LyoKICogQ29weXJpZ2h0IChDKSAxOTgwIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMgYXJlIHBlcm1pdHRlZAogKiBwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBhcmFncmFwaCBhcmUKICogZHVwbGljYXRlZCBpbiBhbGwgc3VjaCBmb3JtcyBhbmQgdGhhdCBhbnkgZG9jdW1lbnRhdGlvbiwKICogYWR2ZXJ0aXNpbmcgbWF0ZXJpYWxzLCBhbmQgb3RoZXIgbWF0ZXJpYWxzIHJlbGF0ZWQgdG8gc3VjaAogKiBkaXN0cmlidXRpb24gYW5kIHVzZSBhY2tub3dsZWRnZSB0aGF0IHRoZSBzb2Z0d2FyZSB3YXMgZGV2ZWxvcGVkCiAqIGJ5IHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEsIEJlcmtlbGV5LiAgVGhlIG5hbWUgb2YgdGhlCiAqIFVuaXZlcnNpdHkgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkCiAqIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQKICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVElCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgogKi8KCi8qCioqIG1vcmUuYyAtIEdlbmVyYWwgcHVycG9zZSB0dHkgb3V0cHV0IGZpbHRlciBhbmQgZmlsZSBwZXJ1c2FsIHByb2dyYW0KKioKKioJYnkgRXJpYyBTaGllbmJyb29kLCBVQyBCZXJrZWxleQoqKgoqKgltb2RpZmllZCBieSBHZW9mZiBQZWNrLCBVQ0IgdG8gYWRkIHVuZGVybGluaW5nLCBzaW5nbGUgc3BhY2luZwoqKgltb2RpZmllZCBieSBKb2huIEZvZGVyYXJvLCBVQ0IgdG8gYWRkIC1jIGFuZCBNT1JFIGVudmlyb25tZW50IHZhcmlhYmxlCioqCW1vZGlmaWVkIGJ5IEVyaWsgVHJvYW4gPGV3dEByZWRoYXQuY29tPiB0byBiZSBtb3JlIHBvc2l4IGFuZCBzbyBjb21waWxlCioqCSAgb24gbGludXgvYXhwLgoqKgltb2RpZmllZCBieSBLYXJzIGRlIEpvbmcgPGpvbmdrQGNzLnV0d2VudGUubmw+IHRvIHVzZSB0ZXJtaW5mbyBpbnN0ZWFkCioqCSAgb2YgdGVybWNhcC4KCTE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgoJLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAoJMTk5OS0wMy0xOSBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KCS0gbW9yZSBubHMgdHJhbnNsYXRhYmxlIHN0cmluZ3MKCTE5OTktMDUtMDkgYWViIC0gYXBwbGllZCBhIFJlZEhhdCBwYXRjaCAoc2V0am1wLT5zaWdzZXRqbXApOyB3aXRob3V0IGl0CglhIHNlY29uZCBeWiB3b3VsZCBmYWlsLgoJMTk5OS0wNS0wOSBhZWIgLSB1bmRvbmUgS2Fycycgd29yaywgc28gdGhhdCBtb3JlIHdvcmtzIHdpdGhvdXQKCWxpYmN1cnNlcyAoYW5kIGhlbmNlIGNhbiBiZSBpbiAvYmluIHdpdGggbGliY3Vyc2VzIGJlaW5nIGluIC91c3IvbGliCgl3aGljaCBtYXkgbm90IGJlIG1vdW50ZWQpLiBIb3dldmVyLCB3aGVuIHRlcm1jYXAgaXMgbm90IHByZXNlbnQgY3Vyc2VzCgljYW4gc3RpbGwgYmUgdXNlZC4KKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgkJLyogZm9yIGFsbG9jYSgpICovCiNpbmNsdWRlIDxzdGRhcmcuaD4JCS8qIGZvciB2YV9zdGFydCgpIGV0YyAqLwojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPHNldGptcC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlICJ4c3RybmNweS5oIgojaW5jbHVkZSAibmxzLmgiCiNpbmNsdWRlICJ3aWRlY2hhci5oIgoKI2RlZmluZSBfUkVHRVhfUkVfQ09NUAojaW5jbHVkZSA8cmVnZXguaD4KI3VuZGVmIF9SRUdFWF9SRV9DT01QCgojZGVmaW5lIFZJCQkidmkiCS8qIGZvdW5kIG9uIHRoZSB1c2VyJ3MgcGF0aCAqLwoKI2RlZmluZSBGb3BlbihzLG0pCShDdXJybGluZSA9IDAsZmlsZV9wb3M9MCxmb3BlbihzLG0pKQojZGVmaW5lIEZ0ZWxsKGYpCWZpbGVfcG9zCiNkZWZpbmUgRnNlZWsoZixvZmYpCShmaWxlX3Bvcz1vZmYsZnNlZWsoZixvZmYsMCkpCiNkZWZpbmUgR2V0YyhmKQkJKCsrZmlsZV9wb3MsIGdldGMoZikpCiNkZWZpbmUgVW5nZXRjKGMsZikJKC0tZmlsZV9wb3MsIHVuZ2V0YyhjLGYpKQojZGVmaW5lIHB1dGNlcnIoYykJZnB1dGMoYywgc3RkZXJyKQojZGVmaW5lIHB1dHNlcnIocykJZnB1dHMocywgc3RkZXJyKQojZGVmaW5lIHB1dHNvdXQocykJZnB1dHMocywgc3Rkb3V0KQoKI2RlZmluZSBzdHR5KGZkLGFyZ3ApICB0Y3NldGF0dHIoZmQsVENTQU5PVyxhcmdwKQoKLyogc29tZSBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgKi8Kdm9pZCBpbml0dGVybSh2b2lkKTsKdm9pZCBraWxsX2xpbmUodm9pZCk7CnZvaWQgZG9jbGVhcih2b2lkKTsKdm9pZCBjbGVhcmVvbCh2b2lkKTsKdm9pZCBjbHJlb3Modm9pZCk7CnZvaWQgaG9tZSh2b2lkKTsKdm9pZCBlcnJvciAoY2hhciAqbWVzcyk7CnZvaWQgZG9fc2hlbGwgKGNoYXIgKmZpbGVuYW1lKTsKaW50ICBjb2xvbiAoY2hhciAqZmlsZW5hbWUsIGludCBjbWQsIGludCBubGluZXMpOwppbnQgIGV4cGFuZCAoY2hhciAqKm91dGJ1ZiwgY2hhciAqaW5idWYpOwp2b2lkIGFyZ3NjYW4oY2hhciAqcyxjaGFyICphcmd2MCk7CnZvaWQgcmRsaW5lIChyZWdpc3RlciBGSUxFICpmKTsKdm9pZCBjb3B5X2ZpbGUocmVnaXN0ZXIgRklMRSAqZik7CnZvaWQgc2VhcmNoKGNoYXIgYnVmW10sIEZJTEUgKmZpbGUsIHJlZ2lzdGVyIGludCBuKTsKdm9pZCBza2lwZiAocmVnaXN0ZXIgaW50IG5za2lwKTsKdm9pZCBza2lwbG5zKHJlZ2lzdGVyIGludCBuLCByZWdpc3RlciBGSUxFICpmKTsKdm9pZCBzY3JlZW4gKHJlZ2lzdGVyIEZJTEUgKmYsIHJlZ2lzdGVyIGludCBudW1fbGluZXMpOwppbnQgIGNvbW1hbmQgKGNoYXIgKmZpbGVuYW1lLCByZWdpc3RlciBGSUxFICpmKTsKdm9pZCBlcmFzZXAgKHJlZ2lzdGVyIGludCBjb2wpOwp2b2lkIHNob3cgKHJlZ2lzdGVyIGNoYXIgY2gpOwp2b2lkIHNldF90dHkodm9pZCk7CnZvaWQgcmVzZXRfdHR5KHZvaWQpOwp2b2lkIHR0eWluIChjaGFyIGJ1ZltdLCByZWdpc3RlciBpbnQgbm1heCwgY2hhciBwY2hhcik7CmludCAgbnVtYmVyKGNoYXIgKmNtZCk7CmludCAgcmVhZGNoICh2b2lkKTsKaW50ICBnZXRfbGluZShyZWdpc3RlciBGSUxFICpmLCBpbnQgKmxlbmd0aCk7CnZvaWQgcHJidWYgKHJlZ2lzdGVyIGNoYXIgKnMsIHJlZ2lzdGVyIGludCBuKTsKdm9pZCBleGVjdXRlIChjaGFyICpmaWxlbmFtZSwgY2hhciAqY21kLCAuLi4pOwpGSUxFICpjaGVja2YgKGNoYXIgKiwgaW50ICopOwppbnQgcHJlcGFyZV9saW5lX2J1ZmZlcih2b2lkKTsKCiNkZWZpbmUgVEJVRlNJWgkxMDI0CiNkZWZpbmUgTElOU0laCTI1NgkvKiBtaW5pbWFsIExpbmUgYnVmZmVyIHNpemUgKi8KI2RlZmluZSBjdHJsKGxldHRlcikJKGxldHRlciAmIDA3NykKI2RlZmluZSBSVUJPVVQJJ1wxNzcnCiNkZWZpbmUgRVNDCSdcMDMzJwojZGVmaW5lIFFVSVQJJ1wwMzQnCgpzdHJ1Y3QgdGVybWlvcwlvdHR5LCBzYXZldHR5MDsKbG9uZwkJZmlsZV9wb3MsIGZpbGVfc2l6ZTsKaW50CQlmbnVtLCBub19pbnR0eSwgbm9fdHR5LCBzbG93X3R0eTsKaW50CQlkdW1fb3B0LCBkbGluZXM7CnZvaWQJCW9ucXVpdChpbnQpLCBvbnN1c3AoaW50KSwgY2hnd2luc3ooaW50KSwgZW5kX2l0KGludCk7CmludAkJbnNjcm9sbCA9IDExOwkvKiBOdW1iZXIgb2YgbGluZXMgc2Nyb2xsZWQgYnkgJ2QnICovCmludAkJZm9sZF9vcHQgPSAxOwkvKiBGb2xkIGxvbmcgbGluZXMgKi8KaW50CQlzdG9wX29wdCA9IDE7CS8qIFN0b3AgYWZ0ZXIgZm9ybSBmZWVkcyAqLwppbnQJCXNzcF9vcHQgPSAwOwkvKiBTdXBwcmVzcyB3aGl0ZSBzcGFjZSAqLwppbnQJCXVsX29wdCA9IDE7CS8qIFVuZGVybGluZSBhcyBiZXN0IHdlIGNhbiAqLwppbnQJCXByb21wdGxlbjsKaW50CQlDdXJybGluZTsJLyogTGluZSB3ZSBhcmUgY3VycmVudGx5IGF0ICovCmludAkJc3RhcnR1cCA9IDE7CmludAkJZmlyc3RmID0gMTsKaW50CQlub3RlbGwgPSAxOwppbnQJCWRvY3J0ZXJhc2UgPSAwOwppbnQJCWRvY3J0a2lsbCA9IDA7CmludAkJYmFkX3NvOwkvKiBUcnVlIGlmIG92ZXJ3cml0aW5nIGRvZXMgbm90IHR1cm4gb2ZmIHN0YW5kb3V0ICovCmludAkJaW53YWl0LCBQYXVzZSwgZXJyb3JzOwppbnQJCXdpdGhpbjsJLyogdHJ1ZSBpZiB3ZSBhcmUgd2l0aGluIGEgZmlsZSwKCQkJZmFsc2UgaWYgd2UgYXJlIGJldHdlZW4gZmlsZXMgKi8KaW50CQloYXJkLCBkdW1iLCBub3Njcm9sbCwgaGFyZHRhYnMsIGNscmVvbCwgZWF0bmw7CmludAkJY2F0Y2hfc3VzcDsJLyogV2Ugc2hvdWxkIGNhdGNoIHRoZSBTSUdUU1RQIHNpZ25hbCAqLwpjaGFyCQkqKmZuYW1lczsJLyogVGhlIGxpc3Qgb2YgZmlsZSBuYW1lcyAqLwppbnQJCW5maWxlczsJCS8qIE51bWJlciBvZiBmaWxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KY2hhcgkJKnNoZWxsOwkJLyogVGhlIG5hbWUgb2YgdGhlIHNoZWxsIHRvIHVzZSAqLwppbnQJCXNoZWxscDsJCS8qIEEgcHJldmlvdXMgc2hlbGwgY29tbWFuZCBleGlzdHMgKi8Kc2lnam1wX2J1ZglyZXN0b3JlOwpjaGFyCQkqTGluZTsJCS8qIExpbmUgYnVmZmVyICovCnNpemVfdAkJTGluZUxlbjsJLyogc2l6ZSBvZiBMaW5lIGJ1ZmZlciAqLwppbnQJCUxwcCA9IDI0OwkvKiBsaW5lcyBwZXIgcGFnZSAqLwpjaGFyCQkqQ2xlYXI7CQkvKiBjbGVhciBzY3JlZW4gKi8KY2hhcgkJKmVyYXNlbG47CS8qIGVyYXNlIGxpbmUgKi8KY2hhcgkJKlNlbnRlciwgKlNleGl0Oy8qIGVudGVyIGFuZCBleGl0IHN0YW5kb3V0IG1vZGUgKi8KY2hhcgkJKlVMZW50ZXIsICpVTGV4aXQ7CS8qIGVudGVyIGFuZCBleGl0IHVuZGVybGluZSBtb2RlICovCmNoYXIJCSpjaFVMOwkJLyogdW5kZXJsaW5lIGNoYXJhY3RlciAqLwpjaGFyCQkqY2hCUzsJCS8qIGJhY2tzcGFjZSBjaGFyYWN0ZXIgKi8KY2hhcgkJKkhvbWU7CQkvKiBnbyB0byBob21lICovCmNoYXIJCSpjdXJzb3JtOwkvKiBjdXJzb3IgbW92ZW1lbnQgKi8KY2hhcgkJY3Vyc29yaG9tZVs0MF07CS8qIGNvbnRhaW5zIGN1cnNvciBtb3ZlbWVudCB0byBob21lICovCmNoYXIJCSpFb2RDbHI7CS8qIGNsZWFyIHJlc3Qgb2Ygc2NyZWVuICovCmludAkJTWNvbCA9IDgwOwkvKiBudW1iZXIgb2YgY29sdW1ucyAqLwppbnQJCVdyYXAgPSAxOwkvKiBzZXQgaWYgYXV0b21hcmdpbnMgKi8KaW50CQlzb2dsaXRjaDsJLyogdGVybWluYWwgaGFzIHN0YW5kb3V0IG1vZGUgZ2xpdGNoICovCmludAkJdWxnbGl0Y2g7CS8qIHRlcm1pbmFsIGhhcyB1bmRlcmxpbmUgbW9kZSBnbGl0Y2ggKi8KaW50CQlwc3RhdGUgPSAwOwkvKiBjdXJyZW50IFVMIHN0YXRlICovCnN0YXRpYyBpbnQJbWFnaWMoRklMRSAqLCBjaGFyICopOwpzdHJ1Y3QgewogICAgbG9uZyBjaHJjdHIsIGxpbmU7Cn0gY29udGV4dCwgc2NyZWVuX3N0YXJ0OwpleHRlcm4gY2hhcglQQzsJCS8qIHBhZCBjaGFyYWN0ZXIgKi8KCiNpZmRlZiBIQVZFX05DVVJTRVNfSAojIGluY2x1ZGUgPG5jdXJzZXMuaD4KI2VsaWYgZGVmaW5lZChIQVZFX05DVVJTRVNfTkNVUlNFU19IKQojIGluY2x1ZGUgPG5jdXJzZXMvbmN1cnNlcy5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfTkNVUlNFU19IKSB8fCBkZWZpbmVkKEhBVkVfTkNVUlNFU19OQ1VSU0VTX0gpCiMgaW5jbHVkZSA8dGVybS5oPgkJCS8qIGluY2x1ZGUgYWZ0ZXIgPGN1cnNlcy5oPiAqLwoKc3RhdGljIHZvaWQKbXlfcHV0c3RyaW5nKGNoYXIgKnMpIHsKCXRwdXRzIChzLCAxLCBwdXRjaGFyKTsJCS8qIHB1dHAocyk7ICovCn0KCnN0YXRpYyB2b2lkCm15X3NldHVwdGVybShjaGFyICp0ZXJtLCBpbnQgZmlsZGVzLCBpbnQgKmVycnJldCkgewogICAgIHNldHVwdGVybSh0ZXJtLCBmaWxkZXMsIGVycnJldCk7Cn0KCnN0YXRpYyBpbnQKbXlfdGdldG51bShjaGFyICpzLCBjaGFyICpzcykgewogICAgIHJldHVybiB0aWdldG51bShzcyk7Cn0KCnN0YXRpYyBpbnQKbXlfdGdldGZsYWcoY2hhciAqcywgY2hhciAqc3MpIHsKICAgICByZXR1cm4gdGlnZXRmbGFnKHNzKTsKfQoKc3RhdGljIGNoYXIgKgpteV90Z2V0c3RyKGNoYXIgKnMsIGNoYXIgKnNzKSB7CiAgICAgcmV0dXJuIHRpZ2V0c3RyKHNzKTsKfQoKc3RhdGljIGNoYXIgKgpteV90Z290byhjaGFyICpjYXAsIGludCBjb2wsIGludCByb3cpIHsKICAgICByZXR1cm4gdHBhcm0oY2FwLCBjb2wsIHJvdyk7Cn0KCiNlbGlmIGRlZmluZWQoSEFWRV9MSUJURVJNQ0FQKSAgICAgICAgICAvKiAhbmN1cnNlcyAqLwoKI2luY2x1ZGUgPHRlcm1jYXAuaD4KCmNoYXIgdGVybWJ1ZmZlcls0MDk2XTsKY2hhciB0Y2J1ZmZlcls0MDk2XTsKY2hhciAqc3RyYnVmID0gdGVybWJ1ZmZlcjsKCnN0YXRpYyB2b2lkCm15X3B1dHN0cmluZyhjaGFyICpzKSB7CiAgICAgdHB1dHMgKHMsIDEsIHB1dGNoYXIpOwp9CgpzdGF0aWMgdm9pZApteV9zZXR1cHRlcm0oY2hhciAqdGVybSwgaW50IGZpbGRlcywgaW50ICplcnJyZXQpIHsKICAgICAqZXJycmV0ID0gdGdldGVudCh0Y2J1ZmZlciwgdGVybSk7Cn0KCnN0YXRpYyBpbnQKbXlfdGdldG51bShjaGFyICpzLCBjaGFyICpzcykgewogICAgIHJldHVybiB0Z2V0bnVtKHMpOwp9CgpzdGF0aWMgaW50Cm15X3RnZXRmbGFnKGNoYXIgKnMsIGNoYXIgKnNzKSB7CiAgICAgcmV0dXJuIHRnZXRmbGFnKHMpOwp9CgpzdGF0aWMgY2hhciAqCm15X3RnZXRzdHIoY2hhciAqcywgY2hhciAqc3MpIHsKICAgICByZXR1cm4gdGdldHN0cihzLCAmc3RyYnVmKTsKfQoKc3RhdGljIGNoYXIgKgpteV90Z290byhjaGFyICpjYXAsIGludCBjb2wsIGludCByb3cpIHsKICAgICByZXR1cm4gdGdvdG8oY2FwLCBjb2wsIHJvdyk7Cn0KCiNlbmRpZiAvKiBIQVZFX0xJQlRFUk1DQVAgKi8KCnN0YXRpYyB2b2lkCmlkdW1teShpbnQgKmtrKSB7fQoKc3RhdGljIHZvaWQKRmR1bW15KEZJTEUgKipmZikge30KCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnMpIHsKCWNoYXIgKnAgPSBzdHJyY2hyKHMsICcvJyk7CglmcHJpbnRmKHN0ZGVyciwKCQlfKCJ1c2FnZTogJXMgWy1kZmxwY3N1XSBbK2xpbmVudW0gfCArL3BhdHRlcm5dIG5hbWUxIG5hbWUyIC4uLlxuIiksCgkJcCA/IHAgKyAxIDogcyk7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgewogICAgRklMRQkqZjsKICAgIGNoYXIJKnM7CiAgICBjaGFyCSpwOwogICAgaW50CQljaDsKICAgIGludAkJbGVmdDsKICAgIGludAkJcHJuYW1lcyA9IDA7CiAgICBpbnQJCWluaXRvcHQgPSAwOwogICAgaW50CQlzcmNob3B0ID0gMDsKICAgIGludAkJY2xlYXJpdCA9IDA7CiAgICBpbnQJCWluaXRsaW5lID0gMDsKICAgIGNoYXIJaW5pdGJ1Zls4MF07CgogICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwogICAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICAgIHRleHRkb21haW4oUEFDS0FHRSk7CiAgICAKICAgIC8qIGF2b2lkIGdjYyBjb21wbGFpbnRzIGFib3V0IHJlZ2lzdGVyIHZhcmlhYmxlcyB0aGF0CiAgICAgICBtYXkgYmUgY2xvYmJlcmVkIGJ5IGEgbG9uZ2ptcCwgYnkgZm9yY2luZyBvdXIgdmFyaWFibGVzIGhlcmUKICAgICAgIHRvIGJlIG5vbi1yZWdpc3RlciAqLwogICAgRmR1bW15KCZmKTsgaWR1bW15KCZsZWZ0KTsgaWR1bW15KCZwcm5hbWVzKTsKICAgIGlkdW1teSgmaW5pdG9wdCk7IGlkdW1teSgmc3JjaG9wdCk7IGlkdW1teSgmaW5pdGxpbmUpOwoKICAgIG5maWxlcyA9IGFyZ2M7CiAgICBmbmFtZXMgPSBhcmd2OwogICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwogICAgaW5pdHRlcm0gKCk7CiAgICBpZiAocHJlcGFyZV9saW5lX2J1ZmZlcigpKSB7CglmcHJpbnRmKHN0ZGVyciwgXygiZmFpbGVkIHRvIGluaXRpYWxpemUgbGluZSBidWZmZXJcbiIpKTsKCWV4aXQoMSk7CiAgICB9CiAgICBuc2Nyb2xsID0gTHBwLzIgLSAxOwogICAgaWYgKG5zY3JvbGwgPD0gMCkKCW5zY3JvbGwgPSAxOwogICAgaWYoKHMgPSBnZXRlbnYoIk1PUkUiKSkgIT0gTlVMTCkgYXJnc2NhbihzLGFyZ3ZbMF0pOwogICAgd2hpbGUgKC0tbmZpbGVzID4gMCkgewoJaWYgKChjaCA9ICgqKytmbmFtZXMpWzBdKSA9PSAnLScpIHsKCSAgICBhcmdzY2FuKCpmbmFtZXMrMSxhcmd2WzBdKTsKCX0KCWVsc2UgaWYgKGNoID09ICcrJykgewoJICAgIHMgPSAqZm5hbWVzOwoJICAgIGlmICgqKytzID09ICcvJykgewoJCXNyY2hvcHQrKzsKCQlmb3IgKCsrcywgcCA9IGluaXRidWY7IHAgPCBpbml0YnVmICsgNzkgJiYgKnMgIT0gJ1wwJzspCgkJICAgICpwKysgPSAqcysrOwoJCSpwID0gJ1wwJzsKCSAgICB9CgkgICAgZWxzZSB7CgkJaW5pdG9wdCsrOwoJCWZvciAoaW5pdGxpbmUgPSAwOyAqcyAhPSAnXDAnOyBzKyspCgkJICAgIGlmIChpc2RpZ2l0ICgqcykpCgkJCWluaXRsaW5lID0gaW5pdGxpbmUqMTAgKyAqcyAtJzAnOwoJCS0taW5pdGxpbmU7CgkgICAgfQoJfQoJZWxzZSBicmVhazsKICAgIH0KICAgIC8qIGFsbG93IGNscmVvbCBvbmx5IGlmIEhvbWUgYW5kIGVyYXNlbG4gYW5kIEVvZENsciBzdHJpbmdzIGFyZQogICAgICogIGRlZmluZWQsIGFuZCBpbiB0aGF0IGNhc2UsIG1ha2Ugc3VyZSB3ZSBhcmUgaW4gbm9zY3JvbGwgbW9kZQogICAgICovCiAgICBpZiAoY2xyZW9sKSB7CiAgICAgICAgaWYoKEhvbWUgPT0gTlVMTCkgfHwgKCpIb21lID09ICdcMCcpIHx8CgkgICAoZXJhc2VsbiA9PSBOVUxMKSB8fCAoKmVyYXNlbG4gPT0gJ1wwJykgfHwKICAgICAgICAgICAoRW9kQ2xyID09IE5VTEwpIHx8ICgqRW9kQ2xyID09ICdcMCcpICkKCSAgICAgIGNscmVvbCA9IDA7CgllbHNlIG5vc2Nyb2xsID0gMTsKICAgIH0KICAgIGlmIChkbGluZXMgPT0gMCkKCSAgICBkbGluZXMgPSBMcHAgLSAxOwkvKiB3YXM6IExwcCAtIChub3Njcm9sbCA/IDEgOiAyKSAqLwogICAgbGVmdCA9IGRsaW5lczsKICAgIGlmIChuZmlsZXMgPiAxKQoJcHJuYW1lcysrOwogICAgaWYgKCFub19pbnR0eSAmJiBuZmlsZXMgPT0gMCkgewoJdXNhZ2UoYXJndlswXSk7CglleGl0KDEpOwogICAgfQogICAgZWxzZQoJZiA9IHN0ZGluOwogICAgaWYgKCFub190dHkpIHsKCXNpZ25hbChTSUdRVUlULCBvbnF1aXQpOwoJc2lnbmFsKFNJR0lOVCwgZW5kX2l0KTsKI2lmZGVmIFNJR1dJTkNICglzaWduYWwoU0lHV0lOQ0gsIGNoZ3dpbnN6KTsKI2VuZGlmCglpZiAoc2lnbmFsIChTSUdUU1RQLCBTSUdfSUdOKSA9PSBTSUdfREZMKSB7CgkgICAgc2lnbmFsKFNJR1RTVFAsIG9uc3VzcCk7CgkgICAgY2F0Y2hfc3VzcCsrOwoJfQoJc3R0eSAoZmlsZW5vKHN0ZGVyciksICZvdHR5KTsKICAgIH0KICAgIGlmIChub19pbnR0eSkgewoJaWYgKG5vX3R0eSkKCSAgICBjb3B5X2ZpbGUgKHN0ZGluKTsKCWVsc2UgewoJICAgIGlmICgoY2ggPSBHZXRjIChmKSkgPT0gJ1xmJykKCQlkb2NsZWFyKCk7CgkgICAgZWxzZSB7CgkJVW5nZXRjIChjaCwgZik7CgkJaWYgKG5vc2Nyb2xsICYmIChjaCAhPSBFT0YpKSB7CgkJICAgIGlmIChjbHJlb2wpCgkJCWhvbWUgKCk7CgkJICAgIGVsc2UKCQkJZG9jbGVhciAoKTsKCQl9CgkgICAgfQoJICAgIGlmIChzcmNob3B0KQoJICAgIHsKCQlzZWFyY2ggKGluaXRidWYsIHN0ZGluLCAxKTsKCQlpZiAobm9zY3JvbGwpCgkJICAgIGxlZnQtLTsKCSAgICB9CgkgICAgZWxzZSBpZiAoaW5pdG9wdCkKCQlza2lwbG5zIChpbml0bGluZSwgc3RkaW4pOwoJICAgIHNjcmVlbiAoc3RkaW4sIGxlZnQpOwoJfQoJbm9faW50dHkgPSAwOwoJcHJuYW1lcysrOwoJZmlyc3RmID0gMDsKICAgIH0KCiAgICB3aGlsZSAoZm51bSA8IG5maWxlcykgewoJaWYgKChmID0gY2hlY2tmIChmbmFtZXNbZm51bV0sICZjbGVhcml0KSkgIT0gTlVMTCkgewoJICAgIGNvbnRleHQubGluZSA9IGNvbnRleHQuY2hyY3RyID0gMDsKCSAgICBDdXJybGluZSA9IDA7CgkgICAgaWYgKGZpcnN0Zikgc2lnc2V0am1wIChyZXN0b3JlLCAxKTsKCSAgICBpZiAoZmlyc3RmKSB7CgkJZmlyc3RmID0gMDsKCQlpZiAoc3JjaG9wdCkgewoJCSAgICBzZWFyY2ggKGluaXRidWYsIGYsIDEpOwoJCSAgICBpZiAobm9zY3JvbGwpCgkJCWxlZnQtLTsKCQl9CgkJZWxzZSBpZiAoaW5pdG9wdCkKCQkgICAgc2tpcGxucyAoaW5pdGxpbmUsIGYpOwoJICAgIH0KCSAgICBlbHNlIGlmIChmbnVtIDwgbmZpbGVzICYmICFub190dHkpIHsKCQlzaWdzZXRqbXAgKHJlc3RvcmUsIDEpOwoJCWxlZnQgPSBjb21tYW5kIChmbmFtZXNbZm51bV0sIGYpOwoJICAgIH0KCSAgICBpZiAobGVmdCAhPSAwKSB7CgkJaWYgKChub3Njcm9sbCB8fCBjbGVhcml0KSAmJiAoZmlsZV9zaXplICE9IExPTkdfTUFYKSkgewoJCSAgICBpZiAoY2xyZW9sKQoJCQlob21lICgpOwoJCSAgICBlbHNlCgkJCWRvY2xlYXIgKCk7CgkJfQoJCWlmIChwcm5hbWVzKSB7CgkJICAgIGlmIChiYWRfc28pCgkJCWVyYXNlcCAoMCk7CgkJICAgIGlmIChjbHJlb2wpCgkJCWNsZWFyZW9sICgpOwoJCSAgICBwdXRzb3V0KCI6Ojo6Ojo6Ojo6Ojo6OiIpOwoJCSAgICBpZiAocHJvbXB0bGVuID4gMTQpCgkJCWVyYXNlcCAoMTQpOwoJCSAgICBwdXRjaGFyKCdcbicpOwoJCSAgICBpZihjbHJlb2wpIGNsZWFyZW9sKCk7CgkJICAgIHB1dHMoZm5hbWVzW2ZudW1dKTsKCQkgICAgaWYoY2xyZW9sKSBjbGVhcmVvbCgpOwoJCSAgICBwdXRzKCI6Ojo6Ojo6Ojo6Ojo6OiIpOwoJCSAgICBpZiAobGVmdCA+IExwcCAtIDQpCgkJCWxlZnQgPSBMcHAgLSA0OwoJCX0KCQlpZiAobm9fdHR5KQoJCSAgICBjb3B5X2ZpbGUgKGYpOwoJCWVsc2UgewoJCSAgICB3aXRoaW4rKzsKCQkgICAgc2NyZWVuKGYsIGxlZnQpOwoJCSAgICB3aXRoaW4gPSAwOwoJCX0KCSAgICB9CgkgICAgc2lnc2V0am1wIChyZXN0b3JlLCAxKTsKCSAgICBmZmx1c2goc3Rkb3V0KTsKCSAgICBmY2xvc2UoZik7CgkgICAgc2NyZWVuX3N0YXJ0LmxpbmUgPSBzY3JlZW5fc3RhcnQuY2hyY3RyID0gMEw7CgkgICAgY29udGV4dC5saW5lID0gY29udGV4dC5jaHJjdHIgPSAwTDsKCX0KCWZudW0rKzsKCWZpcnN0ZiA9IDA7CiAgICB9CiAgICByZXNldF90dHkgKCk7CiAgICBleGl0KDApOwp9Cgp2b2lkIGFyZ3NjYW4oY2hhciAqcywgY2hhciAqYXJndjApIHsKCWludCBzZWVuX251bSA9IDA7CgoJd2hpbGUgKCpzICE9ICdcMCcpIHsKCQlzd2l0Y2ggKCpzKSB7CgkJICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOgoJCSAgY2FzZSAnMyc6IGNhc2UgJzQnOiBjYXNlICc1JzoKCQkgIGNhc2UgJzYnOiBjYXNlICc3JzogY2FzZSAnOCc6CgkJICBjYXNlICc5JzoKCQkJaWYgKCFzZWVuX251bSkgewoJCQkJZGxpbmVzID0gMDsKCQkJCXNlZW5fbnVtID0gMTsKCQkJfQoJCQlkbGluZXMgPSBkbGluZXMqMTAgKyAqcyAtICcwJzsKCQkJYnJlYWs7CgkJICBjYXNlICdkJzoKCQkJZHVtX29wdCA9IDE7CgkJCWJyZWFrOwoJCSAgY2FzZSAnbCc6CgkJCXN0b3Bfb3B0ID0gMDsKCQkJYnJlYWs7CgkJICBjYXNlICdmJzoKCQkJZm9sZF9vcHQgPSAwOwoJCQlicmVhazsKCQkgIGNhc2UgJ3AnOgoJCQlub3Njcm9sbCsrOwoJCQlicmVhazsKCQkgIGNhc2UgJ2MnOgoJCQljbHJlb2wrKzsKCQkJYnJlYWs7CgkJICBjYXNlICdzJzoKCQkJc3NwX29wdCA9IDE7CgkJCWJyZWFrOwoJCSAgY2FzZSAndSc6CgkJCXVsX29wdCA9IDA7CgkJCWJyZWFrOwoJCSAgY2FzZSAnLSc6IGNhc2UgJyAnOiBjYXNlICdcdCc6CgkJCWJyZWFrOwoJCSAgZGVmYXVsdDoKCQkJZnByaW50ZihzdGRlcnIsCgkJCQlfKCIlczogdW5rbm93biBvcHRpb24gXCItJWNcIlxuIiksIGFyZ3YwLCAqcyk7CgkJCXVzYWdlKGFyZ3YwKTsKCQkJZXhpdCgxKTsKCQkJYnJlYWs7CgkJfQoJCXMrKzsKCX0KfQoKCi8qCioqIENoZWNrIHdoZXRoZXIgdGhlIGZpbGUgbmFtZWQgYnkgZnMgaXMgYW4gQVNDSUkgZmlsZSB3aGljaCB0aGUgdXNlciBtYXkKKiogYWNjZXNzLiAgSWYgaXQgaXMsIHJldHVybiB0aGUgb3BlbmVkIGZpbGUuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKi8KCkZJTEUgKgpjaGVja2YgKGZzLCBjbGVhcmZpcnN0KQoJcmVnaXN0ZXIgY2hhciAqZnM7CglpbnQgKmNsZWFyZmlyc3Q7CnsKCXN0cnVjdCBzdGF0IHN0YnVmOwoJcmVnaXN0ZXIgRklMRSAqZjsKCWludCBjOwoKCWlmIChzdGF0IChmcywgJnN0YnVmKSA9PSAtMSkgewoJCSh2b2lkKWZmbHVzaChzdGRvdXQpOwoJCWlmIChjbHJlb2wpCgkJCWNsZWFyZW9sICgpOwoJCXBlcnJvcihmcyk7CgkJcmV0dXJuKChGSUxFICopTlVMTCk7Cgl9CglpZiAoKHN0YnVmLnN0X21vZGUgJiBTX0lGTVQpID09IFNfSUZESVIpIHsKCQlwcmludGYoXygiXG4qKiogJXM6IGRpcmVjdG9yeSAqKipcblxuIiksIGZzKTsKCQlyZXR1cm4oKEZJTEUgKilOVUxMKTsKCX0KCWlmICgoZiA9IEZvcGVuKGZzLCAiciIpKSA9PSBOVUxMKSB7CgkJKHZvaWQpZmZsdXNoKHN0ZG91dCk7CgkJcGVycm9yKGZzKTsKCQlyZXR1cm4oKEZJTEUgKilOVUxMKTsKCX0KCWlmIChtYWdpYyhmLCBmcykpCgkJcmV0dXJuKChGSUxFICopTlVMTCk7CglmY250bChmaWxlbm8oZiksIEZfU0VURkQsIEZEX0NMT0VYRUMgKTsKCWMgPSBHZXRjKGYpOwoJKmNsZWFyZmlyc3QgPSAoYyA9PSAnXGYnKTsKCVVuZ2V0YyAoYywgZik7CglpZiAoKGZpbGVfc2l6ZSA9IHN0YnVmLnN0X3NpemUpID09IDApCgkJZmlsZV9zaXplID0gTE9OR19NQVg7CglyZXR1cm4oZik7Cn0KCi8qCiAqIG1hZ2ljIC0tCiAqCWNoZWNrIGZvciBmaWxlIG1hZ2ljIG51bWJlcnMuICBUaGlzIGNvZGUgd291bGQgYmVzdCBiZSBzaGFyZWQgd2l0aAogKgl0aGUgZmlsZSgxKSBwcm9ncmFtIG9yLCBwZXJoYXBzLCBtb3JlIHNob3VsZCBub3QgdHJ5IHRvIGJlIHNvIHNtYXJ0LgogKi8Kc3RhdGljIGludAptYWdpYyhmLCBmcykKCUZJTEUgKmY7CgljaGFyICpmczsKewoJc2lnbmVkIGNoYXIgdHdvYnl0ZXNbMl07CgoJLyogZG9uJ3QgdHJ5IHRvIGxvb2sgYWhlYWQgaWYgdGhlIGlucHV0IGlzIHVuc2Vla2FibGUgKi8KCWlmIChmc2VlayhmLCAwTCwgU0VFS19TRVQpKQoJCXJldHVybiAwOwoKCWlmIChmcmVhZCh0d29ieXRlcywgMiwgMSwgZikgPT0gMSkgewoJCXN3aXRjaCh0d29ieXRlc1swXSArICh0d29ieXRlc1sxXTw8OCkpIHsKCQljYXNlIDA0MDc6CS8qIGEub3V0IG9iaiAqLwoJCWNhc2UgMDQxMDoJLyogYS5vdXQgZXhlYyAqLwoJCWNhc2UgMDQxMzoJLyogYS5vdXQgZGVtYW5kIGV4ZWMgKi8KCQljYXNlIDA0MDU6CgkJY2FzZSAwNDExOgoJCWNhc2UgMDE3NzU0NToKCQljYXNlIDB4NDU3ZjoJCS8qIHNpbXBsZSBFTEYgZGV0ZWN0aW9uICovCgkJCXByaW50ZihfKCJcbioqKioqKioqICVzOiBOb3QgYSB0ZXh0IGZpbGUgKioqKioqKipcblxuIiksIGZzKTsKCQkJKHZvaWQpZmNsb3NlKGYpOwoJCQlyZXR1cm4gMTsKCQl9Cgl9Cgkodm9pZClmc2VlayhmLCAwTCwgU0VFS19TRVQpOwkJLyogcmV3aW5kKCkgbm90IG5lY2Vzc2FyeSAqLwoJcmV0dXJuIDA7Cn0KCi8qCioqIFByaW50IG91dCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgZiwgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWUuCiovCgojZGVmaW5lIFNUT1AgLTEwCgp2b2lkIHNjcmVlbiAocmVnaXN0ZXIgRklMRSAqZiwgcmVnaXN0ZXIgaW50IG51bV9saW5lcykKewogICAgcmVnaXN0ZXIgaW50IGM7CiAgICByZWdpc3RlciBpbnQgbmNoYXJzOwogICAgaW50IGxlbmd0aDsJCQkvKiBsZW5ndGggb2YgY3VycmVudCBsaW5lICovCiAgICBzdGF0aWMgaW50IHByZXZfbGVuID0gMTsJLyogbGVuZ3RoIG9mIHByZXZpb3VzIGxpbmUgKi8KCiAgICBmb3IgKDs7KSB7Cgl3aGlsZSAobnVtX2xpbmVzID4gMCAmJiAhUGF1c2UpIHsKCSAgICBpZiAoKG5jaGFycyA9IGdldF9saW5lIChmLCAmbGVuZ3RoKSkgPT0gRU9GKQoJICAgIHsKCQlpZiAoY2xyZW9sKQoJCSAgICBjbHJlb3MoKTsKCQlyZXR1cm47CgkgICAgfQoJICAgIGlmIChzc3Bfb3B0ICYmIGxlbmd0aCA9PSAwICYmIHByZXZfbGVuID09IDApCgkJY29udGludWU7CgkgICAgcHJldl9sZW4gPSBsZW5ndGg7CgkgICAgaWYgKGJhZF9zbyB8fCAoKFNlbnRlciAmJiAqU2VudGVyID09ICcgJykgJiYgKHByb21wdGxlbiA+IDApKSkKCQllcmFzZXAgKDApOwoJICAgIC8qIG11c3QgY2xlYXIgYmVmb3JlIGRyYXdpbmcgbGluZSBzaW5jZSB0YWJzIG9uIHNvbWUgdGVybWluYWxzCgkgICAgICogZG8gbm90IGVyYXNlIHdoYXQgdGhleSB0YWIgb3Zlci4KCSAgICAgKi8KCSAgICBpZiAoY2xyZW9sKQoJCWNsZWFyZW9sICgpOwoJICAgIHByYnVmIChMaW5lLCBsZW5ndGgpOwoJICAgIGlmIChuY2hhcnMgPCBwcm9tcHRsZW4pCgkJZXJhc2VwIChuY2hhcnMpOwkvKiBlcmFzZXAgKCkgc2V0cyBwcm9tcHRsZW4gdG8gMCAqLwoJICAgIGVsc2UgcHJvbXB0bGVuID0gMDsKCSAgICAvKiBpcyB0aGlzIG5lZWRlZD8KCSAgICAgKiBpZiAoY2xyZW9sKQoJICAgICAqCWNsZWFyZW9sKCk7CSogbXVzdCBjbGVhciBhZ2FpbiBpbiBjYXNlIHdlIHdyYXBwZWQgKgoJICAgICAqLwoJICAgIGlmIChuY2hhcnMgPCBNY29sIHx8ICFmb2xkX29wdCkKCQlwcmJ1ZigiXG4iLCAxKTsJLyogd2lsbCB0dXJuIG9mZiBVTCBpZiBuZWNlc3NhcnkgKi8KCSAgICBpZiAobmNoYXJzID09IFNUT1ApCgkJYnJlYWs7CgkgICAgbnVtX2xpbmVzLS07Cgl9CglpZiAocHN0YXRlKSB7CgkJbXlfcHV0c3RyaW5nIChVTGV4aXQpOwoJCXBzdGF0ZSA9IDA7Cgl9CglmZmx1c2goc3Rkb3V0KTsKCWlmICgoYyA9IEdldGMoZikpID09IEVPRikKCXsKCSAgICBpZiAoY2xyZW9sKQoJCWNscmVvcyAoKTsKCSAgICByZXR1cm47Cgl9CgoJaWYgKFBhdXNlICYmIGNscmVvbCkKCSAgICBjbHJlb3MgKCk7CglVbmdldGMgKGMsIGYpOwoJc2lnc2V0am1wIChyZXN0b3JlLCAxKTsKCVBhdXNlID0gMDsgc3RhcnR1cCA9IDA7CglpZiAoKG51bV9saW5lcyA9IGNvbW1hbmQgKE5VTEwsIGYpKSA9PSAwKQoJICAgIHJldHVybjsKCWlmIChoYXJkICYmIHByb21wdGxlbiA+IDApCgkJZXJhc2VwICgwKTsKCWlmIChub3Njcm9sbCAmJiBudW1fbGluZXMgPj0gZGxpbmVzKQoJewoJICAgIGlmIChjbHJlb2wpCgkJaG9tZSgpOwoJICAgIGVsc2UKCQlkb2NsZWFyICgpOwoJfQoJc2NyZWVuX3N0YXJ0LmxpbmUgPSBDdXJybGluZTsKCXNjcmVlbl9zdGFydC5jaHJjdHIgPSBGdGVsbCAoZik7CiAgICB9Cn0KCi8qCioqIENvbWUgaGVyZSBpZiBhIHF1aXQgc2lnbmFsIGlzIHJlY2VpdmVkCiovCgp2b2lkIG9ucXVpdChpbnQgZHVtbXkpIHsKICAgIHNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKICAgIGlmICghaW53YWl0KSB7CglwdXRjaGFyICgnXG4nKTsKCWlmICghc3RhcnR1cCkgewoJICAgIHNpZ25hbChTSUdRVUlULCBvbnF1aXQpOwoJICAgIHNpZ2xvbmdqbXAgKHJlc3RvcmUsIDEpOwoJfQoJZWxzZQoJICAgIFBhdXNlKys7CiAgICB9CiAgICBlbHNlIGlmICghZHVtX29wdCAmJiBub3RlbGwpIHsKCXByb21wdGxlbiArPSBmcHJpbnRmKHN0ZGVyciwgXygiW1VzZSBxIG9yIFEgdG8gcXVpdF0iKSk7Cglub3RlbGwgPSAwOwogICAgfQogICAgc2lnbmFsKFNJR1FVSVQsIG9ucXVpdCk7Cn0KCi8qCioqIENvbWUgaGVyZSBpZiBhIHNpZ25hbCBmb3IgYSB3aW5kb3cgc2l6ZSBjaGFuZ2UgaXMgcmVjZWl2ZWQKKi8KCiNpZmRlZiBTSUdXSU5DSAp2b2lkIGNoZ3dpbnN6KGludCBkdW1teSkgewogICAgc3RydWN0IHdpbnNpemUgd2luOwoKICAgICh2b2lkKSBzaWduYWwoU0lHV0lOQ0gsIFNJR19JR04pOwogICAgaWYgKGlvY3RsKGZpbGVubyhzdGRvdXQpLCBUSU9DR1dJTlNaLCAmd2luKSAhPSAtMSkgewoJaWYgKHdpbi53c19yb3cgIT0gMCkgewoJICAgIExwcCA9IHdpbi53c19yb3c7CgkgICAgbnNjcm9sbCA9IExwcC8yIC0gMTsKCSAgICBpZiAobnNjcm9sbCA8PSAwKQoJCW5zY3JvbGwgPSAxOwoJICAgIGRsaW5lcyA9IExwcCAtIDE7CS8qIHdhczogTHBwIC0gKG5vc2Nyb2xsID8gMSA6IDIpICovCgl9CglpZiAod2luLndzX2NvbCAhPSAwKQoJICAgIE1jb2wgPSB3aW4ud3NfY29sOwogICAgfQogICAgKHZvaWQpIHNpZ25hbChTSUdXSU5DSCwgY2hnd2luc3opOwp9CiNlbmRpZgoKLyoKKiogQ2xlYW4gdXAgdGVybWluYWwgc3RhdGUgYW5kIGV4aXQuIEFsc28gY29tZSBoZXJlIGlmIGludGVycnVwdCBzaWduYWwgcmVjZWl2ZWQKKi8KCnZvaWQgZW5kX2l0IChpbnQgZHVtbXkpIHsKICAgIHJlc2V0X3R0eSAoKTsKICAgIGlmIChjbHJlb2wpIHsKCXB1dGNoYXIgKCdccicpOwoJY2xyZW9zICgpOwoJZmZsdXNoIChzdGRvdXQpOwogICAgfQogICAgZWxzZSBpZiAoIWNscmVvbCAmJiAocHJvbXB0bGVuID4gMCkpIHsKCWtpbGxfbGluZSAoKTsKCWZmbHVzaCAoc3Rkb3V0KTsKICAgIH0KICAgIGVsc2UKCXB1dGNlcnIoJ1xuJyk7CiAgICBfZXhpdCgwKTsKfQoKdm9pZCBjb3B5X2ZpbGUocmVnaXN0ZXIgRklMRSAqZikgewogICAgcmVnaXN0ZXIgaW50IGM7CgogICAgd2hpbGUgKChjID0gZ2V0YyhmKSkgIT0gRU9GKQoJcHV0Y2hhcihjKTsKfQoKI2RlZmluZSByaW5nYmVsbCgpCXB1dGNlcnIoJ1wwMDcnKQoKLyogU2VlIHdoZXRoZXIgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBwYXRoIG5hbWUgInBhdGgiIGlzIGVxdWFsIHRvIHRoZQoqKiBzdHJpbmcgInN0cmluZyIKKi8KCnN0YXRpYyBpbnQgdGFpbGVxdSAoY2hhciAqcGF0aCwgcmVnaXN0ZXIgY2hhciAqc3RyaW5nKQp7CglyZWdpc3RlciBjaGFyICp0YWlsOwoKCXRhaWwgPSBwYXRoICsgc3RybGVuKHBhdGgpOwoJd2hpbGUgKC0tdGFpbCA+PSBwYXRoKQoJCWlmICgqdGFpbCA9PSAnLycpCgkJCWJyZWFrOwoJKyt0YWlsOwoJd2hpbGUgKCp0YWlsKysgPT0gKnN0cmluZysrKQoJCWlmICgqdGFpbCA9PSAnXDAnKQoJCQlyZXR1cm4oMSk7CglyZXR1cm4oMCk7Cn0KCnN0YXRpYyB2b2lkIHByb21wdCAoY2hhciAqZmlsZW5hbWUpCnsKICAgIGlmIChjbHJlb2wpCgljbGVhcmVvbCAoKTsKICAgIGVsc2UgaWYgKHByb21wdGxlbiA+IDApCglraWxsX2xpbmUgKCk7CiAgICBpZiAoIWhhcmQpIHsKCXByb21wdGxlbiA9IDA7CglpZiAoU2VudGVyICYmIFNleGl0KSB7CgkgICAgbXlfcHV0c3RyaW5nIChTZW50ZXIpOwoJICAgIHByb21wdGxlbiArPSAoMiAqIHNvZ2xpdGNoKTsKCX0KCWlmIChjbHJlb2wpCgkgICAgY2xlYXJlb2wgKCk7Cglwcm9tcHRsZW4gKz0gcHJpbnRmKF8oIi0tTW9yZS0tIikpOwoJaWYgKGZpbGVuYW1lICE9IE5VTEwpIHsKCSAgICBwcm9tcHRsZW4gKz0gcHJpbnRmKF8oIihOZXh0IGZpbGU6ICVzKSIpLCBmaWxlbmFtZSk7Cgl9IGVsc2UgaWYgKCFub19pbnR0eSkgewoJICAgIHByb21wdGxlbiArPSBwcmludGYoIiglZCUlKSIsIChpbnQpICgoZmlsZV9wb3MgKiAxMDApIC8gZmlsZV9zaXplKSk7Cgl9CglpZiAoZHVtX29wdCkgewoJICAgIHByb21wdGxlbiArPSBwcmludGYoXygiW1ByZXNzIHNwYWNlIHRvIGNvbnRpbnVlLCAncScgdG8gcXVpdC5dIikpOwoJfQoJaWYgKFNlbnRlciAmJiBTZXhpdCkKCSAgICBteV9wdXRzdHJpbmcgKFNleGl0KTsKCWlmIChjbHJlb2wpCgkgICAgY2xyZW9zICgpOwoJZmZsdXNoKHN0ZG91dCk7CiAgICB9CiAgICBlbHNlCglyaW5nYmVsbCgpOwogICAgaW53YWl0Kys7Cn0KCmludCBwcmVwYXJlX2xpbmVfYnVmZmVyKHZvaWQpCnsKICAgIGNoYXIgKm5saW5lOwogICAgc2l6ZV90IG5zeiA9IE1jb2wgKiA0OwoKICAgIGlmIChMaW5lTGVuID49IG5zeikKICAgICAgICByZXR1cm4gMDsKCiAgICBpZiAobnN6IDwgTElOU0laKQogICAgICAgIG5zeiA9IExJTlNJWjsKCiAgICBubGluZSA9IHJlYWxsb2MoTGluZSwgbnN6KTsKICAgIGlmIChubGluZSkgewogICAgICAgIExpbmUgPSBubGluZTsKICAgICAgICBMaW5lTGVuID0gbnN6OwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIGVycm9yKCkgdXNlcyBzaWdsb25nam1wKCksIHdlIHdhbnQgdG8gcmV0dXJuIGZyb20gdGhpcwogICAgICogZnVuY3Rpb24gd2hlbiB0aGUgTGluZSBidWZmZXIgaXMgaW5pdGlsaXplZCBmaXJzdCB0aW1lIGluIG1haW4oKQogICAgICovCiAgICBpZiAoTGluZSkKICAgICAgICBlcnJvcihfKCJvdXQgb2YgbWVtb3J5IikpOwogICAgcmV0dXJuIC0xOwp9CgovKgogKiBHZXQgYSBsb2dpY2FsIGxpbmUKICovCgppbnQgZ2V0X2xpbmUocmVnaXN0ZXIgRklMRSAqZiwgaW50ICpsZW5ndGgpCnsKICAgIGludAljOwogICAgY2hhciAqcDsKICAgIGludAljb2x1bW47CiAgICBzdGF0aWMgaW50IGNvbGZsZzsKCiNpZmRlZiBIQVZFX1dJREVDSEFSCiAgICBpbnQgaTsKICAgIHdjaGFyX3Qgd2M7CiAgICBpbnQgd2Nfd2lkdGg7CiAgICBtYnN0YXRlX3Qgc3RhdGUsIHN0YXRlX2JhazsJCS8qIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzdHJlYW0uICovCiAgICBjaGFyIG1iY1tNQl9MRU5fTUFYXTsJCS8qIEJ1ZmZlciBmb3Igb25lIG11bHRpYnl0ZSBjaGFyLiAqLwogICAgc2l6ZV90IG1ibGVuZ3RoOwkJCS8qIEJ5dGUgbGVuZ3RoIG9mIG11bHRpYnl0ZSBjaGFyLiAqLwogICAgc2l6ZV90IG1iY19wb3MgPSAwOwkJCS8qIFBvc3Rpb24gb2YgdGhlIE1CQy4gKi8KICAgIGludCB1c2VfbWJjX2J1ZmZlcl9mbGFnID0gMDsJLyogSWYgMSwgbWJjIGhhcyBkYXRhLiAqLwogICAgaW50IGJyZWFrX2ZsYWcgPSAwOwkJCS8qIElmIDEsIGV4aXQgd2hpbGUoKS4gKi8KICAgIGxvbmcgZmlsZV9wb3NfYmFrID0gRnRlbGwgKGYpOwoKICAgIG1lbXNldCAoJnN0YXRlLCAnXDAnLCBzaXplb2YgKG1ic3RhdGVfdCkpOwojZW5kaWYKCiAgICBwcmVwYXJlX2xpbmVfYnVmZmVyKCk7CgogICAgcCA9IExpbmU7CiAgICBjb2x1bW4gPSAwOwogICAgYyA9IEdldGMgKGYpOwogICAgaWYgKGNvbGZsZyAmJiBjID09ICdcbicpIHsKCUN1cnJsaW5lKys7CgljID0gR2V0YyAoZik7CiAgICB9CiAgICB3aGlsZSAocCA8ICZMaW5lW0xpbmVMZW4gLSAxXSkgewojaWZkZWYgSEFWRV9XSURFQ0hBUgoJaWYgKGZvbGRfb3B0ICYmIHVzZV9tYmNfYnVmZmVyX2ZsYWcgJiYgTUJfQ1VSX01BWCA+IDEpIHsKCSAgICB1c2VfbWJjX2J1ZmZlcl9mbGFnID0gMDsKCSAgICBzdGF0ZV9iYWsgPSBzdGF0ZTsKCSAgICBtYmNbbWJjX3BvcysrXSA9IGM7CnByb2Nlc3NfbWJjOgoJICAgIG1ibGVuZ3RoID0gbWJydG93YyAoJndjLCBtYmMsIG1iY19wb3MsICZzdGF0ZSk7CgoJICAgIHN3aXRjaCAobWJsZW5ndGgpIHsKCSAgICAgIGNhc2UgKHNpemVfdCktMjoJICAvKiBJbmNvbXBsZXRlIG11bHRpYnl0ZSBjaGFyYWN0ZXIuICovCgkJdXNlX21iY19idWZmZXJfZmxhZyA9IDE7CgkJc3RhdGUgPSBzdGF0ZV9iYWs7CgkJYnJlYWs7CgoJICAgICAgY2FzZSAoc2l6ZV90KS0xOgkgIC8qIEludmFsaWQgYXMgYSBtdWx0aWJ5dGUgY2hhcmFjdGVyLiAqLwoJCSpwKysgPSBtYmNbMF07CgkJc3RhdGUgPSBzdGF0ZV9iYWs7CgkJY29sdW1uKys7CgkJZmlsZV9wb3NfYmFrKys7CgkJCgkJaWYgKGNvbHVtbiA+PSBNY29sKSB7CgkJICAgIEZzZWVrIChmLCBmaWxlX3Bvc19iYWspOwoJCX0gZWxzZSB7CgkJICAgIG1lbW1vdmUgKG1iYywgbWJjICsgMSwgLS1tYmNfcG9zKTsKCQkgICAgaWYgKG1iY19wb3MgPiAwKSB7CgkJCW1iY1ttYmNfcG9zXSA9ICdcMCc7CgkJCWdvdG8gcHJvY2Vzc19tYmM7CgkJICAgIH0KCQl9CgkJYnJlYWs7CgoJICAgICAgZGVmYXVsdDoKCQl3Y193aWR0aCA9IHdjd2lkdGggKHdjKTsKCgkJaWYgKGNvbHVtbiArIHdjX3dpZHRoID4gTWNvbCkgewoJCSAgICBGc2VlayAoZiwgZmlsZV9wb3NfYmFrKTsKCQkgICAgYnJlYWtfZmxhZyA9IDE7CgkJfSBlbHNlIHsKCQkgICAgZm9yIChpID0gMDsgaSA8IG1iY19wb3M7IGkrKykKCQkgICAgICAqcCsrID0gbWJjW2ldOwoJCSAgICBpZiAod2Nfd2lkdGggPiAwKQoJCSAgICAgIGNvbHVtbiArPSB3Y193aWR0aDsKCQl9CgkgICAgfQoKCSAgICBpZiAoYnJlYWtfZmxhZyB8fCBjb2x1bW4gPj0gTWNvbCkKCSAgICAgIGJyZWFrOwoKCSAgICBjID0gR2V0YyAoZik7CgkgICAgY29udGludWU7Cgl9CiNlbmRpZiAKCWlmIChjID09IEVPRikgewoJICAgIGlmIChwID4gTGluZSkgewoJCSpwID0gJ1wwJzsKCQkqbGVuZ3RoID0gcCAtIExpbmU7CgkJcmV0dXJuIChjb2x1bW4pOwoJICAgIH0KCSAgICAqbGVuZ3RoID0gcCAtIExpbmU7CgkgICAgcmV0dXJuIChFT0YpOwoJfQoJaWYgKGMgPT0gJ1xuJykgewoJICAgIEN1cnJsaW5lKys7CgkgICAgYnJlYWs7Cgl9CgoJKnArKyA9IGM7CiNpZiAwCglpZiAoYyA9PSAnXDAzMycpIHsgICAgICAvKiBFU0MgKi8KCQljID0gR2V0YyhmKTsKCQl3aGlsZSAoYyA+ICcgJyAmJiBjIDwgJzAnICYmIHAgPCAmTGluZVtMaW5lTGVuIC0gMV0pIHsKCQkJKnArKyA9IGM7CgkJCWMgPSBHZXRjKGYpOwoJCX0KCQlpZiAoYyA+PSAnMCcgJiYgYyA8ICdcMTc3JyAmJiBwIDwgJkxpbmVbTGluZUxlbiAtIDFdKSB7CgkJCSpwKysgPSBjOwoJCQljID0gR2V0YyhmKTsKCQkJY29udGludWU7CgkJfQoJfQojZW5kaWYKCWlmIChjID09ICdcdCcpIHsKCSAgICBpZiAoIWhhcmR0YWJzIHx8IChjb2x1bW4gPCBwcm9tcHRsZW4gJiYgIWhhcmQpKSB7CgkJaWYgKGhhcmR0YWJzICYmIGVyYXNlbG4gJiYgIWR1bWIpIHsKCQkgICAgY29sdW1uID0gMSArIChjb2x1bW4gfCA3KTsKCQkgICAgbXlfcHV0c3RyaW5nIChlcmFzZWxuKTsKCQkgICAgcHJvbXB0bGVuID0gMDsKCQl9CgkJZWxzZSB7CgkJICAgIGZvciAoLS1wOyBwIDwgJkxpbmVbTGluZUxlbiAtIDFdOykgewoJCQkqcCsrID0gJyAnOwoJCQlpZiAoKCsrY29sdW1uICYgNykgPT0gMCkKCQkJICAgIGJyZWFrOwoJCSAgICB9CgkJICAgIGlmIChjb2x1bW4gPj0gcHJvbXB0bGVuKSBwcm9tcHRsZW4gPSAwOwoJCX0KCSAgICB9IGVsc2UKCQljb2x1bW4gPSAxICsgKGNvbHVtbiB8IDcpOwoJfSBlbHNlIGlmIChjID09ICdcYicgJiYgY29sdW1uID4gMCkgewoJICAgIGNvbHVtbi0tOwoJfSBlbHNlIGlmIChjID09ICdccicpIHsKCSAgICBpbnQgbmV4dCA9IEdldGMoZik7CgkgICAgaWYgKG5leHQgPT0gJ1xuJykgewoJCXAtLTsKCQlDdXJybGluZSsrOwoJCWJyZWFrOwoJICAgIH0KCSAgICBVbmdldGMobmV4dCxmKTsKCSAgICBjb2x1bW4gPSAwOwoJfSBlbHNlIGlmIChjID09ICdcZicgJiYgc3RvcF9vcHQpIHsKCQlwWy0xXSA9ICdeJzsKCQkqcCsrID0gJ0wnOwoJCWNvbHVtbiArPSAyOwoJCVBhdXNlKys7Cgl9IGVsc2UgaWYgKGMgPT0gRU9GKSB7CgkgICAgKmxlbmd0aCA9IHAgLSBMaW5lOwoJICAgIHJldHVybiAoY29sdW1uKTsKCX0gZWxzZSB7CiNpZmRlZiBIQVZFX1dJREVDSEFSCgkgICAgaWYgKGZvbGRfb3B0ICYmIE1CX0NVUl9NQVggPiAxKSB7CgkJbWVtc2V0IChtYmMsICdcMCcsIE1CX0xFTl9NQVgpOwoJCW1iY19wb3MgPSAwOwoJCW1iY1ttYmNfcG9zKytdID0gYzsKCQlzdGF0ZV9iYWsgPSBzdGF0ZTsKCgkJbWJsZW5ndGggPSBtYnJ0b3djICgmd2MsIG1iYywgbWJjX3BvcywgJnN0YXRlKTsKCgkJLyogVGhlIHZhbHVlIG9mIG1ibGVuZ3RoIGlzIGFsd2F5cyBsZXNzIHRoYW4gMiBoZXJlLiAqLwoJCXN3aXRjaCAobWJsZW5ndGgpIHsKCQkgIGNhc2UgKHNpemVfdCktMjoKCQkgICAgcC0tOwoJCSAgICBmaWxlX3Bvc19iYWsgPSBGdGVsbCAoZikgLSAxOwoJCSAgICBzdGF0ZSA9IHN0YXRlX2JhazsKCQkgICAgdXNlX21iY19idWZmZXJfZmxhZyA9IDE7CgkJICAgIGJyZWFrOwoKCQkgIGNhc2UgKHNpemVfdCktMToKCQkgICAgc3RhdGUgPSBzdGF0ZV9iYWs7CgkJICAgIGNvbHVtbisrOwoJCSAgICBicmVhazsKCgkJICBkZWZhdWx0OgoJCSAgICB3Y193aWR0aCA9IHdjd2lkdGggKHdjKTsKCQkgICAgaWYgKHdjX3dpZHRoID4gMCkKCQkgICAgICBjb2x1bW4gKz0gd2Nfd2lkdGg7CgkJfQoJICAgIH0gZWxzZQojZW5kaWYKCSAgICAgIHsKCQlpZiAoaXNwcmludChjKSkKCQkgICBjb2x1bW4rKzsKCSAgICAgIH0KCX0KCglpZiAoY29sdW1uID49IE1jb2wgJiYgZm9sZF9vcHQpCgkJYnJlYWs7CgljID0gR2V0YyAoZik7CiAgICB9CiAgICBpZiAoY29sdW1uID49IE1jb2wgJiYgTWNvbCA+IDApIHsKCWlmICghV3JhcCkgewoJICAgICpwKysgPSAnXG4nOwoJfQogICAgfQogICAgY29sZmxnID0gY29sdW1uID09IE1jb2wgJiYgZm9sZF9vcHQ7CiAgICBpZiAoY29sZmxnICYmIGVhdG5sICYmIFdyYXApIHsKCSpwKysgPSAnXG4nOyAvKiBzaW11bGF0ZSBub3JtYWwgd3JhcCAqLwogICAgfQogICAgKmxlbmd0aCA9IHAgLSBMaW5lOwogICAgKnAgPSAwOwogICAgcmV0dXJuIChjb2x1bW4pOwp9CgovKgoqKiBFcmFzZSB0aGUgcmVzdCBvZiB0aGUgcHJvbXB0LCBhc3N1bWluZyB3ZSBhcmUgc3RhcnRpbmcgYXQgY29sdW1uIGNvbC4KKi8KCnZvaWQgZXJhc2VwIChyZWdpc3RlciBpbnQgY29sKQp7CgogICAgaWYgKHByb21wdGxlbiA9PSAwKQoJcmV0dXJuOwogICAgaWYgKGhhcmQpIHsKCXB1dGNoYXIgKCdcbicpOwogICAgfQogICAgZWxzZSB7CglpZiAoY29sID09IDApCgkgICAgcHV0Y2hhciAoJ1xyJyk7CglpZiAoIWR1bWIgJiYgZXJhc2VsbikKCSAgICBteV9wdXRzdHJpbmcgKGVyYXNlbG4pOwoJZWxzZQoJICAgIGZvciAoY29sID0gcHJvbXB0bGVuIC0gY29sOyBjb2wgPiAwOyBjb2wtLSkKCQlwdXRjaGFyICgnICcpOwogICAgfQogICAgcHJvbXB0bGVuID0gMDsKfQoKLyoKKiogRXJhc2UgdGhlIGN1cnJlbnQgbGluZSBlbnRpcmVseQoqLwoKdm9pZCBraWxsX2xpbmUoKQp7CiAgICBlcmFzZXAoMCk7CiAgICBpZiAoIWVyYXNlbG4gfHwgZHVtYikKCXB1dGNoYXIoJ1xyJyk7Cn0KCi8qCiAqIGZvcmNlIGNsZWFyIHRvIGVuZCBvZiBsaW5lCiAqLwp2b2lkIGNsZWFyZW9sKCkKewogICAgbXlfcHV0c3RyaW5nKGVyYXNlbG4pOwp9Cgp2b2lkIGNscmVvcygpCnsKICAgIG15X3B1dHN0cmluZyhFb2RDbHIpOwp9CgovKiBQcmludCBhIGJ1ZmZlciBvZiBuIGNoYXJhY3RlcnMgKi8KCnZvaWQgcHJidWYgKHJlZ2lzdGVyIGNoYXIgKnMsIHJlZ2lzdGVyIGludCBuKQp7CiAgICByZWdpc3RlciBjaGFyIGM7CQkJLyogbmV4dCBvdXRwdXQgY2hhcmFjdGVyICovCiAgICByZWdpc3RlciBpbnQgc3RhdGU7CQkJLyogbmV4dCBvdXRwdXQgY2hhcidzIFVMIHN0YXRlICovCiNkZWZpbmUgd291bGR1bChzLG4pCSgobikgPj0gMiAmJiAoKChzKVswXSA9PSAnXycgJiYgKHMpWzFdID09ICdcYicpIHx8ICgocylbMV0gPT0gJ1xiJyAmJiAocylbMl0gPT0gJ18nKSkpCgogICAgd2hpbGUgKC0tbiA+PSAwKQoJaWYgKCF1bF9vcHQpCgkgICAgcHV0Y2hhciAoKnMrKyk7CgllbHNlIHsKCSAgICBpZiAoKnMgPT0gJyAnICYmIHBzdGF0ZSA9PSAwICYmIHVsZ2xpdGNoICYmIHdvdWxkdWwocysxLCBuLTEpKSB7CgkJcysrOwoJCWNvbnRpbnVlOwoJICAgIH0KCSAgICBpZiAoKHN0YXRlID0gd291bGR1bChzLCBuKSkgIT0gMCkgewoJCWMgPSAoKnMgPT0gJ18nKT8gc1syXSA6ICpzIDsKCQluIC09IDI7CgkJcyArPSAzOwoJICAgIH0gZWxzZQoJCWMgPSAqcysrOwoJICAgIGlmIChzdGF0ZSAhPSBwc3RhdGUpIHsKCQlpZiAoYyA9PSAnICcgJiYgc3RhdGUgPT0gMCAmJiB1bGdsaXRjaCAmJiB3b3VsZHVsKHMsIG4tMSkpCgkJICAgIHN0YXRlID0gMTsKCQllbHNlCgkJICAgIG15X3B1dHN0cmluZyhzdGF0ZSA/IFVMZW50ZXIgOiBVTGV4aXQpOwoJICAgIH0KCSAgICBpZiAoYyAhPSAnICcgfHwgcHN0YXRlID09IDAgfHwgc3RhdGUgIT0gMCB8fCB1bGdsaXRjaCA9PSAwKQojaWZkZWYgSEFWRV9XSURFQ0hBUgoJICAgIHsKCQl3Y2hhcl90IHdjOwoJCXNpemVfdCBtYmxlbmd0aDsKCQltYnN0YXRlX3Qgc3RhdGU7CgkJbWVtc2V0ICgmc3RhdGUsICdcMCcsIHNpemVvZiAobWJzdGF0ZV90KSk7CgkJcy0tOyBuKys7CgkJbWJsZW5ndGggPSBtYnJ0b3djICgmd2MsIHMsIG4sICZzdGF0ZSk7CgkJaWYgKG1ibGVuZ3RoID09IChzaXplX3QpIC0yIHx8IG1ibGVuZ3RoID09IChzaXplX3QpIC0xKQoJCQltYmxlbmd0aCA9IDE7CgkJd2hpbGUgKG1ibGVuZ3RoLS0pCgkJCXB1dGNoYXIgKCpzKyspOwoJCW4gKz0gbWJsZW5ndGg7CgkgICAgfQojZWxzZQoJICAgICAgICBwdXRjaGFyKGMpOwojZW5kaWYgLyogSEFWRV9XSURFQ0hBUiAqLwoJICAgIGlmIChzdGF0ZSAmJiAqY2hVTCkgewoJCXB1dHNvdXQoY2hCUyk7CgkJbXlfcHV0c3RyaW5nKGNoVUwpOwoJICAgIH0KCSAgICBwc3RhdGUgPSBzdGF0ZTsKCX0KfQoKLyoKKiogIENsZWFyIHRoZSBzY3JlZW4KKi8Kdm9pZApkb2NsZWFyKCkKewogICAgaWYgKENsZWFyICYmICFoYXJkKSB7CglteV9wdXRzdHJpbmcoQ2xlYXIpOwoKCS8qIFB1dCBvdXQgY2FycmlhZ2UgcmV0dXJuIHNvIHRoYXQgc3lzdGVtIGRvZXNuJ3QKCSoqIGdldCBjb25mdXNlZCBieSBlc2NhcGUgc2VxdWVuY2VzIHdoZW4gZXhwYW5kaW5nIHRhYnMKCSovCglwdXRjaGFyICgnXHInKTsKCXByb21wdGxlbiA9IDA7CiAgICB9Cn0KCi8qCiAqIEdvIHRvIGhvbWUgcG9zaXRpb24KICovCnZvaWQKaG9tZSgpCnsKICAgIG15X3B1dHN0cmluZyhIb21lKTsKfQoKc3RhdGljIGludCBsYXN0Y21kLCBsYXN0YXJnLCBsYXN0cDsKc3RhdGljIGludCBsYXN0Y29sb247CmNoYXIgc2hlbGxfbGluZVsxMDAwXTsKCi8qCioqIFJlYWQgYSBjb21tYW5kIGFuZCBkbyBpdC4gQSBjb21tYW5kIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsIGludGVnZXIKKiogYXJndW1lbnQgZm9sbG93ZWQgYnkgdGhlIGNvbW1hbmQgY2hhcmFjdGVyLiAgUmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMKKiogdG8gZGlzcGxheSBpbiB0aGUgbmV4dCBzY3JlZW5mdWwuICBJZiB0aGVyZSBpcyBub3RoaW5nIG1vcmUgdG8gZGlzcGxheQoqKiBpbiB0aGUgY3VycmVudCBmaWxlLCB6ZXJvIGlzIHJldHVybmVkLgoqLwoKaW50IGNvbW1hbmQgKGNoYXIgKmZpbGVuYW1lLCByZWdpc3RlciBGSUxFICpmKQp7CiAgICByZWdpc3RlciBpbnQgbmxpbmVzOwogICAgcmVnaXN0ZXIgaW50IHJldHZhbCA9IDA7CiAgICByZWdpc3RlciBpbnQgYzsKICAgIGNoYXIgY29sb25jaDsKICAgIGludCBkb25lOwogICAgY2hhciBjb21jaGFyLCBjbWRidWZbODBdOwoKI2RlZmluZSByZXQodmFsKSByZXR2YWw9dmFsO2RvbmUrKzticmVhawoKICAgIGRvbmUgPSAwOwogICAgaWYgKCFlcnJvcnMpCglwcm9tcHQgKGZpbGVuYW1lKTsKICAgIGVsc2UKCWVycm9ycyA9IDA7CiAgICBmb3IgKDs7KSB7CglubGluZXMgPSBudW1iZXIgKCZjb21jaGFyKTsKCWxhc3RwID0gY29sb25jaCA9IDA7CglpZiAoY29tY2hhciA9PSAnLicpIHsJLyogUmVwZWF0IGxhc3QgY29tbWFuZCAqLwoJCWxhc3RwKys7CgkJY29tY2hhciA9IGxhc3RjbWQ7CgkJbmxpbmVzID0gbGFzdGFyZzsKCQlpZiAobGFzdGNtZCA9PSAnOicpCgkJCWNvbG9uY2ggPSBsYXN0Y29sb247Cgl9CglsYXN0Y21kID0gY29tY2hhcjsKCWxhc3RhcmcgPSBubGluZXM7CglpZiAoKGNjX3QpIGNvbWNoYXIgPT0gb3R0eS5jX2NjW1ZFUkFTRV0pIHsKCSAgICBraWxsX2xpbmUgKCk7CgkgICAgcHJvbXB0IChmaWxlbmFtZSk7CgkgICAgY29udGludWU7Cgl9Cglzd2l0Y2ggKGNvbWNoYXIpIHsKCWNhc2UgJzonOgoJICAgIHJldHZhbCA9IGNvbG9uIChmaWxlbmFtZSwgY29sb25jaCwgbmxpbmVzKTsKCSAgICBpZiAocmV0dmFsID49IDApCgkJZG9uZSsrOwoJICAgIGJyZWFrOwoJY2FzZSAnYic6CgljYXNlIGN0cmwoJ0InKToKCSAgICB7CgkJcmVnaXN0ZXIgaW50IGluaXRsaW5lOwoKCQlpZiAobm9faW50dHkpIHsKCQkgICAgcmluZ2JlbGwoKTsKCQkgICAgcmV0dXJuICgtMSk7CgkJfQoKCQlpZiAobmxpbmVzID09IDApIG5saW5lcysrOwoKCQlwdXRjaGFyICgnXHInKTsKCQllcmFzZXAgKDApOwoJCXB1dGNoYXIoJ1xuJyk7CgkJaWYgKGNscmVvbCkKCQkJY2xlYXJlb2wgKCk7CgkJaWYgKG5saW5lcyAhPSAxKQoJCQlwcmludGYoXygiLi4uYmFjayAlZCBwYWdlcyIpLCBubGluZXMpOwoJCWVsc2UKCQkJcHV0c291dChfKCIuLi5iYWNrIDEgcGFnZSIpKTsKCQlpZiAoY2xyZW9sKQoJCQljbGVhcmVvbCAoKTsKCQlwdXRjaGFyKCdcbicpOwoKCQlpbml0bGluZSA9IEN1cnJsaW5lIC0gZGxpbmVzICogKG5saW5lcyArIDEpOwoJCWlmICghIG5vc2Nyb2xsKQoJCSAgICAtLWluaXRsaW5lOwoJCWlmIChpbml0bGluZSA8IDApIGluaXRsaW5lID0gMDsKCQlGc2VlayhmLCAwTCk7CgkJQ3VycmxpbmUgPSAwOwkvKiBza2lwbG5zKCkgd2lsbCBtYWtlIEN1cnJsaW5lIGNvcnJlY3QgKi8KCQlza2lwbG5zKGluaXRsaW5lLCBmKTsKCQlpZiAoISBub3Njcm9sbCkgewoJCSAgICByZXQoZGxpbmVzICsgMSk7CgkJfQoJCWVsc2UgewoJCSAgICByZXQoZGxpbmVzKTsKCQl9CgkgICAgfQoJY2FzZSAnICc6CgljYXNlICd6JzoKCSAgICBpZiAobmxpbmVzID09IDApIG5saW5lcyA9IGRsaW5lczsKCSAgICBlbHNlIGlmIChjb21jaGFyID09ICd6JykgZGxpbmVzID0gbmxpbmVzOwoJICAgIHJldCAobmxpbmVzKTsKCWNhc2UgJ2QnOgoJY2FzZSBjdHJsKCdEJyk6CgkgICAgaWYgKG5saW5lcyAhPSAwKSBuc2Nyb2xsID0gbmxpbmVzOwoJICAgIHJldCAobnNjcm9sbCk7CgljYXNlICdxJzoKCWNhc2UgJ1EnOgoJICAgIGVuZF9pdCAoMCk7CgljYXNlICdzJzoKCWNhc2UgJ2YnOgoJY2FzZSBjdHJsKCdGJyk6CgkgICAgaWYgKG5saW5lcyA9PSAwKSBubGluZXMrKzsKCSAgICBpZiAoY29tY2hhciA9PSAnZicpCgkJbmxpbmVzICo9IGRsaW5lczsKCSAgICBwdXRjaGFyICgnXHInKTsKCSAgICBlcmFzZXAgKDApOwoJICAgIHB1dGNoYXIoJ1xuJyk7CgkgICAgaWYgKGNscmVvbCkKCQljbGVhcmVvbCAoKTsKCSAgICBpZiAobmxpbmVzID09IDEpCgkJICAgIHB1dHNvdXQoXygiLi4uc2tpcHBpbmcgb25lIGxpbmUiKSk7CgkgICAgZWxzZQoJCSAgICBwcmludGYoXygiLi4uc2tpcHBpbmcgJWQgbGluZXMiKSwgbmxpbmVzKTsKCgkgICAgaWYgKGNscmVvbCkKCQljbGVhcmVvbCAoKTsKCSAgICBwdXRjaGFyKCdcbicpOwoKCSAgICB3aGlsZSAobmxpbmVzID4gMCkgewoJCXdoaWxlICgoYyA9IEdldGMgKGYpKSAhPSAnXG4nKQoJCSAgICBpZiAoYyA9PSBFT0YpIHsKCQkJcmV0dmFsID0gMDsKCQkJZG9uZSsrOwoJCQlnb3RvIGVuZHN3OwoJCSAgICB9CgkJICAgIEN1cnJsaW5lKys7CgkJICAgIG5saW5lcy0tOwoJICAgIH0KCSAgICByZXQgKGRsaW5lcyk7CgljYXNlICdcbic6CgkgICAgaWYgKG5saW5lcyAhPSAwKQoJCWRsaW5lcyA9IG5saW5lczsKCSAgICBlbHNlCgkJbmxpbmVzID0gMTsKCSAgICByZXQgKG5saW5lcyk7CgljYXNlICdcZic6CgkgICAgaWYgKCFub19pbnR0eSkgewoJCWRvY2xlYXIgKCk7CgkJRnNlZWsgKGYsIHNjcmVlbl9zdGFydC5jaHJjdHIpOwoJCUN1cnJsaW5lID0gc2NyZWVuX3N0YXJ0LmxpbmU7CgkJcmV0IChkbGluZXMpOwoJICAgIH0KCSAgICBlbHNlIHsKCQlyaW5nYmVsbCgpOwoJCWJyZWFrOwoJICAgIH0KCWNhc2UgJ1wnJzoKCSAgICBpZiAoIW5vX2ludHR5KSB7CgkJa2lsbF9saW5lICgpOwoJCXB1dHNvdXQoXygiXG4qKipCYWNrKioqXG5cbiIpKTsKCQlGc2VlayAoZiwgY29udGV4dC5jaHJjdHIpOwoJCUN1cnJsaW5lID0gY29udGV4dC5saW5lOwoJCXJldCAoZGxpbmVzKTsKCSAgICB9CgkgICAgZWxzZSB7CgkJcmluZ2JlbGwoKTsKCQlicmVhazsKCSAgICB9CgljYXNlICc9JzoKCSAgICBraWxsX2xpbmUgKCk7CgkgICAgcHJvbXB0bGVuID0gcHJpbnRmKCIlZCIsIEN1cnJsaW5lKTsKCSAgICBmZmx1c2ggKHN0ZG91dCk7CgkgICAgYnJlYWs7CgljYXNlICduJzoKCSAgICBsYXN0cCsrOwoJY2FzZSAnLyc6CgkgICAgaWYgKG5saW5lcyA9PSAwKSBubGluZXMrKzsKCSAgICBraWxsX2xpbmUgKCk7CgkgICAgcHV0Y2hhcignLycpOwoJICAgIHByb21wdGxlbiA9IDE7CgkgICAgZmZsdXNoIChzdGRvdXQpOwoJICAgIGlmIChsYXN0cCkgewoJCXB1dGNlcnIoJ1xyJyk7CgkJc2VhcmNoIChOVUxMLCBmLCBubGluZXMpOwkvKiBVc2UgcHJldmlvdXMgci5lLiAqLwoJICAgIH0KCSAgICBlbHNlIHsKCQl0dHlpbiAoY21kYnVmLCBzaXplb2YoY21kYnVmKS0yLCAnLycpOwoJCXB1dGNlcnIoJ1xyJyk7CgkJc2VhcmNoIChjbWRidWYsIGYsIG5saW5lcyk7CgkgICAgfQoJICAgIHJldCAoZGxpbmVzLTEpOwoJY2FzZSAnISc6CgkgICAgZG9fc2hlbGwgKGZpbGVuYW1lKTsKCSAgICBicmVhazsKCWNhc2UgJz8nOgoJY2FzZSAnaCc6CgkgICAgaWYgKG5vc2Nyb2xsKSBkb2NsZWFyKCk7CgkgICAgcHV0c291dChfKCJcbiIKIk1vc3QgY29tbWFuZHMgb3B0aW9uYWxseSBwcmVjZWRlZCBieSBpbnRlZ2VyIGFyZ3VtZW50IGsuICAiCiJEZWZhdWx0cyBpbiBicmFja2V0cy5cbiIKIlN0YXIgKCopIGluZGljYXRlcyBhcmd1bWVudCBiZWNvbWVzIG5ldyBkZWZhdWx0LlxuIikpOwoJICAgIHB1dHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoJICAgIHB1dHNvdXQoXygKIjxzcGFjZT4gICAgICAgICAgICAgICAgIERpc3BsYXkgbmV4dCBrIGxpbmVzIG9mIHRleHQgW2N1cnJlbnQgc2NyZWVuIHNpemVdXG4iCiJ6ICAgICAgICAgICAgICAgICAgICAgICBEaXNwbGF5IG5leHQgayBsaW5lcyBvZiB0ZXh0IFtjdXJyZW50IHNjcmVlbiBzaXplXSpcbiIKIjxyZXR1cm4+ICAgICAgICAgICAgICAgIERpc3BsYXkgbmV4dCBrIGxpbmVzIG9mIHRleHQgWzFdKlxuIgoiZCBvciBjdHJsLUQgICAgICAgICAgICAgU2Nyb2xsIGsgbGluZXMgW2N1cnJlbnQgc2Nyb2xsIHNpemUsIGluaXRpYWxseSAxMV0qXG4iCiJxIG9yIFEgb3IgPGludGVycnVwdD4gICBFeGl0IGZyb20gbW9yZVxuIgoicyAgICAgICAgICAgICAgICAgICAgICAgU2tpcCBmb3J3YXJkIGsgbGluZXMgb2YgdGV4dCBbMV1cbiIKImYgICAgICAgICAgICAgICAgICAgICAgIFNraXAgZm9yd2FyZCBrIHNjcmVlbmZ1bHMgb2YgdGV4dCBbMV1cbiIKImIgb3IgY3RybC1CICAgICAgICAgICAgIFNraXAgYmFja3dhcmRzIGsgc2NyZWVuZnVscyBvZiB0ZXh0IFsxXVxuIgoiJyAgICAgICAgICAgICAgICAgICAgICAgR28gdG8gcGxhY2Ugd2hlcmUgcHJldmlvdXMgc2VhcmNoIHN0YXJ0ZWRcbiIKIj0gICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgY3VycmVudCBsaW5lIG51bWJlclxuIgoiLzxyZWd1bGFyIGV4cHJlc3Npb24+ICAgU2VhcmNoIGZvciBrdGggb2NjdXJyZW5jZSBvZiByZWd1bGFyIGV4cHJlc3Npb24gWzFdXG4iCiJuICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggZm9yIGt0aCBvY2N1cnJlbmNlIG9mIGxhc3Qgci5lIFsxXVxuIgoiITxjbWQ+IG9yIDohPGNtZD4gICAgICAgRXhlY3V0ZSA8Y21kPiBpbiBhIHN1YnNoZWxsXG4iCiJ2ICAgICAgICAgICAgICAgICAgICAgICBTdGFydCB1cCAvdXNyL2Jpbi92aSBhdCBjdXJyZW50IGxpbmVcbiIKImN0cmwtTCAgICAgICAgICAgICAgICAgIFJlZHJhdyBzY3JlZW5cbiIKIjpuICAgICAgICAgICAgICAgICAgICAgIEdvIHRvIGt0aCBuZXh0IGZpbGUgWzFdXG4iCiI6cCAgICAgICAgICAgICAgICAgICAgICBHbyB0byBrdGggcHJldmlvdXMgZmlsZSBbMV1cbiIKIjpmICAgICAgICAgICAgICAgICAgICAgIERpc3BsYXkgY3VycmVudCBmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyXG4iCiIuICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXQgcHJldmlvdXMgY29tbWFuZFxuIikpOwoJICAgIHB1dHMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKCQkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOwoJICAgIHByb21wdChmaWxlbmFtZSk7CgkgICAgYnJlYWs7CgljYXNlICd2JzoJLyogVGhpcyBjYXNlIHNob3VsZCBnbyByaWdodCBiZWZvcmUgZGVmYXVsdCAqLwoJICAgIGlmICghbm9faW50dHkpIHsKCQkgICAgLyoKCQkgICAgICogRWFybGllcjogY2FsbCB2aSArbiBmaWxlLiBUaGlzIGFsc28gd29ya3MgZm9yIGVtYWNzLgoJCSAgICAgKiBQT1NJWDogY2FsbCB2aSAtYyBuIGZpbGUgKHdoZW4gZWRpdG9yIGlzIHZpIG9yIGV4KS4KCQkgICAgICovCgkJICAgIGNoYXIgKmVkaXRvciwgKnA7CgkJICAgIGludCBuID0gKEN1cnJsaW5lIC0gZGxpbmVzIDw9IDAgPyAxIDoKCQkJICAgICBDdXJybGluZSAtIChkbGluZXMgKyAxKSAvIDIpOwoJCSAgICBpbnQgc3BsaXQgPSAwOwoKCQkgICAgZWRpdG9yID0gZ2V0ZW52KCJWSVNVQUwiKTsKCQkgICAgaWYgKGVkaXRvciA9PSBOVUxMIHx8ICplZGl0b3IgPT0gJ1wwJykKCQkJICAgIGVkaXRvciA9IGdldGVudigiRURJVE9SIik7CgkJICAgIGlmIChlZGl0b3IgPT0gTlVMTCB8fCAqZWRpdG9yID09ICdcMCcpCgkJCSAgICBlZGl0b3IgPSBWSTsKCgkJICAgIHAgPSBzdHJyY2hyKGVkaXRvciwgJy8nKTsKCQkgICAgaWYgKHApCgkJCSAgICBwKys7CgkJICAgIGVsc2UKCQkJICAgIHAgPSBlZGl0b3I7CgkJICAgIGlmICghc3RyY21wKHAsICJ2aSIpIHx8ICFzdHJjbXAocCwgImV4IikpIHsKCQkJICAgIHNwcmludGYoY21kYnVmLCAiLWMgJWQiLCBuKTsKCQkJICAgIHNwbGl0ID0gMTsKCQkgICAgfSBlbHNlIHsKCQkJICAgIHNwcmludGYoY21kYnVmLCAiKyVkIiwgbik7CgkJICAgIH0KCgkJICAgIGtpbGxfbGluZSgpOwoJCSAgICBwcmludGYoIiVzICVzICVzIiwgZWRpdG9yLCBjbWRidWYsIGZuYW1lc1tmbnVtXSk7CgkJICAgIGlmIChzcGxpdCkgewoJCQkgICAgY21kYnVmWzJdID0gMDsKCQkJICAgIGV4ZWN1dGUoZmlsZW5hbWUsIGVkaXRvciwgZWRpdG9yLCBjbWRidWYsCgkJCQkgICAgY21kYnVmKzMsIGZuYW1lc1tmbnVtXSwgKGNoYXIgKikwKTsKCQkgICAgfSBlbHNlCgkJCSAgICBleGVjdXRlKGZpbGVuYW1lLCBlZGl0b3IsIGVkaXRvciwKCQkJCSAgICBjbWRidWYsIGZuYW1lc1tmbnVtXSwgKGNoYXIgKikwKTsKCQkgICAgYnJlYWs7CgkgICAgfQoJICAgIC8qIGZhbGwgdGhyb3VnaCAqLwoJZGVmYXVsdDoKCSAgICBpZiAoZHVtX29wdCkgewogICAJCWtpbGxfbGluZSAoKTsKCQlpZiAoU2VudGVyICYmIFNleGl0KSB7CgkJICAgIG15X3B1dHN0cmluZyAoU2VudGVyKTsKCQkgICAgcHJvbXB0bGVuID0gcHJpbnRmKF8oIltQcmVzcyAnaCcgZm9yIGluc3RydWN0aW9ucy5dIikpCgkJCSAgICArIDIgKiBzb2dsaXRjaDsKCQkgICAgbXlfcHV0c3RyaW5nIChTZXhpdCk7CgkJfQoJCWVsc2UKCQkgICAgcHJvbXB0bGVuID0gcHJpbnRmKF8oIltQcmVzcyAnaCcgZm9yIGluc3RydWN0aW9ucy5dIikpOwoJCWZmbHVzaCAoc3Rkb3V0KTsKCSAgICB9CgkgICAgZWxzZQoJCXJpbmdiZWxsKCk7CgkgICAgYnJlYWs7Cgl9CglpZiAoZG9uZSkgYnJlYWs7CiAgICB9CiAgICBwdXRjaGFyICgnXHInKTsKZW5kc3c6CiAgICBpbndhaXQgPSAwOwogICAgbm90ZWxsKys7CiAgICByZXR1cm4gKHJldHZhbCk7Cn0KCnN0YXRpYyBjaGFyIGNoOwoKLyoKICogRXhlY3V0ZSBhIGNvbG9uLXByZWZpeGVkIGNvbW1hbmQuCiAqIFJldHVybnMgPDAgaWYgbm90IGEgY29tbWFuZCB0aGF0IHNob3VsZCBjYXVzZQogKiBtb3JlIG9mIHRoZSBmaWxlIHRvIGJlIHByaW50ZWQuCiAqLwoKaW50IGNvbG9uIChjaGFyICpmaWxlbmFtZSwgaW50IGNtZCwgaW50IG5saW5lcykgewoJaWYgKGNtZCA9PSAwKQoJCWNoID0gcmVhZGNoICgpOwoJZWxzZQoJCWNoID0gY21kOwoJbGFzdGNvbG9uID0gY2g7Cglzd2l0Y2ggKGNoKSB7CgljYXNlICdmJzoKCQlraWxsX2xpbmUgKCk7CgkJaWYgKCFub19pbnR0eSkKCQkJcHJvbXB0bGVuID0gcHJpbnRmKF8oIlwiJXNcIiBsaW5lICVkIiksIGZuYW1lc1tmbnVtXSwgQ3VycmxpbmUpOwoJCWVsc2UKCQkJcHJvbXB0bGVuID0gcHJpbnRmKF8oIltOb3QgYSBmaWxlXSBsaW5lICVkIiksIEN1cnJsaW5lKTsKCQlmZmx1c2ggKHN0ZG91dCk7CgkJcmV0dXJuICgtMSk7CgljYXNlICduJzoKCQlpZiAobmxpbmVzID09IDApIHsKCQkJaWYgKGZudW0gPj0gbmZpbGVzIC0gMSkKCQkJCWVuZF9pdCAoMCk7CgkJCW5saW5lcysrOwoJCX0KCQlwdXRjaGFyICgnXHInKTsKCQllcmFzZXAgKDApOwoJCXNraXBmIChubGluZXMpOwoJCXJldHVybiAoMCk7CgljYXNlICdwJzoKCQlpZiAobm9faW50dHkpIHsKCQkJcmluZ2JlbGwoKTsKCQkJcmV0dXJuICgtMSk7CgkJfQoJCXB1dGNoYXIgKCdccicpOwoJCWVyYXNlcCAoMCk7CgkJaWYgKG5saW5lcyA9PSAwKQoJCQlubGluZXMrKzsKCQlza2lwZiAoLW5saW5lcyk7CgkJcmV0dXJuICgwKTsKCWNhc2UgJyEnOgoJCWRvX3NoZWxsIChmaWxlbmFtZSk7CgkJcmV0dXJuICgtMSk7CgljYXNlICdxJzoKCWNhc2UgJ1EnOgoJCWVuZF9pdCAoMCk7CglkZWZhdWx0OgoJCXJpbmdiZWxsKCk7CgkJcmV0dXJuICgtMSk7Cgl9Cn0KCi8qCioqIFJlYWQgYSBkZWNpbWFsIG51bWJlciBmcm9tIHRoZSB0ZXJtaW5hbC4gU2V0IGNtZCB0byB0aGUgbm9uLWRpZ2l0IHdoaWNoCioqIHRlcm1pbmF0ZXMgdGhlIG51bWJlci4KKi8KCmludCBudW1iZXIoY2hhciAqY21kKQp7CglyZWdpc3RlciBpbnQgaTsKCglpID0gMDsgY2ggPSBvdHR5LmNfY2NbVktJTExdOwoJZm9yICg7OykgewoJCWNoID0gcmVhZGNoICgpOwoJCWlmIChpc2RpZ2l0KGNoKSkKCQkJaSA9IGkqMTAgKyBjaCAtICcwJzsKCQllbHNlIGlmICgoY2NfdCkgY2ggPT0gb3R0eS5jX2NjW1ZLSUxMXSkKCQkJaSA9IDA7CgkJZWxzZSB7CgkJCSpjbWQgPSBjaDsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuIChpKTsKfQoKdm9pZCBkb19zaGVsbCAoY2hhciAqZmlsZW5hbWUpCnsKCWNoYXIgY21kYnVmWzIwMF07CglpbnQgcmM7CgljaGFyICpleHBhbmRlZDsKCglraWxsX2xpbmUgKCk7CglwdXRjaGFyKCchJyk7CglmZmx1c2ggKHN0ZG91dCk7Cglwcm9tcHRsZW4gPSAxOwoJaWYgKGxhc3RwKQoJCXB1dHNvdXQoc2hlbGxfbGluZSk7CgllbHNlIHsKCQl0dHlpbiAoY21kYnVmLCBzaXplb2YoY21kYnVmKS0yLCAnIScpOwoJCWV4cGFuZGVkID0gMDsKCQlyYyA9IGV4cGFuZCAoJmV4cGFuZGVkLCBjbWRidWYpOwoJCWlmIChleHBhbmRlZCkgewoJCQlpZiAoc3RybGVuKGV4cGFuZGVkKSA8IHNpemVvZihzaGVsbF9saW5lKSkKCQkJCXN0cmNweShzaGVsbF9saW5lLCBleHBhbmRlZCk7CgkJCWVsc2UKCQkJCXJjID0gLTE7CgkJCWZyZWUoZXhwYW5kZWQpOwoJCX0KCQlpZiAocmMgPCAwKSB7CgkJCXB1dHNlcnIoXygiICBPdmVyZmxvd1xuIikpOwoJCQlwcm9tcHQgKGZpbGVuYW1lKTsKCQkJcmV0dXJuOwoJCX0gZWxzZSBpZiAocmMgPiAwKSB7CgkJCWtpbGxfbGluZSAoKTsKCQkJcHJvbXB0bGVuID0gcHJpbnRmKCIhJXMiLCBzaGVsbF9saW5lKTsKCQl9Cgl9CglmZmx1c2ggKHN0ZG91dCk7CglwdXRjZXJyKCdcbicpOwoJcHJvbXB0bGVuID0gMDsKCXNoZWxscCA9IDE7CglleGVjdXRlIChmaWxlbmFtZSwgc2hlbGwsIHNoZWxsLCAiLWMiLCBzaGVsbF9saW5lLCAwKTsKfQoKLyoKKiogU2VhcmNoIGZvciBudGggb2N1cnJlbmNlIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb250YWluZWQgaW4gYnVmIGluIHRoZSBmaWxlCiovCgp2b2lkIHNlYXJjaChjaGFyIGJ1ZltdLCBGSUxFICpmaWxlLCByZWdpc3RlciBpbnQgbikKewogICAgbG9uZyBzdGFydGxpbmUgPSBGdGVsbCAoZmlsZSk7CiAgICByZWdpc3RlciBsb25nIGxpbmUxID0gc3RhcnRsaW5lOwogICAgcmVnaXN0ZXIgbG9uZyBsaW5lMiA9IHN0YXJ0bGluZTsKICAgIHJlZ2lzdGVyIGxvbmcgbGluZTMgPSBzdGFydGxpbmU7CiAgICByZWdpc3RlciBpbnQgbG5jb3VudDsKICAgIGludCBzYXZlbG4sIHJ2OwogICAgY2hhciAqczsKCiAgICBjb250ZXh0LmxpbmUgPSBzYXZlbG4gPSBDdXJybGluZTsKICAgIGNvbnRleHQuY2hyY3RyID0gc3RhcnRsaW5lOwogICAgbG5jb3VudCA9IDA7CiAgICBpZiAoKHMgPSByZV9jb21wIChidWYpKSAhPSAwKQoJZXJyb3IgKHMpOwogICAgd2hpbGUgKCFmZW9mIChmaWxlKSkgewoJbGluZTMgPSBsaW5lMjsKCWxpbmUyID0gbGluZTE7CglsaW5lMSA9IEZ0ZWxsIChmaWxlKTsKCXJkbGluZSAoZmlsZSk7CglsbmNvdW50Kys7CglpZiAoKHJ2ID0gcmVfZXhlYyAoTGluZSkpID09IDEpIHsKCQlpZiAoLS1uID09IDApIHsKCQkgICAgaWYgKGxuY291bnQgPiAzIHx8IChsbmNvdW50ID4gMSAmJiBub19pbnR0eSkpCgkJICAgIHsKCQkJcHV0Y2hhcignXG4nKTsKCQkJaWYgKGNscmVvbCkKCQkJICAgIGNsZWFyZW9sICgpOwoJCQlwdXRzb3V0KF8oIi4uLnNraXBwaW5nXG4iKSk7CgkJICAgIH0KCQkgICAgaWYgKCFub19pbnR0eSkgewoJCQlDdXJybGluZSAtPSAobG5jb3VudCA+PSAzID8gMyA6IGxuY291bnQpOwoJCQlGc2VlayAoZmlsZSwgbGluZTMpOwoJCQlpZiAobm9zY3JvbGwpIHsKCQkJICAgIGlmIChjbHJlb2wpIHsKCQkJCWhvbWUgKCk7CgkJCQljbGVhcmVvbCAoKTsKCQkJICAgIH0KCQkJICAgIGVsc2UKCQkJCWRvY2xlYXIgKCk7CgkJCX0KCQkgICAgfQoJCSAgICBlbHNlIHsKCQkJa2lsbF9saW5lICgpOwoJCQlpZiAobm9zY3JvbGwpIHsKCQkJICAgIGlmIChjbHJlb2wpIHsKCQkJICAgICAgICBob21lICgpOwoJCQkgICAgICAgIGNsZWFyZW9sICgpOwoJCQkgICAgfQoJCQkgICAgZWxzZQoJCQkJZG9jbGVhciAoKTsKCQkJfQoJCQlwdXRzKExpbmUpOwoJCSAgICB9CgkJICAgIGJyZWFrOwoJCX0KCX0gZWxzZSBpZiAocnYgPT0gLTEpCgkgICAgZXJyb3IgKF8oIlJlZ3VsYXIgZXhwcmVzc2lvbiBib3RjaCIpKTsKICAgIH0KICAgIGlmIChmZW9mIChmaWxlKSkgewoJaWYgKCFub19pbnR0eSkgewoJICAgIEN1cnJsaW5lID0gc2F2ZWxuOwoJICAgIEZzZWVrIChmaWxlLCBzdGFydGxpbmUpOwoJfQoJZWxzZSB7CgkgICAgcHV0c291dChfKCJcblBhdHRlcm4gbm90IGZvdW5kXG4iKSk7CgkgICAgZW5kX2l0ICgwKTsKCX0KCWVycm9yIChfKCJQYXR0ZXJuIG5vdCBmb3VuZCIpKTsKICAgIH0KfQoKLypWQVJBUkdTMiovCnZvaWQgZXhlY3V0ZSAoY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNtZCwgLi4uKQp7CglpbnQgaWQ7CglpbnQgbjsKCXZhX2xpc3QgYXJncDsKCWNoYXIgKiBhcmc7CiAJY2hhciAqKiBhcmdzOwoJaW50IGFyZ2NvdW50OwoKCWZmbHVzaCAoc3Rkb3V0KTsKCXJlc2V0X3R0eSAoKTsKCWZvciAobiA9IDEwOyAoaWQgPSBmb3JrICgpKSA8IDAgJiYgbiA+IDA7IG4tLSkKCSAgICBzbGVlcCAoNSk7CglpZiAoaWQgPT0gMCkgewoJICAgIGlmICghaXNhdHR5KDApKSB7CgkJY2xvc2UoMCk7CgkJb3BlbigiL2Rldi90dHkiLCAwKTsKCSAgICB9CgoJICAgIHZhX3N0YXJ0KGFyZ3AsIGNtZCk7CgkgICAgYXJnID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CgkgICAgYXJnY291bnQgPSAwOwoJICAgIHdoaWxlIChhcmcpIHsKCQlhcmdjb3VudCsrOwoJICAgICAgICBhcmcgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKCSAgICB9CgkgICAgdmFfZW5kKGFyZ3ApOwoKCSAgICBhcmdzID0gYWxsb2NhKHNpemVvZihjaGFyICopICogKGFyZ2NvdW50ICsgMSkpOwoJICAgIGFyZ3NbYXJnY291bnRdID0gTlVMTDsKCSAgICAKCSAgICB2YV9zdGFydChhcmdwLCBjbWQpOwoJICAgIGFyZyA9IHZhX2FyZyhhcmdwLCBjaGFyICopOwoJICAgIGFyZ2NvdW50ID0gMDsKCSAgICB3aGlsZSAoYXJnKSB7CgkJYXJnc1thcmdjb3VudF0gPSBhcmc7CgkJYXJnY291bnQrKzsKCSAgICAgICAgYXJnID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CgkgICAgfQoJICAgIHZhX2VuZChhcmdwKTsKCQoJICAgIGV4ZWN2cCAoY21kLCBhcmdzKTsKCSAgICBwdXRzZXJyKF8oImV4ZWMgZmFpbGVkXG4iKSk7CgkgICAgZXhpdCAoMSk7Cgl9CglpZiAoaWQgPiAwKSB7CgkgICAgc2lnbmFsIChTSUdJTlQsIFNJR19JR04pOwoJICAgIHNpZ25hbCAoU0lHUVVJVCwgU0lHX0lHTik7CgkgICAgaWYgKGNhdGNoX3N1c3ApCgkJc2lnbmFsKFNJR1RTVFAsIFNJR19ERkwpOwoJICAgIHdoaWxlICh3YWl0KDApID4gMCk7CgkgICAgc2lnbmFsIChTSUdJTlQsIGVuZF9pdCk7CgkgICAgc2lnbmFsIChTSUdRVUlULCBvbnF1aXQpOwoJICAgIGlmIChjYXRjaF9zdXNwKQoJCXNpZ25hbChTSUdUU1RQLCBvbnN1c3ApOwoJfSBlbHNlCgkgICAgcHV0c2VycihfKCJjYW4ndCBmb3JrXG4iKSk7CglzZXRfdHR5ICgpOwoJcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7Cglwcm9tcHQgKGZpbGVuYW1lKTsKfQovKgoqKiBTa2lwIG4gbGluZXMgaW4gdGhlIGZpbGUgZgoqLwoKdm9pZCBza2lwbG5zIChyZWdpc3RlciBpbnQgbiwgcmVnaXN0ZXIgRklMRSAqZikKewogICAgcmVnaXN0ZXIgaW50IGM7CgogICAgd2hpbGUgKG4gPiAwKSB7Cgl3aGlsZSAoKGMgPSBHZXRjIChmKSkgIT0gJ1xuJykKCSAgICBpZiAoYyA9PSBFT0YpCgkJcmV0dXJuOwoJICAgIG4tLTsKCSAgICBDdXJybGluZSsrOwogICAgfQp9CgovKgoqKiBTa2lwIG5za2lwIGZpbGVzIGluIHRoZSBmaWxlIGxpc3QgKGZyb20gdGhlIGNvbW1hbmQgbGluZSkuIE5za2lwIG1heSBiZQoqKiBuZWdhdGl2ZS4KKi8KCnZvaWQgc2tpcGYgKHJlZ2lzdGVyIGludCBuc2tpcCkKewogICAgaWYgKG5za2lwID09IDApIHJldHVybjsKICAgIGlmIChuc2tpcCA+IDApIHsKCWlmIChmbnVtICsgbnNraXAgPiBuZmlsZXMgLSAxKQoJICAgIG5za2lwID0gbmZpbGVzIC0gZm51bSAtIDE7CiAgICB9CiAgICBlbHNlIGlmICh3aXRoaW4pCgkrK2ZudW07CiAgICBmbnVtICs9IG5za2lwOwogICAgaWYgKGZudW0gPCAwKQoJZm51bSA9IDA7CiAgICBwdXRzKF8oIlxuLi4uU2tpcHBpbmcgIikpOwogICAgaWYgKGNscmVvbCkKCWNsZWFyZW9sICgpOwogICAgaWYgKG5za2lwID4gMCkKCSAgICBwdXRzb3V0KF8oIi4uLlNraXBwaW5nIHRvIGZpbGUgIikpOwogICAgZWxzZQoJICAgIHB1dHNvdXQoXygiLi4uU2tpcHBpbmcgYmFjayB0byBmaWxlICIpKTsKICAgIHB1dHMoZm5hbWVzW2ZudW1dKTsKICAgIGlmIChjbHJlb2wpCgljbGVhcmVvbCAoKTsKICAgIHB1dGNoYXIoJ1xuJyk7CiAgICAtLWZudW07Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVGVybWluYWwgSS9PIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKdm9pZCBpbml0dGVybSgpCnsKICAgIGludAkJcmV0OwogICAgY2hhcgkqcGFkc3RyOwogICAgY2hhcgkqdGVybTsKICAgIHN0cnVjdCB3aW5zaXplIHdpbjsKCiNpZmRlZiBkb19TSUdUVE9VCnJldHJ5OgojZW5kaWYKICAgIG5vX3R0eSA9IHRjZ2V0YXR0cihmaWxlbm8oc3Rkb3V0KSwgJm90dHkpOwogICAgaWYgKCFub190dHkpIHsJCglkb2NydGVyYXNlID0gKG90dHkuY19jY1tWRVJBU0VdICE9IDI1NSk7Cglkb2NydGtpbGwgPSAgKG90dHkuY19jY1tWS0lMTF0gIT0gMjU1KTsKI2lmZGVmIGRvX1NJR1RUT1UKCXsKCSAgICBpbnQgdGdycDsKCSAgICAvKgoJICAgICAqIFdhaXQgdW50aWwgd2UncmUgaW4gdGhlIGZvcmVncm91bmQgYmVmb3JlIHdlIHNhdmUgdGhlCgkgICAgICogdGhlIHRlcm1pbmFsIG1vZGVzLgoJICAgICAqLwoJICAgIGlmICgodGdycCA9IHRjZ2V0cGdycChmaWxlbm8oc3Rkb3V0KSkpIDwgMCkgewoJCXBlcnJvcigidGNnZXRwZ3JwIik7CgkJZXhpdCgxKTsKCSAgICB9CgkgICAgaWYgKHRncnAgIT0gZ2V0cGdycCgwKSkgewoJCWtpbGwoMCwgU0lHVFRPVSk7CgkJZ290byByZXRyeTsKCSAgICB9Cgl9CiNlbmRpZgoJaWYgKCh0ZXJtID0gZ2V0ZW52KCJURVJNIikpID09IDApIHsKCSAgICBkdW1iKys7IHVsX29wdCA9IDA7Cgl9CiAgICAgICAgbXlfc2V0dXB0ZXJtKHRlcm0sIDEsICZyZXQpOwoJaWYgKHJldCA8PSAwKSB7CgkgICAgZHVtYisrOyB1bF9vcHQgPSAwOwoJfQoJZWxzZSB7CiNpZmRlZiBUSU9DR1dJTlNaCgkgICAgaWYgKGlvY3RsKGZpbGVubyhzdGRvdXQpLCBUSU9DR1dJTlNaLCAmd2luKSA8IDApIHsKI2VuZGlmCgkJTHBwID0gbXlfdGdldG51bSgibGkiLCJsaW5lcyIpOwoJCU1jb2wgPSBteV90Z2V0bnVtKCJjbyIsImNvbHMiKTsKI2lmZGVmIFRJT0NHV0lOU1oKCSAgICB9IGVsc2UgewoJCWlmICgoTHBwID0gd2luLndzX3JvdykgPT0gMCkKCQkgICAgTHBwID0gbXlfdGdldG51bSgibGkiLCJsaW5lcyIpOwoJCWlmICgoTWNvbCA9IHdpbi53c19jb2wpID09IDApCgkJICAgIE1jb2wgPSBteV90Z2V0bnVtKCJjbyIsImNvbHMiKTsKCSAgICB9CiNlbmRpZgoJICAgIGlmICgoTHBwIDw9IDApIHx8IG15X3RnZXRmbGFnKCJoYyIsImhjIikpIHsKCQloYXJkKys7CS8qIEhhcmQgY29weSB0ZXJtaW5hbCAqLwoJCUxwcCA9IDI0OwoJICAgIH0KCgkgICAgaWYgKG15X3RnZXRmbGFnKCJ4biIsInhlbmwiKSkKCQllYXRubCsrOyAvKiBFYXQgbmV3bGluZSBhdCBsYXN0IGNvbHVtbiArIDE7IGRlYywgY29uY2VwdCAqLwoJICAgIGlmIChNY29sIDw9IDApCgkJTWNvbCA9IDgwOwoKCSAgICBpZiAodGFpbGVxdSAoZm5hbWVzWzBdLCAicGFnZSIpKQoJCW5vc2Nyb2xsKys7CgkgICAgV3JhcCA9IG15X3RnZXRmbGFnKCJhbSIsImFtIik7CgkgICAgYmFkX3NvID0gbXlfdGdldGZsYWcgKCJ4cyIsInhocCIpOwoJICAgIGVyYXNlbG4gPSBteV90Z2V0c3RyKCJjZSIsImVsIik7CgkgICAgQ2xlYXIgPSBteV90Z2V0c3RyKCJjbCIsImNsZWFyIik7CgkgICAgU2VudGVyID0gbXlfdGdldHN0cigic28iLCJzbXNvIik7CgkgICAgU2V4aXQgPSBteV90Z2V0c3RyKCJzZSIsInJtc28iKTsKCSAgICBpZiAoKHNvZ2xpdGNoID0gbXlfdGdldG51bSgic2ciLCJ4bWMiKSkgPCAwKQoJCXNvZ2xpdGNoID0gMDsKCgkgICAgLyoKCSAgICAgKiAgU2V0IHVwIGZvciB1bmRlcmxpbmluZzogIHNvbWUgdGVybWluYWxzIGRvbid0IG5lZWQgaXQ7CgkgICAgICogIG90aGVycyBoYXZlIHN0YXJ0L3N0b3Agc2VxdWVuY2VzLCBzdGlsbCBvdGhlcnMgaGF2ZSBhbgoJICAgICAqICB1bmRlcmxpbmUgY2hhciBzZXF1ZW5jZSB3aGljaCBpcyBhc3N1bWVkIHRvIG1vdmUgdGhlCgkgICAgICogIGN1cnNvciBmb3J3YXJkIG9uZSBjaGFyYWN0ZXIuICBJZiB1bmRlcmxpbmUgc2VxdWVuY2UKCSAgICAgKiAgaXNuJ3QgYXZhaWxhYmxlLCBzZXR0bGUgZm9yIHN0YW5kb3V0IHNlcXVlbmNlLgoJICAgICAqLwoKCSAgICBpZiAobXlfdGdldGZsYWcoInVsIiwidWwiKSB8fCBteV90Z2V0ZmxhZygib3MiLCJvcyIpKQoJCXVsX29wdCA9IDA7CgkgICAgaWYgKChjaFVMID0gbXlfdGdldHN0cigidWMiLCJ1YyIpKSA9PSBOVUxMICkKCQljaFVMID0gIiI7CgkgICAgaWYgKCgoVUxlbnRlciA9IG15X3RnZXRzdHIoInVzIiwic211bCIpKSA9PSBOVUxMIHx8CgkgICAgICAgICAoVUxleGl0ID0gbXlfdGdldHN0cigidWUiLCJybXVsIikpID09IE5VTEwpICYmICEqY2hVTCkgewoJICAgICAgICBpZiAoKFVMZW50ZXIgPSBTZW50ZXIpID09IE5VTEwgfHwgKFVMZXhpdCA9IFNleGl0KSA9PSBOVUxMKSB7CgkJCVVMZW50ZXIgPSAiIjsKCQkJVUxleGl0ID0gIiI7CgkJfSBlbHNlCgkJCXVsZ2xpdGNoID0gc29nbGl0Y2g7CgkgICAgfSBlbHNlIHsKCQl1bGdsaXRjaCA9IDA7CgkgICAgfQoKCSAgICBpZiAoKHBhZHN0ciA9IG15X3RnZXRzdHIoInBjIiwicGFkIikpICE9IE5VTEwpCgkJUEMgPSAqcGFkc3RyOwoJICAgIEhvbWUgPSBteV90Z2V0c3RyKCJobyIsImhvbWUiKTsKCSAgICBpZiAoSG9tZSA9PSAwIHx8ICpIb21lID09ICdcMCcpIHsKCQlpZiAoKGN1cnNvcm0gPSBteV90Z2V0c3RyKCJjbSIsImN1cCIpKSAhPSBOVUxMKSB7CgkJICAgIGNvbnN0IGNoYXIgKnQgPSAoY29uc3QgY2hhciAqKW15X3Rnb3RvKGN1cnNvcm0sIDAsIDApOwoJCSAgICB4c3RybmNweShjdXJzb3Job21lLCB0LCBzaXplb2YoY3Vyc29yaG9tZSkpOwoJCSAgICBIb21lID0gY3Vyc29yaG9tZTsKCQl9CgkgICAgfQoJICAgIEVvZENsciA9IG15X3RnZXRzdHIoImNkIiwiZWQiKTsKCSAgICBpZiAoKGNoQlMgPSBteV90Z2V0c3RyKCJsZSIsImN1YjEiKSkgPT0gTlVMTCkKCQljaEJTID0gIlxiIjsKCgl9CglpZiAoKHNoZWxsID0gZ2V0ZW52KCJTSEVMTCIpKSA9PSBOVUxMKQoJICAgIHNoZWxsID0gIi9iaW4vc2giOwogICAgfQogICAgbm9faW50dHkgPSB0Y2dldGF0dHIoZmlsZW5vKHN0ZGluKSwgJm90dHkpOwogICAgdGNnZXRhdHRyKGZpbGVubyhzdGRlcnIpLCAmb3R0eSk7CiAgICBzYXZldHR5MCA9IG90dHk7CiAgICBzbG93X3R0eSA9IGNmZ2V0aXNwZWVkKCZvdHR5KSA8IEIxMjAwOwogICAgaGFyZHRhYnMgPSAob3R0eS5jX29mbGFnICYgVEFCRExZKSAhPSBYVEFCUzsKICAgIGlmICghbm9fdHR5KSB7CglvdHR5LmNfbGZsYWcgJj0gfihJQ0FOT058RUNITyk7CglvdHR5LmNfY2NbVk1JTl0gPSAxOwoJb3R0eS5jX2NjW1ZUSU1FXSA9IDA7CiAgICB9Cn0KCmludCByZWFkY2ggKCkgewoJdW5zaWduZWQgY2hhciBjOwoKCWVycm5vID0gMDsKCWlmIChyZWFkIChmaWxlbm8oc3RkZXJyKSwgJmMsIDEpIDw9IDApIHsKCQlpZiAoZXJybm8gIT0gRUlOVFIpCgkJCWVuZF9pdCgwKTsKCQllbHNlCgkJCWMgPSBvdHR5LmNfY2NbVktJTExdOwoJfQoJcmV0dXJuIChjKTsKfQoKc3RhdGljIGNoYXIgKkJTID0gIlxiIjsKc3RhdGljIGNoYXIgKkJTQiA9ICJcYiBcYiI7CnN0YXRpYyBjaGFyICpDQVJBVCA9ICJeIjsKI2RlZmluZSBFUkFTRU9ORUNPTFVNTiBcCiAgICBpZiAoZG9jcnRlcmFzZSkgXAoJcHV0c2VycihCU0IpOyBcCiAgICBlbHNlIFwKCXB1dHNlcnIoQlMpOwoKdm9pZCB0dHlpbiAoY2hhciBidWZbXSwgcmVnaXN0ZXIgaW50IG5tYXgsIGNoYXIgcGNoYXIpIHsKICAgIGNoYXIgKnNwOwogICAgaW50IGM7CiAgICBpbnQgc2xhc2ggPSAwOwogICAgaW50CW1heGxlbjsKCiAgICBzcCA9IGJ1ZjsKICAgIG1heGxlbiA9IDA7CiAgICB3aGlsZSAoc3AgLSBidWYgPCBubWF4KSB7CglpZiAocHJvbXB0bGVuID4gbWF4bGVuKSBtYXhsZW4gPSBwcm9tcHRsZW47CgljID0gcmVhZGNoICgpOwoJaWYgKGMgPT0gJ1xcJykgewoJICAgIHNsYXNoKys7Cgl9CgllbHNlIGlmICgoKGNjX3QpIGMgPT0gb3R0eS5jX2NjW1ZFUkFTRV0pICYmICFzbGFzaCkgewoJICAgIGlmIChzcCA+IGJ1ZikgewojaWZkZWYgSEFWRV9XSURFQ0hBUgoJCWlmIChNQl9DVVJfTUFYID4gMSkKCQkgIHsKCQkgICAgd2NoYXJfdCB3YzsKCQkgICAgc2l6ZV90IHBvcyA9IDAsIG1ibGVuZ3RoOwoJCSAgICBtYnN0YXRlX3Qgc3RhdGUsIHN0YXRlX2JhazsKCgkJICAgIG1lbXNldCAoJnN0YXRlLCAnXDAnLCBzaXplb2YgKG1ic3RhdGVfdCkpOwoKCQkgICAgd2hpbGUgKDEpIHsKCQkJIHN0YXRlX2JhayA9IHN0YXRlOwoJCQkgbWJsZW5ndGggPSBtYnJ0b3djICgmd2MsIGJ1ZiArIHBvcywgc3AgLSBidWYsICZzdGF0ZSk7CgoJCQkgc3RhdGUgPSAobWJsZW5ndGggPT0gKHNpemVfdCktMgoJCQkJIHx8IG1ibGVuZ3RoID09IChzaXplX3QpLTEpID8gc3RhdGVfYmFrIDogc3RhdGU7CgkJCSBtYmxlbmd0aCA9IChtYmxlbmd0aCA9PSAoc2l6ZV90KS0yCgkJCQkgICAgIHx8IG1ibGVuZ3RoID09IChzaXplX3QpLTEKCQkJCSAgICAgfHwgbWJsZW5ndGggPT0gMCkgPyAxIDogbWJsZW5ndGg7CgoJCQkgaWYgKGJ1ZiArIHBvcyArIG1ibGVuZ3RoID49IHNwKQoJCQkgYnJlYWs7CgoJCQkgcG9zICs9IG1ibGVuZ3RoOwoJCSAgICB9CgoJCSAgICBpZiAobWJsZW5ndGggPT0gMSkgewoJCSAgICAgIEVSQVNFT05FQ09MVU1OCgkJICAgIH0KCQkgICAgZWxzZSB7CgkJCWludCB3Y193aWR0aDsKCQkJd2Nfd2lkdGggPSB3Y3dpZHRoICh3Yyk7CgkJCXdjX3dpZHRoID0gKHdjX3dpZHRoIDwgMSkgPyAxIDogd2Nfd2lkdGg7CgkJCXdoaWxlICh3Y193aWR0aC0tKSB7CgkJCSAgICBFUkFTRU9ORUNPTFVNTgoJCQl9CgkJICAgIH0KCgkJICAgIHdoaWxlIChtYmxlbmd0aC0tKSB7CgkJCS0tcHJvbXB0bGVuOwoJCQktLXNwOwoJCSAgICB9CgkJICB9CgkJZWxzZQojZW5kaWYKCQkgIHsKCQkgICAgLS1wcm9tcHRsZW47CgkJICAgIEVSQVNFT05FQ09MVU1OCgkJICAgIC0tc3A7CgkJICB9CgoJCWlmICgoKnNwIDwgJyAnICYmICpzcCAhPSAnXG4nKSB8fCAqc3AgPT0gUlVCT1VUKSB7CgkJICAgIC0tcHJvbXB0bGVuOwoJCSAgICBFUkFTRU9ORUNPTFVNTgoJCX0KCQljb250aW51ZTsKCSAgICB9CgkgICAgZWxzZSB7CgkJaWYgKCFlcmFzZWxuKSBwcm9tcHRsZW4gPSBtYXhsZW47CgkJc2lnbG9uZ2ptcCAocmVzdG9yZSwgMSk7CgkgICAgfQoJfQoJZWxzZSBpZiAoKChjY190KSBjID09IG90dHkuY19jY1tWS0lMTF0pICYmICFzbGFzaCkgewoJICAgIGlmIChoYXJkKSB7CgkJc2hvdyAoYyk7CgkJcHV0Y2hhciAoJ1xuJyk7CgkJcHV0Y2hhciAocGNoYXIpOwoJICAgIH0KCSAgICBlbHNlIHsKCQlwdXRjaGFyICgnXHInKTsKCQlwdXRjaGFyIChwY2hhcik7CgkJaWYgKGVyYXNlbG4pCgkJICAgIGVyYXNlcCAoMSk7CgkJZWxzZSBpZiAoZG9jcnRraWxsKQoJCSAgICB3aGlsZSAocHJvbXB0bGVuLS0gPiAxKQoJCQlwdXRzZXJyKEJTQik7CgkJcHJvbXB0bGVuID0gMTsKCSAgICB9CgkgICAgc3AgPSBidWY7CgkgICAgZmZsdXNoIChzdGRvdXQpOwoJICAgIGNvbnRpbnVlOwoJfQoJaWYgKHNsYXNoICYmICgoY2NfdCkgYyA9PSBvdHR5LmNfY2NbVktJTExdCgkJICAgfHwgKGNjX3QpIGMgPT0gb3R0eS5jX2NjW1ZFUkFTRV0pKSB7CgkgICAgRVJBU0VPTkVDT0xVTU4KCSAgICAtLXNwOwoJfQoJaWYgKGMgIT0gJ1xcJykKCSAgICBzbGFzaCA9IDA7Cgkqc3ArKyA9IGM7CglpZiAoKGMgPCAnICcgJiYgYyAhPSAnXG4nICYmIGMgIT0gRVNDKSB8fCBjID09IFJVQk9VVCkgewoJICAgIGMgKz0gKGMgPT0gUlVCT1VUKSA/IC0wMTAwIDogMDEwMDsKCSAgICBwdXRzZXJyKENBUkFUKTsKCSAgICBwcm9tcHRsZW4rKzsKCX0KCWlmIChjICE9ICdcbicgJiYgYyAhPSBFU0MpIHsKCSAgICBwdXRjZXJyKGMpOwoJICAgIHByb21wdGxlbisrOwoJfQoJZWxzZQoJICAgIGJyZWFrOwogICAgfQogICAgKi0tc3AgPSAnXDAnOwogICAgaWYgKCFlcmFzZWxuKSBwcm9tcHRsZW4gPSBtYXhsZW47CiAgICBpZiAoc3AgLSBidWYgPj0gbm1heCAtIDEpCgllcnJvciAoXygiTGluZSB0b28gbG9uZyIpKTsKfQoKLyogcmV0dXJuOiAwIC0gdW5jaGFuZ2VkLCAxIC0gY2hhbmdlZCwgLTEgLSBvdmVyZmxvdyAodW5jaGFuZ2VkKSAqLwppbnQgZXhwYW5kIChjaGFyICoqb3V0YnVmLCBjaGFyICppbmJ1ZikgewogICAgY2hhciAqaW5wc3RyOwogICAgY2hhciAqb3V0c3RyOwogICAgY2hhciBjOwogICAgY2hhciAqdGVtcDsKICAgIGludCBjaGFuZ2VkID0gMDsKICAgIGludCB0ZW1wc3osIHh0cmEsIG9mZnNldDsKCiAgICB4dHJhID0gc3RybGVuIChmbmFtZXNbZm51bV0pICsgc3RybGVuIChzaGVsbF9saW5lKSArIDE7CiAgICB0ZW1wc3ogPSAyMDAgKyB4dHJhOwogICAgdGVtcCA9IG1hbGxvYyh0ZW1wc3opOwogICAgaWYgKCF0ZW1wKSB7CgkgICAgZXJyb3IgKF8oIk91dCBvZiBtZW1vcnkiKSk7CgkgICAgcmV0dXJuIC0xOwogICAgfQogICAgaW5wc3RyID0gaW5idWY7CiAgICBvdXRzdHIgPSB0ZW1wOwogICAgd2hpbGUgKChjID0gKmlucHN0cisrKSAhPSAnXDAnKXsKCW9mZnNldCA9IG91dHN0ci10ZW1wOwoJaWYgKHRlbXBzei1vZmZzZXQtMSA8IHh0cmEpIHsKCQl0ZW1wc3ogKz0gMjAwICsgeHRyYTsKCQl0ZW1wID0gcmVhbGxvYyh0ZW1wLCB0ZW1wc3opOwoJCWlmICghdGVtcCkgewoJCQllcnJvciAoXygiT3V0IG9mIG1lbW9yeSIpKTsKCQkJcmV0dXJuIC0xOwoJCX0KCQlvdXRzdHIgPSB0ZW1wICsgb2Zmc2V0OwoJfQoJc3dpdGNoIChjKSB7CgljYXNlICclJzoKCSAgICBpZiAoIW5vX2ludHR5KSB7CgkJc3RyY3B5IChvdXRzdHIsIGZuYW1lc1tmbnVtXSk7CgkJb3V0c3RyICs9IHN0cmxlbiAoZm5hbWVzW2ZudW1dKTsKCQljaGFuZ2VkKys7CgkgICAgfSBlbHNlCgkJKm91dHN0cisrID0gYzsKCSAgICBicmVhazsKCWNhc2UgJyEnOgoJICAgIGlmICghc2hlbGxwKQoJCWVycm9yIChfKCJObyBwcmV2aW91cyBjb21tYW5kIHRvIHN1YnN0aXR1dGUgZm9yIikpOwoJICAgIHN0cmNweSAob3V0c3RyLCBzaGVsbF9saW5lKTsKCSAgICBvdXRzdHIgKz0gc3RybGVuIChzaGVsbF9saW5lKTsKCSAgICBjaGFuZ2VkKys7CgkgICAgYnJlYWs7CgljYXNlICdcXCc6CgkgICAgaWYgKCppbnBzdHIgPT0gJyUnIHx8ICppbnBzdHIgPT0gJyEnKSB7CgkJKm91dHN0cisrID0gKmlucHN0cisrOwoJCWJyZWFrOwoJICAgIH0KCWRlZmF1bHQ6CgkgICAgKm91dHN0cisrID0gYzsKCX0KICAgIH0KICAgICpvdXRzdHIrKyA9ICdcMCc7CiAgICAqb3V0YnVmID0gdGVtcDsKICAgIHJldHVybiAoY2hhbmdlZCk7Cn0KCnZvaWQgc2hvdyAoY2hhciBjKSB7CiAgICBpZiAoKGMgPCAnICcgJiYgYyAhPSAnXG4nICYmIGMgIT0gRVNDKSB8fCBjID09IFJVQk9VVCkgewoJYyArPSAoYyA9PSBSVUJPVVQpID8gLTAxMDAgOiAwMTAwOwoJcHV0c2VycihDQVJBVCk7Cglwcm9tcHRsZW4rKzsKICAgIH0KICAgIHB1dGNlcnIoYyk7CiAgICBwcm9tcHRsZW4rKzsKfQoKdm9pZCBlcnJvciAoY2hhciAqbWVzcykKewogICAgaWYgKGNscmVvbCkKCWNsZWFyZW9sICgpOwogICAgZWxzZQoJa2lsbF9saW5lICgpOwogICAgcHJvbXB0bGVuICs9IHN0cmxlbiAobWVzcyk7CiAgICBpZiAoU2VudGVyICYmIFNleGl0KSB7CglteV9wdXRzdHJpbmcgKFNlbnRlcik7CglwdXRzb3V0KG1lc3MpOwoJbXlfcHV0c3RyaW5nIChTZXhpdCk7CiAgICB9CiAgICBlbHNlCglwdXRzb3V0KG1lc3MpOwogICAgZmZsdXNoKHN0ZG91dCk7CiAgICBlcnJvcnMrKzsKICAgIHNpZ2xvbmdqbXAgKHJlc3RvcmUsIDEpOwp9CgoKdm9pZCBzZXRfdHR5ICgpIHsKCW90dHkuY19sZmxhZyAmPSB+KElDQU5PTnxFQ0hPKTsKCW90dHkuY19jY1tWTUlOXSA9IDE7CS8qIHJlYWQgYXQgbGVhc3QgMSBjaGFyICovCglvdHR5LmNfY2NbVlRJTUVdID0gMDsJLyogbm8gdGltZW91dCAqLwoJc3R0eShmaWxlbm8oc3RkZXJyKSwgJm90dHkpOwp9CgpzdGF0aWMgaW50Cm91cnB1dGNoKGludCBjKSB7CglyZXR1cm4gcHV0YyhjLCBzdGRvdXQpOwp9Cgp2b2lkCnJlc2V0X3R0eSAoKSB7CiAgICBpZiAobm9fdHR5KQoJcmV0dXJuOwogICAgaWYgKHBzdGF0ZSkgewoJdHB1dHMoVUxleGl0LCAxLCBvdXJwdXRjaCk7CS8qIHB1dGNoYXIgLSBpZiB0aGF0IGlzbnQgYSBtYWNybyAqLwoJZmZsdXNoKHN0ZG91dCk7Cglwc3RhdGUgPSAwOwogICAgfQogICAgb3R0eS5jX2xmbGFnIHw9IElDQU5PTnxFQ0hPOwogICAgb3R0eS5jX2NjW1ZNSU5dID0gc2F2ZXR0eTAuY19jY1tWTUlOXTsKICAgIG90dHkuY19jY1tWVElNRV0gPSBzYXZldHR5MC5jX2NjW1ZUSU1FXTsKICAgIHN0dHkoZmlsZW5vKHN0ZGVyciksICZzYXZldHR5MCk7Cn0KCnZvaWQgcmRsaW5lIChyZWdpc3RlciBGSUxFICpmKQp7CiAgICByZWdpc3RlciBpbnQgIGM7CiAgICByZWdpc3RlciBjaGFyICpwOwoKICAgIHByZXBhcmVfbGluZV9idWZmZXIoKTsKCiAgICBwID0gTGluZTsKICAgIHdoaWxlICgoYyA9IEdldGMgKGYpKSAhPSAnXG4nICYmIGMgIT0gRU9GICYmIHAgLSBMaW5lIDwgTGluZUxlbiAtIDEpCgkqcCsrID0gYzsKICAgIGlmIChjID09ICdcbicpCglDdXJybGluZSsrOwogICAgKnAgPSAnXDAnOwp9CgovKiBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYSBzdXNwZW5kIHNpZ25hbCBmcm9tIHRoZSB0ZXJtaW5hbCAqLwoKdm9pZCBvbnN1c3AgKGludCBkdW1teSkgewogICAgc2lnc2V0X3Qgc2lnbmFscywgb2xkbWFzazsKCiAgICAvKiBpZ25vcmUgU0lHVFRPVSBzbyB3ZSBkb24ndCBnZXQgc3RvcHBlZCBpZiBjc2ggZ3JhYnMgdGhlIHR0eSAqLwogICAgc2lnbmFsKFNJR1RUT1UsIFNJR19JR04pOwogICAgcmVzZXRfdHR5ICgpOwogICAgZmZsdXNoIChzdGRvdXQpOwogICAgc2lnbmFsKFNJR1RUT1UsIFNJR19ERkwpOwogICAgLyogU2VuZCB0aGUgVFNUUCBzaWduYWwgdG8gc3VzcGVuZCBvdXIgcHJvY2VzcyBncm91cCAqLwogICAgc2lnbmFsKFNJR1RTVFAsIFNJR19ERkwpOwoKICAgIC8qIHVuYmxvY2sgU0lHVFNUUCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIHN1c3BlbmQgb3Vyc2VsZiAqLwogICAgc2lnZW1wdHlzZXQoJnNpZ25hbHMpOwogICAgc2lnYWRkc2V0KCZzaWduYWxzLCBTSUdUU1RQKTsKICAgIHNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmc2lnbmFscywgJm9sZG1hc2spOwoKICAgIGtpbGwgKDAsIFNJR1RTVFApOwogICAgLyogUGF1c2UgZm9yIHN0YXRpb24gYnJlYWsgKi8KCiAgICBzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZG1hc2ssIE5VTEwpOwoKICAgIC8qIFdlJ3JlIGJhY2sgKi8KICAgIHNpZ25hbCAoU0lHVFNUUCwgb25zdXNwKTsKICAgIHNldF90dHkgKCk7CiAgICBpZiAoaW53YWl0KQoJICAgIHNpZ2xvbmdqbXAgKHJlc3RvcmUsIDEpOwp9Cg==