LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlICJkZWJ1Z2dlci5oIgojaW5jbHVkZSAic3RhY2tmcmFtZS5oIgojaW5jbHVkZSAid2luYmFzZS5oIgoKI2lmZGVmIF9faTM4Nl9fCi8qCiAqIFdlIGtlZXAgdGhpcyBpbmZvIGZvciBlYWNoIGZyYW1lLCBzbyB0aGF0IHdlIGNhbgogKiBmaW5kIGxvY2FsIHZhcmlhYmxlIGluZm9ybWF0aW9uIGNvcnJlY3RseS4KICovCnN0cnVjdCBidF9pbmZvCnsKICB1bnNpZ25lZCBpbnQJICAgICBjczsKICB1bnNpZ25lZCBpbnQJICAgICBlaXA7CiAgdW5zaWduZWQgaW50CSAgICAgc3M7CiAgdW5zaWduZWQgaW50CSAgICAgZWJwOwogIHN0cnVjdCBzeW1ib2xfaW5mbyBmcmFtZTsKfTsKCnN0YXRpYyBpbnQgbmZyYW1lOwpzdGF0aWMgc3RydWN0IGJ0X2luZm8gKiBmcmFtZXMgPSBOVUxMOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiNpZmRlZiBfX2kzODZfXwogICAgREJHX1ZBTFVFCXZhbHVlOwogICAgCiAgICB2YWx1ZS50eXBlID0gTlVMTDsKICAgIHZhbHVlLmNvb2tpZSA9IERWX1RBUkdFVDsKICAgIHZhbHVlLmFkZHIuc2VnID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHZhbHVlLmFkZHIub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CgogICAgREVCVUdfUHJpbnRmKERCR19DSE5fTUVTRywiU3RhY2sgZHVtcDpcbiIpOwogICAgc3dpdGNoIChERUJVR19HZXRTZWxlY3RvclR5cGUodmFsdWUuYWRkci5zZWcpKQogICAgewogICAgY2FzZSBNT0RFXzMyOiAvKiAzMi1iaXQgbW9kZSAqLwogICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3gnICk7CiAgICAgICBicmVhazsKICAgIGNhc2UgTU9ERV8xNjogIC8qIDE2LWJpdCBtb2RlICovCiAgICBjYXNlIE1PREVfVk04NjoKICAgICAgICB2YWx1ZS5hZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJnZhbHVlLCAyNCwgJ3cnICk7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICBERUJVR19QcmludGYoREJHX0NITl9NRVNHLCAiQmFkIHNlZ21lbnQgKCVsZClcbiIsIHZhbHVlLmFkZHIuc2VnKTsKICAgIH0KICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIlxuIik7CiNlbmRpZgp9CgojaWZkZWYgX19pMzg2X18Kc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgZW51bSBkYmdfbW9kZSBtb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBub2lzeSwgY29uc3QgY2hhciAqY2F2ZWF0KQp7CiAgICBpbnQgdGhlZnJhbWUgPSBuZnJhbWUrKzsKICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKURCR19yZWFsbG9jKGZyYW1lcywKCQkJCQkgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIERFQlVHX1ByaW50ZihEQkdfQ0hOX01FU0csIiVzJWQgIiwgKHRoZWZyYW1lID09IGN1cnJfZnJhbWUgPyAiPT4iIDogIiAgIiksCiAgICAgICAgICAgICAgZnJhbWVubyk7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gY29kZS0+c2VnOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBjb2RlLT5vZmY7CiAgICBpZiAobm9pc3kpCiAgICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvZGUsIG1vZGUsIHN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBzdGFjay0+b2ZmLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IHN0YWNrLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IHN0YWNrLT5vZmY7CiAgICBpZiAobm9pc3kpIHsKICAgICAgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csIChtb2RlICE9IE1PREVfMzIpID8gIiAoYnA9JTA0bHglcylcbiIgOiAiIChlYnA9JTA4bHglcylcbiIsCiAgICAgICAgICAgICAgICAgICAgc3RhY2stPm9mZiwgY2F2ZWF0P2NhdmVhdDoiIiApOwogICAgfQp9CgpzdGF0aWMgQk9PTCBERUJVR19GcmFtZTE2KERCR19BRERSICphZGRyLCB1bnNpZ25lZCBpbnQgKmNzLCBpbnQgZnJhbWVubywgaW50IG5vaXN5KQp7CiAgICB1bnNpZ25lZCBpbnQJcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAJCWZyYW1lOwogICAgdm9pZCoJCXAgPSAodm9pZCopREVCVUdfVG9MaW5lYXIoYWRkcik7CiAgICBEQkdfQUREUgkJY29kZTsKICAgIAogICAgaWYgKCFwKSByZXR1cm4gRkFMU0U7CiAgICAKICAgIGlmICghREVCVUdfUkVBRF9NRU0ocCwgJmZyYW1lLCBzaXplb2YoZnJhbWUpKSkgewogICAgICAgIGlmIChub2lzeSkgREVCVUdfSW52YWxBZGRyKGFkZHIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS5icCkgcmV0dXJuIEZBTFNFOwoKICAgIGlmIChmcmFtZS5icCAmIDEpICpjcyA9IGZyYW1lLmNzOwogICAgZWxzZSB7CiAgICAgICAgLyogbm90IGV4cGxpY2l0bHkgbWFya2VkIGFzIGZhciBjYWxsLAoJICogYnV0IGNoZWNrIHdoZXRoZXIgaXQgY291bGQgYmUgYW55d2F5ICovCiAgICAgICAgaWYgKCgoZnJhbWUuY3MmNyk9PTcpICYmIChmcmFtZS5jcyAhPSAqY3MpKSB7CgkgICAgTERUX0VOVFJZCWxlOwoJIAoJICAgIGlmIChHZXRUaHJlYWRTZWxlY3RvckVudHJ5KCBERUJVR19DdXJyVGhyZWFkLT5oYW5kbGUsIGZyYW1lLmNzLCAmbGUpICYmCgkJKGxlLkhpZ2hXb3JkLkJpdHMuVHlwZSAmIDB4MDgpKSB7IC8qIGNvZGUgc2VnbWVudCAqLwoJICAgICAgICAvKiBpdCBpcyB2ZXJ5IHVuY29tbW9uIHRvIHB1c2ggYSBjb2RlIHNlZ21lbnQgY3MgYXMKCQkgKiBhIHBhcmFtZXRlciwgc28gdGhpcyBzaG91bGQgd29yayBpbiBtb3N0IGNhc2VzICovCgkgICAgICAgICpjcyA9IHBvc3NpYmxlX2NzID0gZnJhbWUuY3M7CgkgICAgfQoJfQogICAgfQogICAgY29kZS5zZWcgPSAqY3M7CiAgICBjb2RlLm9mZiA9IGZyYW1lLmlwOwogICAgYWRkci0+b2ZmID0gZnJhbWUuYnAgJiB+MTsKICAgIERFQlVHX0ZvcmNlRnJhbWUoYWRkciwgJmNvZGUsIGZyYW1lbm8sIE1PREVfMTYsIG5vaXN5LAogICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZV9jcyA/ICIsIGZhciBjYWxsIGFzc3VtZWQiIDogTlVMTCApOwogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMzIoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIEZSQU1FMzIgCQlmcmFtZTsKICAgIHZvaWQqCQlwID0gKHZvaWQqKURFQlVHX1RvTGluZWFyKGFkZHIpOwogICAgREJHX0FERFIJCWNvZGU7CiAgICBEV09SRAkJb2xkX2JwID0gYWRkci0+b2ZmOwogICAgCiAgICBpZiAoIXApIHJldHVybiBGQUxTRTsKICAgIAogICAgaWYgKCFERUJVR19SRUFEX01FTShwLCAmZnJhbWUsIHNpemVvZihmcmFtZSkpKSB7CiAgICAgICBpZiAobm9pc3kpIERFQlVHX0ludmFsQWRkcihhZGRyKTsKICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICAgIGlmICghZnJhbWUuaXApIHJldHVybiBGQUxTRTsKCiAgICBjb2RlLnNlZyA9ICpjczsKICAgIGNvZGUub2ZmID0gZnJhbWUuaXA7CiAgICBhZGRyLT5vZmYgPSBmcmFtZS5icDsKICAgIERFQlVHX0ZvcmNlRnJhbWUoYWRkciwgJmNvZGUsIGZyYW1lbm8sIE1PREVfMzIsIG5vaXN5LCBOVUxMKTsKICAgIGlmIChhZGRyLT5vZmYgPT0gb2xkX2JwKSByZXR1cm4gRkFMU0U7CiAgICByZXR1cm4gVFJVRTsKfQojZW5kaWYKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0JhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfQmFja1RyYWNlKEJPT0wgbm9pc3kpCnsKI2lmZGVmIF9faTM4NgogICAgREJHX0FERFIgCQlhZGRyLCBzd19hZGRyLCBjb2RlLCB0bXA7CiAgICB1bnNpZ25lZCBpbnQgCXNzID0gREVCVUdfY29udGV4dC5TZWdTczsKICAgIHVuc2lnbmVkIGludAljcyA9IERFQlVHX2NvbnRleHQuU2VnQ3M7CiAgICBpbnQgCQlmcmFtZW5vID0gMCwgaXMxNiwgb2s7CiAgICBEV09SRCAJCW5leHRfc3dpdGNoLCBjdXJfc3dpdGNoLCBwOwogICAgU1RBQ0sxNkZSQU1FICAgICAgIAlmcmFtZTE2OwogICAgU1RBQ0szMkZSQU1FICAgICAgIAlmcmFtZTMyOwogICAgY2hhcgkJY2g7CgogICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhY2t0cmFjZTpcbiIgKTsKCiAgICBuZnJhbWUgPSAwOwogICAgaWYgKGZyYW1lcykgREJHX2ZyZWUoIGZyYW1lcyApOwogICAgLyogZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopIERCR19hbGxvYyggc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSApOyAqLwogICAgZnJhbWVzID0gTlVMTDsKCiAgICBpZiAoREVCVUdfSXNTZWxlY3RvclN5c3RlbShzcykpIHNzID0gMDsKICAgIGlmIChERUJVR19Jc1NlbGVjdG9yU3lzdGVtKGNzKSkgY3MgPSAwOwoKICAgIC8qIGZpcnN0IHN0YWNrIGZyYW1lIGZyb20gcmVnaXN0ZXJzICovCiAgICBzd2l0Y2ggKERFQlVHX0dldFNlbGVjdG9yVHlwZShzcykpCiAgICB7CiAgICBjYXNlIE1PREVfMzI6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IERFQlVHX2NvbnRleHQuRWlwOwogICAgICAgIGFkZHIuc2VnID0gc3M7CglhZGRyLm9mZiA9IERFQlVHX2NvbnRleHQuRWJwOwogICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwgKTsKICAgICAgICBpZiAoIShjb2RlLnNlZyB8fCBjb2RlLm9mZikpIHsKICAgICAgICAgICAgLyogdHJ5aW5nIHRvIGV4ZWN1dGUgYSBudWxsIHBvaW50ZXIuLi4geXVjay4uLgogICAgICAgICAgICAgKiBpZiBpdCB3YXMgYSBjYWxsIHRvIG51bGwsIHRoZSByZXR1cm4gRUlQIHNob3VsZCBiZQogICAgICAgICAgICAgKiBhdmFpbGFibGUgYXQgU1M6RVNQLCBzbyBsZXQncyB0cnkgdG8gcmV0cmlldmUgaXQgKi8KICAgICAgICAgICAgdG1wLnNlZyA9IHNzOwogICAgICAgICAgICB0bXAub2ZmID0gREVCVUdfY29udGV4dC5Fc3A7CiAgICAgICAgICAgIGlmIChERUJVR19SRUFEX01FTSgodm9pZCAqKURFQlVHX1RvTGluZWFyKCZ0bXApLCAmY29kZS5vZmYsIHNpemVvZihjb2RlLm9mZikpKSB7CiAgICAgICAgICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksICIsIG51bGwgY2FsbCBhc3N1bWVkIiApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlzMTYgPSBGQUxTRTsKCWJyZWFrOwogICAgY2FzZSBNT0RFXzE2OgogICAgY2FzZSBNT0RFX1ZNODY6CiAgICAgICAgY29kZS5zZWcgPSBjczsKICAgICAgICBjb2RlLm9mZiA9IExPV09SRChERUJVR19jb250ZXh0LkVpcCk7CiAgICAgICAgYWRkci5zZWcgPSBzczsKCWFkZHIub2ZmID0gTE9XT1JEKERFQlVHX2NvbnRleHQuRWJwKTsKICAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsIGZyYW1lbm8sIE1PREVfMTYsIG5vaXN5LCBOVUxMICk7CiAgICAgICAgaXMxNiA9IFRSVUU7CglicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzZWdtZW50ICcleCdcbiIsIHNzKTsKCXJldHVybjsKICAgIH0KCiAgICAvKiBjdXJfc3dpdGNoIGhvbGRzIGFkZHJlc3Mgb2YgY3Vycl9zdGFjaydzIGZpZWxkIGluIFRFQiBpbiBkZWJ1Z2dlZSAKICAgICAqIGFkZHJlc3Mgc3BhY2UgCiAgICAgKi8KICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpREVCVUdfQ3VyclRocmVhZC0+dGViICsgT0ZGU0VUX09GKFRFQiwgY3VyX3N0YWNrKTsKICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKWN1cl9zd2l0Y2gsICZuZXh0X3N3aXRjaCwgc2l6ZW9mKG5leHRfc3dpdGNoKSkpIHsKICAgICAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQ2FuJ3QgcmVhZCBURUI6Y3VyX3N0YWNrXG4iKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiAoaXMxNikgewogICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKW5leHRfc3dpdGNoLCAmZnJhbWUzMiwgc2l6ZW9mKFNUQUNLMzJGUkFNRSkpKSB7CgkgICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIkJhZCBzdGFjayBmcmFtZSAweCUwOGx4XG4iLCAKCQkJCSAgICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47Cgl9CgljdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMzIuZnJhbWUxNjsKCXN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKCXN3X2FkZHIub2ZmID0gT0ZGU0VUT0YoY3VyX3N3aXRjaCk7CiAgICB9IGVsc2UgewogICAgICAgIHRtcC5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCXRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CglwID0gREVCVUdfVG9MaW5lYXIoJnRtcCk7CgkKCWlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJICAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkgICAgcmV0dXJuOwoJfQoJY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTE2LmZyYW1lMzI7Cglzd19hZGRyLnNlZyA9IHNzOwoJc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwogICAgfQogICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopREVCVUdfVG9MaW5lYXIoJnN3X2FkZHIpLCAmY2gsIHNpemVvZihjaCkpKSB7CiAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7Cglzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgIH0KICAgIAogICAgZm9yIChvayA9IFRSVUU7IG9rOykgewogICAgICAgIGlmICgoZnJhbWVzW2ZyYW1lbm9dLnNzID09IHN3X2FkZHIuc2VnKSAmJgogICAgICAgICAgICBzd19hZGRyLm9mZiAmJiAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpCiAgICAgICAgewoJICAgLyogMTY8LT4zMiBzd2l0Y2guLi4KCSAgICAqIHllcywgSSBrbm93IHRoaXMgaXMgY29uZnVzaW5nLCBpdCBnYXZlIG1lIGEgaGVhZGFjaGUgdG9vICovCgkgICBpZiAoaXMxNikgewoJICAgICAgCgkgICAgICAgaWYgKCFERUJVR19SRUFEX01FTSgodm9pZCopbmV4dF9zd2l0Y2gsICZmcmFtZTMyLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCQkgIGlmIChub2lzeSkgREVCVUdfUHJpbnRmKCBEQkdfQ0hOX01FU0csICJCYWQgc3RhY2sgZnJhbWUgMHglMDhseFxuIiwgCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgIHJldHVybjsKCSAgICAgICB9CgoJICAgICAgIGNvZGUuc2VnICA9IDA7CgkgICAgICAgY29kZS5vZmYgID0gZnJhbWUzMi5yZXRhZGRyOwoJICAgICAgIAoJICAgICAgIGNzID0gMDsKCSAgICAgICBhZGRyLnNlZyA9IDA7CgkgICAgICAgYWRkci5vZmYgPSBmcmFtZTMyLmVicDsKCSAgICAgICBERUJVR19Gb3JjZUZyYW1lKCAmYWRkciwgJmNvZGUsICsrZnJhbWVubywgTU9ERV8zMiwgbm9pc3ksIE5VTEwgKTsKCSAgICAgICAKCSAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICAgdG1wLnNlZyA9IFNFTEVDVE9ST0YobmV4dF9zd2l0Y2gpOwoJICAgICAgIHRtcC5vZmYgPSBPRkZTRVRPRihuZXh0X3N3aXRjaCk7CgkgICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgIAoJICAgICAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKXAsICZmcmFtZTE2LCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCQkgICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgICAodW5zaWduZWQgbG9uZykoU1RBQ0sxNkZSQU1FKilwICk7CgkJICAgcmV0dXJuOwoJICAgICAgIH0KCSAgICAgICBjdXJfc3dpdGNoID0gKERXT1JEKWZyYW1lMTYuZnJhbWUzMjsKCSAgICAgICBzd19hZGRyLnNlZyA9IDA7CgkgICAgICAgc3dfYWRkci5vZmYgPSBjdXJfc3dpdGNoOwoJICAgICAgIAoJICAgICAgIGlzMTYgPSBGQUxTRTsKCSAgIH0gZWxzZSB7CgkgICAgICB0bXAuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CgkgICAgICB0bXAub2ZmID0gT0ZGU0VUT0YobmV4dF9zd2l0Y2gpOwoJICAgICAgcCA9IERFQlVHX1RvTGluZWFyKCZ0bXApOwoJICAgICAgCgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKilwLCAmZnJhbWUxNiwgc2l6ZW9mKFNUQUNLMTZGUkFNRSkpKSB7CgkJICBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsCgkJCQkJICAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMTZGUkFNRSopcCApOwoJCSAgcmV0dXJuOwoJICAgICAgfQoJICAgICAgCgkgICAgICBjb2RlLnNlZyAgPSBmcmFtZTE2LmNzOwoJICAgICAgY29kZS5vZmYgID0gZnJhbWUxNi5pcDsKCSAgICAgIAoJICAgICAgY3MgPSBmcmFtZTE2LmNzOwoJICAgICAgYWRkci5zZWcgPSBTRUxFQ1RPUk9GKG5leHRfc3dpdGNoKTsKCSAgICAgIGFkZHIub2ZmID0gZnJhbWUxNi5icDsKCSAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCBNT0RFXzE2LCBub2lzeSwgTlVMTCApOwoJICAgICAgCgkgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgICAgICBpZiAoIURFQlVHX1JFQURfTUVNKCh2b2lkKiluZXh0X3N3aXRjaCwgJmZyYW1lMzIsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJCSBpZiAobm9pc3kpIERFQlVHX1ByaW50ZiggREJHX0NITl9NRVNHLCAiQmFkIHN0YWNrIGZyYW1lIDB4JTA4bHhcbiIsIAoJCQkJCSAgKHVuc2lnbmVkIGxvbmcpKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCQkgcmV0dXJuOwoJICAgICAgfQoJICAgICAgY3VyX3N3aXRjaCA9IChEV09SRClmcmFtZTMyLmZyYW1lMTY7CgkgICAgICBzd19hZGRyLnNlZyA9IFNFTEVDVE9ST0YoY3VyX3N3aXRjaCk7CgkgICAgICBzd19hZGRyLm9mZiA9IE9GRlNFVE9GKGN1cl9zd2l0Y2gpOwoJICAgICAgCgkgICAgICBpczE2ID0gVFJVRTsKCSAgIH0KCSAgIGlmICghREVCVUdfUkVBRF9NRU0oKHZvaWQqKURFQlVHX1RvTGluZWFyKCZzd19hZGRyKSwgJmNoLCBzaXplb2YoY2gpKSkgewoJICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CgkgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKCSAgIH0KCX0gZWxzZSB7CgkgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KCSAgIG9rID0gaXMxNiA/IERFQlVHX0ZyYW1lMTYoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpCgkgICAgICA6IERFQlVHX0ZyYW1lMzIoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpOwoJfQogICAgfQogICAgaWYgKG5vaXN5KSBERUJVR19QcmludGYoIERCR19DSE5fTUVTRywgIlxuIiApOwojZW5kaWYKfQoKaW50CkRFQlVHX1NldEZyYW1lKGludCBuZXdmcmFtZSkKewojaWZkZWYgX19pMzg2X18KICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKI2Vsc2UgLyogX19pMzg2X18gKi8KICByZXR1cm4gRkFMU0U7CiNlbmRpZiAvKiBfX2kzODZfXyAqLwp9CgppbnQKREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgdW5zaWduZWQgaW50ICogZWlwLAoJCSAgICAgIHVuc2lnbmVkIGludCAqIGVicCkKewojaWZkZWYgX19pMzg2X18KICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7CiNlbHNlIC8qIF9faTM4Nl9fICovCiAgcmV0dXJuIEZBTFNFOwojZW5kaWYgLyogX19pMzg2X18gKi8KfQoK