LyoKICogZnVuY3Rpb25zIGZvciB3cml0aW5nIElEMyB0YWdzIGluIExBTUUKICoKICogdGV4dCBmdW5jdGlvbnMgc3RvbGVuIGZyb20gbXAzaW5mbyBieSBSaWNhcmRvIENlcnF1ZWlyYSA8cm1jQHJjY24ubmV0PgogKiBhZGFwdGVkIGZvciBMQU1FIGJ5IENvbnJhZCBTYW5kZXJzb24gPGMuc2FuZGVyc29uQG1lLmd1LmVkdS5hdT4KICoKICogCiAqLyAKIAojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAiaWQzdGFnLmgiCklEM1RBR0RBVEEgaWQzdGFnOwogCi8qCiAqIElmICJzdHJpbmciIGlzIHNob3J0ZXIgdGhhbiAibGVuZ3RoIiwgcGFkIGl0IHdpdGggJyAnIChzcGFjZXMpCiAqLwoKc3RhdGljIHZvaWQgaWQzX3BhZChjaGFyICpzdHJpbmcsIGludCBsZW5ndGgpIHsKCWludCBsOyAgbD1zdHJsZW4oc3RyaW5nKTsKCQoJd2hpbGUobDxsZW5ndGgpIHsgc3RyaW5nW2xdID0gJyAnOyBsKys7IH0KCXN0cmluZ1tsXT0nXDAnOwoJfQoKCi8qCiAqIGluaXRpYWxpemUgdGVtcG9yYXJ5IGZpZWxkcwogKi8KCnZvaWQgaWQzX2luaXR0YWcoSUQzVEFHREFUQSAqdGFnKSB7CglzdHJjcHkoIHRhZy0+dGl0bGUsICIiKTsKCXN0cmNweSggdGFnLT5hcnRpc3QsICIiKTsKCXN0cmNweSggdGFnLT5hbGJ1bSwgIiIpOwoJc3RyY3B5KCB0YWctPnllYXIsICIiKTsgICAgCglzdHJjcHkoIHRhZy0+Y29tbWVudCwgIiIpOwoJc3RyY3B5KCB0YWctPmdlbnJlLCAi/yIpOwkvKiB1bnNldCBnZW5yZSAqLwoJdGFnLT50cmFjayA9IDA7CgoJdGFnLT52YWxpZCA9IDA7CQkvKiBub3QgcmVhZHkgZm9yIHdyaXRpbmcqLwoJfQoKLyoKICogYnVpbGQgYW4gSUQzIHRhZyBmcm9tIHRlbXBvcmFyeSBmaWVsZHMKICovCgp2b2lkIGlkM19idWlsZHRhZyhJRDNUQUdEQVRBICp0YWcpIHsKCXN0cmNweSh0YWctPnRhZ3RleHQsIlRBRyIpOwoKCWlkM19wYWQoIHRhZy0+dGl0bGUsIDMwKTsgICBzdHJuY2F0KCB0YWctPnRhZ3RleHQsIHRhZy0+dGl0bGUsMzApOwoJaWQzX3BhZCggdGFnLT5hcnRpc3QsIDMwKTsgIHN0cm5jYXQoIHRhZy0+dGFndGV4dCwgdGFnLT5hcnRpc3QsMzApOwoJaWQzX3BhZCggdGFnLT5hbGJ1bSwgMzApOyAgIHN0cm5jYXQoIHRhZy0+dGFndGV4dCwgdGFnLT5hbGJ1bSwzMCk7CglpZDNfcGFkKCB0YWctPnllYXIsIDQpOyAgICAgc3RybmNhdCggdGFnLT50YWd0ZXh0LCB0YWctPnllYXIsNCk7CglpZDNfcGFkKCB0YWctPmNvbW1lbnQsIDMwKTsgc3RybmNhdCggdGFnLT50YWd0ZXh0LCB0YWctPmNvbW1lbnQsMzApOwoJaWQzX3BhZCggdGFnLT5nZW5yZSwgMSk7ICAgIHN0cm5jYXQoIHRhZy0+dGFndGV4dCwgdGFnLT5nZW5yZSwxKTsKCglpZiggdGFnLT50cmFjayAhPSAwICkgewoJCXRhZy0+dGFndGV4dFsxMjVdID0gJ1wwJzsKCQl0YWctPnRhZ3RleHRbMTI2XSA9IHRhZy0+dHJhY2s7Cgl9Cgl0YWctPnZhbGlkID0gMTsJCS8qIHJlYWR5IGZvciB3cml0aW5nKi8KCX0KCi8qCiAqIHdyaXRlIElEMyB0YWcgCiAqLwoKaW50IGlkM193cml0ZXRhZyhjaGFyKiBmaWxlbmFtZSwgSUQzVEFHREFUQSAqdGFnKSB7CglGSUxFKiBmOwoJaWYoICEgdGFnLT52YWxpZCApIHJldHVybiAtMTsKCglmPWZvcGVuKGZpbGVuYW1lLCJyYisiKTsJaWYoIWYpIHJldHVybiAtMTsKCglmc2VlayhmLDAsU0VFS19FTkQpOyBmd3JpdGUodGFnLT50YWd0ZXh0LDEsMTI4LGYpOwoJZmNsb3NlKGYpOyByZXR1cm4gMDsKCX0KCgoKCgppbnQgZ2VucmVfbGFzdD0xNDc7CmNoYXIgKmdlbnJlX2xpc3RbXT17CgkiQmx1ZXMiLCAiQ2xhc3NpYyBSb2NrIiwgIkNvdW50cnkiLCAiRGFuY2UiLCAiRGlzY28iLCAiRnVuayIsCgkiR3J1bmdlIiwgIkhpcC1Ib3AiLCAiSmF6eiIsICJNZXRhbCIsICJOZXcgQWdlIiwgIk9sZGllcyIsCgkiT3RoZXIiLCAiUG9wIiwgIlImQiIsICJSYXAiLCAiUmVnZ2FlIiwgIlJvY2siLAoJIlRlY2hubyIsICJJbmR1c3RyaWFsIiwgIkFsdGVybmF0aXZlIiwgIlNrYSIsICJEZWF0aCBNZXRhbCIsICJQcmFua3MiLAoJIlNvdW5kdHJhY2siLCAiRXVyby1UZWNobm8iLCAiQW1iaWVudCIsICJUcmlwLUhvcCIsICJWb2NhbCIsICJKYXp6K0Z1bmsiLAoJIkZ1c2lvbiIsICJUcmFuY2UiLCAiQ2xhc3NpY2FsIiwgIkluc3RydW1lbnRhbCIsICJBY2lkIiwgIkhvdXNlIiwKCSJHYW1lIiwgIlNvdW5kIENsaXAiLCAiR29zcGVsIiwgIk5vaXNlIiwgIkFsdGVyblJvY2siLCAiQmFzcyIsCgkiU291bCIsICJQdW5rIiwgIlNwYWNlIiwgIk1lZGl0YXRpdmUiLCAiSW5zdHJ1bWVudGFsIFBvcCIsICJJbnN0cnVtZW50YWwgUm9jayIsCgkiRXRobmljIiwgIkdvdGhpYyIsICJEYXJrd2F2ZSIsICJUZWNobm8tSW5kdXN0cmlhbCIsICJFbGVjdHJvbmljIiwgIlBvcC1Gb2xrIiwKCSJFdXJvZGFuY2UiLCAiRHJlYW0iLCAiU291dGhlcm4gUm9jayIsICJDb21lZHkiLCAiQ3VsdCIsICJHYW5nc3RhIiwKCSJUb3AgNDAiLCAiQ2hyaXN0aWFuIFJhcCIsICJQb3AvRnVuayIsICJKdW5nbGUiLCAiTmF0aXZlIEFtZXJpY2FuIiwgIkNhYmFyZXQiLAoJIk5ldyBXYXZlIiwgIlBzeWNoYWRlbGljIiwgIlJhdmUiLCAiU2hvd3R1bmVzIiwgIlRyYWlsZXIiLCAiTG8tRmkiLAoJIlRyaWJhbCIsICJBY2lkIFB1bmsiLCAiQWNpZCBKYXp6IiwgIlBvbGthIiwgIlJldHJvIiwgIk11c2ljYWwiLAoJIlJvY2sgJiBSb2xsIiwgIkhhcmQgUm9jayIsICJGb2xrIiwgIkZvbGsvUm9jayIsICJOYXRpb25hbCBGb2xrIiwgIlN3aW5nIiwKCSJGYXN0LUZ1c2lvbiIsICJCZWJvYiIsICJMYXRpbiIsICJSZXZpdmFsIiwgIkNlbHRpYyIsICJCbHVlZ3Jhc3MiLCAiQXZhbnRnYXJkZSIsCgkiR290aGljIFJvY2siLCAiUHJvZ3Jlc3NpdmUgUm9jayIsICJQc3ljaGVkZWxpYyBSb2NrIiwgIlN5bXBob25pYyBSb2NrIiwgIlNsb3cgUm9jayIsICJCaWcgQmFuZCIsCgkiQ2hvcnVzIiwgIkVhc3kgTGlzdGVuaW5nIiwgIkFjb3VzdGljIiwgIkh1bW91ciIsICJTcGVlY2giLCAiQ2hhbnNvbiIsCgkiT3BlcmEiLCAiQ2hhbWJlciBNdXNpYyIsICJTb25hdGEiLCAiU3ltcGhvbnkiLCAiQm9vdHkgQmFzcyIsICJQcmltdXMiLAoJIlBvcm4gR3Jvb3ZlIiwgIlNhdGlyZSIsICJTbG93IEphbSIsICJDbHViIiwgIlRhbmdvIiwgIlNhbWJhIiwKCSJGb2xrbG9yZSIsICJCYWxsYWQiLCAiUG93ZXIgQmFsbGFkIiwgIlJoeXRobWljIFNvdWwiLCAiRnJlZXN0eWxlIiwgIkR1ZXQiLAoJIlB1bmsgUm9jayIsICJEcnVtIFNvbG8iLCAiQSBjYXBlbGxhIiwgIkV1cm8tSG91c2UiLCAiRGFuY2UgSGFsbCIsCgkiR29hIiwgIkRydW0gJiBCYXNzIiwgIkNsdWIgSG91c2UiLCAiSGFyZGNvcmUiLCAiVGVycm9yIiwKCSJJbmRpZSIsICJCcml0UG9wIiwgIk5lZ2VyUHVuayIsICJQb2xzayBQdW5rIiwgIkJlYXQiLAoJIkNocmlzdGlhbiBHYW5nc3RhIiwgIkhlYXZ5IE1ldGFsIiwgIkJsYWNrIE1ldGFsIiwgIkNyb3Nzb3ZlciIsICJDb250ZW1wb3JhcnkgQyIsCgkiQ2hyaXN0aWFuIFJvY2siLCAiTWVyZW5ndWUiLCAiU2Fsc2EiLCAiVGhyYXNoIE1ldGFsIiwgIkFuaW1lIiwgIkpQb3AiLAoJIlN5bnRoUG9wIiwKfTsKCgo=