I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKCgpzdGF0aWMgZmxvYXQgKippbXBtdHggPSBOVUxMOwpzdGF0aWMgaW50IGltcGFsbG9jbGVuID0gMDsKI2lmIDEgLy8gdGRpdGVyYXRpb24gdG8gbmFpdmVRc2NvcmVfaW1wIGRlIHRzdWthd2FyZXJ1LgpmbG9hdCBpbXBfbWF0Y2hfb3V0X3NjUSggaW50IGkxLCBpbnQgajEgKQp7Ci8vCWZwcmludGYoIHN0ZGVyciwgImltcCttYXRjaCA9ICVmXG4iLCBpbXBtdHhbaTFdW2oxXSAqIGZhc3RhdGhyZXNob2xkICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgInZhbCA9ICVmXG4iLCBpbXBtdHhbaTFdW2oxXSApOwoJcmV0dXJuKCBpbXBtdHhbaTFdW2oxXSApOwp9CiNlbmRpZgoKc3RhdGljIHZvaWQgaW1wX21hdGNoX291dF92ZWFkUV9nYXBtYXAoIGZsb2F0ICppbXAsIGludCBpMSwgaW50IGxndGgyLCBpbnQgKmdhcG1hcDIgKQp7CiNpZiBGQVNUTUFUQ0hDQUxDCglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJaW50ICpnYXBtYXBwdCA9IGdhcG1hcDI7Cgl3aGlsZSggbGd0aDItLSApCgkJKmltcCsrICs9IHB0WypnYXBtYXBwdCsrXTsKI2Vsc2UKCWludCBqOwoJZmxvYXQgKnB0ID0gaW1wbXR4W2kxXTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCSppbXArKyArPSBwdFtnYXBtYXAyW2pdXTsKI2VuZGlmCn0KCgpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZVFfZ2FwbWFwKCBmbG9hdCAqaW1wLCBpbnQgajEsIGludCBsZ3RoMSwgaW50ICpnYXBtYXAxICkKewojaWYgRkFTVE1BVENIQ0FMQwoJaW50ICpnYXBtYXBwdCA9IGdhcG1hcDE7Cgl3aGlsZSggbGd0aDEtLSApCgkJKmltcCsrICs9IGltcG10eFsqZ2FwbWFwcHQrK11bajFdOwojZWxzZQoJaW50IGk7Cglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQkqaW1wKysgKz0gaW1wbXR4W2dhcG1hcDFbaV1dW2oxXTsKI2VuZGlmCn0KCgpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWRRKCBmbG9hdCAqaW1wLCBpbnQgaTEsIGludCBsZ3RoMiApCnsKI2lmIEZBU1RNQVRDSENBTEMgCglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJd2hpbGUoIGxndGgyLS0gKQoJCSppbXArKyArPSAqcHQrKzsKI2Vsc2UKCWludCBqOwoJZmxvYXQgKnB0ID0gaW1wbXR4W2kxXTsKCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCSppbXArKyArPSBwdFtqXTsKI2VuZGlmCn0Kc3RhdGljIHZvaWQgaW1wX21hdGNoX291dF92ZWFkX3RhdGVRKCBmbG9hdCAqaW1wLCBpbnQgajEsIGludCBsZ3RoMSApCnsKCWludCBpOwoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJKmltcCsrICs9IGltcG10eFtpXVtqMV07Cn0KCnZvaWQgaW1wX3JuYVEoIGludCBuc2VxMSwgaW50IG5zZXEyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBSTkFwYWlyICoqKmdyb3Vwcm5hMSwgUk5BcGFpciAqKipncm91cHJuYTIsIGludCAqZ2FwbWFwMSwgaW50ICpnYXBtYXAyLCBSTkFwYWlyICphZGRpdGlvbmFscGFpciApCnsKCWZvbGRybmEoIG5zZXExLCBuc2VxMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgZ3JvdXBybmExLCBncm91cHJuYTIsIGltcG10eCwgZ2FwbWFwMSwgZ2FwbWFwMiwgYWRkaXRpb25hbHBhaXIgKTsKfQoKI2lmIDEgLy8gdGJmYXN0LmMga2FyYSB5b2JhcmVydS4Kdm9pZCBpbXBfbWF0Y2hfaW5pdF9zdHJpY3RRKCBmbG9hdCAqaW1wLCBpbnQgY2x1czEsIGludCBjbHVzMiwgaW50IGxndGgxLCBpbnQgbGd0aDIsIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIExvY2FsSG9tICoqKmxvY2FsaG9tLCBpbnQgZm9yc2NvcmUgKQp7CglpbnQgaSwgaiwgazEsIGsyLCB0bXBpbnQsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJZmxvYXQgZWZmaWo7Cglkb3VibGUgZWZmaWp4OwoJY2hhciAqcHQsICpwdDEsICpwdDI7CglzdGF0aWMgY2hhciAqbm9jb3VudDEgPSBOVUxMOwoJc3RhdGljIGNoYXIgKm5vY291bnQyID0gTlVMTDsKCUxvY2FsSG9tICp0bXBwdHI7CgoJaWYoIGltcGFsbG9jbGVuIDwgbGd0aDEgKyAyIHx8IGltcGFsbG9jbGVuIDwgbGd0aDIgKyAyICkKCXsKCQlpZiggaW1wbXR4ICkgRnJlZUZsb2F0TXR4KCBpbXBtdHggKTsKCQlpZiggbm9jb3VudDEgKSBmcmVlKCBub2NvdW50MSApOwoJCWlmKCBub2NvdW50MiApIGZyZWUoIG5vY291bnQyICk7CgkJaW1wYWxsb2NsZW4gPSBNQVgoIGxndGgxLCBsZ3RoMiApICsgMjsKCQlpbXBtdHggPSBBbGxvY2F0ZUZsb2F0TXR4KCBpbXBhbGxvY2xlbiwgaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MSA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MiA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCX0KCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMTsgaisrICkKCQkJaWYoIHNlcTFbal1baV0gPT0gJy0nICkgYnJlYWs7CgkJaWYoIGogIT0gY2x1czEgKSBub2NvdW50MVtpXSA9IDE7IAoJCWVsc2UJCQkgbm9jb3VudDFbaV0gPSAwOwoJfQoJZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApCgl7CgkJZm9yKCBqPTA7IGo8Y2x1czI7IGorKyApCgkJCWlmKCBzZXEyW2pdW2ldID09ICctJyApIGJyZWFrOwoJCWlmKCBqICE9IGNsdXMyICkgbm9jb3VudDJbaV0gPSAxOwoJCWVsc2UJCQkgbm9jb3VudDJbaV0gPSAwOwoJfQoKI2lmIDAKZnByaW50Ziggc3RkZXJyLCAibm9jb3VudDIgPVxuIiApOwpmb3IoIGkgPSAwOyBpPGltcGFsbG9jbGVuOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICJub2NvdW50MlslZF0gPSAlZCAoJWMpXG4iLCBpLCBub2NvdW50MltpXSwgc2VxMlswXVtpXSApOwp9CiNlbmRpZgoKCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiZWZmMSBpbiBfaW5pdF9zdHJpY3QgPSBcbiIgKTsKCWZvciggaT0wOyBpPGNsdXMxOyBpKysgKQoJCWZwcmludGYoIHN0ZGVyciwgImVmZjFbXSA9ICVmXG4iLCBlZmYxW2ldICk7Cglmb3IoIGk9MDsgaTxjbHVzMjsgaSsrICkKCQlmcHJpbnRmKCBzdGRlcnIsICJlZmYyW10gPSAlZlxuIiwgZWZmMltpXSApOwojZW5kaWYKCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJaW1wbXR4W2ldW2pdID0gMC4wOwoJZWZmaWp4ID0gIGZhc3RhdGhyZXNob2xkOwoJZm9yKCBpPTA7IGk8Y2x1czE7IGkrKyApCgl7CgkJZm9yKCBqPTA7IGo8Y2x1czI7IGorKyApCgkJewoJCQllZmZpaiA9IChmbG9hdCkoIGVmZjFbaV0gKiBlZmYyW2pdICogZWZmaWp4ICk7CgkJCXRtcHB0ciA9IGxvY2FsaG9tW2ldW2pdOwoJCQl3aGlsZSggdG1wcHRyICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJzdGFydDEgPSAlZFxuIiwgdG1wcHRyLT5zdGFydDEgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiZW5kMSAgID0gJWRcbiIsIHRtcHB0ci0+ZW5kMSAgICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImkgPSAlZCwgc2VxMSA9IFxuJXNcbiIsIGksIHNlcTFbaV0gKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiaiA9ICVkLCBzZXEyID0gXG4lc1xuIiwgaiwgc2VxMltqXSApOwoJCQkJcHQgPSBzZXExW2ldOwoJCQkJdG1waW50ID0gLTE7CgkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJewoJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+c3RhcnQxICkgYnJlYWs7CgkJCQl9CgkJCQlzdGFydDEgPSBwdCAtIHNlcTFbaV0gLSAxOwoJCgkJCQlpZiggdG1wcHRyLT5zdGFydDEgPT0gdG1wcHRyLT5lbmQxICkgZW5kMSA9IHN0YXJ0MTsKCQkJCWVsc2UKCQkJCXsKI2lmIE1BQ0hJR0FJCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAidG1waW50ID0gJWQsIGVuZDEgPSAlZCBwb3MgPSAlZFxuIiwgdG1waW50LCB0bXBwdHItPmVuZDEsIHB0LXNlcTFbaV0gKTsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDEgKSBicmVhazsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCX0KCQkJCQllbmQxID0gcHQgLSBzZXExW2ldIC0gMDsKI2Vsc2UKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBpbnQgPSAlZCwgZW5kMSA9ICVkIHBvcyA9ICVkXG4iLCB0bXBpbnQsIHRtcHB0ci0+ZW5kMSwgcHQtc2VxMVtpXSApOwoJCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQxICkgYnJlYWs7CgkJCQkJfQoJCQkJCWVuZDEgPSBwdCAtIHNlcTFbaV0gLSAxOwojZW5kaWYKCQkJCX0KCQoJCQkJcHQgPSBzZXEyW2pdOwoJCQkJdG1waW50ID0gLTE7CgkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJewoJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+c3RhcnQyICkgYnJlYWs7CgkJCQl9CgkJCQlzdGFydDIgPSBwdCAtIHNlcTJbal0gLSAxOwoJCQkJaWYoIHRtcHB0ci0+c3RhcnQyID09IHRtcHB0ci0+ZW5kMiApIGVuZDIgPSBzdGFydDI7CgkJCQllbHNlCgkJCQl7CiNpZiBNQUNISUdBSQoJCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQkJewoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMiApIGJyZWFrOwoJCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJfQoJCQkJCWVuZDIgPSBwdCAtIHNlcTJbal0gLSAwOwojZWxzZQoJCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQkJewoJCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQyICkgYnJlYWs7CgkJCQkJfQoJCQkJCWVuZDIgPSBwdCAtIHNlcTJbal0gLSAxOwojZW5kaWYKCQkJCX0KLy8JCQkJZnByaW50Ziggc3RkZXJyLCAic3RhcnQxID0gJWQgKCVjKSwgZW5kMSA9ICVkICglYyksIHN0YXJ0MiA9ICVkICglYyksIGVuZDIgPSAlZCAoJWMpXG4iLCBzdGFydDEsIHNlcTFbaV1bc3RhcnQxXSwgZW5kMSwgc2VxMVtpXVtlbmQxXSwgc3RhcnQyLCBzZXEyW2pdW3N0YXJ0Ml0sIGVuZDIsIHNlcTJbal1bZW5kMl0gKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAic3RlcCAwXG4iICk7CgkJCQlpZiggZW5kMSAtIHN0YXJ0MSAhPSBlbmQyIC0gc3RhcnQyICkKCQkJCXsKLy8JCQkJCWZwcmludGYoIHN0ZGVyciwgIkNIVVVJISEsIHN0YXJ0MSA9ICVkLCBlbmQxID0gJWQsIHN0YXJ0MiA9ICVkLCBlbmQyID0gJWRcbiIsIHN0YXJ0MSwgZW5kMSwgc3RhcnQyLCBlbmQyICk7CgkJCQl9CgojaWYgMQoJCQkJazEgPSBzdGFydDE7IGsyID0gc3RhcnQyOwoJCQkJcHQxID0gc2VxMVtpXSArIGsxOwoJCQkJcHQyID0gc2VxMltqXSArIGsyOwoJCQkJd2hpbGUoICpwdDEgJiYgKnB0MiApCgkJCQl7CgkJCQkJaWYoICpwdDEgIT0gJy0nICYmICpwdDIgIT0gJy0nICkKCQkJCQl7Ci8vIL3FpN+k8sbzvcWky6SrpLGkyqSkpOikpqTLw+2w1aS3pMayvKS1pKShowovLwkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+d2ltcG9ydGFuY2UgKiBmYXN0YXRocmVzaG9sZDsKLy8JCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPmltcG9ydGFuY2UgKiBlZmZpajsKCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT5maW1wb3J0YW5jZSAqIGVmZmlqOwovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgIiMjIyMgaW1wbXR4W2sxXVtrMl0gPSAlZiwgdG1wcHRyLT5maW1wb3J0YW5jZT0lZiwgZWZmaWo9JWZcbiIsIGltcG10eFtrMV1bazJdLCB0bXBwdHItPmZpbXBvcnRhbmNlLCBlZmZpaiApOwovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgIm1hcmssICVkICglYykgLSAlZCAoJWMpIFxuIiwgazEsICpwdDEsIGsyLCAqcHQyICk7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAiJWQgKCVjKSAtICVkICglYykgIC0gJWZcbiIsIGsxLCAqcHQxLCBrMiwgKnB0MiwgdG1wcHRyLT5maW1wb3J0YW5jZSAqIGVmZmlqICk7CgkJCQkJCWsxKys7IGsyKys7CgkJCQkJCXB0MSsrOyBwdDIrKzsKCQkJCQl9CgkJCQkJZWxzZSBpZiggKnB0MSAhPSAnLScgJiYgKnB0MiA9PSAnLScgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJza2lwLCAlZCAoJWMpIC0gJWQgKCVjKSBcbiIsIGsxLCAqcHQxLCBrMiwgKnB0MiApOwoJCQkJCQlrMisrOyBwdDIrKzsKCQkJCQl9CgkJCQkJZWxzZSBpZiggKnB0MSA9PSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJza2lwLCAlZCAoJWMpIC0gJWQgKCVjKSBcbiIsIGsxLCAqcHQxLCBrMiwgKnB0MiApOwoJCQkJCQlrMSsrOyBwdDErKzsKCQkJCQl9CgkJCQkJZWxzZSBpZiggKnB0MSA9PSAnLScgJiYgKnB0MiA9PSAnLScgKQoJCQkJCXsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJza2lwLCAlZCAoJWMpIC0gJWQgKCVjKSBcbiIsIGsxLCAqcHQxLCBrMiwgKnB0MiApOwoJCQkJCQlrMSsrOyBwdDErKzsKCQkJCQkJazIrKzsgcHQyKys7CgkJCQkJfQoJCQkJCWlmKCBrMSA+IGVuZDEgfHwgazIgPiBlbmQyICkgYnJlYWs7CgkJCQl9CiNlbHNlCgkJCQl3aGlsZSggazEgPD0gZW5kMSAmJiBrMiA8PSBlbmQyICkKCQkJCXsKCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJrMSxrMj0lZCwlZCAtICIsIGsxLCBrMiApOwoJCQkJCWlmKCAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCXsKCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdICAqIGZhc3RhdGhyZXNob2xkOwoJCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJtYXJrZWRcbiIgKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJubyBjb3VudFxuIiApOwoJCQkJCWsxKys7IGsyKys7CgkJCQl9CiNlbmRpZgoJCQkJdG1wcHRyID0gdG1wcHRyLT5uZXh0OwoJCQl9CgkJfQoJfQojaWYgMAoJaWYoIGNsdXMxID09IDEgJiYgY2x1czIgPT0gNiApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJZnByaW50Ziggc3RkZXJyLCAic2VxMVswXSA9ICAlc1xuIiwgc2VxMVswXSApOwoJCWZwcmludGYoIHN0ZGVyciwgInNlcTJbMF0gPSAgJXNcbiIsIHNlcTJbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJpbXBtdHggPSBcbiIgKTsKCQlmb3IoIGsyPTA7IGsyPGxndGgyOyBrMisrICkKCQkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgKGRvdWJsZSlrMiApOwoJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCWZvciggazE9MDsgazE8bGd0aDE7IGsxKysgKQoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiJWQgIiwgazEgKTsKCQkJZm9yKCBrMj0wOyBrMjwzOyBrMisrICkKCQkJCWZwcmludGYoIHN0ZGVyciwgIiUyLjFmICIsIGltcG10eFtrMV1bazJdICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCX0KCQlleGl0KCAxICk7Cgl9CiNlbmRpZgp9CiNlbmRpZgoKCnN0YXRpYyB2b2lkIGNsZWFydmVjKCBmbG9hdCAqbWF0Y2gsIGludCBsZ3RoICkKewoJd2hpbGUoIGxndGgtLSApICptYXRjaCsrID0gMC4wOwp9CgpzdGF0aWMgdm9pZCBtYXRjaF9jYWxjKCBmbG9hdCAqbWF0Y2gsIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIGludCBpMSwgaW50IGxndGgyLCBmbG9hdCAqKmZsb2F0d29yaywgaW50ICoqaW50d29yaywgaW50IGluaXRpYWxpemUgKQp7CiNpZiBGQVNUTUFUQ0hDQUxDCglpbnQgaiwgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7CglmbG9hdCAqbWF0Y2hwdCwgKmNwbXhwZHB0LCAqKmNwbXhwZHB0cHQ7CglpbnQgKmNwbXhwZG5wdCwgKipjcG14cGRucHRwdDsKCWlmKCBpbml0aWFsaXplICkKCXsKCQlpbnQgY291bnQgPSAwOwoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJY291bnQgPSAwOwoJCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQkJewoJCQkJaWYoIGNwbXgyW2xdW2pdICkKCQkJCXsKCQkJCQljcG14cGRbal1bY291bnRdID0gY3BteDJbbF1bal07CgkJCQkJY3BteHBkbltqXVtjb3VudF0gPSBsOwoJCQkJCWNvdW50Kys7CgkJCQl9CgkJCX0KCQkJY3BteHBkbltqXVtjb3VudF0gPSAtMTsKCQl9Cgl9CgoJewoJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCXsKCQkJc2NhcnJbbF0gPSAwLjA7CgkJCWZvciggaj0wOyBqPDI2OyBqKysgKQoJCQkJc2NhcnJbbF0gKz0gbl9kaXNfY29uc3dlaWdodF9tdWx0aVtqXVtsXSAqIGNwbXgxW2pdW2kxXTsKLy8JCQlzY2FycltsXSAqPSBjb25zd2VpZ2h0X211bHRpOwoJCX0KCQltYXRjaHB0ID0gbWF0Y2g7CgkJY3BteHBkbnB0cHQgPSBjcG14cGRuOwoJCWNwbXhwZHB0cHQgPSBjcG14cGQ7CgkJd2hpbGUoIGxndGgyLS0gKQoJCXsKCQkJKm1hdGNocHQgPSAwLjA7CgkJCWNwbXhwZG5wdCA9ICpjcG14cGRucHRwdCsrOwoJCQljcG14cGRwdCA9ICpjcG14cGRwdHB0Kys7CgkJCXdoaWxlKCAqY3BteHBkbnB0Pi0xICkKCQkJCSptYXRjaHB0ICs9IHNjYXJyWypjcG14cGRucHQrK10gKiAqY3BteHBkcHQrKzsKCQkJbWF0Y2hwdCsrOwoJCX0gCgl9CiNlbHNlCglpbnQgaiwgaywgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7Ci8vIHNpbXBsZQoJaWYoIGluaXRpYWxpemUgKQoJewoJCWludCBjb3VudCA9IDA7CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQljb3VudCA9IDA7CgkJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCQl7CgkJCQlpZiggY3BteDJbbF1bal0gKQoJCQkJewoJCQkJCWNwbXhwZFtjb3VudF1bal0gPSBjcG14MltsXVtqXTsKCQkJCQljcG14cGRuW2NvdW50XVtqXSA9IGw7CgkJCQkJY291bnQrKzsKCQkJCX0KCQkJfQoJCQljcG14cGRuW2NvdW50XVtqXSA9IC0xOwoJCX0KCX0KCWZvciggbD0wOyBsPDI2OyBsKysgKQoJewoJCXNjYXJyW2xdID0gMC4wOwoJCWZvciggaz0wOyBrPDI2OyBrKysgKQoJCQlzY2FycltsXSArPSBuX2Rpc19jb25zd2VpZ2h0X211bHRpW2tdW2xdICogY3BteDFba11baTFdOwovLwkJc2NhcnJbbF0gKj0gY29uc3dlaWdodF9tdWx0aTsKCX0KCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJewoJCW1hdGNoW2pdID0gMC4wOwoJCWZvciggaz0wOyBjcG14cGRuW2tdW2pdPi0xOyBrKysgKQoJCQltYXRjaFtqXSArPSBzY2FycltjcG14cGRuW2tdW2pdXSAqIGNwbXhwZFtrXVtqXTsKCX0gCiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBBdHJhY2tpbmdfbG9jYWxob21fZ2FwbWFwKCBmbG9hdCAqaW1wd21wdCwgZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YywKCQkJCQkJaW50ICpnYXBtYXAxLCBpbnQgKmdhcG1hcDIgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGs7CgljaGFyIGdhcFtdID0gIi0iOwoJZmxvYXQgd207CglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJZnByaW50Ziggc3RkZXJyLCAibGFzdHZlcnRpY2Fsd1slZF0gPSAlZlxuIiwgaSwgbGFzdHZlcnRpY2Fsd1tpXSApOwoJfQojZW5kaWYKIAoJaWYoIG91dGdhcCA9PSAxICkKCQk7CgllbHNlCgl7CgkJd20gPSBsYXN0dmVydGljYWx3WzBdOwoJCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCXsKCQkJaWYoIGxhc3R2ZXJ0aWNhbHdbaV0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbaV07CgkJCQlpaW4gPSBpOyBqaW4gPSBsZ3RoMi0xOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSArKCBsZ3RoMSAtIGkgKTsKCQkJfQoJCX0KCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWlmKCBsYXN0aG9yaXpvbnRhbHdbal0gPj0gd20gKQoJCQl7CgkJCQl3bSA9IGxhc3Rob3Jpem9udGFsd1tqXTsKCQkJCWlpbiA9IGxndGgxLTE7IGppbiA9IGo7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9IC0oIGxndGgyIC0gaiApOwoJCQl9CgkJfQoJfQoKICAgIGZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApIAogICAgewogICAgICAgIGlqcFtpXVswXSA9IGkgKyAxOwogICAgfQogICAgZm9yKCBqPTA7IGo8bGd0aDIrMTsgaisrICkgCiAgICB7CiAgICAgICAgaWpwWzBdW2pdID0gLSggaiArIDEgKTsKICAgIH0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJewoJCW1zZXExW2ldICs9IGxndGgxK2xndGgyOwoJCSptc2VxMVtpXSA9IDA7Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCW1zZXEyW2pdICs9IGxndGgxK2xndGgyOwoJCSptc2VxMltqXSA9IDA7Cgl9CglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CgkqaW1wd21wdCA9IDAuMDsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpK2xdOwoJCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJCSotLW1zZXEyW2pdID0gKmdhcDsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSAKCQkJCSotLW1zZXExW2ldID0gKmdhcDsKCQkJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgCgkJCQkqLS1tc2VxMltqXSA9IHNlcTJbal1bamZpK2xdOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gIT0gbGd0aDEgJiYgamluICE9IGxndGgyICkgLy8gPz8KCQl7CgkJCSppbXB3bXB0ICs9IGltcF9tYXRjaF9vdXRfc2NRKCBnYXBtYXAxW2lpbl0sIGdhcG1hcDJbamluXSApOwovLwkJCWZwcmludGYoIHN0ZGVyciwgImltcHdtID0gJWYgKGlpbj0lZCwgamluPSVkKSBzZXExPSVjLCBzZXEyPSVjXG4iLCAqaW1wd21wdCwgaWluLCBqaW4sIHNlcTFbMF1baWluXSwgc2VxMlswXVtqaW5dICk7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApIAoJCQkqLS1tc2VxMVtpXSA9IHNlcTFbaV1baWZpXTsKCQlmb3IoIGo9MDsgajxqY3ljOyBqKysgKSAKCQkJKi0tbXNlcTJbal0gPSBzZXEyW2pdW2pmaV07CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQp9CgojaWYgMApzdGF0aWMgdm9pZCBBdHJhY2tpbmdfbG9jYWxob21fZ2FwbWFwX2JrKCBmbG9hdCAqaW1wd21wdCwgZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YywKCQkJCQkJaW50ICpnYXBtYXAxLCBpbnQgKmdhcG1hcDIgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGs7CglmbG9hdCB3bTsKCWNoYXIgKmdhcHRhYmxlMSwgKmd0MWJrOwoJY2hhciAqZ2FwdGFibGUyLCAqZ3QyYms7CglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CgkqaW1wd21wdCA9IDAuMDsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPT0gbGd0aDEgfHwgamluID09IGxndGgyICkKCQkJOwoJCWVsc2UKCQl7CgkJCSppbXB3bXB0ICs9IGltcF9tYXRjaF9vdXRfc2NRKCBnYXBtYXAxW2lpbl0sIGdhcG1hcDJbamluXSApOwoKLy8JCWZwcmludGYoIHN0ZGVyciwgImltcHdtID0gJWYgKGlpbj0lZCwgamluPSVkKSBzZXExPSVjLCBzZXEyPSVjXG4iLCAqaW1wd21wdCwgaWluLCBqaW4sIHNlcTFbMF1baWluXSwgc2VxMlswXVtqaW5dICk7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkqLS1nYXB0YWJsZTIgPSAnLSc7CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZ2FwaXJlcnUoIG1zZXExW2ldLCBzZXExW2ldLCBnYXB0YWJsZTEgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGdhcGlyZXJ1KCBtc2VxMltqXSwgc2VxMltqXSwgZ2FwdGFibGUyICk7CgoJZnByaW50Ziggc3RkZXJyLCAibXNlcTFbMF0gPSAlc1xuIiwgbXNlcTFbMF0gKTsKCWZwcmludGYoIHN0ZGVyciwgIm1zZXEyWzBdID0gJXNcbiIsIG1zZXEyWzBdICk7CgoKCWZyZWUoIGd0MWJrICk7CglmcmVlKCBndDJiayApOwp9CgojZW5kaWYKCnN0YXRpYyB2b2lkIEF0cmFja2luZ19sb2NhbGhvbSggZmxvYXQgKmltcHdtcHQsIGZsb2F0ICpsYXN0aG9yaXpvbnRhbHcsIGZsb2F0ICpsYXN0dmVydGljYWx3LCAKCQkJCQkJY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqKmNwbXgxLCBmbG9hdCAqKmNwbXgyLCAKICAgICAgICAgICAgICAgICAgICAgICAgaW50ICoqaWpwLCBpbnQgaWN5YywgaW50IGpjeWMgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGs7CglmbG9hdCB3bTsKCWNoYXIgKmdhcHRhYmxlMSwgKmd0MWJrOwoJY2hhciAqZ2FwdGFibGUyLCAqZ3QyYms7CglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CgkqaW1wd21wdCA9IDAuMDsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPT0gbGd0aDEgfHwgamluID09IGxndGgyICkKCQkJOwoJCWVsc2UKCQl7CgkJCSppbXB3bXB0ICs9IGltcF9tYXRjaF9vdXRfc2NRKCBpaW4sIGppbiApOwoKLy8JCWZwcmludGYoIHN0ZGVyciwgImltcHdtID0gJWYgKGlpbj0lZCwgamluPSVkKSBzZXExPSVjLCBzZXEyPSVjXG4iLCAqaW1wd21wdCwgaWluLCBqaW4sIHNlcTFbMF1baWluXSwgc2VxMlswXVtqaW5dICk7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkqLS1nYXB0YWJsZTIgPSAnbyc7CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGdhcGlyZXJ1KCBtc2VxMVtpXSwgc2VxMVtpXSwgZ2FwdGFibGUxICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBnYXBpcmVydSggbXNlcTJbal0sIHNlcTJbal0sIGdhcHRhYmxlMiApOwoKCWZyZWUoIGd0MWJrICk7CglmcmVlKCBndDJiayApOwp9CgoKc3RhdGljIGZsb2F0IEF0cmFja2luZyggZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YyApCnsKCWludCBpLCBqLCBsLCBpaW4sIGppbiwgaWZpLCBqZmksIGxndGgxLCBsZ3RoMiwgazsKCWZsb2F0IHdtOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7Cglmb3IoIGs9MDsgazw9bGd0aDErbGd0aDI7IGsrKyApIAoJewoJCWlmKCBpanBbaWluXVtqaW5dIDwgMCApIAoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbitpanBbaWluXVtqaW5dOwoJCX0KCQllbHNlIGlmKCBpanBbaWluXVtqaW5dID4gMCApCgkJewoJCQlpZmkgPSBpaW4taWpwW2lpbl1bamluXTsgamZpID0gamluLTE7CgkJfQoJCWVsc2UKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4tMTsKCQl9CgkJbCA9IGlpbiAtIGlmaTsKCQl3aGlsZSggLS1sICkgCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJCSotLWdhcHRhYmxlMiA9ICctJzsKCQkJaysrOwoJCX0KCQlsPSBqaW4gLSBqZmk7CgkJd2hpbGUoIC0tbCApCgkJewoJCQkqLS1nYXB0YWJsZTEgPSAnLSc7CgkJCSotLWdhcHRhYmxlMiA9ICdvJzsKCQkJaysrOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKCglyZXR1cm4oIDAuMCApOwp9CgpmbG9hdCBRX19hbGlnbiggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgaW50IGljeWMsIGludCBqY3ljLCBpbnQgYWxsb2NsZW4sIExvY2FsSG9tICoqKmxvY2FsaG9tLCBmbG9hdCAqaW1wbWF0Y2gsIGNoYXIgKnNnYXAxLCBjaGFyICpzZ2FwMiwgY2hhciAqZWdhcDEsIGNoYXIgKmVnYXAyICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCXJlZ2lzdGVyIGludCBpLCBqOwoJaW50IGxhc3RpLCBsYXN0ajsgICAgICAvKiBvdXRnYXAgPT0gMCAtPiBsZ3RoMSwgb3V0Z2FwID09IDEgLT4gbGd0aDErMSAqLwoJaW50IGxndGgxLCBsZ3RoMjsKCWludCByZXN1bHRsZW47CglmbG9hdCB3bSA9IDAuMDsgICAvKiBpbnQgPz8/Pz8/ICovCglmbG9hdCBnOwoJZmxvYXQgKmN1cnJlbnR3LCAqcHJldmlvdXN3OwovLwlmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwojaWYgVVNFX1BFTkFMVFlfRVgKCWZsb2F0IGZwZW5hbHR5X2V4ID0gKGZsb2F0KXBlbmFsdHlfZXg7CglmcHJpbnRmKCBzdGRlcnIsICJmcGVuYWx0eV9leCA9ICVmXG4iLCBmcGVuYWx0eV9leCApOwojZW5kaWYKI2lmIDEKCWZsb2F0ICp3dG1wOwoJaW50ICppanBwdDsKCWZsb2F0ICptanB0LCAqcHJlcHQsICpjdXJwdDsKCWludCAqbXBqcHQ7CiNlbmRpZgoJc3RhdGljIGZsb2F0IG1pLCAqbTsKCXN0YXRpYyBpbnQgKippanA7CglzdGF0aWMgaW50IG1waSwgKm1wOwoJc3RhdGljIGZsb2F0ICp3MSwgKncyOwoJc3RhdGljIGZsb2F0ICptYXRjaDsKCXN0YXRpYyBmbG9hdCAqaW5pdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJc3RhdGljIGZsb2F0ICpsYXN0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgY2hhciAqKm1zZXExOwoJc3RhdGljIGNoYXIgKiptc2VxMjsKCXN0YXRpYyBjaGFyICoqbXNlcTsKCXN0YXRpYyBmbG9hdCAqZGlnZjE7CglzdGF0aWMgZmxvYXQgKmRpZ2YyOwoJc3RhdGljIGZsb2F0ICpkaWFmMTsKCXN0YXRpYyBmbG9hdCAqZGlhZjI7CglzdGF0aWMgZmxvYXQgKmdhcHoxOwoJc3RhdGljIGZsb2F0ICpnYXB6MjsKCXN0YXRpYyBmbG9hdCAqZ2FwZjE7CglzdGF0aWMgZmxvYXQgKmdhcGYyOwoJc3RhdGljIGZsb2F0ICpvZ2NwMWc7CglzdGF0aWMgZmxvYXQgKm9nY3AyZzsKCXN0YXRpYyBmbG9hdCAqZmdjcDFnOwoJc3RhdGljIGZsb2F0ICpmZ2NwMmc7CglzdGF0aWMgZmxvYXQgKm9nX2hfZGdfbjFfcDsKCXN0YXRpYyBmbG9hdCAqb2dfaF9kZ19uMl9wOwoJc3RhdGljIGZsb2F0ICpmZ19oX2RnX24xX3A7CglzdGF0aWMgZmxvYXQgKmZnX2hfZGdfbjJfcDsKCXN0YXRpYyBmbG9hdCAqb2dfdF9mZ19oX2RnX24xX3A7CglzdGF0aWMgZmxvYXQgKm9nX3RfZmdfaF9kZ19uMl9wOwoJc3RhdGljIGZsb2F0ICpmZ190X29nX2hfZGdfbjFfcDsKCXN0YXRpYyBmbG9hdCAqZmdfdF9vZ19oX2RnX24yX3A7CglzdGF0aWMgZmxvYXQgKmdhcHpfbjE7CglzdGF0aWMgZmxvYXQgKmdhcHpfbjI7CglzdGF0aWMgZmxvYXQgKipjcG14MTsKCXN0YXRpYyBmbG9hdCAqKmNwbXgyOwoJc3RhdGljIGludCAqKmludHdvcms7CglzdGF0aWMgZmxvYXQgKipmbG9hdHdvcms7CglzdGF0aWMgaW50IG9ybGd0aDEgPSAwLCBvcmxndGgyID0gMDsKCWZsb2F0IHRtcHBlbmFsOwoJZmxvYXQgKmZnX3Rfb2dfaF9kZ19uMl9wX3B0OwoJZmxvYXQgKm9nX3RfZmdfaF9kZ19uMl9wX3B0OwoJZmxvYXQgKm9nX2hfZGdfbjJfcF9wdDsKCWZsb2F0ICpmZ19oX2RnX24yX3BfcHQ7CglmbG9hdCAqZ2Fwel9uMl9wdDA7CglmbG9hdCAqZ2Fwel9uMl9wdDE7CglmbG9hdCAqZmdjcDJwdDsKCWZsb2F0ICpvZ2NwMnB0OwoJZmxvYXQgZmdfdF9vZ19oX2RnX24xX3BfdmE7CglmbG9hdCBvZ190X2ZnX2hfZGdfbjFfcF92YTsKCWZsb2F0IG9nX2hfZGdfbjFfcF92YTsKCWZsb2F0IGZnX2hfZGdfbjFfcF92YTsKCWZsb2F0IGdhcHpfbjFfdmEwOwoJZmxvYXQgZ2Fwel9uMV92YTE7CglmbG9hdCBmZ2NwMXZhOwoJZmxvYXQgb2djcDF2YTsKCWZsb2F0IGt5b2thaXBlbmFsOwojaWYgMQoJZmxvYXQgZnBlbmFsdHkgPSAoZmxvYXQpcGVuYWx0eTsKI2Vsc2UKCWZsb2F0IGZwZW5hbHR5OwoJaWYoIFJOQXNjb3JlbXR4ICE9ICdyJyApIGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CgllbHNlIGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHkgKiAxMDsKI2VuZGlmCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyAgc2VxMVswXSA9ICVzXG4iLCBzZXExWzBdICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjICBzZXEyWzBdID0gJXNcbiIsIHNlcTJbMF0gKTsKI2VuZGlmCgoKCglpZiggb3JsZ3RoMSA9PSAwICkKCXsKCQltc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJCW1zZXEyID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCAwICk7Cgl9CgoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwojaWYgMAoJaWYoIGxndGgxID09IDAgfHwgbGd0aDIgPT0gMCApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiV0FSTklORyAoQWFsaWdubW0pOiBsZ3RoMT0lZCwgbGd0aDI9JWRcbiIsIGxndGgxLCBsZ3RoMiApOwoJfQojZW5kaWYKCglpZiggbGd0aDEgPiBvcmxndGgxIHx8IGxndGgyID4gb3JsZ3RoMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggb3JsZ3RoMSA+IDAgJiYgb3JsZ3RoMiA+IDAgKQoJCXsKCQkJRnJlZUZsb2F0VmVjKCB3MSApOwoJCQlGcmVlRmxvYXRWZWMoIHcyICk7CgkJCUZyZWVGbG9hdFZlYyggbWF0Y2ggKTsKCQkJRnJlZUZsb2F0VmVjKCBpbml0dmVydGljYWx3ICk7CgkJCUZyZWVGbG9hdFZlYyggbGFzdHZlcnRpY2FsdyApOwoKCQkJRnJlZUZsb2F0VmVjKCBtICk7CgkJCUZyZWVJbnRWZWMoIG1wICk7CgoJCQlGcmVlQ2hhck10eCggbXNlcSApOwoKCQkJRnJlZUZsb2F0VmVjKCBkaWdmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGRpZ2YyICk7CgkJCUZyZWVGbG9hdFZlYyggZGlhZjEgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWFmMiApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcHoxICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwejIgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXBmMSApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcGYyICk7CgkJCUZyZWVGbG9hdFZlYyggb2djcDFnICk7CgkJCUZyZWVGbG9hdFZlYyggb2djcDJnICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDFnICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDJnICk7CgkJCUZyZWVGbG9hdFZlYyggb2dfaF9kZ19uMV9wICk7CgkJCUZyZWVGbG9hdFZlYyggb2dfaF9kZ19uMl9wICk7CgkJCUZyZWVGbG9hdFZlYyggZmdfaF9kZ19uMV9wICk7CgkJCUZyZWVGbG9hdFZlYyggZmdfaF9kZ19uMl9wICk7CgkJCUZyZWVGbG9hdFZlYyggb2dfdF9mZ19oX2RnX24xX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBvZ190X2ZnX2hfZGdfbjJfcCApOwoJCQlGcmVlRmxvYXRWZWMoIGZnX3Rfb2dfaF9kZ19uMV9wICk7CgkJCUZyZWVGbG9hdFZlYyggZmdfdF9vZ19oX2RnX24yX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXB6X24xICk7CgkJCUZyZWVGbG9hdFZlYyggZ2Fwel9uMiApOwoKCQkJRnJlZUZsb2F0TXR4KCBjcG14MSApOwoJCQlGcmVlRmxvYXRNdHgoIGNwbXgyICk7CgoJCQlGcmVlRmxvYXRNdHgoIGZsb2F0d29yayApOwoJCQlGcmVlSW50TXR4KCBpbnR3b3JrICk7CgkJfQoKCQlsbDEgPSBNQVgoIChpbnQpKDEuMypsZ3RoMSksIG9ybGd0aDEgKSArIDEwMDsKCQlsbDIgPSBNQVgoIChpbnQpKDEuMypsZ3RoMiksIG9ybGd0aDIgKSArIDEwMDsKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIlxudHJ5aW5nIHRvIGFsbG9jYXRlICglZCslZCl4biBtYXRyaWNlcyAuLi4gIiwgbGwxLCBsbDIgKTsKI2VuZGlmCgoJCXcxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQl3MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJbWF0Y2ggPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoKCQlpbml0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlsYXN0dmVydGljYWx3ID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCgkJbSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJbXAgPSBBbGxvY2F0ZUludFZlYyggbGwyKzIgKTsKCgkJbXNlcSA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgbGwxK2xsMiApOwoKCQlkaWdmMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZGlnZjIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWRpYWYxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlkaWFmMiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZ2FwejEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWdhcHoyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlnYXBmMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZ2FwZjIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW9nY3AxZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJb2djcDJnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMWcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWZnY3AyZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJb2dfaF9kZ19uMV9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxICsgMiApOwoJCW9nX2hfZGdfbjJfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMiArIDIgKTsKCQlmZ19oX2RnX24xX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDEgKyAyICk7CgkJZmdfaF9kZ19uMl9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyICsgMiApOwoJCW9nX3RfZmdfaF9kZ19uMV9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxICsgMiApOwoJCW9nX3RfZmdfaF9kZ19uMl9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyICsgMiApOwoJCWZnX3Rfb2dfaF9kZ19uMV9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxICsgMiApOwoJCWZnX3Rfb2dfaF9kZ19uMl9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyICsgMiApOwoJCWdhcHpfbjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWdhcHpfbjIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoKCQljcG14MSA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDErMiApOwoJCWNwbXgyID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMisyICk7CgojaWYgRkFTVE1BVENIQ0FMQwoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNyApOyAKI2Vsc2UKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCiNlbmRpZgoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKCQlvcmxndGgxID0gbGwxIC0gMTAwOwoJCW9ybGd0aDIgPSBsbDIgLSAxMDA7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJbXNlcTFbaV0gPSBtc2VxW2ldOwoJCXNlcTFbaV1bbGd0aDFdID0gMDsKCX0KCWZvciggaj0wOyBqPGpjeWM7IGorKyApCgl7CgkJbXNlcTJbal0gPSBtc2VxW2ljeWMral07CgkJc2VxMltqXVtsZ3RoMl0gPSAwOwoJfQoKCglpZiggb3JsZ3RoMSA+IGNvbW1vbkFsbG9jMSB8fCBvcmxndGgyID4gY29tbW9uQWxsb2MyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBjb21tb25BbGxvYzEgJiYgY29tbW9uQWxsb2MyICkKCQl7CgkJCUZyZWVJbnRNdHgoIGNvbW1vbklQICk7CgkJfQoKCQlsbDEgPSBNQVgoIG9ybGd0aDEsIGNvbW1vbkFsbG9jMSApOwoJCWxsMiA9IE1BWCggb3JsZ3RoMiwgY29tbW9uQWxsb2MyICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcblxudHJ5aW5nIHRvIGFsbG9jYXRlICVkeCVkIG1hdHJpY2VzIC4uLiAiLCBsbDErMSwgbGwyKzEgKTsKI2VuZGlmCgoJCWNvbW1vbklQID0gQWxsb2NhdGVJbnRNdHgoIGxsMSsxMCwgbGwyKzEwICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCgkJY29tbW9uQWxsb2MxID0gbGwxOwoJCWNvbW1vbkFsbG9jMiA9IGxsMjsKCX0KCWlqcCA9IGNvbW1vbklQOwoKI2lmIDAKCXsKCQlmbG9hdCB0ID0gMC4wOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCXQgKz0gZWZmMVtpXTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIHRvdGFsZWZmID0gJWZcbiIsIHQgKTsKCX0KI2VuZGlmCgoJY3BteF9jYWxjX25ldyggc2VxMSwgY3BteDEsIGVmZjEsIGxndGgxLCBpY3ljICk7CgljcG14X2NhbGNfbmV3KCBzZXEyLCBjcG14MiwgZWZmMiwgbGd0aDIsIGpjeWMgKTsKCglpZiggc2dhcDEgKQoJewoJCW5ld19PcGVuaW5nR2FwQ291bnRfenVyZSggb2djcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJbmV3X09wZW5pbmdHYXBDb3VudF96dXJlKCBvZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQluZXdfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMWcsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQluZXdfRmluYWxHYXBDb3VudF96dXJlKCBmZ2NwMmcsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQlnZXRkaWdhcGZyZXFfcGFydCggZGlnZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQlnZXRkaWdhcGZyZXFfcGFydCggZGlnZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMiwgZWdhcDIgKTsKCQlnZXRkaWFtaW5vZnJlcV9wYXJ0KCBkaWFmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOwoJCWdldGRpYW1pbm9mcmVxX3BhcnQoIGRpYWYyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcV96dXJlX3BhcnQoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEgKTsKCQlnZXRnYXBmcmVxX3p1cmVfcGFydCggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBzZ2FwMSApOwoJfQoJZWxzZQoJewoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCXN0X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCXN0X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCWdldGRpZ2FwZnJlcV9zdCggZGlnZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0ZGlnYXBmcmVxX3N0KCBkaWdmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRkaWFtaW5vZnJlcV94KCBkaWFmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRnYXBmcmVxKCBnYXBmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGdhcGZyZXFfenVyZSggZ2FwejIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7Cgl9CgojaWYgMQoJbGFzdGogPSBsZ3RoMisyOwoJZm9yKCBpPTA7IGk8bGFzdGo7IGkrKyApCgl7CgkJb2dfaF9kZ19uMl9wW2ldID0gKCAxLjAtb2djcDJnW2ldLWRpZ2YyW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQlmZ19oX2RnX24yX3BbaV0gPSAoIDEuMC1mZ2NwMmdbaV0tZGlnZjJbaV0gKSAqIGZwZW5hbHR5ICogMC41OwoJCW9nX3RfZmdfaF9kZ19uMl9wW2ldID0gKDEuMC1vZ2NwMmdbaV0rZmdjcDJnW2ldLWRpZ2YyW2ldKSAqIDAuNSAqIGZwZW5hbHR5OwoJCWZnX3Rfb2dfaF9kZ19uMl9wW2ldID0gKDEuMC1mZ2NwMmdbaV0rb2djcDJnW2ldLWRpZ2YyW2ldKSAqIDAuNSAqIGZwZW5hbHR5OwoJCWdhcHpfbjJbaV0gPSAoMS4wLWdhcHoyW2ldKTsKCX0KCWxhc3RqID0gbGd0aDErMjsKCWZvciggaT0wOyBpPGxhc3RqOyBpKysgKQoJewoJCW9nX2hfZGdfbjFfcFtpXSA9ICggMS4wLW9nY3AxZ1tpXS1kaWdmMVtpXSApICogZnBlbmFsdHkgKiAwLjU7CgkJZmdfaF9kZ19uMV9wW2ldID0gKCAxLjAtZmdjcDFnW2ldLWRpZ2YxW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQlvZ190X2ZnX2hfZGdfbjFfcFtpXSA9ICgxLjAtb2djcDFnW2ldK2ZnY3AxZ1tpXS1kaWdmMVtpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlmZ190X29nX2hfZGdfbjFfcFtpXSA9ICgxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXS1kaWdmMVtpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlnYXB6X24xW2ldID0gKDEuMC1nYXB6MVtpXSk7Cgl9CiNlbmRpZgoKCgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJCWZwcmludGYoIHN0ZGVyciwgIm9nY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKI2VuZGlmCgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCWlmKCBSTkFzY29yZW10eCAhPSAncicgKQoJCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyLCBjcG14MSwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJZWxzZQoJCWNsZWFydmVjKCBpbml0dmVydGljYWx3LCBsZ3RoMSApOwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZVEoIGluaXR2ZXJ0aWNhbHcsIDAsIGxndGgxICk7IC8vIDA2MDMwNgoKCWlmKCBSTkFzY29yZW10eCAhPSAncicgKQoJCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MSwgY3BteDIsIDAsIGxndGgyLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCWVsc2UKCQljbGVhcnZlYyggY3VycmVudHcsIGxndGgyICk7CglpZiggbG9jYWxob20gKQoJCWltcF9tYXRjaF9vdXRfdmVhZFEoIGN1cnJlbnR3LCAwLCBsZ3RoMiApOyAvLyAwNjAzMDYKCgojaWYgMCAvLyAtPiB0YmZhc3QuYwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfY2FsYyggY3VycmVudHcsIGljeWMsIGpjeWMsIGxndGgxLCBsZ3RoMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgbG9jYWxob20sIDEsIDAgKTsKCiNlbmRpZgoKCgoJa3lva2FpcGVuYWwgPSAwLjA7CglpZiggb3V0Z2FwID09IDEgKQoJewoJCWcgPSAwLjA7CgoJCWcgKz0gb2djcDFnWzBdICogb2dfaF9kZ19uMl9wWzBdOwovLwkJZyArPSBvZ2NwMWdbMF0gKiAoIDEuMC1vZ2NwMmdbMF0tZGlnZjJbMF0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJaWYoIGcgKSBmcHJpbnRmKCBzdGRlcnIsICJpbml0LW1hdGNoIHBlbmFsMT0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1bMF0sIHNlcTJbMF1bMF0gKTsKCgkJZyArPSBvZ2NwMmdbMF0gKiBvZ19oX2RnX24xX3BbMF07Ci8vCQlnICs9IG9nY3AyZ1swXSAqICggMS4wLW9nY3AxZ1swXS1kaWdmMVswXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgImluaXQtbWF0Y2ggcGVuYWwyPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVswXSwgc2VxMlswXVswXSApOwoKCQlnICs9IGZnY3AxZ1swXSAqIGZnX2hfZGdfbjJfcFswXTsKLy8JCWcgKz0gZmdjcDFnWzBdICogKCAxLjAtZmdjcDJnWzBdLWRpZ2YyWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwxPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoKCQlnICs9IGZnY3AyZ1swXSAqIGZnX2hfZGdfbjFfcFswXTsKLy8JCWcgKz0gZmdjcDJnWzBdICogKCAxLjAtZmdjcDFnWzBdLWRpZ2YxWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwyPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoKCQlreW9rYWlwZW5hbCA9IGc7CgkJaW5pdHZlcnRpY2Fsd1swXSArPSBnOwoJCWN1cnJlbnR3WzBdICs9IGc7CgoJCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgkJewoJCQl0bXBwZW5hbCA9IGdhcHpfbjJbMF0qb2dfdF9mZ19oX2RnX24xX3BbMF07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMF0pKigxLjAtb2djcDFnWzBdK2ZnY3AxZ1swXS1kaWdmMVswXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gdG1wcGVuYWw7CgoJCQl0bXBwZW5hbCA9IGdhcHpfbjJbMV0qZmdfdF9vZ19oX2RnX24xX3BbaV07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMV0pKigxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXS1kaWdmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gdG1wcGVuYWw7CgoJCX0KCQlmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJCXsKCQkJdG1wcGVuYWwgPSBnYXB6X24xWzBdKm9nX3RfZmdfaF9kZ19uMl9wWzBdOwovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxWzBdKSooMS4wLW9nY3AyZ1swXStmZ2NwMmdbMF0tZGlnZjJbMF0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQljdXJyZW50d1tqXSArPSB0bXBwZW5hbDsKCgkJCXRtcHBlbmFsID0gZ2Fwel9uMVsxXSpmZ190X29nX2hfZGdfbjJfcFtqXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJY3VycmVudHdbal0gKz0gdG1wcGVuYWw7CgkJfQoJfQojaWYgT1VUR0FQMFRSWQoJZWxzZQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqIGogLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJaW5pdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiBpIC8gMi4wOwoJfQojZW5kaWYKCgltWzBdID0gMC4wOyAvLyBpcmFuYWkKCWZvciggaj0xOyBqPGxndGgyKzE7ICsraiApIAoJewoJCW1wW2pdID0gMDsKCQltW2pdID0gY3VycmVudHdbai0xXSArIDEwMDAwICogZnBlbmFsdHk7IC8vaWlub2thPwoJfQoJaWYoIGxndGgyID09IDAgKQoJCWxhc3R2ZXJ0aWNhbHdbMF0gPSAwLjA7IC8vIEZhbGlnbiBrYXJhIHlvYmFyZXRhdG9raSBrb3VuYXJ1a2Fub3VzZWkgYXJpCgllbHNlCgkJbGFzdHZlcnRpY2Fsd1swXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKCWlmKCBvdXRnYXAgKSBsYXN0aSA9IGxndGgxKzE7IGVsc2UgbGFzdGkgPSBsZ3RoMTsKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImluaXR2ZXJ0aWNhbHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDIrMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgaW5pdHZlcnRpY2Fsd1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJmY2dwXG4iICk7CmZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbJWRdPSVmXG4iLCBpLCBvZ2NwMltpXSApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJaWYoIFJOQXNjb3JlbXR4ICE9ICdyJyApCgkJCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MSwgY3BteDIsIGksIGxndGgyLCBmbG9hdHdvcmssIGludHdvcmssIDAgKTsKCQllbHNlCgkJCWNsZWFydmVjKCBjdXJyZW50dywgbGd0aDIgKTsKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImk9JWRcbiIsIGkgKTsKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2pdICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoJCWlmKCBsb2NhbGhvbSApCgkJewovLwkJCWZwcmludGYoIHN0ZGVyciwgIkNhbGxpbmcgaW1wX21hdGNoX2NhbGMgKG8pIGxndGggPSAlZCwgaSA9ICVkXG4iLCBsZ3RoMSwgaSApOwojaWYgIDAKCQkJaW1wX21hdGNoX291dF92ZWFkUSggY3VycmVudHcsIGksIGxndGgyICk7CiNlbHNlCgkJCWltcF9tYXRjaF9vdXRfdmVhZFEoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZW5kaWYKCQl9CiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCQljdXJyZW50d1swXSA9IGluaXR2ZXJ0aWNhbHdbaV07CgoJCW1waSA9IDA7CgkJbWkgPSBwcmV2aW91c3dbMF0gKyAxMDAwMCAqIGZwZW5hbHR5OwoKCQlpanBwdCA9IGlqcFtpXSArIDE7CgkJbWpwdCA9IG0gKyAxOwoJCXByZXB0ID0gcHJldmlvdXN3OwoJCWN1cnB0ID0gY3VycmVudHcgKyAxOwoJCW1wanB0ID0gbXAgKyAxOwoJCWZnX3Rfb2dfaF9kZ19uMl9wX3B0ID0gZmdfdF9vZ19oX2RnX24yX3AgKyAxOwoJCW9nX3RfZmdfaF9kZ19uMl9wX3B0ID0gb2dfdF9mZ19oX2RnX24yX3AgKyAxOwoJCW9nX2hfZGdfbjJfcF9wdCA9IG9nX2hfZGdfbjJfcCArIDE7CgkJZmdfaF9kZ19uMl9wX3B0ID0gZmdfaF9kZ19uMl9wICsgMTsKCQlnYXB6X24yX3B0MCA9IGdhcHpfbjIgKyAxOwoJCWdhcHpfbjJfcHQxID0gZ2Fwel9uMiArIDI7CgkJZmdjcDJwdCA9IGZnY3AyZyArIDE7CgkJb2djcDJwdCA9IG9nY3AyZyArIDE7CgoJCWZnX3Rfb2dfaF9kZ19uMV9wX3ZhID0gZmdfdF9vZ19oX2RnX24xX3BbaV07CgkJb2dfdF9mZ19oX2RnX24xX3BfdmEgPSBvZ190X2ZnX2hfZGdfbjFfcFtpXTsKCQlvZ19oX2RnX24xX3BfdmEgPSBvZ19oX2RnX24xX3BbaV07CgkJZmdfaF9kZ19uMV9wX3ZhID0gZmdfaF9kZ19uMV9wW2ldOwoJCWdhcHpfbjFfdmEwID0gZ2Fwel9uMVtpXTsKCQlnYXB6X24xX3ZhMSA9IGdhcHpfbjFbaSsxXTsKCQlmZ2NwMXZhID0gZmdjcDFnW2ldOwoJCW9nY3AxdmEgPSBvZ2NwMWdbaV07CgoJCWxhc3RqID0gbGd0aDIrMTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgkJCXdtID0gKnByZXB0OwoKCQkJZyA9IG9nY3AxdmEgKiAqb2dfaF9kZ19uMl9wX3B0OwovLwkJCWcgPSBvZ2NwMWdbaV0gKiBvZ19oX2RnX24yX3Bbal07Ci8vCQkJZyA9IG9nY3AxZ1tpXSAqICggMS4wLW9nY3AyZ1tqXS1kaWdmMltqXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQkJaWYoIGcgJiYgaT09aiApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsMT0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJd20gKz0gZzsKCgkJCWcgPSAqb2djcDJwdCAqIG9nX2hfZGdfbjFfcF92YTsKLy8JCQlnID0gb2djcDJnW2pdICogb2dfaF9kZ19uMV9wW2ldOwovLwkJCWcgPSBvZ2NwMmdbal0gKiAoIDEuMC1vZ2NwMWdbaV0tZGlnZjFbaV0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJCWlmKCBnICYmIGk9PWogKSBmcHJpbnRmKCBzdGRlcnIsICJtYXRjaCBwZW5hbDI9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCXdtICs9IGc7CgoJCQlnID0gZmdjcDF2YSAqICpmZ19oX2RnX24yX3BfcHQ7Ci8vCQkJZyA9IGZnY3AxZ1tpXSAqIGZnX2hfZGdfbjJfcFtqXTsKLy8JCQlnID0gZmdjcDFnW2ldICogKCAxLjAtZmdjcDJnW2pdLWRpZ2YyW2pdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCQlpZiggZyAmJiBpPT1qICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwzPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSArPSBnOwoKCQkJZyA9ICpmZ2NwMnB0ICogZmdfaF9kZ19uMV9wX3ZhOwovLwkJCWcgPSBmZ2NwMmdbal0gKiBmZ19oX2RnX24xX3BbaV07Ci8vCQkJZyA9IGZnY3AyZ1tqXSAqICggMS4wLWZnY3AxZ1tpXS1kaWdmMVtpXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQkJaWYoIGcgJiYgaT09aiApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsND0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJd20gKz0gZzsKCgkJCSppanBwdCA9IDA7CgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZi0+Iiwgd20gKTsKI2VuZGlmCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCXRtcHBlbmFsID0gZ2Fwel9uMV92YTEgKiAqZmdfdF9vZ19oX2RnX24yX3BfcHQ7Ci8vCQkJdG1wcGVuYWwgPSBnYXB6X24xW2krMV0gKiBmZ190X29nX2hfZGdfbjJfcFtqXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVtpKzFdKSooMS4wLWZnY3AyZ1tqXStvZ2NwMmdbal0tZGlnZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQlpZiggKGc9bWkrdG1wcGVuYWwpID4gd20gKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXAgaSBzdGFydD0lZiAoaj0lZCwgZmdjcDJnW2pdPSVmLCBkaWdmMltqXT0lZiwgZGlhZjJbal09JWYpLCAlYy0lY1xuIiwgZy1taSwgaiwgZmdjcDJnW2pdLCBkaWdmMltqXSwgZGlhZjJbal0sIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9IC0oIGogLSBtcGkgKTsKCQkJfQoJCQl0bXBwZW5hbCA9IGdhcHpfbjFfdmEwICogKm9nX3RfZmdfaF9kZ19uMl9wX3B0OwovLwkJCXRtcHBlbmFsID0gZ2Fwel9uMVtpXSAqIG9nX3RfZmdfaF9kZ19uMl9wW2pdOwovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxW2ldKSooMS4wLW9nY3AyZ1tqXStmZ2NwMmdbal0tZGlnZjJbal0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQlpZiggKGc9KnByZXB0K3RtcHBlbmFsKSA+PSBtaSApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAianVtcCBpIGVuZD0lZiwgJWMtJWNcbiIsIGctKnByZXB0LCBzZXExWzBdW2ktMV0sIHNlcTJbMF1bai0xXSApOwoJCQkJbWkgPSBnOwoJCQkJbXBpID0gai0xOwoJCQl9CgojaWYgVVNFX1BFTkFMVFlfRVgKICAgICAgICAgICAgbWkgKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKI2lmIDAgCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmPyIsIGcgKTsKI2VuZGlmCgkJCXRtcHBlbmFsID0gKmdhcHpfbjJfcHQxICogZmdfdF9vZ19oX2RnX24xX3BfdmE7Ci8vCQkJdG1wcGVuYWwgPSBnYXB6X24yW2orMV0gKiBmZ190X29nX2hfZGdfbjFfcFtpXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MltqKzFdKSooMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0tZGlnZjFbaV0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQlpZiggKGc9Km1qcHQrdG1wcGVuYWwpID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSArKCBpIC0gKm1wanB0ICk7CgkJCX0KCQkJdG1wcGVuYWwgPSAqZ2Fwel9uMl9wdDAgKiBvZ190X2ZnX2hfZGdfbjFfcF92YTsKLy8JCQl0bXBwZW5hbCA9IGdhcHpfbjJbal0gKiBvZ190X2ZnX2hfZGdfbjFfcFtpXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MltqXSkqKDEuMC1vZ2NwMWdbaV0rZmdjcDFnW2ldLWRpZ2YxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJaWYoIChnPSpwcmVwdCt0bXBwZW5hbCkgPj0gKm1qcHQgKQoJCQl7CgkJCQkqbWpwdCA9IGc7CgkJCQkqbXBqcHQgPSBpLTE7CgkJCX0KI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYgIiwgd20gKTsKI2VuZGlmCgojaWYgVVNFX1BFTkFMVFlfRVgKICAgICAgICAgICAgbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgoKCgoKCQkJKmN1cnB0KysgKz0gd207CgkJCWlqcHB0Kys7CgkJCW1qcHQrKzsKCQkJcHJlcHQrKzsKCQkJbXBqcHQrKzsKCQkJZmdfdF9vZ19oX2RnX24yX3BfcHQrKzsKCQkJb2dfdF9mZ19oX2RnX24yX3BfcHQrKzsKCQkJb2dfaF9kZ19uMl9wX3B0Kys7CgkJCWZnX2hfZGdfbjJfcF9wdCsrOwoJCQlnYXB6X24yX3B0MCsrOwoJCQlnYXB6X24yX3B0MSsrOwoJCQlmZ2NwMnB0Kys7CgkJCW9nY3AycHQrKzsKCQl9CgkJbGFzdHZlcnRpY2Fsd1tpXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoJfQoKLy8JZnByaW50Ziggc3RkZXJyLCAid20gPSAlZlxuIiwgd20gKTsKCiNpZiBPVVRHQVAwVFJZCglpZiggIW91dGdhcCApCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogKCBsZ3RoMiAtIGogKSAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlsYXN0dmVydGljYWx3W2ldIC09IG9mZnNldCAqICggbGd0aDEgLSBpICAvIDIuMCk7Cgl9CiNlbmRpZgoJCQoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCIlc1xuIiwgc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTJbal0gKTsKCWZwcmludGYoIHN0ZGVyciwgIj09PT0+IiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMVtpXSwgc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBtc2VxMltqXSwgc2VxMltqXSApOwoJKi8KCWlmKCBsb2NhbGhvbSApCgl7CgkJQXRyYWNraW5nX2xvY2FsaG9tKCBpbXBtYXRjaCwgY3VycmVudHcsIGxhc3R2ZXJ0aWNhbHcsIHNlcTEsIHNlcTIsIG1zZXExLCBtc2VxMiwgY3BteDEsIGNwbXgyLCBpanAsIGljeWMsIGpjeWMgKTsKCX0KCWVsc2UKCQlBdHJhY2tpbmcoIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljICk7CgovLwlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaW1wbWF0Y2ggPSAlZlxuIiwgKmltcG1hdGNoICk7CgoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KCgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBzZXExW2ldLCBtc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBzZXEyW2pdLCBtc2VxMltqXSApOwoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXExW2ldICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjI1xuIiApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXEyW2pdICk7CgkqLwoKLy8JZnByaW50Ziggc3RkZXJyLCAid20gPSAlZlxuIiwgd20gKTsKCgoJcmV0dXJuKCB3bSApOwp9CgpmbG9hdCBRX19hbGlnbl9nYXBtYXAoIGNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgZG91YmxlICplZmYxLCBkb3VibGUgKmVmZjIsIGludCBpY3ljLCBpbnQgamN5YywgaW50IGFsbG9jbGVuLCBMb2NhbEhvbSAqKipsb2NhbGhvbSwgZmxvYXQgKmltcG1hdGNoLCBjaGFyICpzZ2FwMSwgY2hhciAqc2dhcDIsIGNoYXIgKmVnYXAxLCBjaGFyICplZ2FwMiwgaW50ICpnYXBtYXAxLCBpbnQgKmdhcG1hcDIgKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJcmVnaXN0ZXIgaW50IGksIGo7CglpbnQgbGFzdGksIGxhc3RqOyAgICAgIC8qIG91dGdhcCA9PSAwIC0+IGxndGgxLCBvdXRnYXAgPT0gMSAtPiBsZ3RoMSsxICovCglpbnQgbGd0aDEsIGxndGgyOwoJaW50IHJlc3VsdGxlbjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7Ci8vCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CiNpZiBVU0VfUEVOQUxUWV9FWAoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpcGVuYWx0eV9leDsKCWZwcmludGYoIHN0ZGVyciwgImZwZW5hbHR5X2V4ID0gJWZcbiIsIGZwZW5hbHR5X2V4ICk7CiNlbmRpZgojaWYgMQoJZmxvYXQgKnd0bXA7CglpbnQgKmlqcHB0OwoJZmxvYXQgKm1qcHQsICpwcmVwdCwgKmN1cnB0OwoJaW50ICptcGpwdDsKI2VuZGlmCglzdGF0aWMgZmxvYXQgbWksICptOwoJc3RhdGljIGludCAqKmlqcDsKCXN0YXRpYyBpbnQgbXBpLCAqbXA7CglzdGF0aWMgZmxvYXQgKncxLCAqdzI7CglzdGF0aWMgZmxvYXQgKm1hdGNoOwoJc3RhdGljIGZsb2F0ICppbml0dmVydGljYWx3OyAgICAvKiBrdWZ1dSBzdXJlYmEgaXJhbmFpICovCglzdGF0aWMgZmxvYXQgKmxhc3R2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBjaGFyICoqbXNlcTE7CglzdGF0aWMgY2hhciAqKm1zZXEyOwoJc3RhdGljIGNoYXIgKiptc2VxOwoJc3RhdGljIGZsb2F0ICpkaWdmMTsKCXN0YXRpYyBmbG9hdCAqZGlnZjI7CglzdGF0aWMgZmxvYXQgKmRpYWYxOwoJc3RhdGljIGZsb2F0ICpkaWFmMjsKCXN0YXRpYyBmbG9hdCAqZ2FwejE7CglzdGF0aWMgZmxvYXQgKmdhcHoyOwoJc3RhdGljIGZsb2F0ICpnYXBmMTsKCXN0YXRpYyBmbG9hdCAqZ2FwZjI7CglzdGF0aWMgZmxvYXQgKm9nY3AxZzsKCXN0YXRpYyBmbG9hdCAqb2djcDJnOwoJc3RhdGljIGZsb2F0ICpmZ2NwMWc7CglzdGF0aWMgZmxvYXQgKmZnY3AyZzsKCXN0YXRpYyBmbG9hdCAqb2dfaF9kZ19uMV9wOwoJc3RhdGljIGZsb2F0ICpvZ19oX2RnX24yX3A7CglzdGF0aWMgZmxvYXQgKmZnX2hfZGdfbjFfcDsKCXN0YXRpYyBmbG9hdCAqZmdfaF9kZ19uMl9wOwoJc3RhdGljIGZsb2F0ICpvZ190X2ZnX2hfZGdfbjFfcDsKCXN0YXRpYyBmbG9hdCAqb2dfdF9mZ19oX2RnX24yX3A7CglzdGF0aWMgZmxvYXQgKmZnX3Rfb2dfaF9kZ19uMV9wOwoJc3RhdGljIGZsb2F0ICpmZ190X29nX2hfZGdfbjJfcDsKCXN0YXRpYyBmbG9hdCAqZ2Fwel9uMTsKCXN0YXRpYyBmbG9hdCAqZ2Fwel9uMjsKCXN0YXRpYyBmbG9hdCAqKmNwbXgxOwoJc3RhdGljIGZsb2F0ICoqY3BteDI7CglzdGF0aWMgaW50ICoqaW50d29yazsKCXN0YXRpYyBmbG9hdCAqKmZsb2F0d29yazsKCXN0YXRpYyBpbnQgb3JsZ3RoMSA9IDAsIG9ybGd0aDIgPSAwOwoJZmxvYXQgdG1wcGVuYWw7CglmbG9hdCAqZmdfdF9vZ19oX2RnX24yX3BfcHQ7CglmbG9hdCAqb2dfdF9mZ19oX2RnX24yX3BfcHQ7CglmbG9hdCAqb2dfaF9kZ19uMl9wX3B0OwoJZmxvYXQgKmZnX2hfZGdfbjJfcF9wdDsKCWZsb2F0ICpnYXB6X24yX3B0MDsKCWZsb2F0ICpnYXB6X24yX3B0MTsKCWZsb2F0ICpmZ2NwMnB0OwoJZmxvYXQgKm9nY3AycHQ7CglmbG9hdCBmZ190X29nX2hfZGdfbjFfcF92YTsKCWZsb2F0IG9nX3RfZmdfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgb2dfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgZmdfaF9kZ19uMV9wX3ZhOwoJZmxvYXQgZ2Fwel9uMV92YTA7CglmbG9hdCBnYXB6X24xX3ZhMTsKCWZsb2F0IGZnY3AxdmE7CglmbG9hdCBvZ2NwMXZhOwoJZmxvYXQga3lva2FpcGVuYWw7CglmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMgIHNlcTFbMF0gPSAlc1xuIiwgc2VxMVswXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyAgc2VxMlswXSA9ICVzXG4iLCBzZXEyWzBdICk7CiNlbmRpZgoKCgoJaWYoIG9ybGd0aDEgPT0gMCApCgl7CgkJbXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCQltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJfQoKCglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKI2lmIDAKCWlmKCBsZ3RoMSA9PSAwIHx8IGxndGgyID09IDAgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIldBUk5JTkcgKEFhbGlnbm1tKTogbGd0aDE9JWQsIGxndGgyPSVkXG4iLCBsZ3RoMSwgbGd0aDIgKTsKCX0KI2VuZGlmCgoJaWYoIGxndGgxID4gb3JsZ3RoMSB8fCBsZ3RoMiA+IG9ybGd0aDIgKQoJewoJCWludCBsbDEsIGxsMjsKCgkJaWYoIG9ybGd0aDEgPiAwICYmIG9ybGd0aDIgPiAwICkKCQl7CgkJCUZyZWVGbG9hdFZlYyggdzEgKTsKCQkJRnJlZUZsb2F0VmVjKCB3MiApOwoJCQlGcmVlRmxvYXRWZWMoIG1hdGNoICk7CgkJCUZyZWVGbG9hdFZlYyggaW5pdHZlcnRpY2FsdyApOwoJCQlGcmVlRmxvYXRWZWMoIGxhc3R2ZXJ0aWNhbHcgKTsKCgkJCUZyZWVGbG9hdFZlYyggbSApOwoJCQlGcmVlSW50VmVjKCBtcCApOwoKCQkJRnJlZUNoYXJNdHgoIG1zZXEgKTsKCgkJCUZyZWVGbG9hdFZlYyggZGlnZjEgKTsKCQkJRnJlZUZsb2F0VmVjKCBkaWdmMiApOwoJCQlGcmVlRmxvYXRWZWMoIGRpYWYxICk7CgkJCUZyZWVGbG9hdFZlYyggZGlhZjIgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXB6MSApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcHoyICk7CgkJCUZyZWVGbG9hdFZlYyggZ2FwZjEgKTsKCQkJRnJlZUZsb2F0VmVjKCBnYXBmMiApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AxZyApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyZyApOwoJCQlGcmVlRmxvYXRWZWMoIGZnY3AxZyApOwoJCQlGcmVlRmxvYXRWZWMoIGZnY3AyZyApOwoJCQlGcmVlRmxvYXRWZWMoIG9nX2hfZGdfbjFfcCApOwoJCQlGcmVlRmxvYXRWZWMoIG9nX2hfZGdfbjJfcCApOwoJCQlGcmVlRmxvYXRWZWMoIGZnX2hfZGdfbjFfcCApOwoJCQlGcmVlRmxvYXRWZWMoIGZnX2hfZGdfbjJfcCApOwoJCQlGcmVlRmxvYXRWZWMoIG9nX3RfZmdfaF9kZ19uMV9wICk7CgkJCUZyZWVGbG9hdFZlYyggb2dfdF9mZ19oX2RnX24yX3AgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ190X29nX2hfZGdfbjFfcCApOwoJCQlGcmVlRmxvYXRWZWMoIGZnX3Rfb2dfaF9kZ19uMl9wICk7CgkJCUZyZWVGbG9hdFZlYyggZ2Fwel9uMSApOwoJCQlGcmVlRmxvYXRWZWMoIGdhcHpfbjIgKTsKCgkJCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCQkJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoKCQkJRnJlZUZsb2F0TXR4KCBmbG9hdHdvcmsgKTsKCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgkJZGlnZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWRpZ2YyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlkaWFmMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZGlhZjIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCWdhcHoxID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlnYXB6MiA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZ2FwZjEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCWdhcGYyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlvZ2NwMWcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCW9nY3AyZyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJZmdjcDFnID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlmZ2NwMmcgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW9nX2hfZGdfbjFfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSArIDIgKTsKCQlvZ19oX2RnX24yX3AgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIgKyAyICk7CgkJZmdfaF9kZ19uMV9wID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxICsgMiApOwoJCWZnX2hfZGdfbjJfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMiArIDIgKTsKCQlvZ190X2ZnX2hfZGdfbjFfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSArIDIgKTsKCQlvZ190X2ZnX2hfZGdfbjJfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMiArIDIgKTsKCQlmZ190X29nX2hfZGdfbjFfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSArIDIgKTsKCQlmZ190X29nX2hfZGdfbjJfcCA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMiArIDIgKTsKCQlnYXB6X24xID0gQWxsb2NhdGVGbG9hdFZlYyggbGwxKzIgKTsKCQlnYXB6X24yID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJY3BteDEgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgbGwxKzIgKTsKCQljcG14MiA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDIrMiApOwoKI2lmIEZBU1RNQVRDSENBTEMKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjYgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCBNQVgoIGxsMSwgbGwyICkrMiwgMjcgKTsgCiNlbHNlCgkJZmxvYXR3b3JrID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIE1BWCggbGwxLCBsbDIgKSsyICk7IAoJCWludHdvcmsgPSBBbGxvY2F0ZUludE10eCggMjYsIE1BWCggbGwxLCBsbDIgKSsyICk7IAojZW5kaWYKCiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgInN1Y2NlZWRlZFxuIiApOwojZW5kaWYKCgkJb3JsZ3RoMSA9IGxsMSAtIDEwMDsKCQlvcmxndGgyID0gbGwyIC0gMTAwOwoJfQoKCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJewoJCW1zZXExW2ldID0gbXNlcVtpXTsKCQlzZXExW2ldW2xndGgxXSA9IDA7Cgl9Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKQoJewoJCW1zZXEyW2pdID0gbXNlcVtpY3ljK2pdOwoJCXNlcTJbal1bbGd0aDJdID0gMDsKCX0KCgoJaWYoIG9ybGd0aDEgPiBjb21tb25BbGxvYzEgfHwgb3JsZ3RoMiA+IGNvbW1vbkFsbG9jMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggY29tbW9uQWxsb2MxICYmIGNvbW1vbkFsbG9jMiApCgkJewoJCQlGcmVlSW50TXR4KCBjb21tb25JUCApOwoJCX0KCgkJbGwxID0gTUFYKCBvcmxndGgxLCBjb21tb25BbGxvYzEgKTsKCQlsbDIgPSBNQVgoIG9ybGd0aDIsIGNvbW1vbkFsbG9jMiApOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiXG5cbnRyeWluZyB0byBhbGxvY2F0ZSAlZHglZCBtYXRyaWNlcyAuLi4gIiwgbGwxKzEsIGxsMisxICk7CiNlbmRpZgoKCQljb21tb25JUCA9IEFsbG9jYXRlSW50TXR4KCBsbDErMTAsIGxsMisxMCApOwoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG5cbiIgKTsKI2VuZGlmCgoJCWNvbW1vbkFsbG9jMSA9IGxsMTsKCQljb21tb25BbGxvYzIgPSBsbDI7Cgl9CglpanAgPSBjb21tb25JUDsKCiNpZiAwCgl7CgkJZmxvYXQgdCA9IDAuMDsKCQlmb3IoIGk9MDsgaTxpY3ljOyBpKysgKQoJCQl0ICs9IGVmZjFbaV07CglmcHJpbnRmKCBzdGRlcnIsICIjIyB0b3RhbGVmZiA9ICVmXG4iLCB0ICk7Cgl9CiNlbmRpZgoKCWNwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBsZ3RoMSwgaWN5YyApOwoJY3BteF9jYWxjX25ldyggc2VxMiwgY3BteDIsIGVmZjIsIGxndGgyLCBqY3ljICk7CgoJaWYoIHNnYXAxICkKCXsKCQluZXdfT3BlbmluZ0dhcENvdW50X3p1cmUoIG9nY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxLCBlZ2FwMSApOwoJCW5ld19PcGVuaW5nR2FwQ291bnRfenVyZSggb2djcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJbmV3X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDFnLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJbmV3X0ZpbmFsR2FwQ291bnRfenVyZSggZmdjcDJnLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0ZGlnYXBmcmVxX3BhcnQoIGRpZ2YxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEsIGVnYXAxICk7CgkJZ2V0ZGlnYXBmcmVxX3BhcnQoIGRpZ2YyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDIsIGVnYXAyICk7CgkJZ2V0ZGlhbWlub2ZyZXFfcGFydCggZGlhZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxLCBzZ2FwMSwgZWdhcDEgKTsKCQlnZXRkaWFtaW5vZnJlcV9wYXJ0KCBkaWFmMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAyLCBlZ2FwMiApOwoJCWdldGdhcGZyZXEoIGdhcGYxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGdhcGZyZXEoIGdhcGYyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJCWdldGdhcGZyZXFfenVyZV9wYXJ0KCBnYXB6MSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEsIHNnYXAxICk7CgkJZ2V0Z2FwZnJlcV96dXJlX3BhcnQoIGdhcHoyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiwgc2dhcDEgKTsKCX0KCWVsc2UKCXsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlzdF9GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AxZywgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9GaW5hbEdhcENvdW50X3p1cmUoIGZnY3AyZywgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlnZXRkaWdhcGZyZXFfc3QoIGRpZ2YxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSApOwoJCWdldGRpZ2FwZnJlcV9zdCggZGlnZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0ZGlhbWlub2ZyZXFfeCggZGlhZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0ZGlhbWlub2ZyZXFfeCggZGlhZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJZ2V0Z2FwZnJlcSggZ2FwZjIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyICk7CgkJZ2V0Z2FwZnJlcV96dXJlKCBnYXB6MSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlnZXRnYXBmcmVxX3p1cmUoIGdhcHoyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJfQoKI2lmIDEKCWxhc3RqID0gbGd0aDIrMjsKCWZvciggaT0wOyBpPGxhc3RqOyBpKysgKQoJewoJCW9nX2hfZGdfbjJfcFtpXSA9ICggMS4wLW9nY3AyZ1tpXS1kaWdmMltpXSApICogZnBlbmFsdHkgKiAwLjU7CgkJZmdfaF9kZ19uMl9wW2ldID0gKCAxLjAtZmdjcDJnW2ldLWRpZ2YyW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKCQlvZ190X2ZnX2hfZGdfbjJfcFtpXSA9ICgxLjAtb2djcDJnW2ldK2ZnY3AyZ1tpXS1kaWdmMltpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlmZ190X29nX2hfZGdfbjJfcFtpXSA9ICgxLjAtZmdjcDJnW2ldK29nY3AyZ1tpXS1kaWdmMltpXSkgKiAwLjUgKiBmcGVuYWx0eTsKCQlnYXB6X24yW2ldID0gKDEuMC1nYXB6MltpXSk7Cgl9CglsYXN0aiA9IGxndGgxKzI7Cglmb3IoIGk9MDsgaTxsYXN0ajsgaSsrICkKCXsKCQlvZ19oX2RnX24xX3BbaV0gPSAoIDEuMC1vZ2NwMWdbaV0tZGlnZjFbaV0gKSAqIGZwZW5hbHR5ICogMC41OwoJCWZnX2hfZGdfbjFfcFtpXSA9ICggMS4wLWZnY3AxZ1tpXS1kaWdmMVtpXSApICogZnBlbmFsdHkgKiAwLjU7CgkJb2dfdF9mZ19oX2RnX24xX3BbaV0gPSAoMS4wLW9nY3AxZ1tpXStmZ2NwMWdbaV0tZGlnZjFbaV0pICogMC41ICogZnBlbmFsdHk7CgkJZmdfdF9vZ19oX2RnX24xX3BbaV0gPSAoMS4wLWZnY3AxZ1tpXStvZ2NwMWdbaV0tZGlnZjFbaV0pICogMC41ICogZnBlbmFsdHk7CgkJZ2Fwel9uMVtpXSA9ICgxLjAtZ2FwejFbaV0pOwoJfQojZW5kaWYKCgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJCWZwcmludGYoIHN0ZGVyciwgIm9nY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKI2VuZGlmCgoJY3VycmVudHcgPSB3MTsKCXByZXZpb3VzdyA9IHcyOwoKCWlmKCBSTkFzY29yZW10eCAhPSAncicgKQoJCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyLCBjcG14MSwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJZWxzZQoJCWNsZWFydmVjKCBpbml0dmVydGljYWx3LCBsZ3RoMSApOwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZVFfZ2FwbWFwKCBpbml0dmVydGljYWx3LCBnYXBtYXAyWzBdLCBsZ3RoMSwgZ2FwbWFwMSApOyAvLyAwNjAzMDYKCglpZiggUk5Bc2NvcmVtdHggIT0gJ3InICkKCQltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CgllbHNlCgkJY2xlYXJ2ZWMoIGN1cnJlbnR3LCBsZ3RoMiApOwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfb3V0X3ZlYWRRX2dhcG1hcCggY3VycmVudHcsIGdhcG1hcDFbMF0sIGxndGgyLCBnYXBtYXAyICk7IC8vIDA2MDMwNgoKCgojaWYgMCAvLyAtPiB0YmZhc3QuYwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfY2FsYyggY3VycmVudHcsIGljeWMsIGpjeWMsIGxndGgxLCBsZ3RoMiwgc2VxMSwgc2VxMiwgZWZmMSwgZWZmMiwgbG9jYWxob20sIDEsIDAgKTsKCiNlbmRpZgoKCgoJa3lva2FpcGVuYWwgPSAwLjA7CglpZiggb3V0Z2FwID09IDEgKQoJewoJCWcgPSAwLjA7CgoJCWcgKz0gb2djcDFnWzBdICogb2dfaF9kZ19uMl9wWzBdOwovLwkJZyArPSBvZ2NwMWdbMF0gKiAoIDEuMC1vZ2NwMmdbMF0tZGlnZjJbMF0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJaWYoIGcgKSBmcHJpbnRmKCBzdGRlcnIsICJpbml0LW1hdGNoIHBlbmFsMT0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1bMF0sIHNlcTJbMF1bMF0gKTsKCgkJZyArPSBvZ2NwMmdbMF0gKiBvZ19oX2RnX24xX3BbMF07Ci8vCQlnICs9IG9nY3AyZ1swXSAqICggMS4wLW9nY3AxZ1swXS1kaWdmMVswXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQlpZiggZyApIGZwcmludGYoIHN0ZGVyciwgImluaXQtbWF0Y2ggcGVuYWwyPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVswXSwgc2VxMlswXVswXSApOwoKCQlnICs9IGZnY3AxZ1swXSAqIGZnX2hfZGdfbjJfcFswXTsKLy8JCWcgKz0gZmdjcDFnWzBdICogKCAxLjAtZmdjcDJnWzBdLWRpZ2YyWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwxPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoKCQlnICs9IGZnY3AyZ1swXSAqIGZnX2hfZGdfbjFfcFswXTsKLy8JCWcgKz0gZmdjcDJnWzBdICogKCAxLjAtZmdjcDFnWzBdLWRpZ2YxWzBdICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCWlmKCBnICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwyPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoKCQlreW9rYWlwZW5hbCA9IGc7CgkJaW5pdHZlcnRpY2Fsd1swXSArPSBnOwoJCWN1cnJlbnR3WzBdICs9IGc7CgoJCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgkJewoJCQl0bXBwZW5hbCA9IGdhcHpfbjJbMF0qb2dfdF9mZ19oX2RnX24xX3BbMF07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMF0pKigxLjAtb2djcDFnWzBdK2ZnY3AxZ1swXS1kaWdmMVswXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gdG1wcGVuYWw7CgoJCQl0bXBwZW5hbCA9IGdhcHpfbjJbMV0qZmdfdF9vZ19oX2RnX24xX3BbaV07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbMV0pKigxLjAtZmdjcDFnW2ldK29nY3AxZ1tpXS1kaWdmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCWluaXR2ZXJ0aWNhbHdbaV0gKz0gdG1wcGVuYWw7CgoJCX0KCQlmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJCXsKCQkJdG1wcGVuYWwgPSBnYXB6X24xWzBdKm9nX3RfZmdfaF9kZ19uMl9wWzBdOwovLwkJCXRtcHBlbmFsID0gKCAoMS4wLWdhcHoxWzBdKSooMS4wLW9nY3AyZ1swXStmZ2NwMmdbMF0tZGlnZjJbMF0pICkgKiAwLjUgKiBmcGVuYWx0eTsgLy8gbWFkYQoJCQljdXJyZW50d1tqXSArPSB0bXBwZW5hbDsKCgkJCXRtcHBlbmFsID0gZ2Fwel9uMVsxXSpmZ190X29nX2hfZGdfbjJfcFtqXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJY3VycmVudHdbal0gKz0gdG1wcGVuYWw7CgkJfQoJfQojaWYgT1VUR0FQMFRSWQoJZWxzZQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqIGogLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJaW5pdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiBpIC8gMi4wOwoJfQojZW5kaWYKCgltWzBdID0gMC4wOyAvLyBpcmFuYWkKCWZvciggaj0xOyBqPGxndGgyKzE7ICsraiApIAoJewoJCW1wW2pdID0gMDsKCQltW2pdID0gY3VycmVudHdbai0xXSArIDEwMDAwICogZnBlbmFsdHk7IC8vaWlub2thPwoJfQoJaWYoIGxndGgyID09IDAgKQoJCWxhc3R2ZXJ0aWNhbHdbMF0gPSAwLjA7IC8vIEZhbGlnbiBrYXJhIHlvYmFyZXRhdG9raSBrb3VuYXJ1a2Fub3VzZWkgYXJpCgllbHNlCgkJbGFzdHZlcnRpY2Fsd1swXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKCWlmKCBvdXRnYXAgKSBsYXN0aSA9IGxndGgxKzE7IGVsc2UgbGFzdGkgPSBsZ3RoMTsKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImluaXR2ZXJ0aWNhbHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDIrMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgaW5pdHZlcnRpY2Fsd1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJmY2dwXG4iICk7CmZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbJWRdPSVmXG4iLCBpLCBvZ2NwMltpXSApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJaWYoIFJOQXNjb3JlbXR4ICE9ICdyJyApCgkJCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MSwgY3BteDIsIGksIGxndGgyLCBmbG9hdHdvcmssIGludHdvcmssIDAgKTsKCQllbHNlCgkJCWNsZWFydmVjKCBjdXJyZW50dywgbGd0aDIgKTsKI2lmIFhYWFhYWFgKZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImk9JWRcbiIsIGkgKTsKZnByaW50Ziggc3RkZXJyLCAiY3VycmVudHcgPSBcbiIgKTsKZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2pdICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CiNlbmRpZgoJCWlmKCBsb2NhbGhvbSApCgkJewovLwkJCWZwcmludGYoIHN0ZGVyciwgIkNhbGxpbmcgaW1wX21hdGNoX2NhbGMgKG8pIGxndGggPSAlZCwgaSA9ICVkXG4iLCBsZ3RoMSwgaSApOwojaWYgIDAKCQkJaW1wX21hdGNoX291dF92ZWFkUSggY3VycmVudHcsIGksIGxndGgyICk7CiNlbHNlCgkJCWltcF9tYXRjaF9vdXRfdmVhZFFfZ2FwbWFwKCBjdXJyZW50dywgZ2FwbWFwMVtpXSwgbGd0aDIsIGdhcG1hcDIgKTsKI2VuZGlmCgkJfQojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCQltcGkgPSAwOwoJCW1pID0gcHJldmlvdXN3WzBdICsgMTAwMDAgKiBmcGVuYWx0eTsKCgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlmZ190X29nX2hfZGdfbjJfcF9wdCA9IGZnX3Rfb2dfaF9kZ19uMl9wICsgMTsKCQlvZ190X2ZnX2hfZGdfbjJfcF9wdCA9IG9nX3RfZmdfaF9kZ19uMl9wICsgMTsKCQlvZ19oX2RnX24yX3BfcHQgPSBvZ19oX2RnX24yX3AgKyAxOwoJCWZnX2hfZGdfbjJfcF9wdCA9IGZnX2hfZGdfbjJfcCArIDE7CgkJZ2Fwel9uMl9wdDAgPSBnYXB6X24yICsgMTsKCQlnYXB6X24yX3B0MSA9IGdhcHpfbjIgKyAyOwoJCWZnY3AycHQgPSBmZ2NwMmcgKyAxOwoJCW9nY3AycHQgPSBvZ2NwMmcgKyAxOwoKCQlmZ190X29nX2hfZGdfbjFfcF92YSA9IGZnX3Rfb2dfaF9kZ19uMV9wW2ldOwoJCW9nX3RfZmdfaF9kZ19uMV9wX3ZhID0gb2dfdF9mZ19oX2RnX24xX3BbaV07CgkJb2dfaF9kZ19uMV9wX3ZhID0gb2dfaF9kZ19uMV9wW2ldOwoJCWZnX2hfZGdfbjFfcF92YSA9IGZnX2hfZGdfbjFfcFtpXTsKCQlnYXB6X24xX3ZhMCA9IGdhcHpfbjFbaV07CgkJZ2Fwel9uMV92YTEgPSBnYXB6X24xW2krMV07CgkJZmdjcDF2YSA9IGZnY3AxZ1tpXTsKCQlvZ2NwMXZhID0gb2djcDFnW2ldOwoKCQlsYXN0aiA9IGxndGgyKzE7CgkJZm9yKCBqPTE7IGo8bGFzdGo7IGorKyApCgkJewoJCQl3bSA9ICpwcmVwdDsKCgkJCWcgPSBvZ2NwMXZhICogKm9nX2hfZGdfbjJfcF9wdDsKLy8JCQlnID0gb2djcDFnW2ldICogb2dfaF9kZ19uMl9wW2pdOwovLwkJCWcgPSBvZ2NwMWdbaV0gKiAoIDEuMC1vZ2NwMmdbal0tZGlnZjJbal0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJCWlmKCBnICYmIGk9PWogKSBmcHJpbnRmKCBzdGRlcnIsICJtYXRjaCBwZW5hbDE9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCXdtICs9IGc7CgoJCQlnID0gKm9nY3AycHQgKiBvZ19oX2RnX24xX3BfdmE7Ci8vCQkJZyA9IG9nY3AyZ1tqXSAqIG9nX2hfZGdfbjFfcFtpXTsKLy8JCQlnID0gb2djcDJnW2pdICogKCAxLjAtb2djcDFnW2ldLWRpZ2YxW2ldICkgKiBmcGVuYWx0eSAqIDAuNTsKLy8JCQlpZiggZyAmJiBpPT1qICkgZnByaW50Ziggc3RkZXJyLCAibWF0Y2ggcGVuYWwyPSVmLCAlYy0lY1xuIiwgZywgc2VxMVswXVtpXSwgc2VxMlswXVtqXSApOwoJCQl3bSArPSBnOwoKCQkJZyA9IGZnY3AxdmEgKiAqZmdfaF9kZ19uMl9wX3B0OwovLwkJCWcgPSBmZ2NwMWdbaV0gKiBmZ19oX2RnX24yX3Bbal07Ci8vCQkJZyA9IGZnY3AxZ1tpXSAqICggMS4wLWZnY3AyZ1tqXS1kaWdmMltqXSApICogZnBlbmFsdHkgKiAwLjU7Ci8vCQkJaWYoIGcgJiYgaT09aiApIGZwcmludGYoIHN0ZGVyciwgIm1hdGNoIHBlbmFsMz0lZiwgJWMtJWNcbiIsIGcsIHNlcTFbMF1baV0sIHNlcTJbMF1bal0gKTsKCQkJd20gKz0gZzsKCgkJCWcgPSAqZmdjcDJwdCAqIGZnX2hfZGdfbjFfcF92YTsKLy8JCQlnID0gZmdjcDJnW2pdICogZmdfaF9kZ19uMV9wW2ldOwovLwkJCWcgPSBmZ2NwMmdbal0gKiAoIDEuMC1mZ2NwMWdbaV0tZGlnZjFbaV0gKSAqIGZwZW5hbHR5ICogMC41OwovLwkJCWlmKCBnICYmIGk9PWogKSBmcHJpbnRmKCBzdGRlcnIsICJtYXRjaCBwZW5hbDQ9JWYsICVjLSVjXG4iLCBnLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCXdtICs9IGc7CgoJCQkqaWpwcHQgPSAwOwoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYtPiIsIHdtICk7CiNlbmRpZgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQl0bXBwZW5hbCA9IGdhcHpfbjFfdmExICogKmZnX3Rfb2dfaF9kZ19uMl9wX3B0OwovLwkJCXRtcHBlbmFsID0gZ2Fwel9uMVtpKzFdICogZmdfdF9vZ19oX2RnX24yX3Bbal07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejFbaSsxXSkqKDEuMC1mZ2NwMmdbal0rb2djcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJaWYoIChnPW1pK3RtcHBlbmFsKSA+IHdtICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJqdW1wIGkgc3RhcnQ9JWYgKGo9JWQsIGZnY3AyZ1tqXT0lZiwgZGlnZjJbal09JWYsIGRpYWYyW2pdPSVmKSwgJWMtJWNcbiIsIGctbWksIGosIGZnY3AyZ1tqXSwgZGlnZjJbal0sIGRpYWYyW2pdLCBzZXExWzBdW2ldLCBzZXEyWzBdW2pdICk7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSAtKCBqIC0gbXBpICk7CgkJCX0KCQkJdG1wcGVuYWwgPSBnYXB6X24xX3ZhMCAqICpvZ190X2ZnX2hfZGdfbjJfcF9wdDsKLy8JCQl0bXBwZW5hbCA9IGdhcHpfbjFbaV0gKiBvZ190X2ZnX2hfZGdfbjJfcFtqXTsKLy8JCQl0bXBwZW5hbCA9ICggKDEuMC1nYXB6MVtpXSkqKDEuMC1vZ2NwMmdbal0rZmdjcDJnW2pdLWRpZ2YyW2pdKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJaWYoIChnPSpwcmVwdCt0bXBwZW5hbCkgPj0gbWkgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImp1bXAgaSBlbmQ9JWYsICVjLSVjXG4iLCBnLSpwcmVwdCwgc2VxMVswXVtpLTFdLCBzZXEyWzBdW2otMV0gKTsKCQkJCW1pID0gZzsKCQkJCW1waSA9IGotMTsKCQkJfQoKI2lmIFVTRV9QRU5BTFRZX0VYCiAgICAgICAgICAgIG1pICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCiNpZiAwIAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQl0bXBwZW5hbCA9ICpnYXB6X24yX3B0MSAqIGZnX3Rfb2dfaF9kZ19uMV9wX3ZhOwovLwkJCXRtcHBlbmFsID0gZ2Fwel9uMltqKzFdICogZmdfdF9vZ19oX2RnX24xX3BbaV07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbaisxXSkqKDEuMC1mZ2NwMWdbaV0rb2djcDFnW2ldLWRpZ2YxW2ldKSApICogMC41ICogZnBlbmFsdHk7IC8vIG1hZGEKCQkJaWYoIChnPSptanB0K3RtcHBlbmFsKSA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJKmlqcHB0ID0gKyggaSAtICptcGpwdCApOwoJCQl9CgkJCXRtcHBlbmFsID0gKmdhcHpfbjJfcHQwICogb2dfdF9mZ19oX2RnX24xX3BfdmE7Ci8vCQkJdG1wcGVuYWwgPSBnYXB6X24yW2pdICogb2dfdF9mZ19oX2RnX24xX3BbaV07Ci8vCQkJdG1wcGVuYWwgPSAoICgxLjAtZ2FwejJbal0pKigxLjAtb2djcDFnW2ldK2ZnY3AxZ1tpXS1kaWdmMVtpXSkgKSAqIDAuNSAqIGZwZW5hbHR5OyAvLyBtYWRhCgkJCWlmKCAoZz0qcHJlcHQrdG1wcGVuYWwpID49ICptanB0ICkKCQkJewoJCQkJKm1qcHQgPSBnOwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoKI2lmIFVTRV9QRU5BTFRZX0VYCiAgICAgICAgICAgIG1bal0gKz0gZnBlbmFsdHlfZXg7CiNlbmRpZgoKCgoKCgkJCSpjdXJwdCsrICs9IHdtOwoJCQlpanBwdCsrOwoJCQltanB0Kys7CgkJCXByZXB0Kys7CgkJCW1wanB0Kys7CgkJCWZnX3Rfb2dfaF9kZ19uMl9wX3B0Kys7CgkJCW9nX3RfZmdfaF9kZ19uMl9wX3B0Kys7CgkJCW9nX2hfZGdfbjJfcF9wdCsrOwoJCQlmZ19oX2RnX24yX3BfcHQrKzsKCQkJZ2Fwel9uMl9wdDArKzsKCQkJZ2Fwel9uMl9wdDErKzsKCQkJZmdjcDJwdCsrOwoJCQlvZ2NwMnB0Kys7CgkJfQoJCWxhc3R2ZXJ0aWNhbHdbaV0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCX0KCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgojaWYgT1VUR0FQMFRSWQoJaWYoICFvdXRnYXAgKQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqICggbGd0aDIgLSBqICkgLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJbGFzdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiAoIGxndGgxIC0gaSAgLyAyLjApOwoJfQojZW5kaWYKCQkKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsIiVzXG4iLCBzZXEyW2pdICk7CglmcHJpbnRmKCBzdGRlcnIsICI9PT09PiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggbXNlcTFbaV0sIHNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggbXNlcTJbal0sIHNlcTJbal0gKTsKCSovCglpZiggbG9jYWxob20gKQoJewoJCUF0cmFja2luZ19sb2NhbGhvbV9nYXBtYXAoIGltcG1hdGNoLCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YywgZ2FwbWFwMSwgZ2FwbWFwMiApOwoJfQoJZWxzZQoJCUF0cmFja2luZyggY3VycmVudHcsIGxhc3R2ZXJ0aWNhbHcsIHNlcTEsIHNlcTIsIG1zZXExLCBtc2VxMiwgY3BteDEsIGNwbXgyLCBpanAsIGljeWMsIGpjeWMgKTsKCi8vCWZwcmludGYoIHN0ZGVyciwgIiMjIyBpbXBtYXRjaCA9ICVmXG4iLCAqaW1wbWF0Y2ggKTsKCglyZXN1bHRsZW4gPSBzdHJsZW4oIG1zZXExWzBdICk7CglpZiggYWxsb2NsZW4gPCByZXN1bHRsZW4gfHwgcmVzdWx0bGVuID4gTiApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiYWxsb2NsZW49JWQsIHJlc3VsdGxlbj0lZCwgTj0lZFxuIiwgYWxsb2NsZW4sIHJlc3VsdGxlbiwgTiApOwoJCUVycm9yRXhpdCggIkxFTkdUSCBPVkVSIVxuIiApOwoJfQoKCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBzdHJjcHkoIHNlcTFbaV0sIG1zZXExW2ldICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBzdHJjcHkoIHNlcTJbal0sIG1zZXEyW2pdICk7CgkvKgoJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNlcTFbaV0gKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjXG4iICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNlcTJbal0gKTsKCSovCgovLwlmcHJpbnRmKCBzdGRlcnIsICJ3bSA9ICVmXG4iLCB3bSApOwoKCglyZXR1cm4oIHdtICk7Cn0KCg==