LyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMDkgRGFuaWVsIFN0ZW5iZXJnCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJzZXR1cC5oIgoKI2lmbmRlZiBDVVJMX0RJU0FCTEVfRlRQCiNpZmRlZiBIQVZFX0dTU0FQSQoKI2lmZGVmIEhBVkVfT0xEX0dTU01JVAojZGVmaW5lIEdTU19DX05UX0hPU1RCQVNFRF9TRVJWSUNFIGdzc19udF9zZXJ2aWNlX25hbWUKI2VuZGlmCgojaW5jbHVkZSA8c3RkbGliLmg+CiNpZmRlZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpZmRlZiBIQVZFX0dTU01JVAovKiBNSVQgc3R5bGUgKi8KI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGkuaD4KI2luY2x1ZGUgPGdzc2FwaS9nc3NhcGlfZ2VuZXJpYy5oPgojaW5jbHVkZSA8Z3NzYXBpL2dzc2FwaV9rcmI1Lmg+CiNlbHNlCi8qIEhlaW1kYWwtc3R5bGUgKi8KI2luY2x1ZGUgPGdzc2FwaS5oPgojZW5kaWYKCiNpbmNsdWRlICJ1cmxkYXRhLmgiCiNpbmNsdWRlICJjdXJsX2Jhc2U2NC5oIgojaW5jbHVkZSAiZnRwLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAia3JiNC5oIgojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKCiNkZWZpbmUgX01QUklOVEZfUkVQTEFDRSAvKiB1c2Ugb3VyIGZ1bmN0aW9ucyBvbmx5ICovCiNpbmNsdWRlIDxjdXJsL21wcmludGYuaD4KCi8qIFRoZSBsYXN0ICNpbmNsdWRlIGZpbGUgc2hvdWxkIGJlOiAqLwojaW5jbHVkZSAibWVtZGVidWcuaCIKCiNkZWZpbmUgTE9DQUxfQUREUiAoJmNvbm4tPmxvY2FsX2FkZHIpCiNkZWZpbmUgUkVNT1RFX0FERFIgY29ubi0+aXBfYWRkci0+YWlfYWRkcgoKc3RhdGljIGludAprcmI1X2NoZWNrX3Byb3Qodm9pZCAqYXBwX2RhdGEsIGludCBsZXZlbCkKewogIGFwcF9kYXRhID0gTlVMTDsgLyogcHJldmVudCBjb21waWxlciB3YXJuaW5nICovCiAgaWYobGV2ZWwgPT0gcHJvdF9jb25maWRlbnRpYWwpCiAgICByZXR1cm4gLTE7CiAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQKa3JiNV9kZWNvZGUodm9pZCAqYXBwX2RhdGEsIHZvaWQgKmJ1ZiwgaW50IGxlbiwgaW50IGxldmVsLAogICAgICAgICAgICBzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX2J1ZmZlcl9kZXNjIGVuYywgZGVjOwoKICAvKiBzaHV0IGdjYyB1cCAqLwogIGxldmVsID0gMDsKICBjb25uID0gTlVMTDsKCiAgZW5jLnZhbHVlID0gYnVmOwogIGVuYy5sZW5ndGggPSBsZW47CiAgbWFqID0gZ3NzX3Vuc2VhbCgmbWluLCAqY29udGV4dCwgJmVuYywgJmRlYywgTlVMTCwgTlVMTCk7CiAgaWYobWFqICE9IEdTU19TX0NPTVBMRVRFKSB7CiAgICBpZihsZW4gPj0gNCkKICAgICAgc3RyY3B5KGJ1ZiwgIjU5OSAiKTsKICAgIHJldHVybiAtMTsKICB9CgogIG1lbWNweShidWYsIGRlYy52YWx1ZSwgZGVjLmxlbmd0aCk7CiAgbGVuID0gZGVjLmxlbmd0aDsKICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJmRlYyk7CgogIHJldHVybiBsZW47Cn0KCnN0YXRpYyBpbnQKa3JiNV9vdmVyaGVhZCh2b2lkICphcHBfZGF0YSwgaW50IGxldmVsLCBpbnQgbGVuKQp7CiAgLyogbm8gYXJndW1lbnRzIGFyZSB1c2VkLCBqdXN0IGluaXQgdGhlbSB0byBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmdzICovCiAgYXBwX2RhdGEgPSBOVUxMOwogIGxldmVsID0gMDsKICBsZW4gPSAwOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfZW5jb2RlKHZvaWQgKmFwcF9kYXRhLCBjb25zdCB2b2lkICpmcm9tLCBpbnQgbGVuZ3RoLCBpbnQgbGV2ZWwsIHZvaWQgKip0bywKICAgICAgICAgICAgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgZ3NzX2N0eF9pZF90ICpjb250ZXh0ID0gYXBwX2RhdGE7CiAgZ3NzX2J1ZmZlcl9kZXNjIGRlYywgZW5jOwogIE9NX3VpbnQzMiBtYWosIG1pbjsKICBpbnQgc3RhdGU7CiAgaW50IGxlbjsKCiAgLyogc2h1dCBnY2MgdXAgKi8KICBjb25uID0gTlVMTDsKCiAgLyogTk9URSB0aGF0IHRoZSBjYXN0IGlzIHNhZmUsIG5laXRoZXIgb2YgdGhlIGtyYjUsIGdudSBnc3MgYW5kIGhlaW1kYWwKICAgKiBsaWJyYXJpZXMgbW9kaWZ5IHRoZSBpbnB1dCBidWZmZXIgaW4gZ3NzX3NlYWwoKQogICAqLwogIGRlYy52YWx1ZSA9ICh2b2lkKilmcm9tOwogIGRlYy5sZW5ndGggPSBsZW5ndGg7CiAgbWFqID0gZ3NzX3NlYWwoJm1pbiwgKmNvbnRleHQsCiAgICAgICAgICAgICAgICAgbGV2ZWwgPT0gcHJvdF9wcml2YXRlLAogICAgICAgICAgICAgICAgIEdTU19DX1FPUF9ERUZBVUxULAogICAgICAgICAgICAgICAgICZkZWMsICZzdGF0ZSwgJmVuYyk7CgogIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkKICAgIHJldHVybiAtMTsKCiAgLyogbWFsbG9jIGEgbmV3IGJ1ZmZlciwgaW4gY2FzZSBnc3NfcmVsZWFzZV9idWZmZXIgZG9lc24ndCB3b3JrIGFzIGV4cGVjdGVkICovCiAgKnRvID0gbWFsbG9jKGVuYy5sZW5ndGgpOwogIGlmKCEqdG8pCiAgICByZXR1cm4gLTE7CiAgbWVtY3B5KCp0bywgZW5jLnZhbHVlLCBlbmMubGVuZ3RoKTsKICBsZW4gPSBlbmMubGVuZ3RoOwogIGdzc19yZWxlYXNlX2J1ZmZlcigmbWluLCAmZW5jKTsKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50CmtyYjVfYXV0aCh2b2lkICphcHBfZGF0YSwgc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKQp7CiAgaW50IHJldDsKICBjaGFyICpwOwogIGNvbnN0IGNoYXIgKmhvc3QgPSBjb25uLT5kbnNfZW50cnktPmFkZHItPmFpX2Nhbm9ubmFtZTsKICBzc2l6ZV90IG5yZWFkOwogIGN1cmxfc29ja2xlbl90IGwgPSBzaXplb2YoY29ubi0+bG9jYWxfYWRkcik7CiAgc3RydWN0IFNlc3Npb25IYW5kbGUgKmRhdGEgPSBjb25uLT5kYXRhOwogIENVUkxjb2RlIHJlc3VsdDsKICBjb25zdCBjaGFyICpzZXJ2aWNlID0gImZ0cCIsICpzcnZfaG9zdCA9ICJob3N0IjsKICBnc3NfYnVmZmVyX2Rlc2MgZ3NzYnVmLCBfZ3NzcmVzcCwgKmdzc3Jlc3A7CiAgT01fdWludDMyIG1haiwgbWluOwogIGdzc19uYW1lX3QgZ3NzbmFtZTsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBzdHJ1Y3QgZ3NzX2NoYW5uZWxfYmluZGluZ3Nfc3RydWN0IGNoYW47CgogIGlmKGdldHNvY2tuYW1lKGNvbm4tPnNvY2tbRklSU1RTT0NLRVRdLAogICAgICAgICAgICAgICAgIChzdHJ1Y3Qgc29ja2FkZHIgKilMT0NBTF9BRERSLCAmbCkgPCAwKQogICAgcGVycm9yKCJnZXRzb2NrbmFtZSgpIik7CgogIGNoYW4uaW5pdGlhdG9yX2FkZHJ0eXBlID0gR1NTX0NfQUZfSU5FVDsKICBjaGFuLmluaXRpYXRvcl9hZGRyZXNzLmxlbmd0aCA9IGwgLSA0OwogIGNoYW4uaW5pdGlhdG9yX2FkZHJlc3MudmFsdWUgPQogICAgJigoc3RydWN0IHNvY2thZGRyX2luICopTE9DQUxfQUREUiktPnNpbl9hZGRyLnNfYWRkcjsKICBjaGFuLmFjY2VwdG9yX2FkZHJ0eXBlID0gR1NTX0NfQUZfSU5FVDsKICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MubGVuZ3RoID0gbCAtIDQ7CiAgY2hhbi5hY2NlcHRvcl9hZGRyZXNzLnZhbHVlID0KICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKVJFTU9URV9BRERSKS0+c2luX2FkZHIuc19hZGRyOwogIGNoYW4uYXBwbGljYXRpb25fZGF0YS5sZW5ndGggPSAwOwogIGNoYW4uYXBwbGljYXRpb25fZGF0YS52YWx1ZSA9IE5VTEw7CgogIC8qIHRoaXMgbG9vcCB3aWxsIGV4ZWN1dGUgdHdpY2UgKG9uY2UgZm9yIHNlcnZpY2UsIG9uY2UgZm9yIGhvc3QpICovCiAgd2hpbGUoMSkgewogICAgLyogdGhpcyByZWFsbHkgc2hvdWxkbid0IGJlIHJlcGVhdGVkIGhlcmUsIGJ1dCBjYW4ndCBoZWxwIGl0ICovCiAgICBpZihzZXJ2aWNlID09IHNydl9ob3N0KSB7CiAgICAgIHJlc3VsdCA9IEN1cmxfZnRwc2VuZGYoY29ubiwgIkFVVEggR1NTQVBJIik7CgogICAgICBpZihyZXN1bHQpCiAgICAgICAgcmV0dXJuIC0yOwogICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgaWYoZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICczJykKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgZ3NzYnVmLnZhbHVlID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogICAgZ3NzYnVmLmxlbmd0aCA9IHNucHJpbnRmKGdzc2J1Zi52YWx1ZSwgQlVGU0laRSwgIiVzQCVzIiwgc2VydmljZSwgaG9zdCk7CiAgICBtYWogPSBnc3NfaW1wb3J0X25hbWUoJm1pbiwgJmdzc2J1ZiwgR1NTX0NfTlRfSE9TVEJBU0VEX1NFUlZJQ0UsICZnc3NuYW1lKTsKICAgIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkgewogICAgICBnc3NfcmVsZWFzZV9uYW1lKCZtaW4sICZnc3NuYW1lKTsKICAgICAgaWYoc2VydmljZSA9PSBzcnZfaG9zdCkgewogICAgICAgIEN1cmxfZmFpbGYoZGF0YSwgIkVycm9yIGltcG9ydGluZyBzZXJ2aWNlIG5hbWUgJXMiLCBnc3NidWYudmFsdWUpOwogICAgICAgIHJldHVybiBBVVRIX0VSUk9SOwogICAgICB9CiAgICAgIHNlcnZpY2UgPSBzcnZfaG9zdDsKICAgICAgY29udGludWU7CiAgICB9CiAgICB7CiAgICAgIGdzc19PSUQgdDsKICAgICAgZ3NzX2Rpc3BsYXlfbmFtZSgmbWluLCBnc3NuYW1lLCAmZ3NzYnVmLCAmdCk7CiAgICAgIEN1cmxfaW5mb2YoZGF0YSwgIlRyeWluZyBhZ2FpbnN0ICVzXG4iLCBnc3NidWYudmFsdWUpOwogICAgICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJmdzc2J1Zik7CiAgICB9CiAgICBnc3NyZXNwID0gR1NTX0NfTk9fQlVGRkVSOwogICAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwoKICAgIGRvIHsKICAgICAgcmV0ID0gQVVUSF9PSzsKICAgICAgbWFqID0gZ3NzX2luaXRfc2VjX2NvbnRleHQoJm1pbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTk9fQ1JFREVOVElBTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1NTX0NfTk9fT0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHU1NfQ19NVVRVQUxfRkxBRyB8IEdTU19DX1JFUExBWV9GTEFHLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzcmVzcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdzc2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CgogICAgICBpZihnc3NyZXNwKSB7CiAgICAgICAgZnJlZShfZ3NzcmVzcC52YWx1ZSk7CiAgICAgICAgZ3NzcmVzcCA9IE5VTEw7CiAgICAgIH0KCiAgICAgIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSAmJiBtYWogIT0gR1NTX1NfQ09OVElOVUVfTkVFREVEKSB7CiAgICAgICAgQ3VybF9pbmZvZihkYXRhLCAiRXJyb3IgY3JlYXRpbmcgc2VjdXJpdHkgY29udGV4dCIpOwogICAgICAgIHJldCA9IEFVVEhfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmKGdzc2J1Zi5sZW5ndGggIT0gMCkgewogICAgICAgIGlmKEN1cmxfYmFzZTY0X2VuY29kZShkYXRhLCAoY2hhciAqKWdzc2J1Zi52YWx1ZSwgZ3NzYnVmLmxlbmd0aCwgJnApCiAgICAgICAgICAgPCAxKSB7CiAgICAgICAgICBDdXJsX2luZm9mKGRhdGEsICJPdXQgb2YgbWVtb3J5IGJhc2U2NC1lbmNvZGluZyIpOwogICAgICAgICAgcmV0ID0gQVVUSF9DT05USU5VRTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcmVzdWx0ID0gQ3VybF9mdHBzZW5kZihjb25uLCAiQURBVCAlcyIsIHApOwoKICAgICAgICBmcmVlKHApOwoKICAgICAgICBpZihyZXN1bHQpIHsKICAgICAgICAgIHJldCA9IC0yOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpIHsKICAgICAgICAgIHJldCA9IC0xOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBpZihkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzInICYmIGRhdGEtPnN0YXRlLmJ1ZmZlclswXSAhPSAnMycpewogICAgICAgICAgQ3VybF9pbmZvZihkYXRhLCAiU2VydmVyIGRpZG4ndCBhY2NlcHQgYXV0aCBkYXRhXG4iKTsKICAgICAgICAgIHJldCA9IEFVVEhfRVJST1I7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHAgPSBkYXRhLT5zdGF0ZS5idWZmZXIgKyA0OwogICAgICAgIHAgPSBzdHJzdHIocCwgIkFEQVQ9Iik7CiAgICAgICAgaWYocCkgewogICAgICAgICAgX2dzc3Jlc3AubGVuZ3RoID0gQ3VybF9iYXNlNjRfZGVjb2RlKHAgKyA1LCAodW5zaWduZWQgY2hhciAqKikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2dzc3Jlc3AudmFsdWUpOwogICAgICAgICAgaWYoX2dzc3Jlc3AubGVuZ3RoIDwgMSkgewogICAgICAgICAgICBDdXJsX2ZhaWxmKGRhdGEsICJPdXQgb2YgbWVtb3J5IGJhc2U2NC1lbmNvZGluZyIpOwogICAgICAgICAgICByZXQgPSBBVVRIX0NPTlRJTlVFOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGdzc3Jlc3AgPSAmX2dzc3Jlc3A7CiAgICAgIH0KICAgIH0gd2hpbGUobWFqID09IEdTU19TX0NPTlRJTlVFX05FRURFRCk7CgogICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluLCAmZ3NzbmFtZSk7CgogICAgaWYoZ3NzcmVzcCkKICAgICAgZnJlZShfZ3NzcmVzcC52YWx1ZSk7CgogICAgaWYocmV0ID09IEFVVEhfT0sgfHwgc2VydmljZSA9PSBzcnZfaG9zdCkKICAgICAgcmV0dXJuIHJldDsKCiAgICBzZXJ2aWNlID0gc3J2X2hvc3Q7CiAgfQp9CgpzdHJ1Y3QgQ3VybF9zZWNfY2xpZW50X21lY2ggQ3VybF9rcmI1X2NsaWVudF9tZWNoID0gewogICAgIkdTU0FQSSIsCiAgICBzaXplb2YoZ3NzX2N0eF9pZF90KSwKICAgIE5VTEwsIC8qIGluaXQgKi8KICAgIGtyYjVfYXV0aCwKICAgIE5VTEwsIC8qIGVuZCAqLwogICAga3JiNV9jaGVja19wcm90LAogICAga3JiNV9vdmVyaGVhZCwKICAgIGtyYjVfZW5jb2RlLAogICAga3JiNV9kZWNvZGUKfTsKCiNlbmRpZiAvKiBIQVZFX0dTU0FQSSAqLwojZW5kaWYgLyogQ1VSTF9ESVNBQkxFX0ZUUCAqLwo=