LyoKICogRGVidWdnZXIgc3RhY2sgaGFuZGxpbmcKICoKICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCiAqIENvcHlyaWdodCAxOTk2IEVyaWMgWW91bmdkYWxlCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgImRlYnVnZ2VyLmgiCiNpbmNsdWRlICJzdGFja2ZyYW1lLmgiCgoKLyoKICogV2Uga2VlcCB0aGlzIGluZm8gZm9yIGVhY2ggZnJhbWUsIHNvIHRoYXQgd2UgY2FuCiAqIGZpbmQgbG9jYWwgdmFyaWFibGUgaW5mb3JtYXRpb24gY29ycmVjdGx5LgogKi8Kc3RydWN0IGJ0X2luZm8KewogIHVuc2lnbmVkIGludAkgICAgIGNzOwogIHVuc2lnbmVkIGludAkgICAgIGVpcDsKICB1bnNpZ25lZCBpbnQJICAgICBzczsKICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CiAgc3RydWN0IHN5bWJvbF9pbmZvIGZyYW1lOwp9OwoKc3RhdGljIGludCBuZnJhbWU7CnN0YXRpYyBzdHJ1Y3QgYnRfaW5mbyAqIGZyYW1lcyA9IE5VTEw7CmludCBjdXJyX2ZyYW1lOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgV09SRCBicDsKICAgIFdPUkQgaXA7CiAgICBXT1JEIGNzOwp9IEZSQU1FMTY7Cgp0eXBlZGVmIHN0cnVjdAp7CiAgICBEV09SRCBicDsKICAgIERXT1JEIGlwOwogICAgV09SRCBjczsKfSBGUkFNRTMyOwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0luZm9TdGFjawogKgogKiBEdW1wIHRoZSB0b3Agb2YgdGhlIHN0YWNrCiAqLwp2b2lkIERFQlVHX0luZm9TdGFjayh2b2lkKQp7CiAgICBEQkdfQUREUiBhZGRyOwoKICAgIGFkZHIudHlwZSA9IE5VTEw7CiAgICBhZGRyLnNlZyA9IFNTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICBhZGRyLm9mZiA9IEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpOwoKICAgIGZwcmludGYoc3RkZXJyLCJTdGFjayBkdW1wOlxuIik7CiAgICBpZiAoSVNfU0VMRUNUT1JfMzJCSVQoYWRkci5zZWcpKQogICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmYWRkciwgMjQsICd4JyApOwogICAgfQogICAgZWxzZSAgLyogMTYtYml0IG1vZGUgKi8KICAgIHsKICAgICAgICBhZGRyLm9mZiAmPSAweGZmZmY7CiAgICAgICAgREVCVUdfRXhhbWluZU1lbW9yeSggJmFkZHIsIDI0LCAndycgKTsKICAgIH0KICAgIGZwcmludGYoc3RkZXJyLCJcbiIpOwp9CgoKc3RhdGljIHZvaWQgREVCVUdfRm9yY2VGcmFtZShEQkdfQUREUiAqc3RhY2ssIERCR19BRERSICpjb2RlLCBpbnQgZnJhbWVubywgaW50IGJpdHMsIGludCBub2lzeSkKewogICAgaW50IHRoZWZyYW1lID0gbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgZnJhbWVzW3RoZWZyYW1lXS5jcyA9IGNvZGUtPnNlZzsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWlwID0gY29kZS0+b2ZmOwogICAgaWYgKG5vaXN5KQogICAgICBmcmFtZXNbdGhlZnJhbWVdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggY29kZSwgYml0cywgCgkJCQkJCXN0YWNrLT5vZmYsIFRSVUUgKTsKICAgIGVsc2UKICAgICAgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGNvZGUsIFRSVUUsIAoJCQkgICAgICAgJmZyYW1lc1t0aGVmcmFtZV0uZnJhbWUuc3ltLCBzdGFjay0+b2ZmLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IHN0YWNrLT5zZWc7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVicCA9IHN0YWNrLT5vZmY7CiAgICBpZiAobm9pc3kpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAoYml0cyA9PSAxNikgPyAiIChicD0lMDRseClcbiIgOiAiIChlYnA9JTA4bHgpXG4iLCBzdGFjay0+b2ZmICk7CiAgICB9Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMTYoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCBzcyA9IGFkZHItPnNlZywgcG9zc2libGVfY3MgPSAwOwogICAgRlJBTUUxNiAqZnJhbWUgPSAoRlJBTUUxNiAqKURCR19BRERSX1RPX0xJTihhZGRyKTsKICAgIGludCB0aGVmcmFtZSA9IG5mcmFtZTsKCiAgICBpZiAoREVCVUdfSXNCYWRSZWFkUHRyKCBhZGRyLCBzaXplb2YoRlJBTUUxNikgKSkgewogICAgICAgaWYgKG5vaXN5KSB7CgkgIGZwcmludGYoc3RkZXJyLCIqKiogSW52YWxpZCBhZGRyZXNzICIpOwoJICBERUJVR19QcmludEFkZHJlc3MoYWRkciwgZGJnX21vZGUsIEZBTFNFKTsKCSAgZnByaW50ZihzdGRlcnIsIlxuIik7CiAgICAgICB9CiAgICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgICBpZiAoIWZyYW1lLT5icCkgcmV0dXJuIEZBTFNFOwogICAgbmZyYW1lKys7CiAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKilEQkdfcmVhbGxvYyhmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CiAgICBpZiAobm9pc3kpCiAgICAgIGZwcmludGYoc3RkZXJyLCIlcyVkICIsICh0aGVmcmFtZSA9PSBjdXJyX2ZyYW1lID8gIj0+IiA6ICIgICIpLAogICAgICAgICAgICAgIGZyYW1lbm8pOwogICAgaWYgKGZyYW1lLT5icCAmIDEpICpjcyA9IGZyYW1lLT5jczsKICAgIGVsc2UgewogICAgICAvKiBub3QgZXhwbGljaXRseSBtYXJrZWQgYXMgZmFyIGNhbGwsCiAgICAgICAqIGJ1dCBjaGVjayB3aGV0aGVyIGl0IGNvdWxkIGJlIGFueXdheSAqLwogICAgICBpZiAoKChmcmFtZS0+Y3MmNyk9PTcpICYmIChmcmFtZS0+Y3MgIT0gKmNzKSAmJiAhSVNfU0VMRUNUT1JfRlJFRShmcmFtZS0+Y3MpKSB7CiAgICAgICAgbGR0X2VudHJ5IHRjczsKICAgICAgICBMRFRfR2V0RW50cnkoIFNFTEVDVE9SX1RPX0VOVFJZKGZyYW1lLT5jcyksICZ0Y3MgKTsKICAgICAgICBpZiAoIHRjcy50eXBlID09IFNFR01FTlRfQ09ERSApIHsKICAgICAgICAgIC8qIGl0IGlzIHZlcnkgdW5jb21tb24gdG8gcHVzaCBhIGNvZGUgc2VnbWVudCBjcyBhcwogICAgICAgICAgICogYSBwYXJhbWV0ZXIsIHNvIHRoaXMgc2hvdWxkIHdvcmsgaW4gbW9zdCBjYXNlcyAqLwogICAgICAgICAgKmNzID0gcG9zc2libGVfY3MgPSBmcmFtZS0+Y3M7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmcmFtZXNbdGhlZnJhbWVdLmNzID0gYWRkci0+c2VnID0gKmNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5laXAgPSBhZGRyLT5vZmYgPSBmcmFtZS0+aXA7CiAgICBpZiAobm9pc3kpCiAgICAgIGZyYW1lc1t0aGVmcmFtZV0uZnJhbWUgPSBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBhZGRyLCAxNiwgCgkJCQkJCWZyYW1lLT5icCwgVFJVRSApOwogICAgZWxzZQogICAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgVFJVRSwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5zeW0sIGZyYW1lLT5icCwgCgkJCSAgICAgICAmZnJhbWVzW3RoZWZyYW1lXS5mcmFtZS5saXN0KTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uc3MgPSBhZGRyLT5zZWcgPSBzczsKICAgIGZyYW1lc1t0aGVmcmFtZV0uZWJwID0gYWRkci0+b2ZmID0gZnJhbWUtPmJwICYgfjE7CiAgICBpZiAobm9pc3kpIHsKICAgICAgZnByaW50Ziggc3RkZXJyLCAiIChicD0lMDRseCIsIGFkZHItPm9mZiApOwogICAgICBpZiAocG9zc2libGVfY3MpIHsKICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIsIGZhciBjYWxsIGFzc3VtZWQiICk7CiAgICAgIH0KICAgICAgZnByaW50Ziggc3RkZXJyLCAiKVxuIiApOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIERFQlVHX0ZyYW1lMzIoREJHX0FERFIgKmFkZHIsIHVuc2lnbmVkIGludCAqY3MsIGludCBmcmFtZW5vLCBpbnQgbm9pc3kpCnsKICAgIHVuc2lnbmVkIGludCBzcyA9IGFkZHItPnNlZzsKICAgIEZSQU1FMzIgKmZyYW1lID0gKEZSQU1FMzIgKilEQkdfQUREUl9UT19MSU4oYWRkcik7CiAgICBpbnQgdGhlZnJhbWUgPSBuZnJhbWU7CgogICAgaWYgKERFQlVHX0lzQmFkUmVhZFB0ciggYWRkciwgc2l6ZW9mKEZSQU1FMzIpICkpIHsKICAgICAgIGlmIChub2lzeSkgewoJICBmcHJpbnRmKHN0ZGVyciwiKioqIEludmFsaWQgYWRkcmVzcyAiKTsKCSAgREVCVUdfUHJpbnRBZGRyZXNzKGFkZHIsIGRiZ19tb2RlLCBGQUxTRSk7CgkgIGZwcmludGYoc3RkZXJyLCJcbiIpOwogICAgICAgfQogICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgaWYgKCFmcmFtZS0+aXApIHJldHVybiBGQUxTRTsKICAgIG5mcmFtZSsrOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopREJHX3JlYWxsb2MoZnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmZyYW1lKnNpemVvZihzdHJ1Y3QgYnRfaW5mbykpOwogICAgaWYgKG5vaXN5KQogICAgICBmcHJpbnRmKHN0ZGVyciwiJXMlZCAiLCAodGhlZnJhbWUgPT0gY3Vycl9mcmFtZSA/ICI9PiIgOiAiICAiKSwKICAgICAgICAgICAgICBmcmFtZW5vKTsKICAgIGZyYW1lc1t0aGVmcmFtZV0uY3MgPSBhZGRyLT5zZWcgPSAqY3M7CiAgICBmcmFtZXNbdGhlZnJhbWVdLmVpcCA9IGFkZHItPm9mZiA9IGZyYW1lLT5pcDsKICAgIGlmIChub2lzeSkKICAgICAgZnJhbWVzW3RoZWZyYW1lXS5mcmFtZSA9IERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGFkZHIsIDMyLCAKCQkJCQkJZnJhbWUtPmJwLCBUUlVFICk7CiAgICBlbHNlCiAgICAgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBUUlVFLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLnN5bSwgZnJhbWUtPmJwLCAKCQkJICAgICAgICZmcmFtZXNbdGhlZnJhbWVdLmZyYW1lLmxpc3QpOwogICAgaWYgKG5vaXN5KSBmcHJpbnRmKCBzdGRlcnIsICIgKGVicD0lMDhseClcbiIsIGZyYW1lLT5icCApOwogICAgZnJhbWVzW3RoZWZyYW1lXS5zcyA9IGFkZHItPnNlZyA9IHNzOwogICAgZnJhbWVzW3RoZWZyYW1lXS5lYnAgPSBmcmFtZS0+YnA7CiAgICBpZiAoYWRkci0+b2ZmID09IGZyYW1lLT5icCkgcmV0dXJuIEZBTFNFOwogICAgYWRkci0+b2ZmID0gZnJhbWUtPmJwOwogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyB2b2lkIERFQlVHX0RvQmFja1RyYWNlKGludCBub2lzeSkKewogICAgREJHX0FERFIgYWRkciwgc3dfYWRkcjsKICAgIHVuc2lnbmVkIGludCBzcyA9IFNTX3JlZygmREVCVUdfY29udGV4dCksIGNzID0gQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKICAgIGludCBmcmFtZW5vID0gMCwgaXMxNiwgb2s7CiAgICBEV09SRCBuZXh0X3N3aXRjaCwgY3VyX3N3aXRjaDsKCiAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIkJhY2t0cmFjZTpcbiIgKTsKCiAgICBuZnJhbWUgPSAxOwogICAgaWYgKGZyYW1lcykgREJHX2ZyZWUoIGZyYW1lcyApOwogICAgZnJhbWVzID0gKHN0cnVjdCBidF9pbmZvICopIERCR19hbGxvYyggc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSApOwogICAgaWYgKG5vaXN5KQogICAgICBmcHJpbnRmKHN0ZGVyciwiJXMlZCAiLChjdXJyX2ZyYW1lID09IDAgPyAiPT4iIDogIiAgIiksIGZyYW1lbm8pOwoKICAgIGlmIChJU19TRUxFQ1RPUl9TWVNURU0oc3MpKSBzcyA9IDA7CiAgICBpZiAoSVNfU0VMRUNUT1JfU1lTVEVNKGNzKSkgY3MgPSAwOwoKICAgIC8qIGZpcnN0IHN0YWNrIGZyYW1lIGZyb20gcmVnaXN0ZXJzICovCiAgICBpZiAoSVNfU0VMRUNUT1JfMzJCSVQoc3MpKQogICAgewogICAgICAgIGZyYW1lc1swXS5jcyA9IGFkZHIuc2VnID0gY3M7CiAgICAgICAgZnJhbWVzWzBdLmVpcCA9IGFkZHIub2ZmID0gRUlQX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgaWYgKG5vaXN5KQogICAgICAgICAgZnJhbWVzWzBdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMzIsIFRSVUUgKTsKICAgICAgICBlbHNlCgkgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCAmYWRkciwgVFJVRSwgJmZyYW1lc1swXS5mcmFtZS5zeW0sIDAsIAoJCQkJCQkmZnJhbWVzWzBdLmZyYW1lLmxpc3QpOwogICAgICAgIGZyYW1lc1swXS5zcyA9IGFkZHIuc2VnID0gc3M7CglmcmFtZXNbMF0uZWJwID0gYWRkci5vZmYgPSBFQlBfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIiAoZWJwPSUwOHgpXG4iLCBmcmFtZXNbMF0uZWJwICk7CiAgICAgICAgaXMxNiA9IEZBTFNFOwogICAgfSBlbHNlIHsKICAgICAgICBmcmFtZXNbMF0uY3MgPSBhZGRyLnNlZyA9IGNzOwogICAgICAgIGZyYW1lc1swXS5laXAgPSBhZGRyLm9mZiA9IExPV09SRChFSVBfcmVnKCZERUJVR19jb250ZXh0KSk7CiAgICAgICAgaWYgKG5vaXN5KQogICAgICAgICAgZnJhbWVzWzBdLmZyYW1lID0gREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgMTYsIFRSVUUgKTsKICAgICAgICBlbHNlCgkgIERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCAmYWRkciwgVFJVRSwgJmZyYW1lc1swXS5mcmFtZS5zeW0sIDAsIAoJCQkJCQkmZnJhbWVzWzBdLmZyYW1lLmxpc3QpOwogICAgICAgIGZyYW1lc1swXS5zcyA9IGFkZHIuc2VnID0gc3M7CglmcmFtZXNbMF0uZWJwID0gYWRkci5vZmYgPSBCUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiIChicD0lMDR4KVxuIiwgZnJhbWVzWzBdLmVicCApOwogICAgICAgIGlzMTYgPSBUUlVFOwogICAgfQoKICAgIG5leHRfc3dpdGNoID0gTnRDdXJyZW50VGViKCktPmN1cl9zdGFjazsKICAgIGlmIChpczE2KSB7CiAgICAgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJIHJldHVybjsKICAgICAgfQogICAgICBjdXJfc3dpdGNoID0gKERXT1JEKSgoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCktPmZyYW1lMTY7CiAgICAgIHN3X2FkZHIuc2VnID0gU0VMRUNUT1JPRihjdXJfc3dpdGNoKTsKICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpLCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpICk7CgkgcmV0dXJuOwogICAgICB9CiAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSktPmZyYW1lMzI7CiAgICAgIHN3X2FkZHIuc2VnID0gc3M7CiAgICAgIHN3X2FkZHIub2ZmID0gY3VyX3N3aXRjaDsKICAgIH0KICAgIGlmIChERUJVR19Jc0JhZFJlYWRQdHIoJnN3X2FkZHIsMSkpIHsKICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CiAgICAgIHN3X2FkZHIub2ZmID0gKERXT1JEKS0xOwogICAgfQoKICAgIGZvciAob2sgPSBUUlVFOyBvazspIHsKICAgICAgaWYgKChmcmFtZXNbZnJhbWVub10uc3MgPT0gc3dfYWRkci5zZWcpICYmCiAgICAgICAgICAoZnJhbWVzW2ZyYW1lbm9dLmVicCA+PSBzd19hZGRyLm9mZikpIHsKICAgICAgICAvKiAxNjwtPjMyIHN3aXRjaC4uLgogICAgICAgICAqIHllcywgSSBrbm93IHRoaXMgaXMgY29uZnVzaW5nLCBpdCBnYXZlIG1lIGEgaGVhZGFjaGUgdG9vICovCiAgICAgICAgaWYgKGlzMTYpIHsKICAgICAgICAgIFNUQUNLMzJGUkFNRSAqZnJhbWUgPSAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaDsKICAgICAgICAgIERCR19BRERSIGNvZGU7CgoJICBpZiAoSXNCYWRSZWFkUHRyKChTVEFDSzMyRlJBTUUqKW5leHRfc3dpdGNoLCBzaXplb2YoU1RBQ0szMkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2ggKTsKCSAgICByZXR1cm47CgkgIH0KCSAgY29kZS50eXBlID0gTlVMTDsKCSAgY29kZS5zZWcgID0gMDsKCSAgY29kZS5vZmYgID0gZnJhbWUtPnJldGFkZHI7CgogICAgICAgICAgY3MgPSAwOwogICAgICAgICAgYWRkci5zZWcgPSAwOwogICAgICAgICAgYWRkci5vZmYgPSBmcmFtZS0+ZWJwOwogICAgICAgICAgREVCVUdfRm9yY2VGcmFtZSggJmFkZHIsICZjb2RlLCArK2ZyYW1lbm8sIDMyLCBub2lzeSApOwoKICAgICAgICAgIG5leHRfc3dpdGNoID0gY3VyX3N3aXRjaDsKCSAgaWYgKElzQmFkUmVhZFB0cigoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCksIHNpemVvZihTVEFDSzE2RlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0sxNkZSQU1FKilQVFJfU0VHX1RPX0xJTihuZXh0X3N3aXRjaCkgKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgICAgIGN1cl9zd2l0Y2ggPSAoRFdPUkQpKChTVEFDSzE2RlJBTUUqKVBUUl9TRUdfVE9fTElOKG5leHRfc3dpdGNoKSktPmZyYW1lMzI7CiAgICAgICAgICBzd19hZGRyLnNlZyA9IDA7CiAgICAgICAgICBzd19hZGRyLm9mZiA9IGN1cl9zd2l0Y2g7CgogICAgICAgICAgaXMxNiA9IEZBTFNFOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lID0gKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpOwogICAgICAgICAgREJHX0FERFIgY29kZTsKCgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpLCBzaXplb2YoU1RBQ0sxNkZSQU1FKSkpIHsKCSAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIkJhZCBzdGFjayBmcmFtZSAlcFxuIiwgKFNUQUNLMTZGUkFNRSopUFRSX1NFR19UT19MSU4obmV4dF9zd2l0Y2gpICk7CgkgICAgcmV0dXJuOwoJICB9CgoJICBjb2RlLnR5cGUgPSBOVUxMOwoJICBjb2RlLnNlZyAgPSBmcmFtZS0+Y3M7CgkgIGNvZGUub2ZmICA9IGZyYW1lLT5pcDsKCiAgICAgICAgICBjcyA9IGZyYW1lLT5jczsKICAgICAgICAgIGFkZHIuc2VnID0gU0VMRUNUT1JPRihuZXh0X3N3aXRjaCk7CiAgICAgICAgICBhZGRyLm9mZiA9IGZyYW1lLT5icDsKICAgICAgICAgIERFQlVHX0ZvcmNlRnJhbWUoICZhZGRyLCAmY29kZSwgKytmcmFtZW5vLCAxNiwgbm9pc3kgKTsKCiAgICAgICAgICBuZXh0X3N3aXRjaCA9IGN1cl9zd2l0Y2g7CgkgIGlmIChJc0JhZFJlYWRQdHIoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gsIHNpemVvZihTVEFDSzMyRlJBTUUpKSkgewoJICAgIGlmIChub2lzeSkgZnByaW50Ziggc3RkZXJyLCAiQmFkIHN0YWNrIGZyYW1lICVwXG4iLCAoU1RBQ0szMkZSQU1FKiluZXh0X3N3aXRjaCApOwoJICAgIHJldHVybjsKCSAgfQogICAgICAgICAgY3VyX3N3aXRjaCA9IChEV09SRCkoKFNUQUNLMzJGUkFNRSopbmV4dF9zd2l0Y2gpLT5mcmFtZTE2OwogICAgICAgICAgc3dfYWRkci5zZWcgPSBTRUxFQ1RPUk9GKGN1cl9zd2l0Y2gpOwogICAgICAgICAgc3dfYWRkci5vZmYgPSBPRkZTRVRPRihjdXJfc3dpdGNoKTsKCiAgICAgICAgICBpczE2ID0gVFJVRTsKICAgICAgICB9CiAgICAgICAgaWYgKERFQlVHX0lzQmFkUmVhZFB0cigmc3dfYWRkciwxKSkgewogICAgICAgICAgc3dfYWRkci5zZWcgPSAoRFdPUkQpLTE7CiAgICAgICAgICBzd19hZGRyLm9mZiA9IChEV09SRCktMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogb3JkaW5hcnkgc3RhY2sgZnJhbWUgKi8KICAgICAgICBvayA9IGlzMTYgPyBERUJVR19GcmFtZTE2KCAmYWRkciwgJmNzLCArK2ZyYW1lbm8sIG5vaXN5KQogICAgICAgICAgICAgICAgICA6IERFQlVHX0ZyYW1lMzIoICZhZGRyLCAmY3MsICsrZnJhbWVubywgbm9pc3kpOwogICAgICB9CiAgICB9CiAgICBpZiAobm9pc3kpIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIERFQlVHX0JhY2tUcmFjZQogKgogKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICovCnZvaWQgREVCVUdfQmFja1RyYWNlKHZvaWQpCnsKICAgIERFQlVHX0RvQmFja1RyYWNlKCBUUlVFICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgREVCVUdfU2lsZW50QmFja1RyYWNlCiAqCiAqIERpc3BsYXkgYSBzdGFjayBiYWNrLXRyYWNlLgogKi8Kdm9pZCBERUJVR19TaWxlbnRCYWNrVHJhY2Uodm9pZCkKewogICAgREVCVUdfRG9CYWNrVHJhY2UoIEZBTFNFICk7Cn0KCmludApERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCnsKICBpbnQJCXJ0biA9IEZBTFNFOwoKICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CgogIGlmKCBjdXJyX2ZyYW1lID49IG5mcmFtZSApCiAgICB7CiAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOwogICAgfQoKICBpZiggY3Vycl9mcmFtZSA8IDAgKQogICAgewogICAgICBjdXJyX2ZyYW1lID0gMDsKICAgIH0KCiAgIGlmKCBmcmFtZXMgJiYgZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3Quc291cmNlZmlsZSAhPSBOVUxMICkKICAgIHsKICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgfQoKICBydG4gPSBUUlVFOwogIHJldHVybiAocnRuKTsKfQoKaW50CkRFQlVHX0dldEN1cnJlbnRGcmFtZShzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUsIHVuc2lnbmVkIGludCAqIGVpcCwKCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCnsKICAvKgogICAqIElmIHdlIGRvbid0IGhhdmUgYSB2YWxpZCBiYWNrdHJhY2UsIHRoZW4ganVzdCByZXR1cm4uCiAgICovCiAgaWYoIGZyYW1lcyA9PSBOVUxMICkKICAgIHsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAvKgogICAqIElmIHdlIGRvbid0IGtub3cgd2hhdCB0aGUgY3VycmVudCBmdW5jdGlvbiBpcywgdGhlbiB3ZSBhbHNvIGhhdmUKICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAqLwogIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUuc3ltID09IE5VTEwgKQogICAgewogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKICAqZWlwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVpcDsKICAqZWJwID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicDsKCiAgcmV0dXJuIFRSVUU7Cn0KCg==