LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJkZWJ1Z2dlci5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAid2luYmFzZS5oIgoKI2lmZGVmIF9faTM4Nl9fCi8qCiAqIFdlIGtlZXAgdGhpcyBpbmZvIGZvciBlYWNoIGZyYW1lLCBzbyB0aGF0IHdlIGNhbgogKiBmaW5kIGxvY2FsIHZhcmlhYmxlIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KICovCnN0cnVjdCBidF9pbmZvCnsKICB1bnNpZ25lZCBpbnQJICAgICBjczsKICB1bnNpZ25lZCBpbnQJICAgICBlaXA7CiAgdW5zaWduZWQgaW50CSAgICAgc3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWJwOwogIHN0cnVjdCBzeW1ib2xfaW5mbyBmcmFtZTsKfTsKCnN0YXRpYyBpbnQgbmZyYW1lOwpzdGF0aWMgc3RydWN0IGJ0X2luZm8gKiBmcmFtZXMgPSBOVUxMOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiNpZmRlZiBfX2kzODZfXwogICAgREJHX1ZBTFVFCXZhbHVlOwogICAgCiAgICB2YWx1ZS50eXBlID0gTlVMTDsKICAgIHZhbHVlLmNvb2tpZSA9IERWX1RBUkdFVDsKICAgIHZhbHVlLmFkZHIuc2VnID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHZhbHVlLmFkZHIub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CgogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiU3RhY2sgZHVtcDpcbiIpOwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUodmFsdWUuYWRkci5zZWcpKSB7CiAgICBjYXNlIDMyOiAvKiAzMi1iaXQgbW9kZSAqLwogICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3gnICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgMTY6ICAvKiAxNi1iaXQgbW9kZSAqLwogICAgICAgIHZhbHVlLmFkZHIub2ZmICY9IDB4ZmZmZjsKICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmdmFsdWUsIDI0LCAndycgKTsKCWJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csICJCYWQgc2VnbWVudCAoJWxkKVxuIiwgdmFsdWUuYWRkci5zZWcpOwogICAgfQogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiXG4iKTsKI2VuZGlmCn0KCiNpZmRlZiBfX2kzODZfXwpzdGF0aWMgdm9pZCBERUJVR19Gb3JjZUZyYW1lKERCR19BRERSICpzdGFjaywgREJHX0FERFIgKmNvZGUsIGludCBmcmFtZW5vLCBpbnQgYml0cywgaW50IG5vaXN5LCBjb25zdCBjaGFyICpjYXZlYXQpCnsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZSsrOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopREJHX3JlYWxsb2MoZnJhbWVzLAoJCQkJCSAgIG5mcmFtZSpzaXplb2Yoc3RydWN0IGJ0X2luZm8pKTsKICAgIGlmIChub2lzeSkKICAgICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiJXMlZCAiLCAodGhlZnJhbWUgPT0gY3Vycl9mcmFtZSA/ICI9PiIgOiAiICAiKSwKICAgICAgICAgICAgICBmcmFtZW5vKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBjb2RlLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGNvZGUtPm9mZjsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvZGUsIGJpdHMsIAoJCQkJCQkJICBzdGFjay0+b2ZmLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBjb2RlLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgc3RhY2stPm9mZiwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBzdGFjay0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBzdGFjay0+b2ZmOwogICAgaWYgKG5vaXN5KSB7CiAgICAgIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseCVzKVxuIiA6ICIgKGVicD0lMDhseCVzKVxuIiwgc3RhY2stPm9mZiwgY2F2ZWF0P2NhdmVhdDoiIiApOwogICAgfQp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTE2KERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5icCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChmcmFtZS5icCAmIDEpICpjcyA9IGZyYW1lLmNzOwogICAgZWxzZSB7CiAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLAoJICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgICAgaWYgKCgoZnJhbWUuY3MmNyk9PTcpICYmIChmcmFtZS5jcyAhPSAqY3MpKSB7CgkgICAgTERUX0VOVFJZCWxlOwoJIAoJICAgIGlmIChHZXRUaHJlYWRTZWxlY3RvckVudHJ5KCBERUJVR19DdXJyVGhyZWFkLT5oYW5kbGUsIGZyYW1lLmNzLCAmbGUpICYmCgkJKGxlLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MDgpKSB7IC8qIGNvZGUgc2VnbWVudCAqLwoJICAgICAgICAvKiBpdCBpcyB2ZXJ5IHVuY29tbW9uIHRvIHB1c2ggYSBjb2RlIHNlZ21lbnQgY3MgYXMKCQkgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCgkgICAgICAgICpjcyA9IHBvc3NpYmxlX2NzID0gZnJhbWUuY3M7CgkgICAgfQoJfQogICAgfQogICAgY29kZS5zZWcgPSAqY3M7CiAgICBjb2RlLm9mZiA9IGZyYW1lLmlwOwogICAgYWRkci0+b2ZmID0gZnJhbWUuYnAgJiB+MTsKICAgIERFQlVHX0ZvcmNlRnJhbWUoYWRkciwgJmNvZGUsIGZyYW1lbm8sIDE2LCBub2lzeSwgcG9zc2libGVfY3MgPyAiLCBmYXIgY2FsbCBhc3N1bWVkIiA6IE5VTEwgKTsKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTMyKERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICBGUkFNRTMyIAkJZnJhbWU7CiAgICB2b2lkKgkJcCA9ICh2b2lkKilERUJVR19Ub0xpbmVhcihhZGRyKTsKICAgIERCR19BRERSCQljb2RlOwogICAgRFdPUkQJCW9sZF9icCA9IGFkZHItPm9mZjsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgaWYgKG5vaXN5KSBERUJVR19JbnZhbEFkZHIoYWRkcik7CiAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBpZiAoIWZyYW1lLmlwKSByZXR1cm4gRkFMU0U7CgogICAgY29kZS5zZWcgPSAqY3M7CiAgICBjb2RlLm9mZiA9IGZyYW1lLmlwOwogICAgYWRkci0+b2ZmID0gZnJhbWUuYnA7CiAgICBERUJVR19Gb3JjZUZyYW1lKGFkZHIsICZjb2RlLCBmcmFtZW5vLCAzMiwgbm9pc3ksIE5VTEwpOwogICAgaWYgKGFkZHItPm9mZiA9PSBvbGRfYnApIHJldHVybiBGQUxTRTsKICAgIHJldHVybiBUUlVFOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfQmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19CYWNrVHJhY2UoQk9PTCBub2lzeSkKewojaWZkZWYgX19pMzg2CiAgICBEQkdfQUREUiAJCWFkZHIsIHN3X2FkZHIsIGNvZGUsIHRtcDsKICAgIHVuc2lnbmVkIGludCAJc3MgPSBERUJVR19jb250ZXh0LlNlZ1NzOwogICAgdW5zaWduZWQgaW50CWNzID0gREVCVUdfY29udGV4dC5TZWdDczsKICAgIGludCAJCWZyYW1lbm8gPSAwLCBpczE2LCBvazsKICAgIERXT1JEIAkJbmV4dF9zd2l0Y2gsIGN1cl9zd2l0Y2gsIHA7CiAgICBTVEFDSzE2RlJBTUUgICAgICAgCWZyYW1lMTY7CiAgICBTVEFDSzMyRlJBTUUgICAgICAgCWZyYW1lMzI7CiAgICBjaGFyCQljaDsKCiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFja3RyYWNlOlxuIiApOwoKICAgIG5mcmFtZSA9IDA7CiAgICBpZiAoZnJhbWVzKSBEQkdfZnJlZSggZnJhbWVzICk7CiAgICAvKiBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKikgREJHX2FsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7ICovCiAgICBmcmFtZXMgPSBOVUxMOwoKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKHNzKSkgc3MgPSAwOwogICAgaWYgKERFQlVHX0lzU2VsZWN0b3JTeXN0ZW0oY3MpKSBjcyA9IDA7CgogICAgLyogZmlyc3Qgc3RhY2sgZnJhbWUgZnJvbSByZWdpc3RlcnMgKi8KICAgIHN3aXRjaCAoREVCVUdfR2V0U2VsZWN0b3JUeXBlKHNzKSkKICAgIHsKICAgIGNhc2UgMzI6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IERFQlVHX2NvbnRleHQuRWlwOwogICAgICAgIGFkZHIuc2VnID0gc3M7CglhZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRWJwOwogICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgZnJhbWVubywgMzIsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaWYgKCEoY29kZS5zZWcgfHwgY29kZS5vZmYpKSB7CiAgICAgICAgICAgIC8qIHRyeWluZyB0byBleGVjdXRlIGEgbnVsbCBwb2ludGVyLi4uIHl1Y2suLi4KICAgICAgICAgICAgICogaWYgaXQgd2FzIGEgY2FsbCB0byBudWxsLCB0aGUgcmV0dXJuIEVJUCBzaG91bGQgYmUKICAgICAgICAgICAgICogYXZhaWxhYmxlIGF0IFNTOkVTUCwgc28gbGV0J3MgdHJ5IHRvIHJldHJpZXZlIGl0ICovCiAgICAgICAgICAgIHRtcC5zZWcgPSBzczsKICAgICAgICAgICAgdG1wLm9mZiA9IERFQlVHX2NvbnRleHQuRXNwOwogICAgICAgICAgICBpZiAoREVCVUdfUkVBRF9NRU0oREVCVUdfVG9MaW5lYXIoJnRtcCksICZjb2RlLm9mZiwgc2l6ZW9mKGNvZGUub2ZmKSkpIHsKICAgICAgICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAzMiwgbm9pc3ksICIsIG51bGwgY2FsbCBhc3N1bWVkIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlzMTYgPSBGQUxTRTsKCWJyZWFrOwogICAgY2FzZSAxNjoKICAgICAgICBjb2RlLnNlZyA9IGNzOwogICAgICAgIGNvZGUub2ZmID0gTE9XT1JEKERFQlVHX2NvbnRleHQuRWlwKTsKICAgICAgICBhZGRyLnNlZyA9IHNzOwoJYWRkci5vZmYgPSBMT1dPUkQoREVCVUdfY29udGV4dC5FYnApOwogICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgZnJhbWVubywgMTYsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICcldSdcbiIsIHNzKTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBjdXJfc3dpdGNoIGhvbGRzIGFkZHJlc3Mgb2YgY3Vycl9zdGFjaydzIGZpZWxkIGluIFRFQiBpbiBkZWJ1Z2dlZSAKICAgICAqIGFkZHJlc3Mgc3BhY2UgCiAgICAgKi8KICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpREVCVUdfQ3VyclRocmVhZC0+dGViICsgT0ZGU0VUX09GKFRFQiwgY3VyX3N0YWNrKTsKICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKWN1cl9zd2l0Y2gsICZuZXh0X3N3aXRjaCwgc2l6ZW9mKG5leHRfc3dpdGNoKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgcmVhZCBURUI6Y3VyX3N0YWNrXG4iKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoaXMxNikgewogICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47Cgl9CgljdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMzIuZnJhbWUxNjsKCXN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKCXN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CiAgICB9IGVsc2UgewogICAgICAgIHRtcC5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCXRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CglwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgkKCWlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7Cglzd19hZGRyLnNlZyA9IHNzOwoJc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopREVCVUdfVG9MaW5lYXIoJnN3X2FkZHIpLCAmY2gsIHNpemVvZihjaCkpKSB7CiAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7Cglzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgIH0KICAgIAogICAgZm9yIChvayA9IFRSVUU7IG9rOykgewogICAgICAgIGlmICgoZnJhbWVzW2ZyYW1lbm9dLnNzID09IHN3X2FkZHIuc2VnKSAmJgoJICAgIChmcmFtZXNbZnJhbWVub10uZWJwID49IHN3X2FkZHIub2ZmKSkgewoJICAgLyogMTY8LT4zMiBzd2l0Y2guLi4KCSAgICAqIHllcywgSSBrbm93IHRoaXMgaXMgY29uZnVzaW5nLCBpdCBnYXZlIG1lIGEgaGVhZGFjaGUgdG9vICovCgkgICBpZiAoaXMxNikgewoJICAgICAgCgkgICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopbmV4dF9zd2l0Y2gsICZmcmFtZTMyLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCQkgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgIHJldHVybjsKCSAgICAgICB9CgoJICAgICAgIGNvZGUuc2VnICA9IDA7CgkgICAgICAgY29kZS5vZmYgID0gZnJhbWUzMi5yZXRhZGRyOwoJICAgICAgIAoJICAgICAgIGNzID0gMDsKCSAgICAgICBhZGRyLnNlZyA9IDA7CgkgICAgICAgYWRkci5vZmYgPSBmcmFtZTMyLmVicDsKCSAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgMzIsIG5vaXN5LCBOVUxMICk7CgkgICAgICAgCgkgICAgICAgbmV4dF9zd2l0Y2ggPSBjdXJfc3dpdGNoOwoJICAgICAgIHRtcC5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgICB0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJICAgICAgIHAgPSBERUJVR19Ub0xpbmVhcigmdG1wKTsKCSAgICAgICAKCSAgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkJICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCQkgICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMTZGUkFNRSopcCApOwoJCSAgIHJldHVybjsKCSAgICAgICB9CgkgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7CgkgICAgICAgc3dfYWRkci5zZWcgPSAwOwoJICAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKCSAgICAgICAKCSAgICAgICBpczE2ID0gRkFMU0U7CgkgICB9IGVsc2UgewoJICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgdG1wLm9mZiA9IE9GRlNFVE9GKG5leHRfc3dpdGNoKTsKCSAgICAgIHAgPSBERUJVR19Ub0xpbmVhcigmdG1wKTsKCSAgICAgIAoJICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopcCwgJmZyYW1lMTYsIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJCSAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLAoJCQkJCSAgICh1bnNpZ25lZCBsb25nKShTVEFDSzE2RlJBTUUqKXAgKTsKCQkgIHJldHVybjsKCSAgICAgIH0KCSAgICAgIAoJICAgICAgY29kZS5zZWcgID0gZnJhbWUxNi5jczsKCSAgICAgIGNvZGUub2ZmICA9IGZyYW1lMTYuaXA7CgkgICAgICAKCSAgICAgIGNzID0gZnJhbWUxNi5jczsKCSAgICAgIGFkZHIuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICBhZGRyLm9mZiA9IGZyYW1lMTYuYnA7CgkgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgMTYsIG5vaXN5LCBOVUxMICk7CgkgICAgICAKCSAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkJIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkJICAodW5zaWduZWQgbG9uZykoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJCSByZXR1cm47CgkgICAgICB9CgkgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMzIuZnJhbWUxNjsKCSAgICAgIHN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKCSAgICAgIHN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CgkgICAgICAKCSAgICAgIGlzMTYgPSBUUlVFOwoJICAgfQoJICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopREVCVUdfVG9MaW5lYXIoJnN3X2FkZHIpLCAmY2gsIHNpemVvZihjaCkpKSB7CgkgICAgICBzd19hZGRyLnNlZyA9IChEV09SRCktMTsKCSAgICAgIHN3X2FkZHIub2ZmID0gKERXT1JEKS0xOwoJICAgfQoJfSBlbHNlIHsKCSAgICAvKiBvcmRpbmFyeSBzdGFjayBmcmFtZSAqLwoJICAgb2sgPSBpczE2ID8gREVCVUdfRnJhbWUxNiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSkKCSAgICAgIDogREVCVUdfRnJhbWUzMiggJmFkZHIsICZjcywgKytmcmFtZW5vLCBub2lzeSk7Cgl9CiAgICB9CiAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiXG4iICk7CiNlbmRpZgp9CgppbnQKREVCVUdfU2V0RnJhbWUoaW50IG5ld2ZyYW1lKQp7CiNpZmRlZiBfX2kzODZfXwogIGludAkJcnRuID0gRkFMU0U7CgogIGN1cnJfZnJhbWUgPSBuZXdmcmFtZTsKCiAgaWYoIGN1cnJfZnJhbWUgPj0gbmZyYW1lICkKICAgIHsKICAgICAgY3Vycl9mcmFtZSA9IG5mcmFtZSAtIDE7CiAgICB9CgogIGlmKCBjdXJyX2ZyYW1lIDwgMCApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSAwOwogICAgfQoKICAgaWYoIGZyYW1lcyAmJiBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUubGlzdC5zb3VyY2VmaWxlICE9IE5VTEwgKQogICAgewogICAgICBERUJVR19MaXN0KCZmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUubGlzdCwgTlVMTCwgMCk7CiAgICB9CgogIHJ0biA9IFRSVUU7CiAgcmV0dXJuIChydG4pOwojZWxzZSAvKiBfX2kzODZfXyAqLwogIHJldHVybiBGQUxTRTsKI2VuZGlmIC8qIF9faTM4Nl9fICovCn0KCmludApERUJVR19HZXRDdXJyZW50RnJhbWUoc3RydWN0IG5hbWVfaGFzaCAqKiBuYW1lLCB1bnNpZ25lZCBpbnQgKiBlaXAsCgkJICAgICAgdW5zaWduZWQgaW50ICogZWJwKQp7CiNpZmRlZiBfX2kzODZfXwogIC8qCiAgICogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGJhY2t0cmFjZSwgdGhlbiBqdXN0IHJldHVybi4KICAgKi8KICBpZiggZnJhbWVzID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIC8qCiAgICogSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzLCB0aGVuIHdlIGFsc28gaGF2ZQogICAqIG5vdGhpbmcgdG8gcmVwb3J0IGhlcmUuCiAgICovCiAgaWYoIGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5zeW0gPT0gTlVMTCApCiAgICB7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgKm5hbWUgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltOwogICplaXAgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZWlwOwogICplYnAgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZWJwOwoKICByZXR1cm4gVFJVRTsKI2Vsc2UgLyogX19pMzg2X18gKi8KICByZXR1cm4gRkFMU0U7CiNlbmRpZiAvKiBfX2kzODZfXyAqLwp9Cgo=