LyoKICogaThrLmMgLS0gTGludXggZHJpdmVyIGZvciBhY2Nlc3NpbmcgdGhlIFNNTSBCSU9TIG9uIERlbGwgbGFwdG9wcy4KICoJICAgIFNlZSBodHRwOi8vd3d3LmRlYmlhbi5vcmcvfmR6L2k4ay8gZm9yIG1vcmUgaW5mb3JtYXRpb24KICoJICAgIGFuZCBmb3IgbGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBkcml2ZXIuCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFzc2ltbyBEYWwgWm90dG8gPGR6QGRlYmlhbi5vcmc+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQogKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CiAqIGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqLwoKI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2FwbV9iaW9zLmg+CiNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CgojaW5jbHVkZSA8bGludXgvaThrLmg+CgojZGVmaW5lIEk4S19WRVJTSU9OCQkiMS4xMyAxNC8wNS8yMDAyIgoKI2RlZmluZSBJOEtfU01NX0ZOX1NUQVRVUwkweDAwMjUKI2RlZmluZSBJOEtfU01NX1BPV0VSX1NUQVRVUwkweDAwNjkKI2RlZmluZSBJOEtfU01NX1NFVF9GQU4JCTB4MDFhMwojZGVmaW5lIEk4S19TTU1fR0VUX0ZBTgkJMHgwMGEzCiNkZWZpbmUgSThLX1NNTV9HRVRfU1BFRUQJMHgwMmEzCiNkZWZpbmUgSThLX1NNTV9HRVRfVEVNUAkweDEwYTMKI2RlZmluZSBJOEtfU01NX0dFVF9ERUxMX1NJRwkweGZmYTMKI2RlZmluZSBJOEtfU01NX0JJT1NfVkVSU0lPTgkweDAwYTYKCiNkZWZpbmUgSThLX0ZBTl9NVUxUCQkzMAojZGVmaW5lIEk4S19NQVhfVEVNUAkJMTI3CgojZGVmaW5lIEk4S19GTl9OT05FCQkweDAwCiNkZWZpbmUgSThLX0ZOX1VQCQkweDAxCiNkZWZpbmUgSThLX0ZOX0RPV04JCTB4MDIKI2RlZmluZSBJOEtfRk5fTVVURQkJMHgwNAojZGVmaW5lIEk4S19GTl9NQVNLCQkweDA3CiNkZWZpbmUgSThLX0ZOX1NISUZUCQk4CgojZGVmaW5lIEk4S19QT1dFUl9BQwkJMHgwNQojZGVmaW5lIEk4S19QT1dFUl9CQVRURVJZCTB4MDEKCiNkZWZpbmUgSThLX1RFTVBFUkFUVVJFX0JVRwkxCgojZGVmaW5lIERFTExfU0lHTkFUVVJFCQkiRGVsbCBDb21wdXRlciIKCnN0YXRpYyBjaGFyICpzdXBwb3J0ZWRfbW9kZWxzW10gPSB7CiAgICAiSW5zcGlyb24iLAogICAgIkxhdGl0dWRlIiwKICAgIE5VTEwKfTsKCnN0YXRpYyBjaGFyIHN5c3RlbV92ZW5kb3JbNDhdID0gIj8iOwpzdGF0aWMgY2hhciBwcm9kdWN0X25hbWUgWzQ4XSA9ICI/IjsKc3RhdGljIGNoYXIgYmlvc192ZXJzaW9uIFs0XSAgPSAiPyI7CnN0YXRpYyBjaGFyIHNlcmlhbF9udW1iZXJbMTZdID0gIj8iOwoKTU9EVUxFX0FVVEhPUigiTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpIik7Ck1PRFVMRV9ERVNDUklQVElPTigiRHJpdmVyIGZvciBhY2Nlc3NpbmcgU01NIEJJT1Mgb24gRGVsbCBsYXB0b3BzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCnN0YXRpYyBpbnQgZm9yY2U7Cm1vZHVsZV9wYXJhbShmb3JjZSwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoZm9yY2UsICJGb3JjZSBsb2FkaW5nIHdpdGhvdXQgY2hlY2tpbmcgZm9yIHN1cHBvcnRlZCBtb2RlbHMiKTsKCnN0YXRpYyBpbnQgcmVzdHJpY3RlZDsKbW9kdWxlX3BhcmFtKHJlc3RyaWN0ZWQsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHJlc3RyaWN0ZWQsICJBbGxvdyBmYW4gY29udHJvbCBpZiBTWVNfQURNSU4gY2FwYWJpbGl0eSBzZXQiKTsKCnN0YXRpYyBpbnQgcG93ZXJfc3RhdHVzOwptb2R1bGVfcGFyYW0ocG93ZXJfc3RhdHVzLCBib29sLCAwNjAwKTsKTU9EVUxFX1BBUk1fREVTQyhwb3dlcl9zdGF0dXMsICJSZXBvcnQgcG93ZXIgc3RhdHVzIGluIC9wcm9jL2k4ayIpOwoKc3RhdGljIHNzaXplX3QgaThrX3JlYWQoc3RydWN0IGZpbGUgKiwgY2hhciBfX3VzZXIgKiwgc2l6ZV90LCBsb2ZmX3QgKik7CnN0YXRpYyBpbnQgaThrX2lvY3RsKHN0cnVjdCBpbm9kZSAqLCBzdHJ1Y3QgZmlsZSAqLCB1bnNpZ25lZCBpbnQsCgkJICAgICB1bnNpZ25lZCBsb25nKTsKCnN0YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGk4a19mb3BzID0gewogICAgLnJlYWQJPSBpOGtfcmVhZCwKICAgIC5pb2N0bAk9IGk4a19pb2N0bCwKfTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVuc2lnbmVkIGludCBlYXg7CiAgICB1bnNpZ25lZCBpbnQgZWJ4IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKICAgIHVuc2lnbmVkIGludCBlY3ggX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwogICAgdW5zaWduZWQgaW50IGVkeCBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CiAgICB1bnNpZ25lZCBpbnQgZXNpIF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKICAgIHVuc2lnbmVkIGludCBlZGkgX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwp9IFNNTVJlZ2lzdGVyczsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHU4CXR5cGU7CiAgICB1OAlsZW5ndGg7CiAgICB1MTYJaGFuZGxlOwp9IERNSUhlYWRlcjsKCi8qCiAqIENhbGwgdGhlIFN5c3RlbSBNYW5hZ2VtZW50IE1vZGUgQklPUy4gQ29kZSBwcm92aWRlZCBieSBKb25hdGhhbiBCdXp6YXJkLgogKi8Kc3RhdGljIGludCBpOGtfc21tKFNNTVJlZ2lzdGVycyAqcmVncykKewogICAgaW50IHJjOwogICAgaW50IGVheCA9IHJlZ3MtPmVheDsKCiAgICBhc20oInB1c2hsICUlZWF4XG5cdCIgXAoJIm1vdmwgMCglJWVheCksJSVlZHhcblx0IiBcCgkicHVzaCAlJWVkeFxuXHQiIFwKCSJtb3ZsIDQoJSVlYXgpLCUlZWJ4XG5cdCIgXAoJIm1vdmwgOCglJWVheCksJSVlY3hcblx0IiBcCgkibW92bCAxMiglJWVheCksJSVlZHhcblx0IiBcCgkibW92bCAxNiglJWVheCksJSVlc2lcblx0IiBcCgkibW92bCAyMCglJWVheCksJSVlZGlcblx0IiBcCgkicG9wbCAlJWVheFxuXHQiIFwKCSJvdXQgJSVhbCwkMHhiMlxuXHQiIFwKCSJvdXQgJSVhbCwkMHg4NFxuXHQiIFwKCSJ4Y2hnbCAlJWVheCwoJSVlc3ApXG5cdCIKCSJtb3ZsICUlZWJ4LDQoJSVlYXgpXG5cdCIgXAoJIm1vdmwgJSVlY3gsOCglJWVheClcblx0IiBcCgkibW92bCAlJWVkeCwxMiglJWVheClcblx0IiBcCgkibW92bCAlJWVzaSwxNiglJWVheClcblx0IiBcCgkibW92bCAlJWVkaSwyMCglJWVheClcblx0IiBcCgkicG9wbCAlJWVkeFxuXHQiIFwKCSJtb3ZsICUlZWR4LDAoJSVlYXgpXG5cdCIgXAoJImxhaGZcblx0IiBcCgkic2hybCAkOCwlJWVheFxuXHQiIFwKCSJhbmRsICQxLCUlZWF4XG4iIFwKCTogIj1hIiAocmMpCgk6ICJhIiAocmVncykKCTogIiVlYngiLCAiJWVjeCIsICIlZWR4IiwgIiVlc2kiLCAiJWVkaSIsICJtZW1vcnkiKTsKCiAgICBpZiAoKHJjICE9IDApIHx8ICgocmVncy0+ZWF4ICYgMHhmZmZmKSA9PSAweGZmZmYpIHx8IChyZWdzLT5lYXggPT0gZWF4KSkgewoJcmV0dXJuIC1FSU5WQUw7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCi8qCiAqIFJlYWQgdGhlIGJpb3MgdmVyc2lvbi4gUmV0dXJuIHRoZSB2ZXJzaW9uIGFzIGFuIGludGVnZXIgY29ycmVzcG9uZGluZwogKiB0byB0aGUgYXNjaWkgdmFsdWUsIGZvciBleGFtcGxlICJBMTciIGlzIHJldHVybmVkIGFzIDB4MDA0MTMxMzcuCiAqLwpzdGF0aWMgaW50IGk4a19nZXRfYmlvc192ZXJzaW9uKHZvaWQpCnsKICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICBpbnQgcmM7CgogICAgcmVncy5lYXggPSBJOEtfU01NX0JJT1NfVkVSU0lPTjsKICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewoJcmV0dXJuIHJjOwogICAgfQoKICAgIHJldHVybiByZWdzLmVheDsKfQoKLyoKICogUmVhZCB0aGUgbWFjaGluZSBpZC4KICovCnN0YXRpYyBpbnQgaThrX2dldF9zZXJpYWxfbnVtYmVyKHVuc2lnbmVkIGNoYXIgKmJ1ZmYpCnsKICAgIHN0cmxjcHkoYnVmZiwgc2VyaWFsX251bWJlciwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKICAgIHJldHVybiAwOwp9CgovKgogKiBSZWFkIHRoZSBGbiBrZXkgc3RhdHVzLgogKi8Kc3RhdGljIGludCBpOGtfZ2V0X2ZuX3N0YXR1cyh2b2lkKQp7CiAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgaW50IHJjOwoKICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9GTl9TVEFUVVM7CiAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKCXJldHVybiByYzsKICAgIH0KCiAgICBzd2l0Y2ggKChyZWdzLmVheCA+PiBJOEtfRk5fU0hJRlQpICYgSThLX0ZOX01BU0spIHsKICAgIGNhc2UgSThLX0ZOX1VQOgoJcmV0dXJuIEk4S19WT0xfVVA7CiAgICBjYXNlIEk4S19GTl9ET1dOOgoJcmV0dXJuIEk4S19WT0xfRE9XTjsKICAgIGNhc2UgSThLX0ZOX01VVEU6CglyZXR1cm4gSThLX1ZPTF9NVVRFOwogICAgZGVmYXVsdDoKCXJldHVybiAwOwogICAgfQp9CgovKgogKiBSZWFkIHRoZSBwb3dlciBzdGF0dXMuCiAqLwpzdGF0aWMgaW50IGk4a19nZXRfcG93ZXJfc3RhdHVzKHZvaWQpCnsKICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICBpbnQgcmM7CgogICAgcmVncy5lYXggPSBJOEtfU01NX1BPV0VSX1NUQVRVUzsKICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewoJcmV0dXJuIHJjOwogICAgfQoKICAgIHN3aXRjaCAocmVncy5lYXggJiAweGZmKSB7CiAgICBjYXNlIEk4S19QT1dFUl9BQzoKCXJldHVybiBJOEtfQUM7CiAgICBkZWZhdWx0OgoJcmV0dXJuIEk4S19CQVRURVJZOwogICAgfQp9CgovKgogKiBSZWFkIHRoZSBmYW4gc3RhdHVzLgogKi8Kc3RhdGljIGludCBpOGtfZ2V0X2Zhbl9zdGF0dXMoaW50IGZhbikKewogICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKICAgIGludCByYzsKCiAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX0ZBTjsKICAgIHJlZ3MuZWJ4ID0gZmFuICYgMHhmZjsKICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewoJcmV0dXJuIHJjOwogICAgfQoKICAgIHJldHVybiAocmVncy5lYXggJiAweGZmKTsKfQoKLyoKICogUmVhZCB0aGUgZmFuIHNwZWVkIGluIFJQTS4KICovCnN0YXRpYyBpbnQgaThrX2dldF9mYW5fc3BlZWQoaW50IGZhbikKewogICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKICAgIGludCByYzsKCiAgICByZWdzLmVheCA9IEk4S19TTU1fR0VUX1NQRUVEOwogICAgcmVncy5lYnggPSBmYW4gJiAweGZmOwogICAgaWYgKChyYz1pOGtfc21tKCZyZWdzKSkgPCAwKSB7CglyZXR1cm4gcmM7CiAgICB9CgogICAgcmV0dXJuIChyZWdzLmVheCAmIDB4ZmZmZikgKiBJOEtfRkFOX01VTFQ7Cn0KCi8qCiAqIFNldCB0aGUgZmFuIHNwZWVkIChvZmYsIGxvdywgaGlnaCkuIFJldHVybnMgdGhlIG5ldyBmYW4gc3RhdHVzLgogKi8Kc3RhdGljIGludCBpOGtfc2V0X2ZhbihpbnQgZmFuLCBpbnQgc3BlZWQpCnsKICAgIFNNTVJlZ2lzdGVycyByZWdzID0geyAwLCAwLCAwLCAwLCAwLCAwIH07CiAgICBpbnQgcmM7CgogICAgc3BlZWQgPSAoc3BlZWQgPCAwKSA/IDAgOiAoKHNwZWVkID4gSThLX0ZBTl9NQVgpID8gSThLX0ZBTl9NQVggOiBzcGVlZCk7CgogICAgcmVncy5lYXggPSBJOEtfU01NX1NFVF9GQU47CiAgICByZWdzLmVieCA9IChmYW4gJiAweGZmKSB8IChzcGVlZCA8PCA4KTsKICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewoJcmV0dXJuIHJjOwogICAgfQoKICAgIHJldHVybiAoaThrX2dldF9mYW5fc3RhdHVzKGZhbikpOwp9CgovKgogKiBSZWFkIHRoZSBjcHUgdGVtcGVyYXR1cmUuCiAqLwpzdGF0aWMgaW50IGk4a19nZXRfY3B1X3RlbXAodm9pZCkKewogICAgU01NUmVnaXN0ZXJzIHJlZ3MgPSB7IDAsIDAsIDAsIDAsIDAsIDAgfTsKICAgIGludCByYzsKICAgIGludCB0ZW1wOwoKI2lmZGVmIEk4S19URU1QRVJBVFVSRV9CVUcKICAgIHN0YXRpYyBpbnQgcHJldiA9IDA7CiNlbmRpZgoKICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfVEVNUDsKICAgIGlmICgocmM9aThrX3NtbSgmcmVncykpIDwgMCkgewoJcmV0dXJuIHJjOwogICAgfQogICAgdGVtcCA9IHJlZ3MuZWF4ICYgMHhmZjsKCiNpZmRlZiBJOEtfVEVNUEVSQVRVUkVfQlVHCiAgICAvKgogICAgICogU29tZXRpbWVzIHRoZSB0ZW1wZXJhdHVyZSBzZW5zb3IgcmV0dXJucyAweDk5LCB3aGljaCBpcyBvdXQgb2YgcmFuZ2UuCiAgICAgKiBJbiB0aGlzIGNhc2Ugd2UgcmV0dXJuIChvbmNlKSB0aGUgcHJldmlvdXMgY2FjaGVkIHZhbHVlLiBGb3IgZXhhbXBsZToKICAgICAjIDEwMDM2NTUxMzcgMDAwMDAwNTggMDAwMDVhNGIKICAgICAjIDEwMDM2NTUxMzggMDAwMDAwOTkgMDAwMDNhODAgPC0tLSAweDk5ID0gMTUzIGRlZ3JlZXMKICAgICAjIDEwMDM2NTUxMzkgMDAwMDAwNTQgMDAwMDVjNTIKICAgICAqLwogICAgaWYgKHRlbXAgPiBJOEtfTUFYX1RFTVApIHsKCXRlbXAgPSBwcmV2OwoJcHJldiA9IEk4S19NQVhfVEVNUDsKICAgIH0gZWxzZSB7CglwcmV2ID0gdGVtcDsKICAgIH0KI2VuZGlmCgogICAgcmV0dXJuIHRlbXA7Cn0KCnN0YXRpYyBpbnQgaThrX2dldF9kZWxsX3NpZ25hdHVyZSh2b2lkKQp7CiAgICBTTU1SZWdpc3RlcnMgcmVncyA9IHsgMCwgMCwgMCwgMCwgMCwgMCB9OwogICAgaW50IHJjOwoKICAgIHJlZ3MuZWF4ID0gSThLX1NNTV9HRVRfREVMTF9TSUc7CiAgICBpZiAoKHJjPWk4a19zbW0oJnJlZ3MpKSA8IDApIHsKCXJldHVybiByYzsKICAgIH0KCiAgICBpZiAoKHJlZ3MuZWF4ID09IDExNDU2NTE1MjcpICYmIChyZWdzLmVkeCA9PSAxMTQ1MzkyMjA0KSkgewoJcmV0dXJuIDA7CiAgICB9IGVsc2UgewoJcmV0dXJuIC0xOwogICAgfQp9CgpzdGF0aWMgaW50IGk4a19pb2N0bChzdHJ1Y3QgaW5vZGUgKmlwLCBzdHJ1Y3QgZmlsZSAqZnAsIHVuc2lnbmVkIGludCBjbWQsCgkJICAgICB1bnNpZ25lZCBsb25nIGFyZykKewogICAgaW50IHZhbDsKICAgIGludCBzcGVlZDsKICAgIHVuc2lnbmVkIGNoYXIgYnVmZlsxNl07CiAgICBpbnQgX191c2VyICphcmdwID0gKGludCBfX3VzZXIgKilhcmc7CgogICAgaWYgKCFhcmdwKQoJcmV0dXJuIC1FSU5WQUw7CgogICAgc3dpdGNoIChjbWQpIHsKICAgIGNhc2UgSThLX0JJT1NfVkVSU0lPTjoKCXZhbCA9IGk4a19nZXRfYmlvc192ZXJzaW9uKCk7CglicmVhazsKCiAgICBjYXNlIEk4S19NQUNISU5FX0lEOgoJbWVtc2V0KGJ1ZmYsIDAsIDE2KTsKCXZhbCA9IGk4a19nZXRfc2VyaWFsX251bWJlcihidWZmKTsKCWJyZWFrOwoKICAgIGNhc2UgSThLX0ZOX1NUQVRVUzoKCXZhbCA9IGk4a19nZXRfZm5fc3RhdHVzKCk7CglicmVhazsKCiAgICBjYXNlIEk4S19QT1dFUl9TVEFUVVM6Cgl2YWwgPSBpOGtfZ2V0X3Bvd2VyX3N0YXR1cygpOwoJYnJlYWs7CgogICAgY2FzZSBJOEtfR0VUX1RFTVA6Cgl2YWwgPSBpOGtfZ2V0X2NwdV90ZW1wKCk7CglicmVhazsKCiAgICBjYXNlIEk4S19HRVRfU1BFRUQ6CglpZiAoY29weV9mcm9tX3VzZXIoJnZhbCwgYXJncCwgc2l6ZW9mKGludCkpKSB7CgkgICAgcmV0dXJuIC1FRkFVTFQ7Cgl9Cgl2YWwgPSBpOGtfZ2V0X2Zhbl9zcGVlZCh2YWwpOwoJYnJlYWs7CgogICAgY2FzZSBJOEtfR0VUX0ZBTjoKCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKCSAgICByZXR1cm4gLUVGQVVMVDsKCX0KCXZhbCA9IGk4a19nZXRfZmFuX3N0YXR1cyh2YWwpOwoJYnJlYWs7CgogICAgY2FzZSBJOEtfU0VUX0ZBTjoKCWlmIChyZXN0cmljdGVkICYmICFjYXBhYmxlKENBUF9TWVNfQURNSU4pKSB7CgkgICAgcmV0dXJuIC1FUEVSTTsKCX0KCWlmIChjb3B5X2Zyb21fdXNlcigmdmFsLCBhcmdwLCBzaXplb2YoaW50KSkpIHsKCSAgICByZXR1cm4gLUVGQVVMVDsKCX0KCWlmIChjb3B5X2Zyb21fdXNlcigmc3BlZWQsIGFyZ3ArMSwgc2l6ZW9mKGludCkpKSB7CgkgICAgcmV0dXJuIC1FRkFVTFQ7Cgl9Cgl2YWwgPSBpOGtfc2V0X2Zhbih2YWwsIHNwZWVkKTsKCWJyZWFrOwoKICAgIGRlZmF1bHQ6CglyZXR1cm4gLUVJTlZBTDsKICAgIH0KCiAgICBpZiAodmFsIDwgMCkgewoJcmV0dXJuIHZhbDsKICAgIH0KCiAgICBzd2l0Y2ggKGNtZCkgewogICAgY2FzZSBJOEtfQklPU19WRVJTSU9OOgoJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCAmdmFsLCA0KSkgewoJICAgIHJldHVybiAtRUZBVUxUOwoJfQoJYnJlYWs7CiAgICBjYXNlIEk4S19NQUNISU5FX0lEOgoJaWYgKGNvcHlfdG9fdXNlcihhcmdwLCBidWZmLCAxNikpIHsKCSAgICByZXR1cm4gLUVGQVVMVDsKCX0KCWJyZWFrOwogICAgZGVmYXVsdDoKCWlmIChjb3B5X3RvX3VzZXIoYXJncCwgJnZhbCwgc2l6ZW9mKGludCkpKSB7CgkgICAgcmV0dXJuIC1FRkFVTFQ7Cgl9CglicmVhazsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyoKICogUHJpbnQgdGhlIGluZm9ybWF0aW9uIGZvciAvcHJvYy9pOGsuCiAqLwpzdGF0aWMgaW50IGk4a19nZXRfaW5mbyhjaGFyICpidWZmZXIsIGNoYXIgKipzdGFydCwgb2ZmX3QgZnBvcywgaW50IGxlbmd0aCkKewogICAgaW50IG4sIGZuX2tleSwgY3B1X3RlbXAsIGFjX3Bvd2VyOwogICAgaW50IGxlZnRfZmFuLCByaWdodF9mYW4sIGxlZnRfc3BlZWQsIHJpZ2h0X3NwZWVkOwoKICAgIGNwdV90ZW1wICAgICA9IGk4a19nZXRfY3B1X3RlbXAoKTsJCQkvKiAxMTEwMCC1cyAqLwogICAgbGVmdF9mYW4gICAgID0gaThrX2dldF9mYW5fc3RhdHVzKEk4S19GQU5fTEVGVCk7CS8qICAgNTgwILVzICovCiAgICByaWdodF9mYW4gICAgPSBpOGtfZ2V0X2Zhbl9zdGF0dXMoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCiAgICBsZWZ0X3NwZWVkICAgPSBpOGtfZ2V0X2Zhbl9zcGVlZChJOEtfRkFOX0xFRlQpOwkvKiAgIDU4MCC1cyAqLwogICAgcmlnaHRfc3BlZWQgID0gaThrX2dldF9mYW5fc3BlZWQoSThLX0ZBTl9SSUdIVCk7CS8qICAgNTgwILVzICovCiAgICBmbl9rZXkgICAgICAgPSBpOGtfZ2V0X2ZuX3N0YXR1cygpOwkJCS8qICAgNzUwILVzICovCiAgICBpZiAocG93ZXJfc3RhdHVzKSB7CglhY19wb3dlciA9IGk4a19nZXRfcG93ZXJfc3RhdHVzKCk7CQkvKiAxNDcwMCC1cyAqLwogICAgfSBlbHNlIHsKCWFjX3Bvd2VyID0gLTE7CiAgICB9CgogICAgLyoKICAgICAqIEluZm86CiAgICAgKgogICAgICogMSkgIEZvcm1hdCB2ZXJzaW9uICh0aGlzIHdpbGwgY2hhbmdlIGlmIGZvcm1hdCBjaGFuZ2VzKQogICAgICogMikgIEJJT1MgdmVyc2lvbgogICAgICogMykgIEJJT1MgbWFjaGluZSBJRAogICAgICogNCkgIENwdSB0ZW1wZXJhdHVyZQogICAgICogNSkgIExlZnQgZmFuIHN0YXR1cwogICAgICogNikgIFJpZ2h0IGZhbiBzdGF0dXMKICAgICAqIDcpICBMZWZ0IGZhbiBzcGVlZAogICAgICogOCkgIFJpZ2h0IGZhbiBzcGVlZAogICAgICogOSkgIEFDIHBvd2VyCiAgICAgKiAxMCkgRm4gS2V5IHN0YXR1cwogICAgICovCiAgICBuID0gc3ByaW50ZihidWZmZXIsICIlcyAlcyAlcyAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKCQlJOEtfUFJPQ19GTVQsCgkJYmlvc192ZXJzaW9uLAoJCXNlcmlhbF9udW1iZXIsCgkJY3B1X3RlbXAsCgkJbGVmdF9mYW4sCgkJcmlnaHRfZmFuLAoJCWxlZnRfc3BlZWQsCgkJcmlnaHRfc3BlZWQsCgkJYWNfcG93ZXIsCgkJZm5fa2V5KTsKCiAgICByZXR1cm4gbjsKfQoKc3RhdGljIHNzaXplX3QgaThrX3JlYWQoc3RydWN0IGZpbGUgKmYsIGNoYXIgX191c2VyICpidWZmZXIsIHNpemVfdCBsZW4sIGxvZmZfdCAqZnBvcykKewogICAgaW50IG47CiAgICBjaGFyIGluZm9bMTI4XTsKCiAgICBuID0gaThrX2dldF9pbmZvKGluZm8sIE5VTEwsIDAsIDEyOCk7CiAgICBpZiAobiA8PSAwKSB7CglyZXR1cm4gbjsKICAgIH0KCiAgICBpZiAoKmZwb3MgPj0gbikgewoJcmV0dXJuIDA7CiAgICB9CgogICAgaWYgKCgqZnBvcyArIGxlbikgPj0gbikgewoJbGVuID0gbiAtICpmcG9zOwogICAgfQoKICAgIGlmIChjb3B5X3RvX3VzZXIoYnVmZmVyLCBpbmZvLCBsZW4pICE9IDApIHsKCXJldHVybiAtRUZBVUxUOwogICAgfQoKICAgICpmcG9zICs9IGxlbjsKICAgIHJldHVybiBsZW47Cn0KCnN0YXRpYyBjaGFyKiBfX2luaXQgc3RyaW5nX3RyaW0oY2hhciAqcywgaW50IHNpemUpCnsKICAgIGludCBsZW47CiAgICBjaGFyICpwOwoKICAgIGlmICgobGVuID0gc3RybGVuKHMpKSA+IHNpemUpIHsKCWxlbiA9IHNpemU7CiAgICB9CgogICAgZm9yIChwPXMrbGVuLTE7IGxlbiAmJiAoKnA9PScgJyk7IGxlbi0tLHAtLSkgewoJKnAgPSAnXDAnOwogICAgfQoKICAgIHJldHVybiBzOwp9CgovKiBETUkgY29kZSwgc3RvbGVuIGZyb20gYXJjaC9pMzg2L2tlcm5lbC9kbWlfc2Nhbi5jICovCgovKgogKiB8PC0tIGRtaS0+bGVuZ3RoIC0tPnwKICogfCAgICAgICAgICAgICAgICAgICB8CiAqIHxkbWkgaGVhZGVyICAgIHM9TiAgfCBzdHJpbmcxLFwwLCAuLi4sIHN0cmluZ04sXDAsIC4uLiwgXDAKICogICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfAogKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAqLwpzdGF0aWMgY2hhciogX19pbml0IGRtaV9zdHJpbmcoRE1JSGVhZGVyICpkbWksIHU4IHMpCnsKICAgIHU4ICpwOwoKICAgIGlmICghcykgewoJcmV0dXJuICIiOwogICAgfQogICAgcy0tOwoKICAgIHAgPSAodTggKilkbWkgKyBkbWktPmxlbmd0aDsKICAgIHdoaWxlIChzID4gMCkgewoJcCArPSBzdHJsZW4ocCk7CglwKys7CglzLS07CiAgICB9CgogICAgcmV0dXJuIHA7Cn0KCnN0YXRpYyB2b2lkIF9faW5pdCBkbWlfZGVjb2RlKERNSUhlYWRlciAqZG1pKQp7CiAgICB1OCAqZGF0YSA9ICh1OCAqKSBkbWk7CiAgICBjaGFyICpwOwoKI2lmZGVmIEk4S19ERUJVRwogICAgaW50IGk7CiAgICBwcmludGsoIiUwOHggIiwgKGludClkYXRhKTsKICAgIGZvciAoaT0wOyBpPGRhdGFbMV0gJiYgaTw2NDsgaSsrKSB7CglwcmludGsoIiUwMnggIiwgZGF0YVtpXSk7CiAgICB9CiAgICBwcmludGsoIlxuIik7CiNlbmRpZgoKICAgIHN3aXRjaCAoZG1pLT50eXBlKSB7CiAgICBjYXNlICAwOgkvKiBCSU9TIEluZm9ybWF0aW9uICovCglwID0gZG1pX3N0cmluZyhkbWksZGF0YVs1XSk7CglpZiAoKnApIHsKCSAgICBzdHJsY3B5KGJpb3NfdmVyc2lvbiwgcCwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwoJICAgIHN0cmluZ190cmltKGJpb3NfdmVyc2lvbiwgc2l6ZW9mKGJpb3NfdmVyc2lvbikpOwoJfQoJYnJlYWs7CQogICAgY2FzZSAxOgkvKiBTeXN0ZW0gSW5mb3JtYXRpb24gKi8KCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzRdKTsKCWlmICgqcCkgewoJICAgIHN0cmxjcHkoc3lzdGVtX3ZlbmRvciwgcCwgc2l6ZW9mKHN5c3RlbV92ZW5kb3IpKTsKCSAgICBzdHJpbmdfdHJpbShzeXN0ZW1fdmVuZG9yLCBzaXplb2Yoc3lzdGVtX3ZlbmRvcikpOwoJfQoJcCA9IGRtaV9zdHJpbmcoZG1pLGRhdGFbNV0pOwoJaWYgKCpwKSB7CgkgICAgc3RybGNweShwcm9kdWN0X25hbWUsIHAsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKCSAgICBzdHJpbmdfdHJpbShwcm9kdWN0X25hbWUsIHNpemVvZihwcm9kdWN0X25hbWUpKTsKCX0KCXAgPSBkbWlfc3RyaW5nKGRtaSxkYXRhWzddKTsKCWlmICgqcCkgewoJICAgIHN0cmxjcHkoc2VyaWFsX251bWJlciwgcCwgc2l6ZW9mKHNlcmlhbF9udW1iZXIpKTsKCSAgICBzdHJpbmdfdHJpbShzZXJpYWxfbnVtYmVyLCBzaXplb2Yoc2VyaWFsX251bWJlcikpOwoJfQoJYnJlYWs7CiAgICB9Cn0KCnN0YXRpYyBpbnQgX19pbml0IGRtaV90YWJsZSh1MzIgYmFzZSwgaW50IGxlbiwgaW50IG51bSwgdm9pZCAoKmZuKShETUlIZWFkZXIqKSkKewogICAgdTggKmJ1ZjsKICAgIHU4ICpkYXRhOwogICAgRE1JSGVhZGVyICpkbWk7CiAgICBpbnQgaSA9IDE7CgogICAgYnVmID0gaW9yZW1hcChiYXNlLCBsZW4pOwogICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CglyZXR1cm4gLTE7CiAgICB9CiAgICBkYXRhID0gYnVmOwoKICAgIC8qCiAgICAgKiBTdG9wIHdoZW4gd2Ugc2VlIGFsIHRoZSBpdGVtcyB0aGUgdGFibGUgY2xhaW1lZCB0byBoYXZlCiAgICAgKiBvciB3ZSBydW4gb2ZmIHRoZSBlbmQgb2YgdGhlIHRhYmxlIChhbHNvIGhhcHBlbnMpCiAgICAgKi8KICAgIHdoaWxlICgoaTxudW0pICYmICgoZGF0YS1idWYpIDwgbGVuKSkgewoJZG1pID0gKERNSUhlYWRlciAqKWRhdGE7CgkvKgoJICogQXZvaWQgbWlzcGFyc2luZyBjcnVkIGlmIHRoZSBsZW5ndGggb2YgdGhlIGxhc3QKCSAqIHJlY29yZCBpcyBjcmFwCgkgKi8KCWlmICgoZGF0YS1idWYrZG1pLT5sZW5ndGgpID49IGxlbikgewoJICAgIGJyZWFrOwoJfQoJZm4oZG1pKTsKCWRhdGEgKz0gZG1pLT5sZW5ndGg7CgkvKgoJICogRG9uJ3QgZ28gb2ZmIHRoZSBlbmQgb2YgdGhlIGRhdGEgaWYgdGhlcmUgaXMKCSAqIHN0dWZmIGxvb2tpbmcgbGlrZSBzdHJpbmcgZmlsbCBwYXN0IHRoZSBlbmQKCSAqLwoJd2hpbGUgKCgoZGF0YS1idWYpIDwgbGVuKSAmJiAoKmRhdGEgfHwgZGF0YVsxXSkpIHsKCSAgICBkYXRhKys7Cgl9CglkYXRhICs9IDI7CglpKys7CiAgICB9CiAgICBpb3VubWFwKGJ1Zik7CgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgX19pbml0IGRtaV9pdGVyYXRlKHZvaWQgKCpkZWNvZGUpKERNSUhlYWRlciAqKSkKewoJdW5zaWduZWQgY2hhciBidWZbMjBdOwoJdm9pZCBfX2lvbWVtICpwID0gaW9yZW1hcCgweGUwMDAwLCAweDIwMDAwKSwgKnE7CgoJaWYgKCFwKQoJCXJldHVybiAtMTsKCglmb3IgKHEgPSBwOyBxIDwgcCArIDB4MjAwMDA7IHEgKz0gMTYpIHsKCQltZW1jcHlfZnJvbWlvKGJ1ZiwgcSwgMjApOwoJCWlmIChtZW1jbXAoYnVmLCAiX0RNSV8iLCA1KT09MCkgewoJCQl1MTYgbnVtICA9IGJ1ZlsxM108PDggIHwgYnVmWzEyXTsKCQkJdTE2IGxlbiAgPSBidWYgWzddPDw4ICB8IGJ1ZiBbNl07CgkJCXUzMiBiYXNlID0gYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XTsKI2lmZGVmIEk4S19ERUJVRwoJCQlwcmludGsoS0VSTl9JTkZPICJETUkgJWQuJWQgcHJlc2VudC5cbiIsCgkJCSAgIGJ1ZlsxNF0+PjQsIGJ1ZlsxNF0mMHgwRik7CgkJCXByaW50ayhLRVJOX0lORk8gIiVkIHN0cnVjdHVyZXMgb2NjdXB5aW5nICVkIGJ5dGVzLlxuIiwKCQkJICAgYnVmWzEzXTw8OCB8IGJ1ZlsxMl0sCgkJCSAgIGJ1ZiBbN108PDggfCBidWZbNl0pOwoJCQlwcmludGsoS0VSTl9JTkZPICJETUkgdGFibGUgYXQgMHglMDhYLlxuIiwKCQkJICAgYnVmWzExXTw8MjQgfCBidWZbMTBdPDwxNiB8IGJ1Zls5XTw8OCB8IGJ1Zls4XSk7CiNlbmRpZgoJCQlpZiAoZG1pX3RhYmxlKGJhc2UsIGxlbiwgbnVtLCBkZWNvZGUpPT0wKSB7CgkJCQlpb3VubWFwKHApOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQl9Cgl9Cglpb3VubWFwKHApOwoJcmV0dXJuIC0xOwp9Ci8qIGVuZCBvZiBETUkgY29kZSAqLwoKLyoKICogR2V0IERNSSBpbmZvcm1hdGlvbi4KICovCnN0YXRpYyBpbnQgX19pbml0IGk4a19kbWlfcHJvYmUodm9pZCkKewogICAgY2hhciAqKnA7CgogICAgaWYgKGRtaV9pdGVyYXRlKGRtaV9kZWNvZGUpICE9IDApIHsKCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBETUkgaW5mb3JtYXRpb25cbiIpOwoJcmV0dXJuIC1FTk9ERVY7CiAgICB9CgogICAgaWYgKHN0cm5jbXAoc3lzdGVtX3ZlbmRvcixERUxMX1NJR05BVFVSRSxzdHJsZW4oREVMTF9TSUdOQVRVUkUpKSAhPSAwKSB7CglwcmludGsoS0VSTl9JTkZPICJpOGs6IG5vdCBydW5uaW5nIG9uIGEgRGVsbCBzeXN0ZW1cbiIpOwoJcmV0dXJuIC1FTk9ERVY7CiAgICB9CgogICAgZm9yIChwPXN1cHBvcnRlZF9tb2RlbHM7IDsgcCsrKSB7CglpZiAoISpwKSB7CgkgICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB1bnN1cHBvcnRlZCBtb2RlbDogJXNcbiIsIHByb2R1Y3RfbmFtZSk7CgkgICAgcmV0dXJuIC1FTk9ERVY7Cgl9CglpZiAoc3RybmNtcChwcm9kdWN0X25hbWUsKnAsc3RybGVuKCpwKSkgPT0gMCkgewoJICAgIGJyZWFrOwoJfQogICAgfQoKICAgIHJldHVybiAwOwp9CgovKgogKiBQcm9iZSBmb3IgdGhlIHByZXNlbmNlIG9mIGEgc3VwcG9ydGVkIGxhcHRvcC4KICovCnN0YXRpYyBpbnQgX19pbml0IGk4a19wcm9iZSh2b2lkKQp7CiAgICBjaGFyIGJ1ZmZbNF07CiAgICBpbnQgdmVyc2lvbjsKICAgIGludCBzbW1fZm91bmQgPSAwOwoKICAgIC8qCiAgICAgKiBHZXQgRE1JIGluZm9ybWF0aW9uCiAgICAgKi8KICAgIGlmIChpOGtfZG1pX3Byb2JlKCkgIT0gMCkgewoJcHJpbnRrKEtFUk5fSU5GTyAiaThrOiB2ZW5kb3I9JXMsIG1vZGVsPSVzLCB2ZXJzaW9uPSVzXG4iLAoJICAgICAgIHN5c3RlbV92ZW5kb3IsIHByb2R1Y3RfbmFtZSwgYmlvc192ZXJzaW9uKTsKICAgIH0KCiAgICAvKgogICAgICogR2V0IFNNTSBEZWxsIHNpZ25hdHVyZQogICAgICovCiAgICBpZiAoaThrX2dldF9kZWxsX3NpZ25hdHVyZSgpICE9IDApIHsKCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBTTU0gRGVsbCBzaWduYXR1cmVcbiIpOwogICAgfSBlbHNlIHsKCXNtbV9mb3VuZCA9IDE7CiAgICB9CgogICAgLyoKICAgICAqIEdldCBTTU0gQklPUyB2ZXJzaW9uLgogICAgICovCiAgICB2ZXJzaW9uID0gaThrX2dldF9iaW9zX3ZlcnNpb24oKTsKICAgIGlmICh2ZXJzaW9uIDw9IDApIHsKCXByaW50ayhLRVJOX0lORk8gImk4azogdW5hYmxlIHRvIGdldCBTTU0gQklPUyB2ZXJzaW9uXG4iKTsKICAgIH0gZWxzZSB7CglzbW1fZm91bmQgPSAxOwoJYnVmZlswXSA9ICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmY7CglidWZmWzFdID0gKHZlcnNpb24gPj4gIDgpICYgMHhmZjsKCWJ1ZmZbMl0gPSAodmVyc2lvbikgICAgICAgJiAweGZmOwoJYnVmZlszXSA9ICdcMCc7CgkvKgoJICogSWYgRE1JIEJJT1MgdmVyc2lvbiBpcyB1bmtub3duIHVzZSBTTU0gQklPUyB2ZXJzaW9uLgoJICovCglpZiAoYmlvc192ZXJzaW9uWzBdID09ICc/JykgewoJICAgIHN0cmNweShiaW9zX3ZlcnNpb24sIGJ1ZmYpOwoJfQoJLyoKCSAqIENoZWNrIGlmIHRoZSB0d28gdmVyc2lvbnMgbWF0Y2guCgkgKi8KCWlmIChzdHJuY21wKGJ1ZmYsYmlvc192ZXJzaW9uLHNpemVvZihiaW9zX3ZlcnNpb24pKSAhPSAwKSB7CgkgICAgcHJpbnRrKEtFUk5fSU5GTyAiaThrOiBCSU9TIHZlcnNpb24gbWlzbWF0Y2g6ICVzICE9ICVzXG4iLAoJCSAgIGJ1ZmYsIGJpb3NfdmVyc2lvbik7Cgl9CiAgICB9CgogICAgaWYgKCFzbW1fZm91bmQgJiYgIWZvcmNlKSB7CglyZXR1cm4gLUVOT0RFVjsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKI2lmZGVmIE1PRFVMRQpzdGF0aWMKI2VuZGlmCmludCBfX2luaXQgaThrX2luaXQodm9pZCkKewogICAgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jX2k4azsKCiAgICAvKiBBcmUgd2UgcnVubmluZyBvbiBhbiBzdXBwb3J0ZWQgbGFwdG9wPyAqLwogICAgaWYgKGk4a19wcm9iZSgpICE9IDApIHsKCXJldHVybiAtRU5PREVWOwogICAgfQoKICAgIC8qIFJlZ2lzdGVyIHRoZSBwcm9jIGVudHJ5ICovCiAgICBwcm9jX2k4ayA9IGNyZWF0ZV9wcm9jX2luZm9fZW50cnkoImk4ayIsIDAsIE5VTEwsIGk4a19nZXRfaW5mbyk7CiAgICBpZiAoIXByb2NfaThrKSB7CglyZXR1cm4gLUVOT0VOVDsKICAgIH0KICAgIHByb2NfaThrLT5wcm9jX2ZvcHMgPSAmaThrX2ZvcHM7CiAgICBwcm9jX2k4ay0+b3duZXIgPSBUSElTX01PRFVMRTsKCiAgICBwcmludGsoS0VSTl9JTkZPCgkgICAiRGVsbCBsYXB0b3AgU01NIGRyaXZlciB2JXMgTWFzc2ltbyBEYWwgWm90dG8gKGR6QGRlYmlhbi5vcmcpXG4iLAoJICAgSThLX1ZFUlNJT04pOwoKICAgIHJldHVybiAwOwp9CgojaWZkZWYgTU9EVUxFCmludCBpbml0X21vZHVsZSh2b2lkKQp7CiAgICByZXR1cm4gaThrX2luaXQoKTsKfQoKdm9pZCBjbGVhbnVwX21vZHVsZSh2b2lkKQp7CiAgICAvKiBSZW1vdmUgdGhlIHByb2MgZW50cnkgKi8KICAgIHJlbW92ZV9wcm9jX2VudHJ5KCJpOGsiLCBOVUxMKTsKCiAgICBwcmludGsoS0VSTl9JTkZPICJpOGs6IG1vZHVsZSB1bmxvYWRlZFxuIik7Cn0KI2VuZGlmCgovKiBlbmQgb2YgZmlsZSAqLwo=