LyoKICogbmZzbW91bnQuYyAtLSBMaW51eCBORlMgbW91bnQKICogQ29weXJpZ2h0IChDKSAxOTkzIFJpY2sgU2xhZGtleSA8anJzQHdvcmxkLnN0ZC5jb20+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFdlZCBGZWIgIDggMTI6NTE6NDggMTk5NSwgYmlyb0B5Z2dkcmFzaWwuY29tIChSb3NzIEJpcm8pOiBhbGxvdyBhbGwgcG9ydAogKiBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgogKgogKiBGcmksIDggTWFyIDE5OTYgMTg6MDE6MzksIFN3ZW4gVGh1ZW1tbGVyIDxzd2VuQHVuaS1wYWRlcmJvcm4uZGU+OgogKiBPbWl0IHRoZSBjYWxsIHRvIGNvbm5lY3QoKSBmb3IgTGludXggdmVyc2lvbiAxLjMuMTEgb3IgbGF0ZXIuCiAqCiAqIFdlZCBPY3QgIDEgMjM6NTU6MjggMTk5NzogRGljayBTdHJlZWZsYW5kIDxkaWNrX3N0cmVlZmxhbmRAdGFza2luZy5jb20+CiAqIEltcGxlbWVudGVkIHRoZSAiYmciLCAiZmciIGFuZCAicmV0cnkiIG1vdW50IG9wdGlvbnMgZm9yIE5GUy4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICogTW9kaWZpZWQgYnkgT2xhZiBLaXJjaCBhbmQgVHJvbmQgTXlrbGVidXN0IGZvciBuZXcgTkZTIGNvZGUsCiAqIHBsdXMgTkZTdjMgc3R1ZmYuCiAqCiAqIDIwMDYtMDYtMDYgQW1pdCBHdWQgPGFndWRAcmVkaGF0LmNvbT4KICogLSBNb3ZlZCB3aXRoIG1vZGlmY2F0aW9ucyB0byBuZnMtdXRpbHMvdXRpbHMvbW91bnQgZnJvbSB1dGlsLWxpbnV4L21vdW50LgogKi8KCi8qCiAqIG5mc21vdW50LmMsdiAxLjEuMS4xIDE5OTMvMTEvMTggMDg6NDA6NTEganJzIEV4cAogKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8bmV0ZGIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHJwYy9ycGMuaD4KI2luY2x1ZGUgPHJwYy9wbWFwX3Byb3QuaD4KI2luY2x1ZGUgPHJwYy9wbWFwX2NsbnQuaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNpbmNsdWRlIDxtbnRlbnQuaD4KI2luY2x1ZGUgPHN5cy9tb3VudC5oPgojaW5jbHVkZSA8cGF0aHMuaD4KI2luY2x1ZGUgPHN5c2xvZy5oPgoKI2luY2x1ZGUgInhjb21tb24uaCIKI2luY2x1ZGUgIm1vdW50LmgiCiNpbmNsdWRlICJuZnNfbW91bnQuaCIKI2luY2x1ZGUgIm1vdW50X2NvbnN0YW50cy5oIgojaW5jbHVkZSAibmxzLmgiCiNpbmNsdWRlICJlcnJvci5oIgojaW5jbHVkZSAibmV0d29yay5oIgojaW5jbHVkZSAidmVyc2lvbi5oIgoKI2lmZGVmIEhBVkVfUlBDU1ZDX05GU19QUk9UX0gKI2luY2x1ZGUgPHJwY3N2Yy9uZnNfcHJvdC5oPgojZWxzZQojaW5jbHVkZSA8bGludXgvbmZzLmg+CiNkZWZpbmUgbmZzc3RhdCBuZnNfc3RhdAojZW5kaWYKCiNpZm5kZWYgTkZTX1BPUlQKI2RlZmluZSBORlNfUE9SVCAyMDQ5CiNlbmRpZgojaWZuZGVmIE5GU19GSFNJWkUKI2RlZmluZSBORlNfRkhTSVpFIDMyCiNlbmRpZgoKI2lmbmRlZiBIQVZFX0lORVRfQVRPTgojZGVmaW5lIGluZXRfYXRvbihhLGIpICgwKQojZW5kaWYKCnR5cGVkZWYgZGlycGF0aCBtbnQyYXJnX3Q7CnR5cGVkZWYgZGlycGF0aCBtbnQzYXJnX3Q7CnR5cGVkZWYgZGlycGF0aCBtbnRhcmdfdDsKCnR5cGVkZWYgc3RydWN0IGZoc3RhdHVzICBtbnQycmVzX3Q7CnR5cGVkZWYgc3RydWN0IG1vdW50cmVzMyBtbnQzcmVzX3Q7CnR5cGVkZWYgdW5pb24gewoJbW50MnJlc190IG5mc3YyOwoJbW50M3Jlc190IG5mc3YzOwp9IG1udHJlc190OwoKZXh0ZXJuIGludCBuZnNfbW91bnRfZGF0YV92ZXJzaW9uOwpleHRlcm4gY2hhciAqcHJvZ25hbWU7CmV4dGVybiBpbnQgdmVyYm9zZTsKZXh0ZXJuIGludCBzbG9wcHk7CgpzdGF0aWMgaW5saW5lIGVudW0gY2xudF9zdGF0Cm5mczNfbW91bnQoQ0xJRU5UICpjbG50LCBtbnQzYXJnX3QgKm1udDNhcmcsIG1udDNyZXNfdCAqbW50M3JlcykKewoJcmV0dXJuIGNsbnRfY2FsbChjbG50LCBNT1VOVFBST0MzX01OVCwKCQkJICh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLCAoY2FkZHJfdCkgbW50M2FyZywKCQkJICh4ZHJwcm9jX3QpIHhkcl9tb3VudHJlczMsIChjYWRkcl90KSBtbnQzcmVzLAoJCQkgVElNRU9VVCk7Cn0KCnN0YXRpYyBpbmxpbmUgZW51bSBjbG50X3N0YXQKbmZzMl9tb3VudChDTElFTlQgKmNsbnQsIG1udDJhcmdfdCAqbW50MmFyZywgbW50MnJlc190ICptbnQycmVzKQp7CglyZXR1cm4gY2xudF9jYWxsKGNsbnQsIE1PVU5UUFJPQ19NTlQsCgkJCSAoeGRycHJvY190KSB4ZHJfZGlycGF0aCwgKGNhZGRyX3QpIG1udDJhcmcsCgkJCSAoeGRycHJvY190KSB4ZHJfZmhzdGF0dXMsIChjYWRkcl90KSBtbnQycmVzLAoJCQkgVElNRU9VVCk7Cn0KCnN0YXRpYyBpbnQKbmZzX2NhbGxfbW91bnQoY2xudF9hZGRyX3QgKm1udF9zZXJ2ZXIsIGNsbnRfYWRkcl90ICpuZnNfc2VydmVyLAoJICAgICAgIG1udGFyZ190ICptbnRhcmcsIG1udHJlc190ICptbnRyZXMpCnsKCUNMSUVOVCAqY2xudDsKCWVudW0gY2xudF9zdGF0IHN0YXQ7CglpbnQgbXNvY2s7CgoJaWYgKCFwcm9iZV9ib3RocG9ydHMobW50X3NlcnZlciwgbmZzX3NlcnZlcikpCgkJZ290byBvdXRfYmFkOwoKCWNsbnQgPSBtbnRfb3BlbmNsbnQobW50X3NlcnZlciwgJm1zb2NrKTsKCWlmICghY2xudCkKCQlnb3RvIG91dF9iYWQ7CgkvKiBtYWtlIHBvaW50ZXJzIGluIHhkcl9tb3VudHJlczMgTlVMTCBzbwoJICogdGhhdCB4ZHJfYXJyYXkgYWxsb2NhdGVzIG1lbW9yeSBmb3IgdXMKCSAqLwoJbWVtc2V0KG1udHJlcywgMCwgc2l6ZW9mKCptbnRyZXMpKTsKCXN3aXRjaCAobW50X3NlcnZlci0+cG1hcC5wbV92ZXJzKSB7CgljYXNlIDM6CgkJc3RhdCA9IG5mczNfbW91bnQoY2xudCwgbW50YXJnLCAmbW50cmVzLT5uZnN2Myk7CgkJYnJlYWs7CgljYXNlIDI6CgljYXNlIDE6CgkJc3RhdCA9IG5mczJfbW91bnQoY2xudCwgbW50YXJnLCAmbW50cmVzLT5uZnN2Mik7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWdvdG8gb3V0X2JhZDsKCX0KCWlmIChzdGF0ICE9IFJQQ19TVUNDRVNTKSB7CgkJY2xudF9nZXRlcnIoY2xudCwgJnJwY19jcmVhdGVlcnIuY2ZfZXJyb3IpOwoJCXJwY19jcmVhdGVlcnIuY2Zfc3RhdCA9IHN0YXQ7Cgl9CgltbnRfY2xvc2VjbG50KGNsbnQsIG1zb2NrKTsKCWlmIChzdGF0ID09IFJQQ19TVUNDRVNTKQoJCXJldHVybiAxOwogb3V0X2JhZDoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50CnBhcnNlX29wdGlvbnMoY2hhciAqb2xkX29wdHMsIHN0cnVjdCBuZnNfbW91bnRfZGF0YSAqZGF0YSwKCSAgICAgIGludCAqYmcsIGludCAqcmV0cnksIGNsbnRfYWRkcl90ICptbnRfc2VydmVyLAoJICAgICAgY2xudF9hZGRyX3QgKm5mc19zZXJ2ZXIsIGNoYXIgKm5ld19vcHRzLCBjb25zdCBpbnQgb3B0X3NpemUpCnsKCXN0cnVjdCBzb2NrYWRkcl9pbiAqbW50X3NhZGRyID0gJm1udF9zZXJ2ZXItPnNhZGRyOwoJc3RydWN0IHBtYXAgKm1udF9wbWFwID0gJm1udF9zZXJ2ZXItPnBtYXA7CglzdHJ1Y3QgcG1hcCAqbmZzX3BtYXAgPSAmbmZzX3NlcnZlci0+cG1hcDsKCWludCBsZW47CgljaGFyICpvcHQsICpvcHRlcSwgKnAsICpvcHRfYiwgKnRtcF9vcHRzOwoJY2hhciAqbW91bnRob3N0ID0gTlVMTDsKCWNoYXIgY2J1ZlsxMjhdOwoJaW50IG9wZW5fcXVvdGUgPSAwOwoKCWRhdGEtPmZsYWdzID0gMDsKCSpiZyA9IDA7CgoJbGVuID0gc3RybGVuKG5ld19vcHRzKTsKCXRtcF9vcHRzID0geHN0cmR1cChvbGRfb3B0cyk7Cglmb3IgKHA9dG1wX29wdHMsIG9wdF9iPU5VTEw7IHAgJiYgKnA7IHArKykgewoJCWlmICghb3B0X2IpCgkJCW9wdF9iID0gcDsJCS8qIGJlZ2luIG9mIHRoZSBvcHRpb24gaXRlbSAqLwoJCWlmICgqcCA9PSAnIicpCgkJCW9wZW5fcXVvdGUgXj0gMTsJLyogcmV2ZXJzZSB0aGUgc3RhdHVzICovCgkJaWYgKG9wZW5fcXVvdGUpCgkJCWNvbnRpbnVlOwkJLyogc3RpbGwgaW4gYSBxdW90ZWQgYmxvY2sgKi8KCQlpZiAoKnAgPT0gJywnKQoJCQkqcCA9ICdcMCc7CQkvKiB0ZXJtaW5hdGUgdGhlIG9wdGlvbiBpdGVtICovCgkJaWYgKCpwID09ICdcMCcgfHwgKihwKzEpID09ICdcMCcpIHsKCQkJb3B0ID0gb3B0X2I7CQkvKiBvcHQgaXMgdXNlZnVsIG5vdyAqLwoJCQlvcHRfYiA9IE5VTEw7CgkJfQoJCWVsc2UKCQkJY29udGludWU7CQkvKiBzdGlsbCBzb21ld2hlcmUgaW4gdGhlIG9wdGlvbiBpdGVtICovCgoJCWlmIChzdHJsZW4ob3B0KSA+PSBzaXplb2YoY2J1ZikpCgkJCWdvdG8gYmFkX3BhcmFtZXRlcjsKCQlpZiAoKG9wdGVxID0gc3RyY2hyKG9wdCwgJz0nKSkgJiYgaXNkaWdpdChvcHRlcVsxXSkpIHsKCQkJaW50IHZhbCA9IGF0b2kob3B0ZXEgKyAxKTsJCgkJCSpvcHRlcSA9ICdcMCc7CgkJCWlmICghc3RyY21wKG9wdCwgInJzaXplIikpCgkJCQlkYXRhLT5yc2l6ZSA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJ3c2l6ZSIpKQoJCQkJZGF0YS0+d3NpemUgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAidGltZW8iKSkKCQkJCWRhdGEtPnRpbWVvID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInJldHJhbnMiKSkKCQkJCWRhdGEtPnJldHJhbnMgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWNyZWdtaW4iKSkKCQkJCWRhdGEtPmFjcmVnbWluID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjcmVnbWF4IikpCgkJCQlkYXRhLT5hY3JlZ21heCA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhY2Rpcm1pbiIpKQoJCQkJZGF0YS0+YWNkaXJtaW4gPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWNkaXJtYXgiKSkKCQkJCWRhdGEtPmFjZGlybWF4ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgImFjdGltZW8iKSkgewoJCQkJZGF0YS0+YWNyZWdtaW4gPSB2YWw7CgkJCQlkYXRhLT5hY3JlZ21heCA9IHZhbDsKCQkJCWRhdGEtPmFjZGlybWluID0gdmFsOwoJCQkJZGF0YS0+YWNkaXJtYXggPSB2YWw7CgkJCX0KCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZXRyeSIpKQoJCQkJKnJldHJ5ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgInBvcnQiKSkKCQkJCW5mc19wbWFwLT5wbV9wb3J0ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50cG9ydCIpKQoJCQkgICAgICAgIG1udF9wbWFwLT5wbV9wb3J0ID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50cHJvZyIpKQoJCQkJbW50X3BtYXAtPnBtX3Byb2cgPSB2YWw7CgkJCWVsc2UgaWYgKCFzdHJjbXAob3B0LCAibW91bnR2ZXJzIikpCgkJCQltbnRfcG1hcC0+cG1fdmVycyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJtb3VudGhvc3QiKSkKCQkJCW1vdW50aG9zdD14c3RybmR1cChvcHRlcSsxLCBzdHJjc3BuKG9wdGVxKzEsIiBcdFxuXHIsIikpOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3Byb2ciKSkKCQkJCW5mc19wbWFwLT5wbV9wcm9nID0gdmFsOwoJCQllbHNlIGlmICghc3RyY21wKG9wdCwgIm5mc3ZlcnMiKSB8fAoJCQkJICFzdHJjbXAob3B0LCAidmVycyIpKSB7CgkJCQluZnNfcG1hcC0+cG1fdmVycyA9IHZhbDsKCQkJCW9wdCA9ICJuZnN2ZXJzIjsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgIm5hbWxlbiIpKSB7CgkJCQlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA+PSAyKQoJCQkJCWRhdGEtPm5hbWxlbiA9IHZhbDsKCQkJCWVsc2UgaWYgKHNsb3BweSkKCQkJCQljb250aW51ZTsKCQkJCWVsc2UKCQkJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CiNlbmRpZgoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWRkciIpKSB7CgkJCQkvKiBpZ25vcmUgKi87CgkJCQljb250aW51ZTsKIAkJCX0gZWxzZSBpZiAoc2xvcHB5KQoJCQkJY29udGludWU7CgkJCWVsc2UKCQkJCWdvdG8gYmFkX3BhcmFtZXRlcjsKCQkJc3ByaW50ZihjYnVmLCAiJXM9JXMsIiwgb3B0LCBvcHRlcSsxKTsKCQl9IGVsc2UgaWYgKG9wdGVxKSB7CgkJCSpvcHRlcSA9ICdcMCc7CgkJCWlmICghc3RyY21wKG9wdCwgInByb3RvIikpIHsKCQkJCWlmICghc3RyY21wKG9wdGVxKzEsICJ1ZHAiKSkgewoJCQkJCW5mc19wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19VRFA7CgkJCQkJbW50X3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1VEUDsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCQkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKCQkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHRlcSsxLCAidGNwIikgJiYKCQkJCQkgICBuZnNfbW91bnRfZGF0YV92ZXJzaW9uID4gMikgewoJCQkJCW5mc19wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19UQ1A7CgkJCQkJbW50X3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1RDUDsKCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfVENQOwojZW5kaWYKCQkJCX0gZWxzZSBpZiAoc2xvcHB5KQoJCQkJCWNvbnRpbnVlOwoJCQkJZWxzZQoJCQkJCWdvdG8gYmFkX3BhcmFtZXRlcjsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDUKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgInNlYyIpKSB7CgkJCQljaGFyICpzZWNmbGF2b3IgPSBvcHRlcSsxOwoJCQkJLyogc2VlIFJGQyAyNjIzICovCgkJCQlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA8IDUpIHsKCQkJCQlwcmludGYoXygiV2FybmluZzogaWdub3Jpbmcgc2VjPSVzIG9wdGlvblxuIiksCgkJCQkJCQlzZWNmbGF2b3IpOwoJCQkJCWNvbnRpbnVlOwoJCQkJfSBlbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgIm5vbmUiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX05PTkU7CgkJCQllbHNlIGlmICghc3RyY21wKHNlY2ZsYXZvciwgInN5cyIpKQoJCQkJCWRhdGEtPnBzZXVkb2ZsYXZvciA9IEFVVEhfU1lTOwoJCQkJZWxzZSBpZiAoIXN0cmNtcChzZWNmbGF2b3IsICJrcmI1IikpCgkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfS1JCNTsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAia3JiNWkiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19LUkI1STsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAia3JiNXAiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19LUkI1UDsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAibGlwa2V5IikpCgkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfTEtFWTsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAibGlwa2V5LWkiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19MS0VZSTsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAibGlwa2V5LXAiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19MS0VZUDsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAic3BrbTMiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19TUEtNOwoJCQkJZWxzZSBpZiAoIXN0cmNtcChzZWNmbGF2b3IsICJzcGttM2kiKSkKCQkJCQlkYXRhLT5wc2V1ZG9mbGF2b3IgPSBBVVRIX0dTU19TUEtNSTsKCQkJCWVsc2UgaWYgKCFzdHJjbXAoc2VjZmxhdm9yLCAic3BrbTNwIikpCgkJCQkJZGF0YS0+cHNldWRvZmxhdm9yID0gQVVUSF9HU1NfU1BLTVA7CgkJCQllbHNlIGlmIChzbG9wcHkpCgkJCQkJY29udGludWU7CgkJCQllbHNlIHsKCQkJCQlwcmludGYoXygiV2FybmluZzogVW5yZWNvZ25pemVkIHNlY3VyaXR5IGZsYXZvciAlcy5cbiIpLAoJCQkJCQlzZWNmbGF2b3IpOwoJCQkJCWdvdG8gYmFkX3BhcmFtZXRlcjsKCQkJCX0KCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9TRUNGTEFWT1VSOwojZW5kaWYKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgIm1vdW50aG9zdCIpKQoJCQkgICAgICAgIG1vdW50aG9zdD14c3RybmR1cChvcHRlcSsxLAoJCQkJCQkgICBzdHJjc3BuKG9wdGVxKzEsIiBcdFxuXHIsIikpOwoJCQkgZWxzZSBpZiAoIXN0cmNtcChvcHQsICJjb250ZXh0IikpIHsKCQkJCWNoYXIgKmNvbnRleHQgPSBvcHRlcSArIDE7CgkJCQlpbnQgY3R4bGVuID0gc3RybGVuKGNvbnRleHQpOwoKCQkJCWlmIChjdHhsZW4gPiBORlNfTUFYX0NPTlRFWFRfTEVOKSB7CgkJCQkJbmZzX2Vycm9yKF8oImNvbnRleHQgcGFyYW1ldGVyIGV4Y2VlZHMiCgkJCQkJCQkiIGxpbWl0IG9mICVkIiksCgkJCQkJCQlORlNfTUFYX0NPTlRFWFRfTEVOKTsKCQkJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CgkJCQl9CgkJCQkvKiBUaGUgY29udGV4dCBzdHJpbmcgaXMgaW4gdGhlIGZvcm1hdCBvZgoJCQkJICogInN5c3RlbV91Om9iamVjdF9yOi4uLiIuICBXZSBvbmx5IHdhbnQKCQkJCSAqIHRoZSBjb250ZXh0IHN0ciBiZXR3ZWVuIHRoZSBxdW90ZXMuCgkJCQkgKi8KCQkJCWlmICgqY29udGV4dCA9PSAnIicpCgkJCQkJc3RybmNweShkYXRhLT5jb250ZXh0LCBjb250ZXh0KzEsCgkJCQkJCQljdHhsZW4tMik7CgkJCQllbHNlCgkJCQkJc3RybmNweShkYXRhLT5jb250ZXh0LCBjb250ZXh0LAoJCQkJCQkJTkZTX01BWF9DT05URVhUX0xFTik7CiAJCQl9IGVsc2UgaWYgKHNsb3BweSkKCQkJCWNvbnRpbnVlOwoJCQllbHNlCgkJCQlnb3RvIGJhZF9wYXJhbWV0ZXI7CgkJCXNwcmludGYoY2J1ZiwgIiVzPSVzLCIsIG9wdCwgb3B0ZXErMSk7CgkJfSBlbHNlIHsKCQkJaW50IHZhbCA9IDE7CgkJCWlmICghc3RybmNtcChvcHQsICJubyIsIDIpKSB7CgkJCQl2YWwgPSAwOwoJCQkJb3B0ICs9IDI7CgkJCX0KCQkJaWYgKCFzdHJjbXAob3B0LCAiYmciKSkKCQkJCSpiZyA9IHZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJmZyIpKQoJCQkJKmJnID0gIXZhbDsKCQkJZWxzZSBpZiAoIXN0cmNtcChvcHQsICJzb2Z0IikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfU09GVDsKCQkJCWlmICh2YWwpCgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1NPRlQ7CgkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJoYXJkIikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfU09GVDsKCQkJCWlmICghdmFsKQoJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9TT0ZUOwoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiaW50ciIpKSB7CgkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX0lOVFI7CgkJCQlpZiAodmFsKQoJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9JTlRSOwoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAicG9zaXgiKSkgewoJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9QT1NJWDsKCQkJCWlmICh2YWwpCgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1BPU0lYOwoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiY3RvIikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9DVE87CgkJCQlpZiAoIXZhbCkKCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9DVE87CgkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJhYyIpKSB7CgkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX05PQUM7CgkJCQlpZiAoIXZhbCkKCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9BQzsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgInRjcCIpKSB7CgkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKCQkJCWlmICh2YWwpIHsKCQkJCQlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA8IDIpCgkJCQkJCWdvdG8gYmFkX29wdGlvbjsKCQkJCQluZnNfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVENQOwoJCQkJCW1udF9wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19UQ1A7CgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKCQkJCX0gZWxzZSB7CgkJCQkJbW50X3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1VEUDsKCQkJCQluZnNfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAidWRwIikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfVENQOwoJCQkJaWYgKCF2YWwpIHsKCQkJCQlpZiAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA8IDIpCgkJCQkJCWdvdG8gYmFkX29wdGlvbjsKCQkJCQluZnNfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVENQOwoJCQkJCW1udF9wbWFwLT5wbV9wcm90ID0gSVBQUk9UT19UQ1A7CgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX1RDUDsKCQkJCX0gZWxzZSB7CgkJCQkJbmZzX3BtYXAtPnBtX3Byb3QgPSBJUFBST1RPX1VEUDsKCQkJCQltbnRfcG1hcC0+cG1fcHJvdCA9IElQUFJPVE9fVURQOwoJCQkJfQojZW5kaWYKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDMKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImxvY2siKSkgewoJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9OT05MTTsKCQkJCWlmICghdmFsKSB7CgkJCQkJaWYgKG5mc19tb3VudF9kYXRhX3ZlcnNpb24gPCAzKQoJCQkJCQlnb3RvIGJhZF9vcHRpb247CgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX05PTkxNOwoJCQkJfQojZW5kaWYKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDQKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgImJyb2tlbl9zdWlkIikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfQlJPS0VOX1NVSUQ7CgkJCQlpZiAodmFsKSB7CgkJCQkJaWYgKG5mc19tb3VudF9kYXRhX3ZlcnNpb24gPCA0KQoJCQkJCQlnb3RvIGJhZF9vcHRpb247CgkJCQkJZGF0YS0+ZmxhZ3MgfD0gTkZTX01PVU5UX0JST0tFTl9TVUlEOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCFzdHJjbXAob3B0LCAiYWNsIikpIHsKCQkJCWRhdGEtPmZsYWdzICY9IH5ORlNfTU9VTlRfTk9BQ0w7CgkJCQlpZiAoIXZhbCkKCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9BQ0w7CgkJCX0gZWxzZSBpZiAoIXN0cmNtcChvcHQsICJyZGlycGx1cyIpKSB7CgkJCQlkYXRhLT5mbGFncyAmPSB+TkZTX01PVU5UX05PUkRJUlBMVVM7CgkJCQlpZiAoIXZhbCkKCQkJCQlkYXRhLT5mbGFncyB8PSBORlNfTU9VTlRfTk9SRElSUExVUzsKCQkJfSBlbHNlIGlmICghc3RyY21wKG9wdCwgInNoYXJlY2FjaGUiKSkgewoJCQkJZGF0YS0+ZmxhZ3MgJj0gfk5GU19NT1VOVF9VTlNIQVJFRDsKCQkJCWlmICghdmFsKQoJCQkJCWRhdGEtPmZsYWdzIHw9IE5GU19NT1VOVF9VTlNIQVJFRDsKI2VuZGlmCgkJCX0gZWxzZSB7CgkJCWJhZF9vcHRpb246CgkJCQlpZiAoc2xvcHB5KQoJCQkJCWNvbnRpbnVlOwoJCQkJbmZzX2Vycm9yKF8oIiVzOiBVbnN1cHBvcnRlZCBuZnMgbW91bnQgb3B0aW9uOiIKCQkJCQkJIiAlcyVzIiksIHByb2duYW1lLAoJCQkJCQl2YWwgPyAiIiA6ICJubyIsIG9wdCk7CgkJCQlnb3RvIG91dF9iYWQ7CgkJCX0KCQkJc3ByaW50ZihjYnVmLCB2YWwgPyAiJXMsIiA6ICJubyVzLCIsIG9wdCk7CgkJfQoJCWxlbiArPSBzdHJsZW4oY2J1Zik7CgkJaWYgKGxlbiA+PSBvcHRfc2l6ZSkgewoJCQluZnNfZXJyb3IoXygiJXM6IGV4Y2Vzc2l2ZWx5IGxvbmcgb3B0aW9uIGFyZ3VtZW50IiksCgkJCQkJcHJvZ25hbWUpOwoJCQlnb3RvIG91dF9iYWQ7CgkJfQoJCXN0cmNhdChuZXdfb3B0cywgY2J1Zik7Cgl9CgkvKiBTZWUgaWYgdGhlIG5mcyBob3N0ID0gbW91bnQgaG9zdC4gKi8KCWlmIChtb3VudGhvc3QpIHsKCQlpZiAoIW5mc19nZXRob3N0YnluYW1lKG1vdW50aG9zdCwgbW50X3NhZGRyKSkKCQkJZ290byBvdXRfYmFkOwoJCSptbnRfc2VydmVyLT5ob3N0bmFtZSA9IG1vdW50aG9zdDsKCX0KCWZyZWUodG1wX29wdHMpOwoJcmV0dXJuIDE7CiBiYWRfcGFyYW1ldGVyOgoJbmZzX2Vycm9yKF8oIiVzOiBCYWQgbmZzIG1vdW50IHBhcmFtZXRlcjogJXNcbiIpLCBwcm9nbmFtZSwgb3B0KTsKIG91dF9iYWQ6CglmcmVlKHRtcF9vcHRzKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IG5mc21udF9jaGVja19jb21wYXQoY29uc3Qgc3RydWN0IHBtYXAgKm5mc19wbWFwLAoJCQkJY29uc3Qgc3RydWN0IHBtYXAgKm1udF9wbWFwKQp7Cgl1bnNpZ25lZCBpbnQgbWF4X25mc192ZXJzID0gKG5mc19tb3VudF9kYXRhX3ZlcnNpb24gPj0gNCkgPyAzIDogMjsKCXVuc2lnbmVkIGludCBtYXhfbW50X3ZlcnMgPSAobmZzX21vdW50X2RhdGFfdmVyc2lvbiA+PSA0KSA/IDMgOiAyOwoKCWlmIChuZnNfcG1hcC0+cG1fdmVycyA9PSA0KSB7CgkJbmZzX2Vycm9yKF8oIiVzOiBQbGVhc2UgdXNlICctdCBuZnM0JyAiCgkJCQkiaW5zdGVhZCBvZiAnLW8gdmVycz00JyIpLCBwcm9nbmFtZSk7CgkJZ290byBvdXRfYmFkOwoJfQoKCWlmIChuZnNfcG1hcC0+cG1fdmVycykgewoJCWlmIChuZnNfcG1hcC0+cG1fdmVycyA+IG1heF9uZnNfdmVycyB8fCBuZnNfcG1hcC0+cG1fdmVycyA8IDIpIHsKCQkJbmZzX2Vycm9yKF8oIiVzOiBORlMgdmVyc2lvbiAlbGQgaXMgbm90IHN1cHBvcnRlZCIpLAoJCQkJCXByb2duYW1lLCBuZnNfcG1hcC0+cG1fdmVycyk7CgkJCWdvdG8gb3V0X2JhZDsKCQl9Cgl9CgoJaWYgKG1udF9wbWFwLT5wbV92ZXJzID4gbWF4X21udF92ZXJzKSB7CgkJbmZzX2Vycm9yKF8oIiVzOiBORlMgbW91bnQgdmVyc2lvbiAlbGQgaXMgbm90IHN1cHBvcnRlZCIpLAoJCQkJcHJvZ25hbWUsIG1udF9wbWFwLT5wbV92ZXJzKTsKCQlnb3RvIG91dF9iYWQ7Cgl9CgoJcmV0dXJuIDE7CgpvdXRfYmFkOgoJcmV0dXJuIDA7Cn0KCmludApuZnNtb3VudChjb25zdCBjaGFyICpzcGVjLCBjb25zdCBjaGFyICpub2RlLCBpbnQgZmxhZ3MsCgkgY2hhciAqKmV4dHJhX29wdHMsIGludCBmYWtlLCBpbnQgcnVubmluZ19iZykKewoJY2hhciBob3N0ZGlyWzEwMjRdOwoJY2hhciAqaG9zdG5hbWUsICpkaXJuYW1lLCAqb2xkX29wdHMsICptb3VudGhvc3QgPSBOVUxMOwoJY2hhciBuZXdfb3B0c1sxMDI0XSwgY2J1ZlsxMDI0XTsKCXN0YXRpYyBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgZGF0YTsKCWludCB2YWw7CglzdGF0aWMgaW50IGRvb25jZSA9IDA7CgoJY2xudF9hZGRyX3QgbW50X3NlcnZlciA9IHsgJm1vdW50aG9zdCwgfTsKCWNsbnRfYWRkcl90IG5mc19zZXJ2ZXIgPSB7ICZob3N0bmFtZSwgfTsKCXN0cnVjdCBzb2NrYWRkcl9pbiAqbmZzX3NhZGRyID0gJm5mc19zZXJ2ZXIuc2FkZHI7CglzdHJ1Y3QgcG1hcCAgKm1udF9wbWFwID0gJm1udF9zZXJ2ZXIucG1hcCwKCQkgICAgICpuZnNfcG1hcCA9ICZuZnNfc2VydmVyLnBtYXA7CglzdHJ1Y3QgcG1hcCAgc2F2ZV9tbnQsIHNhdmVfbmZzOwoKCWludCBmc29jayA9IC0xOwoKCW1udHJlc190IG1udHJlczsKCglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJY2hhciAqczsKCWludCBiZywgcmV0cnk7CglpbnQgcmV0dmFsID0gRVhfRkFJTDsKCXRpbWVfdCB0OwoJdGltZV90IHByZXZ0OwoJdGltZV90IHRpbWVvdXQ7CgoJaWYgKHN0cmxlbihzcGVjKSA+PSBzaXplb2YoaG9zdGRpcikpIHsKCQluZnNfZXJyb3IoXygiJXM6IGV4Y2Vzc2l2ZWx5IGxvbmcgaG9zdDpkaXIgYXJndW1lbnQiKSwKCQkJCXByb2duYW1lKTsKCQlnb3RvIGZhaWw7Cgl9CglzdHJjcHkoaG9zdGRpciwgc3BlYyk7CglpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJzonKSkpIHsKCQlob3N0bmFtZSA9IGhvc3RkaXI7CgkJZGlybmFtZSA9IHMgKyAxOwoJCSpzID0gJ1wwJzsKCQkvKiBJZ25vcmUgYWxsIGJ1dCBmaXJzdCBob3N0bmFtZSBpbiByZXBsaWNhdGVkIG1vdW50cwoJCSAgIHVudGlsIHRoZXkgY2FuIGJlIGZ1bGx5IHN1cHBvcnRlZC4gKG1hY2tAc2dpLmNvbSkgKi8KCQlpZiAoKHMgPSBzdHJjaHIoaG9zdGRpciwgJywnKSkpIHsKCQkJKnMgPSAnXDAnOwoJCQluZnNfZXJyb3IoXygiJXM6IHdhcm5pbmc6ICIKCQkJCSAgIm11bHRpcGxlIGhvc3RuYW1lcyBub3Qgc3VwcG9ydGVkIiksCgkJCQkJcHJvZ25hbWUpOwoJCX0KCX0gZWxzZSB7CgkJbmZzX2Vycm9yKF8oIiVzOiBkaXJlY3RvcnkgdG8gbW91bnQgbm90IGluIGhvc3Q6ZGlyIGZvcm1hdCIpLAoJCQkJcHJvZ25hbWUpOwoJCWdvdG8gZmFpbDsKCX0KCglpZiAoIW5mc19nZXRob3N0YnluYW1lKGhvc3RuYW1lLCBuZnNfc2FkZHIpKQoJCWdvdG8gZmFpbDsKCW1vdW50aG9zdCA9IGhvc3RuYW1lOwoJbWVtY3B5ICgmbW50X3NlcnZlci5zYWRkciwgbmZzX3NhZGRyLCBzaXplb2YgKG1udF9zZXJ2ZXIuc2FkZHIpKTsKCgkvKiBhZGQgSVAgYWRkcmVzcyB0byBtdGFiIG9wdGlvbnMgZm9yIHVzZSB3aGVuIHVubW91bnRpbmcgKi8KCglzID0gaW5ldF9udG9hKG5mc19zYWRkci0+c2luX2FkZHIpOwoJb2xkX29wdHMgPSAqZXh0cmFfb3B0czsKCWlmICghb2xkX29wdHMpCgkJb2xkX29wdHMgPSAiIjsKCgkvKiBTZXQgZGVmYXVsdCBvcHRpb25zLgoJICogcnNpemUvd3NpemUgKGFuZCBic2l6ZSwgZm9yIHZlciA+PSAzKSBhcmUgbGVmdCAwIGluIG9yZGVyIHRvCgkgKiBsZXQgdGhlIGtlcm5lbCBkZWNpZGUuCgkgKiB0aW1lbyBpcyBmaWxsZWQgaW4gYWZ0ZXIgd2Uga25vdyB3aGV0aGVyIGl0J2xsIGJlIFRDUCBvciBVRFAuICovCgltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CglkYXRhLmFjcmVnbWluCT0gMzsKCWRhdGEuYWNyZWdtYXgJPSA2MDsKCWRhdGEuYWNkaXJtaW4JPSAzMDsKCWRhdGEuYWNkaXJtYXgJPSA2MDsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDIKCWRhdGEubmFtbGVuCT0gTkFNRV9NQVg7CiNlbmRpZgoKCWJnID0gMDsKCXJldHJ5ID0gLTE7CgoJbWVtc2V0KG1udF9wbWFwLCAwLCBzaXplb2YoKm1udF9wbWFwKSk7CgltbnRfcG1hcC0+cG1fcHJvZyA9IE1PVU5UUFJPRzsKCW1lbXNldChuZnNfcG1hcCwgMCwgc2l6ZW9mKCpuZnNfcG1hcCkpOwoJbmZzX3BtYXAtPnBtX3Byb2cgPSBORlNfUFJPR1JBTTsKCgkvKiBwYXJzZSBvcHRpb25zICovCgluZXdfb3B0c1swXSA9IDA7CglpZiAoIXBhcnNlX29wdGlvbnMob2xkX29wdHMsICZkYXRhLCAmYmcsICZyZXRyeSwgJm1udF9zZXJ2ZXIsICZuZnNfc2VydmVyLAoJCQkgICBuZXdfb3B0cywgc2l6ZW9mKG5ld19vcHRzKSkpCgkJZ290byBmYWlsOwoJaWYgKCFuZnNtbnRfY2hlY2tfY29tcGF0KG5mc19wbWFwLCBtbnRfcG1hcCkpCgkJZ290byBmYWlsOwoKCWlmIChyZXRyeSA9PSAtMSkgewoJCWlmIChiZykKCQkJcmV0cnkgPSAxMDAwMDsJLyogMTAwMDAgbWlucyA9PSB+MSB3ZWVrKi8KCQllbHNlCgkJCXJldHJ5ID0gMjsJLyogMiBtaW4gZGVmYXVsdCBvbiBmZyBtb3VudHMgKi8KCX0KCiNpZmRlZiBORlNfTU9VTlRfREVCVUcKCXByaW50ZihfKCJyc2l6ZSA9ICVkLCB3c2l6ZSA9ICVkLCB0aW1lbyA9ICVkLCByZXRyYW5zID0gJWRcbiIpLAoJICAgICAgIGRhdGEucnNpemUsIGRhdGEud3NpemUsIGRhdGEudGltZW8sIGRhdGEucmV0cmFucyk7CglwcmludGYoXygiYWNyZWcgKG1pbiwgbWF4KSA9ICglZCwgJWQpLCBhY2RpciAobWluLCBtYXgpID0gKCVkLCAlZClcbiIpLAoJICAgICAgIGRhdGEuYWNyZWdtaW4sIGRhdGEuYWNyZWdtYXgsIGRhdGEuYWNkaXJtaW4sIGRhdGEuYWNkaXJtYXgpOwoJcHJpbnRmKF8oInBvcnQgPSAlbHUsIGJnID0gJWQsIHJldHJ5ID0gJWQsIGZsYWdzID0gJS44eFxuIiksCgkgICAgICAgbmZzX3BtYXAtPnBtX3BvcnQsIGJnLCByZXRyeSwgZGF0YS5mbGFncyk7CglwcmludGYoXygibW91bnRwcm9nID0gJWx1LCBtb3VudHZlcnMgPSAlbHUsIG5mc3Byb2cgPSAlbHUsIG5mc3ZlcnMgPSAlbHVcbiIpLAoJICAgICAgIG1udF9wbWFwLT5wbV9wcm9nLCBtbnRfcG1hcC0+cG1fdmVycywKCSAgICAgICBuZnNfcG1hcC0+cG1fcHJvZywgbmZzX3BtYXAtPnBtX3ZlcnMpOwoJcHJpbnRmKF8oInNvZnQgPSAlZCwgaW50ciA9ICVkLCBwb3NpeCA9ICVkLCBub2N0byA9ICVkLCBub2FjID0gJWQiKSwKCSAgICAgICAoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9TT0ZUKSAhPSAwLAoJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX0lOVFIpICE9IDAsCgkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfUE9TSVgpICE9IDAsCgkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9DVE8pICE9IDAsCgkgICAgICAgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9BQykgIT0gMCk7CiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCglwcmludGYoXygiLCB0Y3AgPSAlZCIpLAoJICAgICAgIChkYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgIT0gMCk7CiNlbmRpZgojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNAoJcHJpbnRmKF8oIiwgbm9hY2wgPSAlZCIpLCAoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT0FDTCkgIT0gMCk7CiNlbmRpZgojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNQoJcHJpbnRmKF8oIiwgc2VjID0gJXUiKSwgZGF0YS5wc2V1ZG9mbGF2b3IpOwoJcHJpbnRmKF8oIiwgcmVhZGRpcnBsdXMgPSAlZCIpLCAoZGF0YS5mbGFncyAmIE5GU19NT1VOVF9OT1JESVJQTFVTKSAhPSAwKTsKI2VuZGlmCglwcmludGYoIlxuIik7CiNlbmRpZgoKCWRhdGEudmVyc2lvbiA9IG5mc19tb3VudF9kYXRhX3ZlcnNpb247CgoJaWYgKGZsYWdzICYgTVNfUkVNT1VOVCkKCQlnb3RvIG91dF9vazsKCgkvKiBjcmVhdGUgbW91bnQgZGVhbW9uIGNsaWVudCAqLwoKCS8qCgkgKiBUaGUgZm9sbG93aW5nIGxvb3AgaW1wbGVtZW50cyB0aGUgbW91bnQgcmV0cmllcy4gT24gdGhlIGZpcnN0CgkgKiBjYWxsLCAicnVubmluZ19iZyIgaXMgMC4gV2hlbiB0aGUgbW91bnQgdGltZXMgb3V0LCBhbmQgdGhlCgkgKiAiYmciIG9wdGlvbiBpcyBzZXQsIHRoZSBleGl0IHN0YXR1cyBFWF9CRyB3aWxsIGJlIHJldHVybmVkLgoJICogRm9yIGEgYmFja2dyb3VuZGVkIG1vdW50LCB0aGVyZSB3aWxsIGJlIGEgc2Vjb25kIGNhbGwgYnkgdGhlCgkgKiBjaGlsZCBwcm9jZXNzIHdpdGggInJ1bm5pbmdfYmciIHNldCB0byAxLgoJICoKCSAqIFRoZSBjYXNlIHdoZXJlIHRoZSBtb3VudCBwb2ludCBpcyBub3QgcHJlc2VudCBhbmQgdGhlICJiZyIKCSAqIG9wdGlvbiBpcyBzZXQsIGlzIHRyZWF0ZWQgYXMgYSB0aW1lb3V0LiBUaGlzIGlzIGRvbmUgdG8KCSAqIHN1cHBvcnQgbmVzdGVkIG1vdW50cy4KCSAqCgkgKiBUaGUgInJldHJ5IiBjb3VudCBzcGVjaWZpZWQgYnkgdGhlIHVzZXIgaXMgdGhlIG51bWJlciBvZgoJICogbWludXRlcyB0byByZXRyeSBiZWZvcmUgZ2l2aW5nIHVwLgoJICoKCSAqIE9ubHkgdGhlIGZpcnN0IGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBkaXNwbGF5ZWQuCgkgKi8KCXRpbWVvdXQgPSB0aW1lKE5VTEwpICsgNjAgKiByZXRyeTsKCXByZXZ0ID0gMDsKCXQgPSAzMDsKCXZhbCA9IDE7CgoJbWVtY3B5KCZzYXZlX25mcywgbmZzX3BtYXAsIHNpemVvZihzYXZlX25mcykpOwoJbWVtY3B5KCZzYXZlX21udCwgbW50X3BtYXAsIHNpemVvZihzYXZlX21udCkpOwoJZm9yICg7OykgewoJCWlmIChiZyAmJiBzdGF0KG5vZGUsICZzdGF0YnVmKSA9PSAtMSkgewoJCQkvKiBubyBtb3VudCBwb2ludCB5ZXQgLSBzbGVlcCAqLwoJCQlpZiAocnVubmluZ19iZykgewoJCQkJc2xlZXAodmFsKTsJLyogMSwgMiwgNCwgOCwgMTYsIDMwLCAuLi4gKi8KCQkJCXZhbCAqPSAyOwoJCQkJaWYgKHZhbCA+IDMwKQoJCQkJCXZhbCA9IDMwOwoJCQl9CgkJfSBlbHNlIHsKCQkJaW50IHN0YXQ7CgkJCS8qIGJlIGNhcmVmdWwgbm90IHRvIHVzZSB0b28gbWFueSBDUFUgY3ljbGVzICovCgkJCWlmICh0IC0gcHJldnQgPCAzMCkKCQkJCXNsZWVwKDMwKTsKCgkJCXN0YXQgPSBuZnNfY2FsbF9tb3VudCgmbW50X3NlcnZlciwgJm5mc19zZXJ2ZXIsCgkJCQkJICAgICAgJmRpcm5hbWUsICZtbnRyZXMpOwoJCQlpZiAoc3RhdCkKCQkJCWJyZWFrOwoJCQltZW1jcHkobmZzX3BtYXAsICZzYXZlX25mcywgc2l6ZW9mKCpuZnNfcG1hcCkpOwoJCQltZW1jcHkobW50X3BtYXAsICZzYXZlX21udCwgc2l6ZW9mKCptbnRfcG1hcCkpOwoJCQlwcmV2dCA9IHQ7CgkJfQoJCWlmICghYmcpIHsKCQkJc3dpdGNoKHJwY19jcmVhdGVlcnIuY2Zfc3RhdCl7CgkJCWNhc2UgUlBDX1RJTUVET1VUOgoJCQkJYnJlYWs7CgkJCWNhc2UgUlBDX1NZU1RFTUVSUk9SOgoJCQkJaWYgKGVycm5vID09IEVUSU1FRE9VVCkKCQkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJwY19tb3VudF9lcnJvcnMoKm5mc19zZXJ2ZXIuaG9zdG5hbWUsIDAsIGJnKTsKCQkgICAgICAgIGdvdG8gZmFpbDsKCQkJfQoJCQl0ID0gdGltZShOVUxMKTsKCQkJaWYgKHQgPj0gdGltZW91dCkgewoJCQkJcnBjX21vdW50X2Vycm9ycygqbmZzX3NlcnZlci5ob3N0bmFtZSwgMCwgYmcpOwoJCQkJZ290byBmYWlsOwoJCQl9CgkJCXJwY19tb3VudF9lcnJvcnMoKm5mc19zZXJ2ZXIuaG9zdG5hbWUsIDEsIGJnKTsKCQkJY29udGludWU7CgkJfQoJCWlmICghcnVubmluZ19iZykgewoJCQlpZiAocmV0cnkgPiAwKQoJCQkJcmV0dmFsID0gRVhfQkc7CgkJCWdvdG8gZmFpbDsKCQl9CgkJdCA9IHRpbWUoTlVMTCk7CgkJaWYgKHQgPj0gdGltZW91dCkgewoJCQlycGNfbW91bnRfZXJyb3JzKCpuZnNfc2VydmVyLmhvc3RuYW1lLCAwLCBiZyk7CgkJCWdvdG8gZmFpbDsKCQl9CgkJaWYgKGRvb25jZSsrIDwgMSkKCQkJcnBjX21vdW50X2Vycm9ycygqbmZzX3NlcnZlci5ob3N0bmFtZSwgMSwgYmcpOwoJfQoKCWlmIChtbnRfcG1hcC0+cG1fdmVycyA8PSAyKSB7CgkJaWYgKG1udHJlcy5uZnN2Mi5maHNfc3RhdHVzICE9IDApIHsKCQkJbmZzX2Vycm9yKF8oIiVzOiAlczolcyBmYWlsZWQsIHJlYXNvbiBnaXZlbiBieSBzZXJ2ZXI6ICVzIiksCgkJCQkJcHJvZ25hbWUsIGhvc3RuYW1lLCBkaXJuYW1lLAoJCQkJCW5mc19zdHJlcnJvcihtbnRyZXMubmZzdjIuZmhzX3N0YXR1cykpOwoJCQlnb3RvIGZhaWw7CgkJfQoJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKCQkgICAgICAgKGNoYXIgKikgbW50cmVzLm5mc3YyLmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUsCgkJICAgICAgIE5GU19GSFNJWkUpOwojaWYgTkZTX01PVU5UX1ZFUlNJT04gPj0gNAoJCWRhdGEucm9vdC5zaXplID0gTkZTX0ZIU0laRTsKCQltZW1jcHkoZGF0YS5vbGRfcm9vdC5kYXRhLAoJCSAgICAgICAoY2hhciAqKSBtbnRyZXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKCQkgICAgICAgTkZTX0ZIU0laRSk7CiNlbmRpZgoJfSBlbHNlIHsKI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDQKCQltb3VudHJlczNfb2sgKm1vdW50cmVzOwoJCWZoYW5kbGUzICpmaGFuZGxlOwoJCWludCBpLCAgbl9mbGF2b3JzLCAqZmxhdm9yLCB5dW0gPSAwOwoJCWlmIChtbnRyZXMubmZzdjMuZmhzX3N0YXR1cyAhPSAwKSB7CgkJCW5mc19lcnJvcihfKCIlczogJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlcyIpLAoJCQkJCXByb2duYW1lLCBob3N0bmFtZSwgZGlybmFtZSwKCQkJCQluZnNfc3RyZXJyb3IobW50cmVzLm5mc3YzLmZoc19zdGF0dXMpKTsKCQkJZ290byBmYWlsOwoJCX0KI2lmIE5GU19NT1VOVF9WRVJTSU9OID49IDUKCQltb3VudHJlcyA9ICZtbnRyZXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvOwoJCW5fZmxhdm9ycyA9IG1vdW50cmVzLT5hdXRoX2ZsYXZvcnMuYXV0aF9mbGF2b3JzX2xlbjsKCQlpZiAobl9mbGF2b3JzIDw9IDApCgkJCWdvdG8gbm9hdXRoX2ZsYXZvcnM7CgoJCWZsYXZvciA9IG1vdW50cmVzLT5hdXRoX2ZsYXZvcnMuYXV0aF9mbGF2b3JzX3ZhbDsKCQlmb3IgKGkgPSAwOyBpIDwgbl9mbGF2b3JzOyArK2kpIHsKCQkJLyoKCQkJICogUGVyIFJGQzI2MjMsIHNlY3Rpb24gMi43LCB3ZSBzaG91bGQgcHJlZmVyIHRoZQoJCQkgKiBmbGF2b3VyIGxpc3RlZCBmaXJzdC4KCQkJICogSWYgbm8gZmxhdm91ciByZXF1ZXN0ZWQsIHVzZSB0aGUgZmlyc3Qgc2ltcGxlCgkJCSAqIGZsYXZvdXIgdGhhdCBpcyBvZmZlcmVkLgoJCQkgKi8KCQkJaWYgKCEgKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfU0VDRkxBVk9VUikgJiYKCQkJICAgIChmbGF2b3JbaV0gPT0gQVVUSF9TWVMgfHwKCQkJICAgICBmbGF2b3JbaV0gPT0gQVVUSF9OT05FKSkgewoJCQkJZGF0YS5wc2V1ZG9mbGF2b3IgPSBmbGF2b3JbaV07CgkJCQlkYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9TRUNGTEFWT1VSOwoJCQl9CgkJCWlmIChmbGF2b3JbaV0gPT0gZGF0YS5wc2V1ZG9mbGF2b3IpCgkJCQl5dW0gPSAxOwojaWZkZWYgTkZTX01PVU5UX0RFQlVHCgkJCXByaW50ZihfKCJhdXRoIGZsYXZvciAlZDogJWRcbiIpLCBpLCBmbGF2b3JbaV0pOwojZW5kaWYKCQl9CgkJaWYgKCF5dW0pIHsKCQkJbmZzX2Vycm9yKF8oIiVzOiAlczolcyBmYWlsZWQsIHNlY3VyaXR5IGZsYXZvciAiCgkJCQkJIm5vdCBzdXBwb3J0ZWQiKSwKCQkJCQlwcm9nbmFtZSwgaG9zdG5hbWUsIGRpcm5hbWUpOwoJCQkvKiBzZXJ2ZXIgaGFzIHJlZ2lzdGVyZWQgdXMgaW4gcm10YWIsIHNlbmQgdW1vdW50ICovCgkJCW5mc19jYWxsX3Vtb3VudCgmbW50X3NlcnZlciwgJmRpcm5hbWUpOwoJCQlnb3RvIGZhaWw7CgkJfQpub2F1dGhfZmxhdm9yczoKI2VuZGlmCgkJZmhhbmRsZSA9ICZtbnRyZXMubmZzdjMubW91bnRyZXMzX3UubW91bnRpbmZvLmZoYW5kbGU7CgkJbWVtc2V0KGRhdGEub2xkX3Jvb3QuZGF0YSwgMCwgTkZTX0ZIU0laRSk7CgkJbWVtc2V0KCZkYXRhLnJvb3QsIDAsIHNpemVvZihkYXRhLnJvb3QpKTsKCQlkYXRhLnJvb3Quc2l6ZSA9IGZoYW5kbGUtPmZoYW5kbGUzX2xlbjsKCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCgkJICAgICAgIChjaGFyICopIGZoYW5kbGUtPmZoYW5kbGUzX3ZhbCwKCQkgICAgICAgZmhhbmRsZS0+ZmhhbmRsZTNfbGVuKTsKCgkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKI2VuZGlmCgl9CgoJaWYgKG5mc19tb3VudF9kYXRhX3ZlcnNpb24gPT0gMSkgewoJCS8qIGNyZWF0ZSBuZnMgc29ja2V0IGZvciBrZXJuZWwgKi8KCQlpZiAobmZzX3BtYXAtPnBtX3Byb3QgPT0gSVBQUk9UT19UQ1ApCgkJCWZzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CgkJZWxzZQoJCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CgkJaWYgKGZzb2NrIDwgMCkgewoJCQlwZXJyb3IoXygibmZzIHNvY2tldCIpKTsKCQkJZ290byBmYWlsOwoJCX0KCQlpZiAoYmluZHJlc3Zwb3J0KGZzb2NrLCAwKSA8IDApIHsKCQkJcGVycm9yKF8oIm5mcyBiaW5kcmVzdnBvcnQiKSk7CgkJCWdvdG8gZmFpbDsKCQl9Cgl9CgojaWZkZWYgTkZTX01PVU5UX0RFQlVHCglwcmludGYoXygidXNpbmcgcG9ydCAlbHUgZm9yIG5mcyBkZWFtb25cbiIpLCBuZnNfcG1hcC0+cG1fcG9ydCk7CiNlbmRpZgoJbmZzX3NhZGRyLT5zaW5fcG9ydCA9IGh0b25zKG5mc19wbWFwLT5wbV9wb3J0KTsKCS8qCgkgKiBjb25uZWN0KCkgdGhlIHNvY2tldCBmb3Iga2VybmVscyAxLjMuMTAgYW5kIGJlbG93IG9ubHksCgkgKiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIG11bHRpaG9tZWQgaG9zdHMuCgkgKiAtLVN3ZW4KCSAqLwoJaWYgKGxpbnV4X3ZlcnNpb25fY29kZSgpIDw9IE1BS0VfVkVSU0lPTigxLCAzLCAxMCkgJiYgZnNvY2sgIT0gLTEKCSAgICAmJiBjb25uZWN0KGZzb2NrLCAoc3RydWN0IHNvY2thZGRyICopIG5mc19zYWRkciwKCQkgICAgICAgc2l6ZW9mICgqbmZzX3NhZGRyKSkgPCAwKSB7CgkJcGVycm9yKF8oIm5mcyBjb25uZWN0IikpOwoJCWdvdG8gZmFpbDsKCX0KCiNpZiBORlNfTU9VTlRfVkVSU0lPTiA+PSAyCglpZiAobmZzX3BtYXAtPnBtX3Byb3QgPT0gSVBQUk9UT19UQ1ApCgkJZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVENQOwoJZWxzZQoJCWRhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9UQ1A7CiNlbmRpZgoKCS8qIHByZXBhcmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGtlcm5lbCAqLwoKCWRhdGEuZmQgPSBmc29jazsKCW1lbWNweSgoY2hhciAqKSAmZGF0YS5hZGRyLCAoY2hhciAqKSBuZnNfc2FkZHIsIHNpemVvZihkYXRhLmFkZHIpKTsKCXN0cm5jcHkoZGF0YS5ob3N0bmFtZSwgaG9zdG5hbWUsIHNpemVvZihkYXRhLmhvc3RuYW1lKSk7Cgogb3V0X29rOgoJLyogRW5zdXJlIHdlIGhhdmUgZW5vdWdoIHBhZGRpbmcgZm9yIHRoZSBmb2xsb3dpbmcgc3RyY2F0KClzICovCglpZiAoc3RybGVuKG5ld19vcHRzKSArIHN0cmxlbihzKSArIDMwID49IHNpemVvZihuZXdfb3B0cykpIHsKCQluZnNfZXJyb3IoXygiJXM6IGV4Y2Vzc2l2ZWx5IGxvbmcgb3B0aW9uIGFyZ3VtZW50IiksCgkJCQlwcm9nbmFtZSk7CgkJZ290byBmYWlsOwoJfQoKCXNucHJpbnRmKGNidWYsIHNpemVvZihjYnVmKS0xLCAiYWRkcj0lcyIsIHMpOwoJc3RyY2F0KG5ld19vcHRzLCBjYnVmKTsKCgkqZXh0cmFfb3B0cyA9IHhzdHJkdXAobmV3X29wdHMpOwoKCWlmICghZmFrZSAmJiAhKGRhdGEuZmxhZ3MgJiBORlNfTU9VTlRfTk9OTE0pKSB7CgkJaWYgKCFzdGFydF9zdGF0ZCgpKSB7CgkJCW5mc19lcnJvcihfKCIlczogcnBjLnN0YXRkIGlzIG5vdCBydW5uaW5nIGJ1dCBpcyAiCgkJCQkicmVxdWlyZWQgZm9yIHJlbW90ZSBsb2NraW5nLlxuIgoJCQkJIiAgIEVpdGhlciB1c2UgJy1vIG5vbG9jaycgdG8ga2VlcCAiCgkJCQkibG9ja3MgbG9jYWwsIG9yIHN0YXJ0IHN0YXRkLiIpLAoJCQkJCXByb2duYW1lKTsKCQkJZ290byBmYWlsOwoJCX0KCX0KCglpZiAoIWZha2UpIHsKCQlpZiAobW91bnQoc3BlYywgbm9kZSwgIm5mcyIsCgkJCQlmbGFncyAmIH4oTVNfVVNFUnxNU19VU0VSUyksICZkYXRhKSkgewoJCQltb3VudF9lcnJvcihzcGVjLCBub2RlLCBlcnJubyk7CgkJCWdvdG8gZmFpbDsKCQl9Cgl9CgoJcmV0dXJuIEVYX1NVQ0NFU1M7CgoJLyogYWJvcnQgKi8KIGZhaWw6CglpZiAoZnNvY2sgIT0gLTEpCgkJY2xvc2UoZnNvY2spOwoJcmV0dXJuIHJldHZhbDsKfQo=