LyogR1NTQVBJL2tyYjUgc3VwcG9ydCBmb3IgRlRQIC0gbG9vc2VseSBiYXNlZCBvbiBvbGQga3JiNC5jCiAqCiAqIENvcHlyaWdodCAoYykgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSBLdW5nbGlnYSBUZWtuaXNrYSBI9mdza29sYW4KICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuCiAqIENvcHlyaWdodCAoYykgMjAwNCAtIDIwMTYgRGFuaWVsIFN0ZW5iZXJnCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKICogYXJlIG1ldDoKICoKICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECiAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQogKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAogKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUwogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCiAqIFNVQ0ggREFNQUdFLiAgKi8KCiNpbmNsdWRlICJjdXJsX3NldHVwLmgiCgojaWYgZGVmaW5lZChIQVZFX0dTU0FQSSkgJiYgIWRlZmluZWQoQ1VSTF9ESVNBQkxFX0ZUUCkKCiNpZmRlZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgoKI2luY2x1ZGUgInVybGRhdGEuaCIKI2luY2x1ZGUgImN1cmxfYmFzZTY0LmgiCiNpbmNsdWRlICJmdHAuaCIKI2luY2x1ZGUgImN1cmxfZ3NzYXBpLmgiCiNpbmNsdWRlICJzZW5kZi5oIgojaW5jbHVkZSAiY3VybF9zZWMuaCIKI2luY2x1ZGUgIndhcm5sZXNzLmgiCgovKiBUaGUgbGFzdCAzICNpbmNsdWRlIGZpbGVzIHNob3VsZCBiZSBpbiB0aGlzIG9yZGVyICovCiNpbmNsdWRlICJjdXJsX3ByaW50Zi5oIgojaW5jbHVkZSAiY3VybF9tZW1vcnkuaCIKI2luY2x1ZGUgIm1lbWRlYnVnLmgiCgpzdGF0aWMgaW50CmtyYjVfaW5pdCh2b2lkICphcHBfZGF0YSkKewogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIC8qIE1ha2Ugc3VyZSBvdXIgY29udGV4dCBpcyBpbml0aWFsaXplZCBmb3Iga3JiNV9lbmQuICovCiAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfY2hlY2tfcHJvdCh2b2lkICphcHBfZGF0YSwgaW50IGxldmVsKQp7CiAgKHZvaWQpYXBwX2RhdGE7IC8qIHVudXNlZCAqLwogIGlmKGxldmVsID09IFBST1RfQ09ORklERU5USUFMKQogICAgcmV0dXJuIC0xOwogIHJldHVybiAwOwp9CgpzdGF0aWMgaW50CmtyYjVfZGVjb2RlKHZvaWQgKmFwcF9kYXRhLCB2b2lkICpidWYsIGludCBsZW4sCiAgICAgICAgICAgIGludCBsZXZlbCBVTlVTRURfUEFSQU0sCiAgICAgICAgICAgIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiBVTlVTRURfUEFSQU0pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX2J1ZmZlcl9kZXNjIGVuYywgZGVjOwoKICAodm9pZClsZXZlbDsKICAodm9pZCljb25uOwoKICBlbmMudmFsdWUgPSBidWY7CiAgZW5jLmxlbmd0aCA9IGxlbjsKICBtYWogPSBnc3NfdW5zZWFsKCZtaW4sICpjb250ZXh0LCAmZW5jLCAmZGVjLCBOVUxMLCBOVUxMKTsKICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKICAgIGlmKGxlbiA+PSA0KQogICAgICBzdHJjcHkoYnVmLCAiNTk5ICIpOwogICAgcmV0dXJuIC0xOwogIH0KCiAgbWVtY3B5KGJ1ZiwgZGVjLnZhbHVlLCBkZWMubGVuZ3RoKTsKICBsZW4gPSBjdXJseF91enRvc2koZGVjLmxlbmd0aCk7CiAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZkZWMpOwoKICByZXR1cm4gbGVuOwp9CgpzdGF0aWMgaW50CmtyYjVfb3ZlcmhlYWQodm9pZCAqYXBwX2RhdGEsIGludCBsZXZlbCwgaW50IGxlbikKewogIC8qIG5vIGFyZ3VtZW50cyBhcmUgdXNlZCAqLwogICh2b2lkKWFwcF9kYXRhOwogICh2b2lkKWxldmVsOwogICh2b2lkKWxlbjsKICByZXR1cm4gMDsKfQoKc3RhdGljIGludAprcmI1X2VuY29kZSh2b2lkICphcHBfZGF0YSwgY29uc3Qgdm9pZCAqZnJvbSwgaW50IGxlbmd0aCwgaW50IGxldmVsLCB2b2lkICoqdG8pCnsKICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICBnc3NfYnVmZmVyX2Rlc2MgZGVjLCBlbmM7CiAgT01fdWludDMyIG1haiwgbWluOwogIGludCBzdGF0ZTsKICBpbnQgbGVuOwoKICAvKiBOT1RFIHRoYXQgdGhlIGNhc3QgaXMgc2FmZSwgbmVpdGhlciBvZiB0aGUga3JiNSwgZ251IGdzcyBhbmQgaGVpbWRhbAogICAqIGxpYnJhcmllcyBtb2RpZnkgdGhlIGlucHV0IGJ1ZmZlciBpbiBnc3Nfc2VhbCgpCiAgICovCiAgZGVjLnZhbHVlID0gKHZvaWQgKilmcm9tOwogIGRlYy5sZW5ndGggPSBsZW5ndGg7CiAgbWFqID0gZ3NzX3NlYWwoJm1pbiwgKmNvbnRleHQsCiAgICAgICAgICAgICAgICAgbGV2ZWwgPT0gUFJPVF9QUklWQVRFLAogICAgICAgICAgICAgICAgIEdTU19DX1FPUF9ERUZBVUxULAogICAgICAgICAgICAgICAgICZkZWMsICZzdGF0ZSwgJmVuYyk7CgogIGlmKG1haiAhPSBHU1NfU19DT01QTEVURSkKICAgIHJldHVybiAtMTsKCiAgLyogbWFsbG9jIGEgbmV3IGJ1ZmZlciwgaW4gY2FzZSBnc3NfcmVsZWFzZV9idWZmZXIgZG9lc24ndCB3b3JrIGFzCiAgICAgZXhwZWN0ZWQgKi8KICAqdG8gPSBtYWxsb2MoZW5jLmxlbmd0aCk7CiAgaWYoISp0bykKICAgIHJldHVybiAtMTsKICBtZW1jcHkoKnRvLCBlbmMudmFsdWUsIGVuYy5sZW5ndGgpOwogIGxlbiA9IGN1cmx4X3V6dG9zaShlbmMubGVuZ3RoKTsKICBnc3NfcmVsZWFzZV9idWZmZXIoJm1pbiwgJmVuYyk7CiAgcmV0dXJuIGxlbjsKfQoKc3RhdGljIGludAprcmI1X2F1dGgodm9pZCAqYXBwX2RhdGEsIHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubikKewogIGludCByZXQgPSBBVVRIX09LOwogIGNoYXIgKnA7CiAgY29uc3QgY2hhciAqaG9zdCA9IGNvbm4tPmhvc3QubmFtZTsKICBzc2l6ZV90IG5yZWFkOwogIGN1cmxfc29ja2xlbl90IGwgPSBzaXplb2YoY29ubi0+bG9jYWxfYWRkcik7CiAgc3RydWN0IEN1cmxfZWFzeSAqZGF0YSA9IGNvbm4tPmRhdGE7CiAgQ1VSTGNvZGUgcmVzdWx0OwogIGNvbnN0IGNoYXIgKnNlcnZpY2UgPSBkYXRhLT5zZXQuc3RyW1NUUklOR19TRVJWSUNFX05BTUVdID8KICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+c2V0LnN0cltTVFJJTkdfU0VSVklDRV9OQU1FXSA6CiAgICAgICAgICAgICAgICAgICAgICAgICJmdHAiOwogIGNvbnN0IGNoYXIgKnNydl9ob3N0ID0gImhvc3QiOwogIGdzc19idWZmZXJfZGVzYyBpbnB1dF9idWZmZXIsIG91dHB1dF9idWZmZXIsIF9nc3NyZXNwLCAqZ3NzcmVzcDsKICBPTV91aW50MzIgbWFqLCBtaW47CiAgZ3NzX25hbWVfdCBnc3NuYW1lOwogIGdzc19jdHhfaWRfdCAqY29udGV4dCA9IGFwcF9kYXRhOwogIHN0cnVjdCBnc3NfY2hhbm5lbF9iaW5kaW5nc19zdHJ1Y3QgY2hhbjsKICBzaXplX3QgYmFzZTY0X3N6ID0gMDsKICBzdHJ1Y3Qgc29ja2FkZHJfaW4gKipyZW1vdGVfYWRkciA9CiAgICAoc3RydWN0IHNvY2thZGRyX2luICoqKSZjb25uLT5pcF9hZGRyLT5haV9hZGRyOwoKICBpZihnZXRzb2NrbmFtZShjb25uLT5zb2NrW0ZJUlNUU09DS0VUXSwKICAgICAgICAgICAgICAgICAoc3RydWN0IHNvY2thZGRyICopJmNvbm4tPmxvY2FsX2FkZHIsICZsKSA8IDApCiAgICBwZXJyb3IoImdldHNvY2tuYW1lKCkiKTsKCiAgY2hhbi5pbml0aWF0b3JfYWRkcnR5cGUgPSBHU1NfQ19BRl9JTkVUOwogIGNoYW4uaW5pdGlhdG9yX2FkZHJlc3MubGVuZ3RoID0gbCAtIDQ7CiAgY2hhbi5pbml0aWF0b3JfYWRkcmVzcy52YWx1ZSA9ICZjb25uLT5sb2NhbF9hZGRyLnNpbl9hZGRyLnNfYWRkcjsKICBjaGFuLmFjY2VwdG9yX2FkZHJ0eXBlID0gR1NTX0NfQUZfSU5FVDsKICBjaGFuLmFjY2VwdG9yX2FkZHJlc3MubGVuZ3RoID0gbCAtIDQ7CiAgY2hhbi5hY2NlcHRvcl9hZGRyZXNzLnZhbHVlID0gJigqcmVtb3RlX2FkZHIpLT5zaW5fYWRkci5zX2FkZHI7CiAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLmxlbmd0aCA9IDA7CiAgY2hhbi5hcHBsaWNhdGlvbl9kYXRhLnZhbHVlID0gTlVMTDsKCiAgLyogdGhpcyBsb29wIHdpbGwgZXhlY3V0ZSB0d2ljZSAob25jZSBmb3Igc2VydmljZSwgb25jZSBmb3IgaG9zdCkgKi8KICBmb3IoOzspIHsKICAgIC8qIHRoaXMgcmVhbGx5IHNob3VsZG4ndCBiZSByZXBlYXRlZCBoZXJlLCBidXQgY2FuJ3QgaGVscCBpdCAqLwogICAgaWYoc2VydmljZSA9PSBzcnZfaG9zdCkgewogICAgICByZXN1bHQgPSBDdXJsX2Z0cHNlbmQoY29ubiwgIkFVVEggR1NTQVBJIik7CiAgICAgIGlmKHJlc3VsdCkKICAgICAgICByZXR1cm4gLTI7CgogICAgICBpZihDdXJsX0dldEZUUFJlc3BvbnNlKCZucmVhZCwgY29ubiwgTlVMTCkpCiAgICAgICAgcmV0dXJuIC0xOwoKICAgICAgaWYoZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICczJykKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgaW5wdXRfYnVmZmVyLnZhbHVlID0gZGF0YS0+c3RhdGUuYnVmZmVyOwogICAgaW5wdXRfYnVmZmVyLmxlbmd0aCA9IHNucHJpbnRmKGlucHV0X2J1ZmZlci52YWx1ZSwgQlVGU0laRSwgIiVzQCVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlLCBob3N0KTsKICAgIG1haiA9IGdzc19pbXBvcnRfbmFtZSgmbWluLCAmaW5wdXRfYnVmZmVyLCBHU1NfQ19OVF9IT1NUQkFTRURfU0VSVklDRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAmZ3NzbmFtZSk7CiAgICBpZihtYWogIT0gR1NTX1NfQ09NUExFVEUpIHsKICAgICAgZ3NzX3JlbGVhc2VfbmFtZSgmbWluLCAmZ3NzbmFtZSk7CiAgICAgIGlmKHNlcnZpY2UgPT0gc3J2X2hvc3QpIHsKICAgICAgICBDdXJsX2ZhaWxmKGRhdGEsICJFcnJvciBpbXBvcnRpbmcgc2VydmljZSBuYW1lICVzIiwKICAgICAgICAgICAgICAgICAgIGlucHV0X2J1ZmZlci52YWx1ZSk7CiAgICAgICAgcmV0dXJuIEFVVEhfRVJST1I7CiAgICAgIH0KICAgICAgc2VydmljZSA9IHNydl9ob3N0OwogICAgICBjb250aW51ZTsKICAgIH0KICAgIC8qIFdlIHBhc3MgTlVMTCBhcyB8b3V0cHV0X25hbWVfdHlwZXwgdG8gYXZvaWQgYSBsZWFrLiAqLwogICAgZ3NzX2Rpc3BsYXlfbmFtZSgmbWluLCBnc3NuYW1lLCAmb3V0cHV0X2J1ZmZlciwgTlVMTCk7CiAgICBDdXJsX2luZm9mKGRhdGEsICJUcnlpbmcgYWdhaW5zdCAlc1xuIiwgb3V0cHV0X2J1ZmZlci52YWx1ZSk7CiAgICBnc3NyZXNwID0gR1NTX0NfTk9fQlVGRkVSOwogICAgKmNvbnRleHQgPSBHU1NfQ19OT19DT05URVhUOwoKICAgIGRvIHsKICAgICAgLyogUmVsZWFzZSB0aGUgYnVmZmVyIGF0IGVhY2ggaXRlcmF0aW9uIHRvIGF2b2lkIGxlYWtpbmc6IHRoZSBmaXJzdCB0aW1lCiAgICAgICAgIHdlIGFyZSByZWxlYXNpbmcgdGhlIG1lbW9yeSBmcm9tIGdzc19kaXNwbGF5X25hbWUuIFRoZSBsYXN0IGl0ZW0gaXMKICAgICAgICAgdGFrZW4gY2FyZSBieSBhIGZpbmFsIGdzc19yZWxlYXNlX2J1ZmZlci4gKi8KICAgICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZvdXRwdXRfYnVmZmVyKTsKICAgICAgcmV0ID0gQVVUSF9PSzsKICAgICAgbWFqID0gQ3VybF9nc3NfaW5pdF9zZWNfY29udGV4dChkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnc3NuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDdXJsX2tyYjVfbWVjaF9vaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3NzcmVzcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwoKICAgICAgaWYoZ3NzcmVzcCkgewogICAgICAgIGZyZWUoX2dzc3Jlc3AudmFsdWUpOwogICAgICAgIGdzc3Jlc3AgPSBOVUxMOwogICAgICB9CgogICAgICBpZihHU1NfRVJST1IobWFqKSkgewogICAgICAgIEN1cmxfaW5mb2YoZGF0YSwgIkVycm9yIGNyZWF0aW5nIHNlY3VyaXR5IGNvbnRleHRcbiIpOwogICAgICAgIHJldCA9IEFVVEhfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGlmKG91dHB1dF9idWZmZXIubGVuZ3RoICE9IDApIHsKICAgICAgICBjaGFyICpjbWQ7CgogICAgICAgIHJlc3VsdCA9IEN1cmxfYmFzZTY0X2VuY29kZShkYXRhLCAoY2hhciAqKW91dHB1dF9idWZmZXIudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9idWZmZXIubGVuZ3RoLCAmcCwgJmJhc2U2NF9zeik7CiAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICBDdXJsX2luZm9mKGRhdGEsICJiYXNlNjQtZW5jb2Rpbmc6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgICBjdXJsX2Vhc3lfc3RyZXJyb3IocmVzdWx0KSk7CiAgICAgICAgICByZXQgPSBBVVRIX0VSUk9SOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBjbWQgPSBhcHJpbnRmKCJBREFUICVzIiwgcCk7CiAgICAgICAgaWYoY21kKQogICAgICAgICAgcmVzdWx0ID0gQ3VybF9mdHBzZW5kKGNvbm4sIGNtZCk7CiAgICAgICAgZWxzZQogICAgICAgICAgcmVzdWx0ID0gQ1VSTEVfT1VUX09GX01FTU9SWTsKCiAgICAgICAgZnJlZShwKTsKCiAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICByZXQgPSAtMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYoQ3VybF9HZXRGVFBSZXNwb25zZSgmbnJlYWQsIGNvbm4sIE5VTEwpKSB7CiAgICAgICAgICByZXQgPSAtMTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgaWYoZGF0YS0+c3RhdGUuYnVmZmVyWzBdICE9ICcyJyAmJiBkYXRhLT5zdGF0ZS5idWZmZXJbMF0gIT0gJzMnKSB7CiAgICAgICAgICBDdXJsX2luZm9mKGRhdGEsICJTZXJ2ZXIgZGlkbid0IGFjY2VwdCBhdXRoIGRhdGFcbiIpOwogICAgICAgICAgcmV0ID0gQVVUSF9FUlJPUjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgcCA9IGRhdGEtPnN0YXRlLmJ1ZmZlciArIDQ7CiAgICAgICAgcCA9IHN0cnN0cihwLCAiQURBVD0iKTsKICAgICAgICBpZihwKSB7CiAgICAgICAgICByZXN1bHQgPSBDdXJsX2Jhc2U2NF9kZWNvZGUocCArIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKiopJl9nc3NyZXNwLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZ3NzcmVzcC5sZW5ndGgpOwogICAgICAgICAgaWYocmVzdWx0KSB7CiAgICAgICAgICAgIEN1cmxfZmFpbGYoZGF0YSwgImJhc2U2NC1kZWNvZGluZzogJXMiLAogICAgICAgICAgICAgICAgICAgICAgIGN1cmxfZWFzeV9zdHJlcnJvcihyZXN1bHQpKTsKICAgICAgICAgICAgcmV0ID0gQVVUSF9DT05USU5VRTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBnc3NyZXNwID0gJl9nc3NyZXNwOwogICAgICB9CiAgICB9IHdoaWxlKG1haiA9PSBHU1NfU19DT05USU5VRV9ORUVERUQpOwoKICAgIGdzc19yZWxlYXNlX25hbWUoJm1pbiwgJmdzc25hbWUpOwogICAgZ3NzX3JlbGVhc2VfYnVmZmVyKCZtaW4sICZvdXRwdXRfYnVmZmVyKTsKCiAgICBpZihnc3NyZXNwKQogICAgICBmcmVlKF9nc3NyZXNwLnZhbHVlKTsKCiAgICBpZihyZXQgPT0gQVVUSF9PSyB8fCBzZXJ2aWNlID09IHNydl9ob3N0KQogICAgICByZXR1cm4gcmV0OwoKICAgIHNlcnZpY2UgPSBzcnZfaG9zdDsKICB9CiAgcmV0dXJuIHJldDsKfQoKc3RhdGljIHZvaWQga3JiNV9lbmQodm9pZCAqYXBwX2RhdGEpCnsKICAgIE9NX3VpbnQzMiBtaW47CiAgICBnc3NfY3R4X2lkX3QgKmNvbnRleHQgPSBhcHBfZGF0YTsKICAgIGlmKCpjb250ZXh0ICE9IEdTU19DX05PX0NPTlRFWFQpIHsKI2lmZGVmIERFQlVHQlVJTEQKICAgICAgT01fdWludDMyIG1haiA9CiNlbmRpZgogICAgICBnc3NfZGVsZXRlX3NlY19jb250ZXh0KCZtaW4sIGNvbnRleHQsIEdTU19DX05PX0JVRkZFUik7CiAgICAgIERFQlVHQVNTRVJUKG1haiA9PSBHU1NfU19DT01QTEVURSk7CiAgICB9Cn0KCnN0cnVjdCBDdXJsX3NlY19jbGllbnRfbWVjaCBDdXJsX2tyYjVfY2xpZW50X21lY2ggPSB7CiAgICAiR1NTQVBJIiwKICAgIHNpemVvZihnc3NfY3R4X2lkX3QpLAogICAga3JiNV9pbml0LAogICAga3JiNV9hdXRoLAogICAga3JiNV9lbmQsCiAgICBrcmI1X2NoZWNrX3Byb3QsCiAgICBrcmI1X292ZXJoZWFkLAogICAga3JiNV9lbmNvZGUsCiAgICBrcmI1X2RlY29kZQp9OwoKI2VuZGlmIC8qIEhBVkVfR1NTQVBJICYmICFDVVJMX0RJU0FCTEVfRlRQICovCg==