I2luY2x1ZGUgIm1sdGFsbi5oIgojaW5jbHVkZSAiZHAuaCIKCiNkZWZpbmUgTUFDSElHQUkgMAojZGVmaW5lIE9VVEdBUDBUUlkgMQojZGVmaW5lIERFQlVHIDAKI2RlZmluZSBYWFhYWFhYICAgIDAKI2RlZmluZSBVU0VfUEVOQUxUWV9FWCAgMAojZGVmaW5lIEZBU1RNQVRDSENBTEMgMQoKCnN0YXRpYyBmbG9hdCAqKmltcG10eCA9IE5VTEw7CnN0YXRpYyBpbnQgaW1wYWxsb2NsZW4gPSAwOwpmbG9hdCBpbXBfbWF0Y2hfb3V0X3NjKCBpbnQgaTEsIGludCBqMSApCnsKLy8JZnByaW50Ziggc3RkZXJyLCAiaW1wK21hdGNoID0gJWZcbiIsIGltcG10eFtpMV1bajFdICogZmFzdGF0aHJlc2hvbGQgKTsKLy8JZnByaW50Ziggc3RkZXJyLCAidmFsID0gJWZcbiIsIGltcG10eFtpMV1bajFdICk7CglyZXR1cm4oIGltcG10eFtpMV1bajFdICk7Cn0Kc3RhdGljIHZvaWQgaW1wX21hdGNoX291dF92ZWFkX2dhcG1hcCggZmxvYXQgKmltcCwgaW50IGkxLCBpbnQgbGd0aDIsIGludCAqZ2FwbWFwMiApCnsKI2lmIEZBU1RNQVRDSENBTEMKCWZsb2F0ICpwdCA9IGltcG10eFtpMV07CglpbnQgKmdhcG1hcHB0ID0gZ2FwbWFwMjsKCXdoaWxlKCBsZ3RoMi0tICkKCQkqaW1wKysgKz0gcHRbKmdhcG1hcHB0KytdOwojZWxzZQoJaW50IGo7CglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJKmltcCsrICs9IHB0W2dhcG1hcDJbal1dOwojZW5kaWYKfQoKCnN0YXRpYyB2b2lkIGltcF9tYXRjaF9vdXRfdmVhZF90YXRlX2dhcG1hcCggZmxvYXQgKmltcCwgaW50IGoxLCBpbnQgbGd0aDEsIGludCAqZ2FwbWFwMSApCnsKI2lmIEZBU1RNQVRDSENBTEMKCWludCAqZ2FwbWFwcHQgPSBnYXBtYXAxOwoJd2hpbGUoIGxndGgxLS0gKQoJCSppbXArKyArPSBpbXBtdHhbKmdhcG1hcHB0KytdW2oxXTsKI2Vsc2UKCWludCBpOwoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJKmltcCsrICs9IGltcG10eFtnYXBtYXAxW2ldXVtqMV07CiNlbmRpZgp9CgpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWQoIGZsb2F0ICppbXAsIGludCBpMSwgaW50IGxndGgyICkKewojaWYgRkFTVE1BVENIQ0FMQyAKCWZsb2F0ICpwdCA9IGltcG10eFtpMV07Cgl3aGlsZSggbGd0aDItLSApCgkJKmltcCsrICs9ICpwdCsrOwojZWxzZQoJaW50IGo7CglmbG9hdCAqcHQgPSBpbXBtdHhbaTFdOwoJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJKmltcCsrICs9IHB0W2pdOwojZW5kaWYKfQpzdGF0aWMgdm9pZCBpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZSggZmxvYXQgKmltcCwgaW50IGoxLCBpbnQgbGd0aDEgKQp7CglpbnQgaTsKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKQoJCSppbXArKyArPSBpbXBtdHhbaV1bajFdOwp9Cgp2b2lkIGltcF9ybmEoIGludCBuc2VxMSwgaW50IG5zZXEyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBSTkFwYWlyICoqKmdyb3Vwcm5hMSwgUk5BcGFpciAqKipncm91cHJuYTIsIGludCAqZ2FwbWFwMSwgaW50ICpnYXBtYXAyLCBSTkFwYWlyICpwYWlyICkKewoJZm9sZHJuYSggbnNlcTEsIG5zZXEyLCBzZXExLCBzZXEyLCBlZmYxLCBlZmYyLCBncm91cHJuYTEsIGdyb3Vwcm5hMiwgaW1wbXR4LCBnYXBtYXAxLCBnYXBtYXAyLCBwYWlyICk7Cn0KCgp2b2lkIGltcF9tYXRjaF9pbml0X3N0cmljdCggZmxvYXQgKmltcCwgaW50IGNsdXMxLCBpbnQgY2x1czIsIGludCBsZ3RoMSwgaW50IGxndGgyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBMb2NhbEhvbSAqKipsb2NhbGhvbSwgaW50IGZvcnNjb3JlICkKewoJaW50IGksIGosIGsxLCBrMiwgdG1waW50LCBzdGFydDEsIHN0YXJ0MiwgZW5kMSwgZW5kMjsKCWZsb2F0IGVmZmlqOwoJZG91YmxlIGVmZmlqeDsKCWNoYXIgKnB0LCAqcHQxLCAqcHQyOwoJc3RhdGljIGNoYXIgKm5vY291bnQxID0gTlVMTDsKCXN0YXRpYyBjaGFyICpub2NvdW50MiA9IE5VTEw7CglMb2NhbEhvbSAqdG1wcHRyOwoKCWlmKCBpbXBhbGxvY2xlbiA8IGxndGgxICsgMiB8fCBpbXBhbGxvY2xlbiA8IGxndGgyICsgMiApCgl7CgkJaWYoIGltcG10eCApIEZyZWVGbG9hdE10eCggaW1wbXR4ICk7CgkJaWYoIG5vY291bnQxICkgZnJlZSggbm9jb3VudDEgKTsKCQlpZiggbm9jb3VudDIgKSBmcmVlKCBub2NvdW50MiApOwoJCWltcGFsbG9jbGVuID0gTUFYKCBsZ3RoMSwgbGd0aDIgKSArIDI7CgkJaW1wbXR4ID0gQWxsb2NhdGVGbG9hdE10eCggaW1wYWxsb2NsZW4sIGltcGFsbG9jbGVuICk7CgkJbm9jb3VudDEgPSBBbGxvY2F0ZUNoYXJWZWMoIGltcGFsbG9jbGVuICk7CgkJbm9jb3VudDIgPSBBbGxvY2F0ZUNoYXJWZWMoIGltcGFsbG9jbGVuICk7Cgl9CgoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgl7CgkJZm9yKCBqPTA7IGo8Y2x1czE7IGorKyApCgkJCWlmKCBzZXExW2pdW2ldID09ICctJyApIGJyZWFrOwoJCWlmKCBqICE9IGNsdXMxICkgbm9jb3VudDFbaV0gPSAxOyAKCQllbHNlCQkJIG5vY291bnQxW2ldID0gMDsKCX0KCWZvciggaT0wOyBpPGxndGgyOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMyOyBqKysgKQoJCQlpZiggc2VxMltqXVtpXSA9PSAnLScgKSBicmVhazsKCQlpZiggaiAhPSBjbHVzMiApIG5vY291bnQyW2ldID0gMTsKCQllbHNlCQkJIG5vY291bnQyW2ldID0gMDsKCX0KCiNpZiAwCmZwcmludGYoIHN0ZGVyciwgIm5vY291bnQyID1cbiIgKTsKZm9yKCBpID0gMDsgaTxpbXBhbGxvY2xlbjsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAibm9jb3VudDJbJWRdID0gJWQgKCVjKVxuIiwgaSwgbm9jb3VudDJbaV0sIHNlcTJbMF1baV0gKTsKfQojZW5kaWYKCgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImVmZjEgaW4gX2luaXRfc3RyaWN0ID0gXG4iICk7Cglmb3IoIGk9MDsgaTxjbHVzMTsgaSsrICkKCQlmcHJpbnRmKCBzdGRlcnIsICJlZmYxW10gPSAlZlxuIiwgZWZmMVtpXSApOwoJZm9yKCBpPTA7IGk8Y2x1czI7IGkrKyApCgkJZnByaW50Ziggc3RkZXJyLCAiZWZmMltdID0gJWZcbiIsIGVmZjJbaV0gKTsKI2VuZGlmCgoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIGZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCWltcG10eFtpXVtqXSA9IDAuMDsKCWVmZmlqeCA9ICBmYXN0YXRocmVzaG9sZDsKCWZvciggaT0wOyBpPGNsdXMxOyBpKysgKQoJewoJCWZvciggaj0wOyBqPGNsdXMyOyBqKysgKQoJCXsKCQkJZWZmaWogPSAoZmxvYXQpKCBlZmYxW2ldICogZWZmMltqXSAqIGVmZmlqeCApOwoJCQl0bXBwdHIgPSBsb2NhbGhvbVtpXVtqXTsKCQkJd2hpbGUoIHRtcHB0ciApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAic3RhcnQxID0gJWRcbiIsIHRtcHB0ci0+c3RhcnQxICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImVuZDEgICA9ICVkXG4iLCB0bXBwdHItPmVuZDEgICApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQsIHNlcTEgPSBcbiVzXG4iLCBpLCBzZXExW2ldICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImogPSAlZCwgc2VxMiA9IFxuJXNcbiIsIGosIHNlcTJbal0gKTsKCQkJCXB0ID0gc2VxMVtpXTsKCQkJCXRtcGludCA9IC0xOwoJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCXsKCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPnN0YXJ0MSApIGJyZWFrOwoJCQkJfQoJCQkJc3RhcnQxID0gcHQgLSBzZXExW2ldIC0gMTsKCQoJCQkJaWYoIHRtcHB0ci0+c3RhcnQxID09IHRtcHB0ci0+ZW5kMSApIGVuZDEgPSBzdGFydDE7CgkJCQllbHNlCgkJCQl7CiNpZiBNQUNISUdBSQoJCQkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCQkJewovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgInRtcGludCA9ICVkLCBlbmQxID0gJWQgcG9zID0gJWRcbiIsIHRtcGludCwgdG1wcHRyLT5lbmQxLCBwdC1zZXExW2ldICk7CgkJCQkJCWlmKCB0bXBpbnQgPT0gdG1wcHRyLT5lbmQxICkgYnJlYWs7CgkJCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCQl9CgkJCQkJZW5kMSA9IHB0IC0gc2VxMVtpXSAtIDA7CiNlbHNlCgkJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAidG1waW50ID0gJWQsIGVuZDEgPSAlZCBwb3MgPSAlZFxuIiwgdG1waW50LCB0bXBwdHItPmVuZDEsIHB0LXNlcTFbaV0gKTsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMSApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQxID0gcHQgLSBzZXExW2ldIC0gMTsKI2VuZGlmCgkJCQl9CgkKCQkJCXB0ID0gc2VxMltqXTsKCQkJCXRtcGludCA9IC0xOwoJCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJCXsKCQkJCQlpZiggKnB0KysgIT0gJy0nICkgdG1waW50Kys7CgkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPnN0YXJ0MiApIGJyZWFrOwoJCQkJfQoJCQkJc3RhcnQyID0gcHQgLSBzZXEyW2pdIC0gMTsKCQkJCWlmKCB0bXBwdHItPnN0YXJ0MiA9PSB0bXBwdHItPmVuZDIgKSBlbmQyID0gc3RhcnQyOwoJCQkJZWxzZQoJCQkJewojaWYgTUFDSElHQUkKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoIHRtcGludCA9PSB0bXBwdHItPmVuZDIgKSBicmVhazsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCX0KCQkJCQllbmQyID0gcHQgLSBzZXEyW2pdIC0gMDsKI2Vsc2UKCQkJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQkJCXsKCQkJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJCQlpZiggdG1waW50ID09IHRtcHB0ci0+ZW5kMiApIGJyZWFrOwoJCQkJCX0KCQkJCQllbmQyID0gcHQgLSBzZXEyW2pdIC0gMTsKI2VuZGlmCgkJCQl9Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkICglYyksIGVuZDEgPSAlZCAoJWMpLCBzdGFydDIgPSAlZCAoJWMpLCBlbmQyID0gJWQgKCVjKVxuIiwgc3RhcnQxLCBzZXExW2ldW3N0YXJ0MV0sIGVuZDEsIHNlcTFbaV1bZW5kMV0sIHN0YXJ0Miwgc2VxMltqXVtzdGFydDJdLCBlbmQyLCBzZXEyW2pdW2VuZDJdICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInN0ZXAgMFxuIiApOwoJCQkJaWYoIGVuZDEgLSBzdGFydDEgIT0gZW5kMiAtIHN0YXJ0MiApCgkJCQl7Ci8vCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJDSFVVSSEhLCBzdGFydDEgPSAlZCwgZW5kMSA9ICVkLCBzdGFydDIgPSAlZCwgZW5kMiA9ICVkXG4iLCBzdGFydDEsIGVuZDEsIHN0YXJ0MiwgZW5kMiApOwoJCQkJfQoKI2lmIDEKCQkJCWsxID0gc3RhcnQxOyBrMiA9IHN0YXJ0MjsKCQkJCXB0MSA9IHNlcTFbaV0gKyBrMTsKCQkJCXB0MiA9IHNlcTJbal0gKyBrMjsKCQkJCXdoaWxlKCAqcHQxICYmICpwdDIgKQoJCQkJewoJCQkJCWlmKCAqcHQxICE9ICctJyAmJiAqcHQyICE9ICctJyApCgkJCQkJewovLyC9xaTfpPLG873FpMukq6SxpMqkpKTopKaky8PtsNWkt6TGsryktaSkoaMKLy8JCQkJCQlpbXBtdHhbazFdW2syXSArPSB0bXBwdHItPndpbXBvcnRhbmNlICogZmFzdGF0aHJlc2hvbGQ7Ci8vCQkJCQkJaW1wbXR4W2sxXVtrMl0gKz0gdG1wcHRyLT5pbXBvcnRhbmNlICogZWZmaWo7CgkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+ZmltcG9ydGFuY2UgKiBlZmZpajsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICIjIyMjIGltcG10eFtrMV1bazJdID0gJWYsIHRtcHB0ci0+ZmltcG9ydGFuY2U9JWYsIGVmZmlqPSVmXG4iLCBpbXBtdHhbazFdW2syXSwgdG1wcHRyLT5maW1wb3J0YW5jZSwgZWZmaWogKTsKLy8JCQkJCQlmcHJpbnRmKCBzdGRlcnIsICJtYXJrLCAlZCAoJWMpIC0gJWQgKCVjKSBcbiIsIGsxLCAqcHQxLCBrMiwgKnB0MiApOwovLwkJCQkJCWZwcmludGYoIHN0ZGVyciwgIiVkICglYykgLSAlZCAoJWMpICAtICVmXG4iLCBrMSwgKnB0MSwgazIsICpwdDIsIHRtcHB0ci0+ZmltcG9ydGFuY2UgKiBlZmZpaiApOwoJCQkJCQlrMSsrOyBrMisrOwoJCQkJCQlwdDErKzsgcHQyKys7CgkJCQkJfQoJCQkJCWVsc2UgaWYoICpwdDEgIT0gJy0nICYmICpwdDIgPT0gJy0nICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAic2tpcCwgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKCQkJCQkJazIrKzsgcHQyKys7CgkJCQkJfQoJCQkJCWVsc2UgaWYoICpwdDEgPT0gJy0nICYmICpwdDIgIT0gJy0nICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAic2tpcCwgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKCQkJCQkJazErKzsgcHQxKys7CgkJCQkJfQoJCQkJCWVsc2UgaWYoICpwdDEgPT0gJy0nICYmICpwdDIgPT0gJy0nICkKCQkJCQl7Ci8vCQkJCQkJZnByaW50Ziggc3RkZXJyLCAic2tpcCwgJWQgKCVjKSAtICVkICglYykgXG4iLCBrMSwgKnB0MSwgazIsICpwdDIgKTsKCQkJCQkJazErKzsgcHQxKys7CgkJCQkJCWsyKys7IHB0MisrOwoJCQkJCX0KCQkJCQlpZiggazEgPiBlbmQxIHx8IGsyID4gZW5kMiApIGJyZWFrOwoJCQkJfQojZWxzZQoJCQkJd2hpbGUoIGsxIDw9IGVuZDEgJiYgazIgPD0gZW5kMiApCgkJCQl7CgkJCQkJZnByaW50Ziggc3RkZXJyLCAiazEsazI9JWQsJWQgLSAiLCBrMSwgazIgKTsKCQkJCQlpZiggIW5vY291bnQxW2sxXSAmJiAhbm9jb3VudDJbazJdICkKCQkJCQl7CgkJCQkJCWltcG10eFtrMV1bazJdICs9IHRtcHB0ci0+d2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXSAgKiBmYXN0YXRocmVzaG9sZDsKCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibWFya2VkXG4iICk7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQkJZnByaW50Ziggc3RkZXJyLCAibm8gY291bnRcbiIgKTsKCQkJCQlrMSsrOyBrMisrOwoJCQkJfQojZW5kaWYKCQkJCXRtcHB0ciA9IHRtcHB0ci0+bmV4dDsKCQkJfQoJCX0KCX0KCiNpZiAwCglpZiggY2x1czEgPT0gMSAmJiBjbHVzMiA9PSAxICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJ3cml0aW5nIGltcG10eFxuIiApOwoJCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCWZwcmludGYoIHN0ZGVyciwgInNlcTFbMF0gPSAgJXNcbiIsIHNlcTFbMF0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJzZXEyWzBdID0gICVzXG4iLCBzZXEyWzBdICk7CgkJZnByaW50Ziggc3RkZXJyLCAiaW1wbXR4ID0gXG4iICk7CgkJZm9yKCBrMj0wOyBrMjxsZ3RoMjsgazIrKyApCgkJCWZwcmludGYoIHN0ZGVyciwgIiU2LjNmICIsIChkb3VibGUpazIgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCQlmb3IoIGsxPTA7IGsxPGxndGgxOyBrMSsrICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgIiVkICIsIGsxICk7CgkJCWZvciggazI9MDsgazI8MzA7IGsyKysgKQoJCQkJZnByaW50Ziggc3RkZXJyLCAiJTIuMWYgIiwgaW1wbXR4W2sxXVtrMl0gKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CgkJfQovLwkJZXhpdCggMSApOwoJfQojZW5kaWYKfQoKI2lmIDAKdm9pZCBpbXBfbWF0Y2hfaW5pdCggZmxvYXQgKmltcCwgaW50IGNsdXMxLCBpbnQgY2x1czIsIGludCBsZ3RoMSwgaW50IGxndGgyLCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBMb2NhbEhvbSAqKipsb2NhbGhvbSApCnsKCWludCBkaWYsIGksIGosIGsxLCBrMiwgdG1waW50LCBzdGFydDEsIHN0YXJ0MiwgZW5kMSwgZW5kMjsKCXN0YXRpYyBpbnQgaW1wYWxsb2NsZW4gPSAwOwoJY2hhciAqcHQ7CglpbnQgYWxsZ2FwOwoJc3RhdGljIGNoYXIgKm5vY291bnQxID0gTlVMTDsKCXN0YXRpYyBjaGFyICpub2NvdW50MiA9IE5VTEw7CgoJaWYoIGltcGFsbG9jbGVuIDwgbGd0aDEgKyAyIHx8IGltcGFsbG9jbGVuIDwgbGd0aDIgKyAyICkKCXsKCQlpZiggaW1wbXR4ICkgRnJlZUZsb2F0TXR4KCBpbXBtdHggKTsKCQlpZiggbm9jb3VudDEgKSBmcmVlKCBub2NvdW50MSApOwoJCWlmKCBub2NvdW50MiApIGZyZWUoIG5vY291bnQyICk7CgkJaW1wYWxsb2NsZW4gPSBNQVgoIGxndGgxLCBsZ3RoMiApICsgMjsKCQlpbXBtdHggPSBBbGxvY2F0ZUZsb2F0TXR4KCBpbXBhbGxvY2xlbiwgaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MSA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCQlub2NvdW50MiA9IEFsbG9jYXRlQ2hhclZlYyggaW1wYWxsb2NsZW4gKTsKCX0KCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajxjbHVzMTsgaisrICkKCQkJaWYoIHNlcTFbal1baV0gPT0gJy0nICkgYnJlYWs7CgkJaWYoIGogIT0gY2x1czEgKSBub2NvdW50MVtpXSA9IDE7IAoJCWVsc2UJCQkgbm9jb3VudDFbaV0gPSAwOwoJfQoJZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApCgl7CgkJZm9yKCBqPTA7IGo8Y2x1czI7IGorKyApCgkJCWlmKCBzZXEyW2pdW2ldID09ICctJyApIGJyZWFrOwoJCWlmKCBqICE9IGNsdXMyICkgbm9jb3VudDJbaV0gPSAxOwoJCWVsc2UJCQkgbm9jb3VudDJbaV0gPSAwOwoJfQoKI2lmIDAKZnByaW50Ziggc3RkZXJyLCAibm9jb3VudDIgPVxuIiApOwpmb3IoIGkgPSAwOyBpPGltcGFsbG9jbGVuOyBpKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICJub2NvdW50MlslZF0gPSAlZCAoJWMpXG4iLCBpLCBub2NvdW50MltpXSwgc2VxMlswXVtpXSApOwp9CiNlbmRpZgoKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSBmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQlpbXBtdHhbaV1bal0gPSAwOwoJZm9yKCBpPTA7IGk8Y2x1czE7IGkrKyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkLCBzZXExID0gJXNcbiIsIGksIHNlcTFbaV0gKTsKCQlmb3IoIGo9MDsgajxjbHVzMjsgaisrICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkXG4iLCBsb2NhbGhvbVtpXVtqXS0+c3RhcnQxICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImVuZDEgICA9ICVkXG4iLCBsb2NhbGhvbVtpXVtqXS0+ZW5kMSAgICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImogPSAlZCwgc2VxMiA9ICVzXG4iLCBqLCBzZXEyW2pdICk7CgkJCXB0ID0gc2VxMVtpXTsKCQkJdG1waW50ID0gLTE7CgkJCXdoaWxlKCAqcHQgIT0gMCApCgkJCXsKCQkJCWlmKCAqcHQrKyAhPSAnLScgKSB0bXBpbnQrKzsKCQkJCWlmKCB0bXBpbnQgPT0gbG9jYWxob21baV1bal0tPnN0YXJ0MSApIGJyZWFrOwoJCQl9CgkJCXN0YXJ0MSA9IHB0IC0gc2VxMVtpXSAtIDE7CgoJCQl3aGlsZSggKnB0ICE9IDAgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInRtcGludCA9ICVkLCBlbmQxID0gJWQgcG9zID0gJWRcbiIsIHRtcGludCwgbG9jYWxob21baV1bal0uZW5kMSwgcHQtc2VxMVtpXSApOwoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+ZW5kMSApIGJyZWFrOwoJCQl9CgkJCWVuZDEgPSBwdCAtIHNlcTFbaV0gLSAxOwoKCQkJcHQgPSBzZXEyW2pdOwoJCQl0bXBpbnQgPSAtMTsKCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJewoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+c3RhcnQyICkgYnJlYWs7CgkJCX0KCQkJc3RhcnQyID0gcHQgLSBzZXEyW2pdIC0gMTsKCQkJd2hpbGUoICpwdCAhPSAwICkKCQkJewoJCQkJaWYoICpwdCsrICE9ICctJyApIHRtcGludCsrOwoJCQkJaWYoIHRtcGludCA9PSBsb2NhbGhvbVtpXVtqXS0+ZW5kMiApIGJyZWFrOwoJCQl9CgkJCWVuZDIgPSBwdCAtIHNlcTJbal0gLSAxOwovLwkJCWZwcmludGYoIHN0ZGVyciwgInN0YXJ0MSA9ICVkLCBlbmQxID0gJWQsIHN0YXJ0MiA9ICVkLCBlbmQyID0gJWRcbiIsIHN0YXJ0MSwgZW5kMSwgc3RhcnQyLCBlbmQyICk7CgkJCWsxID0gc3RhcnQxOwoJCQlrMiA9IHN0YXJ0MjsKCQkJZnByaW50Ziggc3RkZXJyLCAic3RlcCAwXG4iICk7CgkJCXdoaWxlKCBrMSA8PSBlbmQxICYmIGsyIDw9IGVuZDIgKQoJCQl7CiNpZiAwCgkJCQlpZiggIW5vY291bnQxW2sxXSAmJiAhbm9jb3VudDJbazJdICkKCQkJCQlpbXBtdHhbazFdW2syXSArPSBsb2NhbGhvbVtpXVtqXS53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJazErKzsgazIrKzsKI2Vsc2UKCQkJCWlmKCAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCWltcG10eFtrMV1bazJdICs9IGxvY2FsaG9tW2ldW2pdLT53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJazErKzsgazIrKzsKI2VuZGlmCgkJCX0KCgkJCWRpZiA9ICggZW5kMSAtIHN0YXJ0MSApIC0gKCBlbmQyIC0gc3RhcnQyICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImRpZiA9ICVkXG4iLCBkaWYgKTsKCQkJaWYoIGRpZiA+IDAgKQoJCQl7CgkJCQlkbwoJCQkJewoJCQkJCWZwcmludGYoIHN0ZGVyciwgImRpZiA9ICVkXG4iLCBkaWYgKTsKCQkJCQlrMSA9IHN0YXJ0MTsKCQkJCQlrMiA9IHN0YXJ0MiAtIGRpZjsKCQkJCQl3aGlsZSggazEgPD0gZW5kMSAmJiBrMiA8PSBlbmQyICkKCQkJCQl7CgkJCQkJCWlmKCAwIDw9IGsyICYmIHN0YXJ0MiA8PSBrMiAmJiAhbm9jb3VudDFbazFdICYmICFub2NvdW50MltrMl0gKQoJCQkJCQkJaW1wbXR4W2sxXVtrMl0gPSBsb2NhbGhvbVtpXVtqXS0+d2ltcG9ydGFuY2UgKiBlZmYxW2ldICogZWZmMltqXTsKCQkJCQkJazErKzsgazIrKzsKCQkJCQl9CgkJCQl9CgkJCQl3aGlsZSggZGlmLS0gKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWRvCgkJCQl7CgkJCQkJazEgPSBzdGFydDEgKyBkaWY7CgkJCQkJazIgPSBzdGFydDI7CgkJCQkJd2hpbGUoIGsxIDw9IGVuZDEgKQoJCQkJCXsKCQkJCQkJaWYoIGsxID49IDAgJiYgazEgPj0gc3RhcnQxICYmICFub2NvdW50MVtrMV0gJiYgIW5vY291bnQyW2syXSApCgkJCQkJCQlpbXBtdHhbazFdW2syXSA9IGxvY2FsaG9tW2ldW2pdLT53aW1wb3J0YW5jZSAqIGVmZjFbaV0gKiBlZmYyW2pdOwoJCQkJCQlrMSsrOyBrMisrOwoJCQkJCX0KCQkJCX0KCQkJCXdoaWxlKCBkaWYrKyApOwoJCQl9CgkJfQoJfQojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiaW1wbXR4ID0gXG4iICk7Cglmb3IoIGsyPTA7IGsyPGxndGgyOyBrMisrICkKCQlmcHJpbnRmKCBzdGRlcnIsICIlNi4zZiAiLCAoZG91YmxlKWsyICk7CglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggazE9MDsgazE8bGd0aDE7IGsxKysgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIiVkIiwgazEgKTsKCQlmb3IoIGsyPTA7IGsyPGxndGgyOyBrMisrICkKCQkJZnByaW50Ziggc3RkZXJyLCAiJTYuM2YgIiwgaW1wbXR4W2sxXVtrMl0gKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCX0KI2VuZGlmCn0KI2VuZGlmCgpzdGF0aWMgdm9pZCBtYXRjaF9jYWxjKCBmbG9hdCAqbWF0Y2gsIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIGludCBpMSwgaW50IGxndGgyLCBmbG9hdCAqKmZsb2F0d29yaywgaW50ICoqaW50d29yaywgaW50IGluaXRpYWxpemUgKQp7CiNpZiBGQVNUTUFUQ0hDQUxDCglpbnQgaiwgbDsKCWZsb2F0IHNjYXJyWzI2XTsKCWZsb2F0ICoqY3BteHBkID0gZmxvYXR3b3JrOwoJaW50ICoqY3BteHBkbiA9IGludHdvcms7CglmbG9hdCAqbWF0Y2hwdCwgKmNwbXhwZHB0LCAqKmNwbXhwZHB0cHQ7CglpbnQgKmNwbXhwZG5wdCwgKipjcG14cGRucHRwdDsKCWlmKCBpbml0aWFsaXplICkKCXsKCQlpbnQgY291bnQgPSAwOwoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJY291bnQgPSAwOwoJCQlmb3IoIGw9MDsgbDwyNjsgbCsrICkKCQkJewoJCQkJaWYoIGNwbXgyW2xdW2pdICkKCQkJCXsKCQkJCQljcG14cGRbal1bY291bnRdID0gY3BteDJbbF1bal07CgkJCQkJY3BteHBkbltqXVtjb3VudF0gPSBsOwoJCQkJCWNvdW50Kys7CgkJCQl9CgkJCX0KCQkJY3BteHBkbltqXVtjb3VudF0gPSAtMTsKCQl9Cgl9CgoJewoJCWZvciggbD0wOyBsPDI2OyBsKysgKQoJCXsKCQkJc2NhcnJbbF0gPSAwLjA7CgkJCWZvciggaj0wOyBqPDI2OyBqKysgKQovLwkJCQlzY2FycltsXSArPSBuX2Rpc1tqXVtsXSAqIGNwbXgxW2pdW2kxXTsKCQkJCXNjYXJyW2xdICs9IG5fZGlzX2NvbnN3ZWlnaHRfbXVsdGlbal1bbF0gKiBjcG14MVtqXVtpMV07CgkJfQoJCW1hdGNocHQgPSBtYXRjaDsKCQljcG14cGRucHRwdCA9IGNwbXhwZG47CgkJY3BteHBkcHRwdCA9IGNwbXhwZDsKCQl3aGlsZSggbGd0aDItLSApCgkJewoJCQkqbWF0Y2hwdCA9IDAuMDsKCQkJY3BteHBkbnB0ID0gKmNwbXhwZG5wdHB0Kys7CgkJCWNwbXhwZHB0ID0gKmNwbXhwZHB0cHQrKzsKCQkJd2hpbGUoICpjcG14cGRucHQ+LTEgKQoJCQkJKm1hdGNocHQgKz0gc2NhcnJbKmNwbXhwZG5wdCsrXSAqICpjcG14cGRwdCsrOwoJCQltYXRjaHB0Kys7CgkJfSAKCX0KI2Vsc2UKCWludCBqLCBrLCBsOwoJZmxvYXQgc2NhcnJbMjZdOwoJZmxvYXQgKipjcG14cGQgPSBmbG9hdHdvcms7CglpbnQgKipjcG14cGRuID0gaW50d29yazsKLy8gc2ltcGxlCglpZiggaW5pdGlhbGl6ZSApCgl7CgkJaW50IGNvdW50ID0gMDsKCQlmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCQl7CgkJCWNvdW50ID0gMDsKCQkJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgkJCXsKCQkJCWlmKCBjcG14MltsXVtqXSApCgkJCQl7CgkJCQkJY3BteHBkW2NvdW50XVtqXSA9IGNwbXgyW2xdW2pdOwoJCQkJCWNwbXhwZG5bY291bnRdW2pdID0gbDsKCQkJCQljb3VudCsrOwoJCQkJfQoJCQl9CgkJCWNwbXhwZG5bY291bnRdW2pdID0gLTE7CgkJfQoJfQoJZm9yKCBsPTA7IGw8MjY7IGwrKyApCgl7CgkJc2NhcnJbbF0gPSAwLjA7CgkJZm9yKCBrPTA7IGs8MjY7IGsrKyApCgkJCXNjYXJyW2xdICs9IG5fZGlzX2NvbnN3ZWlnaHRfbXVsdGlba11bbF0gKiBjcG14MVtrXVtpMV07Ci8vCQkJc2NhcnJbbF0gKz0gbl9kaXNba11bbF0gKiBjcG14MVtrXVtpMV07Cgl9Cglmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKCXsKCQltYXRjaFtqXSA9IDAuMDsKCQlmb3IoIGs9MDsgY3BteHBkbltrXVtqXT4tMTsgaysrICkKCQkJbWF0Y2hbal0gKz0gc2NhcnJbY3BteHBkbltrXVtqXV0gKiBjcG14cGRba11bal07Cgl9IAojZW5kaWYKfQoKc3RhdGljIHZvaWQgQXRyYWNraW5nX2xvY2FsaG9tKCBmbG9hdCAqaW1wd21wdCwgZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YyApCnsKCWludCBpLCBqLCBsLCBpaW4sIGppbiwgaWZpLCBqZmksIGxndGgxLCBsZ3RoMiwgazsKCWZsb2F0IHdtOwoJY2hhciAqZ2FwdGFibGUxLCAqZ3QxYms7CgljaGFyICpnYXB0YWJsZTIsICpndDJiazsKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwoJZ3QxYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCWd0MmJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCiAKCWlmKCBvdXRnYXAgPT0gMSApCgkJOwoJZWxzZQoJewoJCXdtID0gbGFzdHZlcnRpY2Fsd1swXTsKCQlmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQl7CgkJCWlmKCBsYXN0dmVydGljYWx3W2ldID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0dmVydGljYWx3W2ldOwoJCQkJaWluID0gaTsgamluID0gbGd0aDItMTsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gKyggbGd0aDEgLSBpICk7CgkJCX0KCQl9CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQlpZiggbGFzdGhvcml6b250YWx3W2pdID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0aG9yaXpvbnRhbHdbal07CgkJCQlpaW4gPSBsZ3RoMS0xOyBqaW4gPSBqOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSAtKCBsZ3RoMiAtIGogKTsKCQkJfQoJCX0KCX0KCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoJZ2FwdGFibGUxID0gZ3QxYmsgKyBsZ3RoMStsZ3RoMjsKCSpnYXB0YWJsZTEgPSAwOwoJZ2FwdGFibGUyID0gZ3QyYmsgKyBsZ3RoMStsZ3RoMjsKCSpnYXB0YWJsZTIgPSAwOwoKCWlpbiA9IGxndGgxOyBqaW4gPSBsZ3RoMjsKCSppbXB3bXB0ID0gMC4wOwoJZm9yKCBrPTA7IGs8PWxndGgxK2xndGgyOyBrKysgKSAKCXsKCQlpZiggaWpwW2lpbl1bamluXSA8IDAgKSAKCQl7CgkJCWlmaSA9IGlpbi0xOyBqZmkgPSBqaW4raWpwW2lpbl1bamluXTsKCQl9CgkJZWxzZSBpZiggaWpwW2lpbl1bamluXSA+IDAgKQoJCXsKCQkJaWZpID0gaWluLWlqcFtpaW5dW2ppbl07IGpmaSA9IGppbi0xOwoJCX0KCQllbHNlCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluLTE7CgkJfQoJCWwgPSBpaW4gLSBpZmk7CgkJd2hpbGUoIC0tbCApIAoJCXsKCQkJKi0tZ2FwdGFibGUxID0gJ28nOwoJCQkqLS1nYXB0YWJsZTIgPSAnLSc7CgkJCWsrKzsKCQl9CgkJbD0gamluIC0gamZpOwoJCXdoaWxlKCAtLWwgKQoJCXsKCQkJKi0tZ2FwdGFibGUxID0gJy0nOwoJCQkqLS1nYXB0YWJsZTIgPSAnbyc7CgkJCWsrKzsKCQl9CgkJaWYoIGlpbiA9PSBsZ3RoMSB8fCBqaW4gPT0gbGd0aDIgKQoJCQk7CgkJZWxzZQoJCXsKCQkJKmltcHdtcHQgKz0gaW1wX21hdGNoX291dF9zYyggaWluLCBqaW4gKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJpbXB3bSA9ICVmIChpaW49JWQsIGppbj0lZCkgc2VxMT0lYywgc2VxMj0lY1xuIiwgKmltcHdtcHQsIGlpbiwgamluLCBzZXExWzBdW2lpbl0sIHNlcTJbMF1bamluXSApOwoJCX0KCQlpZiggaWluIDw9IDAgfHwgamluIDw9IDAgKSBicmVhazsKCQkqLS1nYXB0YWJsZTEgPSAnbyc7CgkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCWsrKzsKCQlpaW4gPSBpZmk7IGppbiA9IGpmaTsKCX0KCglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKfQpzdGF0aWMgdm9pZCBBdHJhY2tpbmdfbG9jYWxob21fZ2FwbWFwKCBmbG9hdCAqaW1wd21wdCwgZmxvYXQgKmxhc3Rob3Jpem9udGFsdywgZmxvYXQgKmxhc3R2ZXJ0aWNhbHcsIAoJCQkJCQljaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIAogICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbXNlcTEsIGNoYXIgKiptc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICoqY3BteDEsIGZsb2F0ICoqY3BteDIsIAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgKippanAsIGludCBpY3ljLCBpbnQgamN5YywKCQkJCQkJaW50ICpnYXBtYXAxLCBpbnQgKmdhcG1hcDIgKQp7CglpbnQgaSwgaiwgbCwgaWluLCBqaW4sIGlmaSwgamZpLCBsZ3RoMSwgbGd0aDIsIGs7CglmbG9hdCB3bTsKCWNoYXIgKmdhcHRhYmxlMSwgKmd0MWJrOwoJY2hhciAqZ2FwdGFibGUyLCAqZ3QyYms7CglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKCWd0MWJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CglndDJiayA9IEFsbG9jYXRlQ2hhclZlYyggbGd0aDErbGd0aDIrMSApOwoKI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJsYXN0dmVydGljYWx3WyVkXSA9ICVmXG4iLCBpLCBsYXN0dmVydGljYWx3W2ldICk7Cgl9CiNlbmRpZgogCglpZiggb3V0Z2FwID09IDEgKQoJCTsKCWVsc2UKCXsKCQl3bSA9IGxhc3R2ZXJ0aWNhbHdbMF07CgkJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApCgkJewoJCQlpZiggbGFzdHZlcnRpY2Fsd1tpXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdHZlcnRpY2Fsd1tpXTsKCQkJCWlpbiA9IGk7IGppbiA9IGxndGgyLTE7CgkJCQlpanBbbGd0aDFdW2xndGgyXSA9ICsoIGxndGgxIC0gaSApOwoJCQl9CgkJfQoJCWZvciggaj0wOyBqPGxndGgyOyBqKysgKQoJCXsKCQkJaWYoIGxhc3Rob3Jpem9udGFsd1tqXSA+PSB3bSApCgkJCXsKCQkJCXdtID0gbGFzdGhvcml6b250YWx3W2pdOwoJCQkJaWluID0gbGd0aDEtMTsgamluID0gajsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gLSggbGd0aDIgLSBqICk7CgkJCX0KCQl9Cgl9CgogICAgZm9yKCBpPTA7IGk8bGd0aDErMTsgaSsrICkgCiAgICB7CiAgICAgICAgaWpwW2ldWzBdID0gaSArIDE7CiAgICB9CiAgICBmb3IoIGo9MDsgajxsZ3RoMisxOyBqKysgKSAKICAgIHsKICAgICAgICBpanBbMF1bal0gPSAtKCBqICsgMSApOwogICAgfQoKCWdhcHRhYmxlMSA9IGd0MWJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUxID0gMDsKCWdhcHRhYmxlMiA9IGd0MmJrICsgbGd0aDErbGd0aDI7CgkqZ2FwdGFibGUyID0gMDsKCglpaW4gPSBsZ3RoMTsgamluID0gbGd0aDI7CgkqaW1wd21wdCA9IDAuMDsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPT0gbGd0aDEgfHwgamluID09IGxndGgyICkKCQkJOwoJCWVsc2UKCQl7CgkJCSppbXB3bXB0ICs9IGltcF9tYXRjaF9vdXRfc2MoIGdhcG1hcDFbaWluXSwgZ2FwbWFwMltqaW5dICk7CgovLwkJZnByaW50Ziggc3RkZXJyLCAiaW1wd20gPSAlZiAoaWluPSVkLCBqaW49JWQpIHNlcTE9JWMsIHNlcTI9JWNcbiIsICppbXB3bXB0LCBpaW4sIGppbiwgc2VxMVswXVtpaW5dLCBzZXEyWzBdW2ppbl0gKTsKCQl9CgkJaWYoIGlpbiA8PSAwIHx8IGppbiA8PSAwICkgYnJlYWs7CgkJKi0tZ2FwdGFibGUxID0gJy0nOwoJCSotLWdhcHRhYmxlMiA9ICctJzsKCQlrKys7CgkJaWluID0gaWZpOyBqaW4gPSBqZmk7Cgl9Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBnYXBpcmVydSggbXNlcTFbaV0sIHNlcTFbaV0sIGdhcHRhYmxlMSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZ2FwaXJlcnUoIG1zZXEyW2pdLCBzZXEyW2pdLCBnYXB0YWJsZTIgKTsKCglmcmVlKCBndDFiayApOwoJZnJlZSggZ3QyYmsgKTsKfQpzdGF0aWMgZmxvYXQgQXRyYWNraW5nKCBmbG9hdCAqbGFzdGhvcml6b250YWx3LCBmbG9hdCAqbGFzdHZlcnRpY2FsdywgCgkJCQkJCWNoYXIgKipzZXExLCBjaGFyICoqc2VxMiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiptc2VxMSwgY2hhciAqKm1zZXEyLCAKICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKipjcG14MSwgZmxvYXQgKipjcG14MiwgCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAqKmlqcCwgaW50IGljeWMsIGludCBqY3ljICkKewoJaW50IGksIGosIGwsIGlpbiwgamluLCBpZmksIGpmaSwgbGd0aDEsIGxndGgyLCBrOwoJZmxvYXQgd207CgljaGFyICpnYXB0YWJsZTEsICpndDFiazsKCWNoYXIgKmdhcHRhYmxlMiwgKmd0MmJrOwoJbGd0aDEgPSBzdHJsZW4oIHNlcTFbMF0gKTsKCWxndGgyID0gc3RybGVuKCBzZXEyWzBdICk7CgoJZ3QxYmsgPSBBbGxvY2F0ZUNoYXJWZWMoIGxndGgxK2xndGgyKzEgKTsKCWd0MmJrID0gQWxsb2NhdGVDaGFyVmVjKCBsZ3RoMStsZ3RoMisxICk7CgojaWYgMAoJZm9yKCBpPTA7IGk8bGd0aDE7IGkrKyApIAoJewoJCWZwcmludGYoIHN0ZGVyciwgImxhc3R2ZXJ0aWNhbHdbJWRdID0gJWZcbiIsIGksIGxhc3R2ZXJ0aWNhbHdbaV0gKTsKCX0KI2VuZGlmCiAKCWlmKCBvdXRnYXAgPT0gMSApCgkJOwoJZWxzZQoJewoJCXdtID0gbGFzdHZlcnRpY2Fsd1swXTsKCQlmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkKCQl7CgkJCWlmKCBsYXN0dmVydGljYWx3W2ldID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0dmVydGljYWx3W2ldOwoJCQkJaWluID0gaTsgamluID0gbGd0aDItMTsKCQkJCWlqcFtsZ3RoMV1bbGd0aDJdID0gKyggbGd0aDEgLSBpICk7CgkJCX0KCQl9CgkJZm9yKCBqPTA7IGo8bGd0aDI7IGorKyApCgkJewoJCQlpZiggbGFzdGhvcml6b250YWx3W2pdID49IHdtICkKCQkJewoJCQkJd20gPSBsYXN0aG9yaXpvbnRhbHdbal07CgkJCQlpaW4gPSBsZ3RoMS0xOyBqaW4gPSBqOwoJCQkJaWpwW2xndGgxXVtsZ3RoMl0gPSAtKCBsZ3RoMiAtIGogKTsKCQkJfQoJCX0KCX0KCiAgICBmb3IoIGk9MDsgaTxsZ3RoMSsxOyBpKysgKSAKICAgIHsKICAgICAgICBpanBbaV1bMF0gPSBpICsgMTsKICAgIH0KICAgIGZvciggaj0wOyBqPGxndGgyKzE7IGorKyApIAogICAgewogICAgICAgIGlqcFswXVtqXSA9IC0oIGogKyAxICk7CiAgICB9CgoJZ2FwdGFibGUxID0gZ3QxYmsgKyBsZ3RoMStsZ3RoMjsKCSpnYXB0YWJsZTEgPSAwOwoJZ2FwdGFibGUyID0gZ3QyYmsgKyBsZ3RoMStsZ3RoMjsKCSpnYXB0YWJsZTIgPSAwOwoKCWlpbiA9IGxndGgxOyBqaW4gPSBsZ3RoMjsKCWZvciggaz0wOyBrPD1sZ3RoMStsZ3RoMjsgaysrICkgCgl7CgkJaWYoIGlqcFtpaW5dW2ppbl0gPCAwICkgCgkJewoJCQlpZmkgPSBpaW4tMTsgamZpID0gamluK2lqcFtpaW5dW2ppbl07CgkJfQoJCWVsc2UgaWYoIGlqcFtpaW5dW2ppbl0gPiAwICkKCQl7CgkJCWlmaSA9IGlpbi1panBbaWluXVtqaW5dOyBqZmkgPSBqaW4tMTsKCQl9CgkJZWxzZQoJCXsKCQkJaWZpID0gaWluLTE7IGpmaSA9IGppbi0xOwoJCX0KCQlsID0gaWluIC0gaWZpOwoJCXdoaWxlKCAtLWwgKSAKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkJKi0tZ2FwdGFibGUyID0gJy0nOwoJCQlrKys7CgkJfQoJCWw9IGppbiAtIGpmaTsKCQl3aGlsZSggLS1sICkKCQl7CgkJCSotLWdhcHRhYmxlMSA9ICctJzsKCQkJKi0tZ2FwdGFibGUyID0gJ28nOwoJCQlrKys7CgkJfQoJCWlmKCBpaW4gPD0gMCB8fCBqaW4gPD0gMCApIGJyZWFrOwoJCSotLWdhcHRhYmxlMSA9ICdvJzsKCQkqLS1nYXB0YWJsZTIgPSAnbyc7CgkJaysrOwoJCWlpbiA9IGlmaTsgamluID0gamZpOwoJfQoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGdhcGlyZXJ1KCBtc2VxMVtpXSwgc2VxMVtpXSwgZ2FwdGFibGUxICk7Cglmb3IoIGo9MDsgajxqY3ljOyBqKysgKSBnYXBpcmVydSggbXNlcTJbal0sIHNlcTJbal0sIGdhcHRhYmxlMiApOwoKCWZyZWUoIGd0MWJrICk7CglmcmVlKCBndDJiayApOwoKCXJldHVybiggMC4wICk7Cn0KCmZsb2F0IEFfX2FsaWduKCBjaGFyICoqc2VxMSwgY2hhciAqKnNlcTIsIGRvdWJsZSAqZWZmMSwgZG91YmxlICplZmYyLCBpbnQgaWN5YywgaW50IGpjeWMsIGludCBhbGxvY2xlbiwgTG9jYWxIb20gKioqbG9jYWxob20sIGZsb2F0ICppbXBtYXRjaCwgY2hhciAqc2dhcDEsIGNoYXIgKnNnYXAyLCBjaGFyICplZ2FwMSwgY2hhciAqZWdhcDIgKQovKiBzY29yZSBubyBrZWlzYW4gbm8gc2FpIG1vdG9rYXJhYXJ1IGdhcCBubyBhdHVrYWkgbmkgbW9uZGFpIGdhIGFydSAqLwp7Ci8vCWludCBrOwoJcmVnaXN0ZXIgaW50IGksIGo7CglpbnQgbGFzdGksIGxhc3RqOyAgICAgIC8qIG91dGdhcCA9PSAwIC0+IGxndGgxLCBvdXRnYXAgPT0gMSAtPiBsZ3RoMSsxICovCglpbnQgbGd0aDEsIGxndGgyOwoJaW50IHJlc3VsdGxlbjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7Ci8vCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CiNpZiBVU0VfUEVOQUxUWV9FWAoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpcGVuYWx0eV9leDsKI2VuZGlmCiNpZiAxCglmbG9hdCAqd3RtcDsKCWludCAqaWpwcHQ7CglmbG9hdCAqbWpwdCwgKnByZXB0LCAqY3VycHQ7CglpbnQgKm1wanB0OwojZW5kaWYKCXN0YXRpYyBmbG9hdCBtaSwgKm07CglzdGF0aWMgaW50ICoqaWpwOwoJc3RhdGljIGludCBtcGksICptcDsKCXN0YXRpYyBmbG9hdCAqdzEsICp3MjsKCXN0YXRpYyBmbG9hdCAqbWF0Y2g7CglzdGF0aWMgZmxvYXQgKmluaXR2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBmbG9hdCAqbGFzdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJc3RhdGljIGNoYXIgKiptc2VxMTsKCXN0YXRpYyBjaGFyICoqbXNlcTI7CglzdGF0aWMgY2hhciAqKm1zZXE7CglzdGF0aWMgZmxvYXQgKm9nY3AxOwoJc3RhdGljIGZsb2F0ICpvZ2NwMjsKCXN0YXRpYyBmbG9hdCAqZmdjcDE7CglzdGF0aWMgZmxvYXQgKmZnY3AyOwoJc3RhdGljIGZsb2F0ICoqY3BteDE7CglzdGF0aWMgZmxvYXQgKipjcG14MjsKCXN0YXRpYyBpbnQgKippbnR3b3JrOwoJc3RhdGljIGZsb2F0ICoqZmxvYXR3b3JrOwoJc3RhdGljIGludCBvcmxndGgxID0gMCwgb3JsZ3RoMiA9IDA7CglmbG9hdCBmcGVuYWx0eSA9IChmbG9hdClwZW5hbHR5OwoJZmxvYXQgKmZnY3AycHQ7CglmbG9hdCAqb2djcDJwdDsKCWZsb2F0IGZnY3AxdmE7CglmbG9hdCBvZ2NwMXZhOwoKCgojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyAgZWZmIGluIFNBKysrYWxpZ25cbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIyMgIHNlcTFbMF0gPSAlc1xuIiwgc2VxMVswXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyAgc3RybGVuKCBzZXExWzBdICkgPSAlZFxuIiwgc3RybGVuKCBzZXExWzBdICkgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwgImVmZjFbJWRdID0gJWZcbiIsIGksIGVmZjFbaV0gKTsKI2VuZGlmCglpZiggb3JsZ3RoMSA9PSAwICkKCXsKCQltc2VxMSA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJCW1zZXEyID0gQWxsb2NhdGVDaGFyTXR4KCBuam9iLCAwICk7Cgl9CgoKCWxndGgxID0gc3RybGVuKCBzZXExWzBdICk7CglsZ3RoMiA9IHN0cmxlbiggc2VxMlswXSApOwojaWYgMAoJaWYoIGxndGgxID09IDAgfHwgbGd0aDIgPT0gMCApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiV0FSTklORyAoQWFsaWdubW0pOiBsZ3RoMT0lZCwgbGd0aDI9JWRcbiIsIGxndGgxLCBsZ3RoMiApOwoJfQojZW5kaWYKCglpZiggbGd0aDEgPiBvcmxndGgxIHx8IGxndGgyID4gb3JsZ3RoMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggb3JsZ3RoMSA+IDAgJiYgb3JsZ3RoMiA+IDAgKQoJCXsKCQkJRnJlZUZsb2F0VmVjKCB3MSApOwoJCQlGcmVlRmxvYXRWZWMoIHcyICk7CgkJCUZyZWVGbG9hdFZlYyggbWF0Y2ggKTsKCQkJRnJlZUZsb2F0VmVjKCBpbml0dmVydGljYWx3ICk7CgkJCUZyZWVGbG9hdFZlYyggbGFzdHZlcnRpY2FsdyApOwoKCQkJRnJlZUZsb2F0VmVjKCBtICk7CgkJCUZyZWVJbnRWZWMoIG1wICk7CgoJCQlGcmVlQ2hhck10eCggbXNlcSApOwoKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMSApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDEgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMiApOwoKCgkJCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCQkJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoKCQkJRnJlZUZsb2F0TXR4KCBmbG9hdHdvcmsgKTsKCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgkJb2djcDEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCW9nY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoKCQljcG14MSA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDErMiApOwoJCWNwbXgyID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMisyICk7CgojaWYgRkFTVE1BVENIQ0FMQwoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNyApOyAKI2Vsc2UKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCiNlbmRpZgoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKCQlvcmxndGgxID0gbGwxIC0gMTAwOwoJCW9ybGd0aDIgPSBsbDIgLSAxMDA7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJbXNlcTFbaV0gPSBtc2VxW2ldOwoJCXNlcTFbaV1bbGd0aDFdID0gMDsKCX0KCWZvciggaj0wOyBqPGpjeWM7IGorKyApCgl7CgkJbXNlcTJbal0gPSBtc2VxW2ljeWMral07CgkJc2VxMltqXVtsZ3RoMl0gPSAwOwoJfQoKCglpZiggb3JsZ3RoMSA+IGNvbW1vbkFsbG9jMSB8fCBvcmxndGgyID4gY29tbW9uQWxsb2MyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBjb21tb25BbGxvYzEgJiYgY29tbW9uQWxsb2MyICkKCQl7CgkJCUZyZWVJbnRNdHgoIGNvbW1vbklQICk7CgkJfQoKCQlsbDEgPSBNQVgoIG9ybGd0aDEsIGNvbW1vbkFsbG9jMSApOwoJCWxsMiA9IE1BWCggb3JsZ3RoMiwgY29tbW9uQWxsb2MyICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcblxudHJ5aW5nIHRvIGFsbG9jYXRlICVkeCVkIG1hdHJpY2VzIC4uLiAiLCBsbDErMSwgbGwyKzEgKTsKI2VuZGlmCgoJCWNvbW1vbklQID0gQWxsb2NhdGVJbnRNdHgoIGxsMSsxMCwgbGwyKzEwICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCgkJY29tbW9uQWxsb2MxID0gbGwxOwoJCWNvbW1vbkFsbG9jMiA9IGxsMjsKCX0KCWlqcCA9IGNvbW1vbklQOwoKI2lmIDAKCXsKCQlmbG9hdCB0ID0gMC4wOwoJCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgkJCXQgKz0gZWZmMVtpXTsKCWZwcmludGYoIHN0ZGVyciwgIiMjIHRvdGFsZWZmID0gJWZcbiIsIHQgKTsKCX0KI2VuZGlmCgoJY3BteF9jYWxjX25ldyggc2VxMSwgY3BteDEsIGVmZjEsIGxndGgxLCBpY3ljICk7CgljcG14X2NhbGNfbmV3KCBzZXEyLCBjcG14MiwgZWZmMiwgbGd0aDIsIGpjeWMgKTsKCglpZiggc2dhcDEgKQoJewoJCW5ld19PcGVuaW5nR2FwQ291bnQoIG9nY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgc2dhcDEgKTsKCQluZXdfT3BlbmluZ0dhcENvdW50KCBvZ2NwMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIsIHNnYXAyICk7CgkJbmV3X0ZpbmFsR2FwQ291bnQoIGZnY3AxLCBpY3ljLCBzZXExLCBlZmYxLCBsZ3RoMSwgZWdhcDEgKTsKCQluZXdfRmluYWxHYXBDb3VudCggZmdjcDIsIGpjeWMsIHNlcTIsIGVmZjIsIGxndGgyLCBlZ2FwMiApOwoJfQoJZWxzZQoJewoJCXN0X09wZW5pbmdHYXBDb3VudCggb2djcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CgkJc3RfT3BlbmluZ0dhcENvdW50KCBvZ2NwMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCQlzdF9GaW5hbEdhcENvdW50KCBmZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgKTsKCQlzdF9GaW5hbEdhcENvdW50KCBmZ2NwMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCX0KCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJb2djcDFbaV0gPSAwLjUgKiAoIDEuMCAtIG9nY3AxW2ldICkgKiBmcGVuYWx0eTsKCQlmZ2NwMVtpXSA9IDAuNSAqICggMS4wIC0gZmdjcDFbaV0gKSAqIGZwZW5hbHR5OwoJfQoJZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJewoJCW9nY3AyW2ldID0gMC41ICogKCAxLjAgLSBvZ2NwMltpXSApICogZnBlbmFsdHk7CgkJZmdjcDJbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AyW2ldICkgKiBmcGVuYWx0eTsKCX0KI2lmIDAKCWZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCQlmcHJpbnRmKCBzdGRlcnIsICJvZ2NwMVslZF09JWZcbiIsIGksIG9nY3AxW2ldICk7CiNlbmRpZgoKCWN1cnJlbnR3ID0gdzE7CglwcmV2aW91c3cgPSB3MjsKCgltYXRjaF9jYWxjKCBpbml0dmVydGljYWx3LCBjcG14MiwgY3BteDEsIDAsIGxndGgxLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX291dF92ZWFkX3RhdGUoIGluaXR2ZXJ0aWNhbHcsIDAsIGxndGgxICk7IC8vIDA2MDMwNgoKCW1hdGNoX2NhbGMoIGN1cnJlbnR3LCBjcG14MSwgY3BteDIsIDAsIGxndGgyLCBmbG9hdHdvcmssIGludHdvcmssIDEgKTsKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX291dF92ZWFkKCBjdXJyZW50dywgMCwgbGd0aDIgKTsgLy8gMDYwMzA2CiNpZiAwIC8vIC0+IHRiZmFzdC5jCglpZiggbG9jYWxob20gKQoJCWltcF9tYXRjaF9jYWxjKCBjdXJyZW50dywgaWN5YywgamN5YywgbGd0aDEsIGxndGgyLCBzZXExLCBzZXEyLCBlZmYxLCBlZmYyLCBsb2NhbGhvbSwgMSwgMCApOwoKI2VuZGlmCgoJaWYoIG91dGdhcCA9PSAxICkKCXsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCXsKCQkJaW5pdHZlcnRpY2Fsd1tpXSArPSAoIG9nY3AxWzBdICsgZmdjcDFbaS0xXSApIDsKCQl9CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQl7CgkJCWN1cnJlbnR3W2pdICs9ICggb2djcDJbMF0gKyBmZ2NwMltqLTFdICkgOwoJCX0KCX0KI2lmIE9VVEdBUDBUUlkKCWVsc2UKCXsKCQlmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJCQljdXJyZW50d1tqXSAtPSBvZmZzZXQgKiBqIC8gMi4wOwoJCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgkJCWluaXR2ZXJ0aWNhbHdbaV0gLT0gb2Zmc2V0ICogaSAvIDIuMDsKCX0KI2VuZGlmCgoJZm9yKCBqPTE7IGo8bGd0aDIrMTsgKytqICkgCgl7CgkJbVtqXSA9IGN1cnJlbnR3W2otMV0gKyBvZ2NwMVsxXTsgbXBbal0gPSAwOwoJfQoJaWYoIGxndGgyID09IDAgKQoJCWxhc3R2ZXJ0aWNhbHdbMF0gPSAwLjA7IC8vIEZhbGlnbiBrYXJhIHlvYmFyZXRhdG9raSBrb3VuYXJ1a2Fub3VzZWkgYXJpCgllbHNlCgkJbGFzdHZlcnRpY2Fsd1swXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKCWlmKCBvdXRnYXAgKSBsYXN0aSA9IGxndGgxKzE7IGVsc2UgbGFzdGkgPSBsZ3RoMTsKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImluaXR2ZXJ0aWNhbHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDIrMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgaW5pdHZlcnRpY2Fsd1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJmY2dwXG4iICk7CmZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbJWRdPSVmXG4iLCBpLCBvZ2NwMltpXSApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxLCBjcG14MiwgaSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMCApOwojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJaWYoIGxvY2FsaG9tICkKCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiQ2FsbGluZyBpbXBfbWF0Y2hfY2FsYyAobykgbGd0aCA9ICVkLCBpID0gJWRcbiIsIGxndGgxLCBpICk7CiNpZiAgMAoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWQoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZWxzZQoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWQoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZW5kaWYKCQl9CiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJpPSVkXG4iLCBpICk7CmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaj0wOyBqPGxndGgyOyBqKysgKQp7CglmcHJpbnRmKCBzdGRlcnIsICIlNS4yZiAiLCBjdXJyZW50d1tqXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwojZW5kaWYKCQljdXJyZW50d1swXSA9IGluaXR2ZXJ0aWNhbHdbaV07CgoKCQltaSA9IHByZXZpb3Vzd1swXSArIG9nY3AyWzFdOyBtcGkgPSAwOwoJCWlqcHB0ID0gaWpwW2ldICsgMTsKCQltanB0ID0gbSArIDE7CgkJcHJlcHQgPSBwcmV2aW91c3c7CgkJY3VycHQgPSBjdXJyZW50dyArIDE7CgkJbXBqcHQgPSBtcCArIDE7CgkJZmdjcDJwdCA9IGZnY3AyOwoJCW9nY3AycHQgPSBvZ2NwMiArIDE7CgkJZmdjcDF2YSA9IGZnY3AxW2ktMV07CgkJb2djcDF2YSA9IG9nY3AxW2ldOwoJCWxhc3RqID0gbGd0aDIrMTsKCQlmb3IoIGo9MTsgajxsYXN0ajsgaisrICkKCQl7CgkJCXdtID0gKnByZXB0OwoJCQkqaWpwcHQgPSAwOwoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiJTUuMGYtPiIsIHdtICk7CiNlbmRpZgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggKGc9bWkrKmZnY3AycHQpID4gd20gKQoJCQl7CgkJCQl3bSA9IGc7CgkJCQkqaWpwcHQgPSAtKCBqIC0gbXBpICk7CgkJCX0KCQkJaWYoIChnPSpwcmVwdCsqb2djcDJwdCkgPj0gbWkgKQoJCQl7CgkJCQltaSA9IGc7CgkJCQltcGkgPSBqLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1pICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCiNpZiAwIAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggKGc9Km1qcHQrZmdjcDF2YSkgPiB3bSApCgkJCXsKCQkJCXdtID0gZzsKCQkJCSppanBwdCA9ICsoIGkgLSAqbXBqcHQgKTsKCQkJfQoJCQlpZiggKGc9KnByZXB0K29nY3AxdmEpID49ICptanB0ICkKCQkJewoJCQkJKm1qcHQgPSBnOwoJCQkJKm1wanB0ID0gaS0xOwoJCQl9CiNpZiBVU0VfUEVOQUxUWV9FWAoJCQltW2pdICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgIiU1LjBmICIsIHdtICk7CiNlbmRpZgoJCQkqY3VycHQrKyArPSB3bTsKCQkJaWpwcHQrKzsKCQkJbWpwdCsrOwoJCQlwcmVwdCsrOwoJCQltcGpwdCsrOwoJCQlmZ2NwMnB0Kys7CgkJCW9nY3AycHQrKzsKCQl9CgkJbGFzdHZlcnRpY2Fsd1tpXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoJfQoKLy8JZnByaW50Ziggc3RkZXJyLCAid20gPSAlZlxuIiwgd20gKTsKCiNpZiBPVVRHQVAwVFJZCglpZiggIW91dGdhcCApCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogKCBsZ3RoMiAtIGogKSAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlsYXN0dmVydGljYWx3W2ldIC09IG9mZnNldCAqICggbGd0aDEgLSBpICAvIDIuMCk7Cgl9CiNlbmRpZgoJCQoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCIlc1xuIiwgc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTJbal0gKTsKCWZwcmludGYoIHN0ZGVyciwgIj09PT0+IiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMVtpXSwgc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBtc2VxMltqXSwgc2VxMltqXSApOwoJKi8KCWlmKCBsb2NhbGhvbSApCgl7CgkJQXRyYWNraW5nX2xvY2FsaG9tKCBpbXBtYXRjaCwgY3VycmVudHcsIGxhc3R2ZXJ0aWNhbHcsIHNlcTEsIHNlcTIsIG1zZXExLCBtc2VxMiwgY3BteDEsIGNwbXgyLCBpanAsIGljeWMsIGpjeWMgKTsKCX0KCWVsc2UKCQlBdHJhY2tpbmcoIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljICk7CgovLwlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaW1wbWF0Y2ggPSAlZlxuIiwgKmltcG1hdGNoICk7CgoJcmVzdWx0bGVuID0gc3RybGVuKCBtc2VxMVswXSApOwoJaWYoIGFsbG9jbGVuIDwgcmVzdWx0bGVuIHx8IHJlc3VsdGxlbiA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgImFsbG9jbGVuPSVkLCByZXN1bHRsZW49JWQsIE49JWRcbiIsIGFsbG9jbGVuLCByZXN1bHRsZW4sIE4gKTsKCQlFcnJvckV4aXQoICJMRU5HVEggT1ZFUiFcbiIgKTsKCX0KCgoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBzZXExW2ldLCBtc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBzZXEyW2pdLCBtc2VxMltqXSApOwoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXExW2ldICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjI1xuIiApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgZnByaW50Ziggc3RkZXJyLCAiJXNcbiIsIG1zZXEyW2pdICk7CgkqLwoKLy8JZnByaW50Ziggc3RkZXJyLCAid20gPSAlZlxuIiwgd20gKTsKCglyZXR1cm4oIHdtICk7Cn0KCmZsb2F0IEFfX2FsaWduX2dhcG1hcCggY2hhciAqKnNlcTEsIGNoYXIgKipzZXEyLCBkb3VibGUgKmVmZjEsIGRvdWJsZSAqZWZmMiwgaW50IGljeWMsIGludCBqY3ljLCBpbnQgYWxsb2NsZW4sIExvY2FsSG9tICoqKmxvY2FsaG9tLCBmbG9hdCAqaW1wbWF0Y2gsIGludCAqZ2FwbWFwMSwgaW50ICpnYXBtYXAyICkKLyogc2NvcmUgbm8ga2Vpc2FuIG5vIHNhaSBtb3Rva2FyYWFydSBnYXAgbm8gYXR1a2FpIG5pIG1vbmRhaSBnYSBhcnUgKi8KewovLwlpbnQgazsKCXJlZ2lzdGVyIGludCBpLCBqOwoJaW50IGxhc3RpLCBsYXN0ajsgICAgIC8qIG91dGdhcCA9PSAwIC0+IGxndGgxLCBvdXRnYXAgPT0gMSAtPiBsZ3RoMSsxICovCglpbnQgbGd0aDEsIGxndGgyOwoJaW50IHJlc3VsdGxlbjsKCWZsb2F0IHdtID0gMC4wOyAgIC8qIGludCA/Pz8/Pz8gKi8KCWZsb2F0IGc7CglmbG9hdCAqY3VycmVudHcsICpwcmV2aW91c3c7Ci8vCWZsb2F0IGZwZW5hbHR5ID0gKGZsb2F0KXBlbmFsdHk7CiNpZiBVU0VfUEVOQUxUWV9FWAoJZmxvYXQgZnBlbmFsdHlfZXggPSAoZmxvYXQpcGVuYWx0eV9leDsKI2VuZGlmCiNpZiAxCglmbG9hdCAqd3RtcDsKCWludCAqaWpwcHQ7CglmbG9hdCAqbWpwdCwgKnByZXB0LCAqY3VycHQ7CglpbnQgKm1wanB0OwojZW5kaWYKCXN0YXRpYyBmbG9hdCBtaSwgKm07CglzdGF0aWMgaW50ICoqaWpwOwoJc3RhdGljIGludCBtcGksICptcDsKCXN0YXRpYyBmbG9hdCAqdzEsICp3MjsKCXN0YXRpYyBmbG9hdCAqbWF0Y2g7CglzdGF0aWMgZmxvYXQgKmluaXR2ZXJ0aWNhbHc7ICAgIC8qIGt1ZnV1IHN1cmViYSBpcmFuYWkgKi8KCXN0YXRpYyBmbG9hdCAqbGFzdHZlcnRpY2FsdzsgICAgLyoga3VmdXUgc3VyZWJhIGlyYW5haSAqLwoJc3RhdGljIGNoYXIgKiptc2VxMTsKCXN0YXRpYyBjaGFyICoqbXNlcTI7CglzdGF0aWMgY2hhciAqKm1zZXE7CglzdGF0aWMgZmxvYXQgKm9nY3AxOwoJc3RhdGljIGZsb2F0ICpvZ2NwMjsKCXN0YXRpYyBmbG9hdCAqZmdjcDE7CglzdGF0aWMgZmxvYXQgKmZnY3AyOwoJc3RhdGljIGZsb2F0ICoqY3BteDE7CglzdGF0aWMgZmxvYXQgKipjcG14MjsKCXN0YXRpYyBpbnQgKippbnR3b3JrOwoJc3RhdGljIGZsb2F0ICoqZmxvYXR3b3JrOwoJc3RhdGljIGludCBvcmxndGgxID0gMCwgb3JsZ3RoMiA9IDA7CglmbG9hdCAqZmdjcDJwdDsKCWZsb2F0ICpvZ2NwMnB0OwoJZmxvYXQgZmdjcDF2YTsKCWZsb2F0IG9nY3AxdmE7CgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgImVmZiBpbiBTQSsrK2FsaWduXG4iICk7Cglmb3IoIGk9MDsgaTxpY3ljOyBpKysgKSBmcHJpbnRmKCBzdGRlcnIsICJlZmYxWyVkXSA9ICVmXG4iLCBpLCBlZmYxW2ldICk7CiNlbmRpZgoJaWYoIG9ybGd0aDEgPT0gMCApCgl7CgkJbXNlcTEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIDAgKTsKCQltc2VxMiA9IEFsbG9jYXRlQ2hhck10eCggbmpvYiwgMCApOwoJfQoKCglsZ3RoMSA9IHN0cmxlbiggc2VxMVswXSApOwoJbGd0aDIgPSBzdHJsZW4oIHNlcTJbMF0gKTsKI2lmIDAKCWlmKCBsZ3RoMSA9PSAwIHx8IGxndGgyID09IDAgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIldBUk5JTkcgKEFhbGlnbl9nYXBtYXApOiBsZ3RoMT0lZCwgbGd0aDI9JWRcbiIsIGxndGgxLCBsZ3RoMiApOwoJfQojZW5kaWYKCglpZiggbGd0aDEgPiBvcmxndGgxIHx8IGxndGgyID4gb3JsZ3RoMiApCgl7CgkJaW50IGxsMSwgbGwyOwoKCQlpZiggb3JsZ3RoMSA+IDAgJiYgb3JsZ3RoMiA+IDAgKQoJCXsKCQkJRnJlZUZsb2F0VmVjKCB3MSApOwoJCQlGcmVlRmxvYXRWZWMoIHcyICk7CgkJCUZyZWVGbG9hdFZlYyggbWF0Y2ggKTsKCQkJRnJlZUZsb2F0VmVjKCBpbml0dmVydGljYWx3ICk7CgkJCUZyZWVGbG9hdFZlYyggbGFzdHZlcnRpY2FsdyApOwoKCQkJRnJlZUZsb2F0VmVjKCBtICk7CgkJCUZyZWVJbnRWZWMoIG1wICk7CgoJCQlGcmVlQ2hhck10eCggbXNlcSApOwoKCQkJRnJlZUZsb2F0VmVjKCBvZ2NwMSApOwoJCQlGcmVlRmxvYXRWZWMoIG9nY3AyICk7CgkJCUZyZWVGbG9hdFZlYyggZmdjcDEgKTsKCQkJRnJlZUZsb2F0VmVjKCBmZ2NwMiApOwoKCgkJCUZyZWVGbG9hdE10eCggY3BteDEgKTsKCQkJRnJlZUZsb2F0TXR4KCBjcG14MiApOwoKCQkJRnJlZUZsb2F0TXR4KCBmbG9hdHdvcmsgKTsKCQkJRnJlZUludE10eCggaW50d29yayApOwoJCX0KCgkJbGwxID0gTUFYKCAoaW50KSgxLjMqbGd0aDEpLCBvcmxndGgxICkgKyAxMDA7CgkJbGwyID0gTUFYKCAoaW50KSgxLjMqbGd0aDIpLCBvcmxndGgyICkgKyAxMDA7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcbnRyeWluZyB0byBhbGxvY2F0ZSAoJWQrJWQpeG4gbWF0cmljZXMgLi4uICIsIGxsMSwgbGwyICk7CiNlbmRpZgoKCQl3MSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMisyICk7CgkJdzIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1hdGNoID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCgkJaW5pdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJbGFzdHZlcnRpY2FsdyA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgoJCW0gPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoJCW1wID0gQWxsb2NhdGVJbnRWZWMoIGxsMisyICk7CgoJCW1zZXEgPSBBbGxvY2F0ZUNoYXJNdHgoIG5qb2IsIGxsMStsbDIgKTsKCgkJb2djcDEgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDErMiApOwoJCW9nY3AyID0gQWxsb2NhdGVGbG9hdFZlYyggbGwyKzIgKTsKCQlmZ2NwMSA9IEFsbG9jYXRlRmxvYXRWZWMoIGxsMSsyICk7CgkJZmdjcDIgPSBBbGxvY2F0ZUZsb2F0VmVjKCBsbDIrMiApOwoKCQljcG14MSA9IEFsbG9jYXRlRmxvYXRNdHgoIDI2LCBsbDErMiApOwoJCWNwbXgyID0gQWxsb2NhdGVGbG9hdE10eCggMjYsIGxsMisyICk7CgojaWYgRkFTVE1BVENIQ0FMQwoJCWZsb2F0d29yayA9IEFsbG9jYXRlRmxvYXRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKCQlpbnR3b3JrID0gQWxsb2NhdGVJbnRNdHgoIE1BWCggbGwxLCBsbDIgKSsyLCAyNiApOyAKI2Vsc2UKCQlmbG9hdHdvcmsgPSBBbGxvY2F0ZUZsb2F0TXR4KCAyNiwgTUFYKCBsbDEsIGxsMiApKzIgKTsgCgkJaW50d29yayA9IEFsbG9jYXRlSW50TXR4KCAyNywgTUFYKCBsbDEsIGxsMiApKzIgKTsgCiNlbmRpZgoKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAic3VjY2VlZGVkXG4iICk7CiNlbmRpZgoKCQlvcmxndGgxID0gbGwxIC0gMTAwOwoJCW9ybGd0aDIgPSBsbDIgLSAxMDA7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApCgl7CgkJbXNlcTFbaV0gPSBtc2VxW2ldOwoJCXNlcTFbaV1bbGd0aDFdID0gMDsKCX0KCWZvciggaj0wOyBqPGpjeWM7IGorKyApCgl7CgkJbXNlcTJbal0gPSBtc2VxW2ljeWMral07CgkJc2VxMltqXVtsZ3RoMl0gPSAwOwoJfQoKCglpZiggb3JsZ3RoMSA+IGNvbW1vbkFsbG9jMSB8fCBvcmxndGgyID4gY29tbW9uQWxsb2MyICkKCXsKCQlpbnQgbGwxLCBsbDI7CgoJCWlmKCBjb21tb25BbGxvYzEgJiYgY29tbW9uQWxsb2MyICkKCQl7CgkJCUZyZWVJbnRNdHgoIGNvbW1vbklQICk7CgkJfQoKCQlsbDEgPSBNQVgoIG9ybGd0aDEsIGNvbW1vbkFsbG9jMSApOwoJCWxsMiA9IE1BWCggb3JsZ3RoMiwgY29tbW9uQWxsb2MyICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJcblxudHJ5aW5nIHRvIGFsbG9jYXRlICVkeCVkIG1hdHJpY2VzIC4uLiAiLCBsbDErMSwgbGwyKzEgKTsKI2VuZGlmCgoJCWNvbW1vbklQID0gQWxsb2NhdGVJbnRNdHgoIGxsMSsxMCwgbGwyKzEwICk7CgojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJzdWNjZWVkZWRcblxuIiApOwojZW5kaWYKCgkJY29tbW9uQWxsb2MxID0gbGwxOwoJCWNvbW1vbkFsbG9jMiA9IGxsMjsKCX0KCWlqcCA9IGNvbW1vbklQOwoKCWNwbXhfY2FsY19uZXcoIHNlcTEsIGNwbXgxLCBlZmYxLCBzdHJsZW4oIHNlcTFbMF0gKSwgaWN5YyApOwoJY3BteF9jYWxjX25ldyggc2VxMiwgY3BteDIsIGVmZjIsIHN0cmxlbiggc2VxMlswXSApLCBqY3ljICk7CgoJc3RfT3BlbmluZ0dhcENvdW50KCBvZ2NwMSwgaWN5Yywgc2VxMSwgZWZmMSwgbGd0aDEgICk7CglzdF9PcGVuaW5nR2FwQ291bnQoIG9nY3AyLCBqY3ljLCBzZXEyLCBlZmYyLCBsZ3RoMiApOwoJc3RfRmluYWxHYXBDb3VudCggZmdjcDEsIGljeWMsIHNlcTEsIGVmZjEsIGxndGgxICk7CglzdF9GaW5hbEdhcENvdW50KCBmZ2NwMiwgamN5Yywgc2VxMiwgZWZmMiwgbGd0aDIgKTsKCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgl7CgkJb2djcDFbaV0gPSAwLjUgKiAoIDEuMCAtIG9nY3AxW2ldICk7CgkJZmdjcDFbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AxW2ldICk7Cgl9Cglmb3IoIGk9MDsgaTxsZ3RoMjsgaSsrICkgCgl7CgkJb2djcDJbaV0gPSAwLjUgKiAoIDEuMCAtIG9nY3AyW2ldICk7CgkJZmdjcDJbaV0gPSAwLjUgKiAoIDEuMCAtIGZnY3AyW2ldICk7Cgl9CiNpZiAwCglmb3IoIGk9MDsgaTxsZ3RoMTsgaSsrICkgCgkJZnByaW50Ziggc3RkZXJyLCAib2djcDFbJWRdPSVmXG4iLCBpLCBvZ2NwMVtpXSApOwojZW5kaWYKCgljdXJyZW50dyA9IHcxOwoJcHJldmlvdXN3ID0gdzI7CgoKCW1hdGNoX2NhbGMoIGluaXR2ZXJ0aWNhbHcsIGNwbXgyLCBjcG14MSwgMCwgbGd0aDEsIGZsb2F0d29yaywgaW50d29yaywgMSApOwoJaWYoIGxvY2FsaG9tICkKCQlpbXBfbWF0Y2hfb3V0X3ZlYWRfdGF0ZV9nYXBtYXAoIGluaXR2ZXJ0aWNhbHcsIGdhcG1hcDJbMF0sIGxndGgxLCBnYXBtYXAxICk7IC8vIDA2MDMwNgoKCgltYXRjaF9jYWxjKCBjdXJyZW50dywgY3BteDEsIGNwbXgyLCAwLCBsZ3RoMiwgZmxvYXR3b3JrLCBpbnR3b3JrLCAxICk7CglpZiggbG9jYWxob20gKQoJCWltcF9tYXRjaF9vdXRfdmVhZF9nYXBtYXAoIGN1cnJlbnR3LCBnYXBtYXAxWzBdLCBsZ3RoMiwgZ2FwbWFwMiApOyAvLyAwNjAzMDYKI2lmIDAgLy8gLT4gdGJmYXN0LmMKCWlmKCBsb2NhbGhvbSApCgkJaW1wX21hdGNoX2NhbGMoIGN1cnJlbnR3LCBpY3ljLCBqY3ljLCBsZ3RoMSwgbGd0aDIsIHNlcTEsIHNlcTIsIGVmZjEsIGVmZjIsIGxvY2FsaG9tLCAxLCAwICk7CgojZW5kaWYKCglpZiggb3V0Z2FwID09IDEgKQoJewoJCWZvciggaT0xOyBpPGxndGgxKzE7IGkrKyApCgkJewoJCQlpbml0dmVydGljYWx3W2ldICs9ICggb2djcDFbMF0gKyBmZ2NwMVtpLTFdICkgOwoJCX0KCQlmb3IoIGo9MTsgajxsZ3RoMisxOyBqKysgKQoJCXsKCQkJY3VycmVudHdbal0gKz0gKCBvZ2NwMlswXSArIGZnY3AyW2otMV0gKSA7CgkJfQoJfQojaWYgT1VUR0FQMFRSWQoJZWxzZQoJewoJCWZvciggaj0xOyBqPGxndGgyKzE7IGorKyApCgkJCWN1cnJlbnR3W2pdIC09IG9mZnNldCAqIGogLyAyLjA7CgkJZm9yKCBpPTE7IGk8bGd0aDErMTsgaSsrICkKCQkJaW5pdHZlcnRpY2Fsd1tpXSAtPSBvZmZzZXQgKiBpIC8gMi4wOwoJfQojZW5kaWYKCglmb3IoIGo9MTsgajxsZ3RoMisxOyArK2ogKSAKCXsKCQltW2pdID0gY3VycmVudHdbai0xXSArIG9nY3AxWzFdOyBtcFtqXSA9IDA7Cgl9CgoJaWYoIGxndGgyID09IDAgKQoJCWxhc3R2ZXJ0aWNhbHdbMF0gPSAwLjA7CgllbHNlCgkJbGFzdHZlcnRpY2Fsd1swXSA9IGN1cnJlbnR3W2xndGgyLTFdOwoKCWlmKCBvdXRnYXAgKSBsYXN0aSA9IGxndGgxKzE7IGVsc2UgbGFzdGkgPSBsZ3RoMTsKCiNpZiBYWFhYWFhYCmZwcmludGYoIHN0ZGVyciwgImN1cnJlbnR3ID0gXG4iICk7CmZvciggaT0wOyBpPGxndGgxKzE7IGkrKyApCnsKCWZwcmludGYoIHN0ZGVyciwgIiU1LjJmICIsIGN1cnJlbnR3W2ldICk7Cn0KZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CmZwcmludGYoIHN0ZGVyciwgImluaXR2ZXJ0aWNhbHcgPSBcbiIgKTsKZm9yKCBpPTA7IGk8bGd0aDIrMTsgaSsrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgaW5pdHZlcnRpY2Fsd1tpXSApOwp9CmZwcmludGYoIHN0ZGVyciwgIlxuIiApOwpmcHJpbnRmKCBzdGRlcnIsICJmY2dwXG4iICk7CmZvciggaT0wOyBpPGxndGgxOyBpKysgKSAKCWZwcmludGYoIHN0ZGVyciwgImZnY3AxWyVkXT0lZlxuIiwgaSwgb2djcDFbaV0gKTsKZm9yKCBpPTA7IGk8bGd0aDI7IGkrKyApIAoJZnByaW50Ziggc3RkZXJyLCAiZmdjcDJbJWRdPSVmXG4iLCBpLCBvZ2NwMltpXSApOwojZW5kaWYKCglmb3IoIGk9MTsgaTxsYXN0aTsgaSsrICkKCXsKCQl3dG1wID0gcHJldmlvdXN3OyAKCQlwcmV2aW91c3cgPSBjdXJyZW50dzsKCQljdXJyZW50dyA9IHd0bXA7CgoJCXByZXZpb3Vzd1swXSA9IGluaXR2ZXJ0aWNhbHdbaS0xXTsKCgkJbWF0Y2hfY2FsYyggY3VycmVudHcsIGNwbXgxLCBjcG14MiwgaSwgbGd0aDIsIGZsb2F0d29yaywgaW50d29yaywgMCApOwojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJaWYoIGxvY2FsaG9tICkKCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiQ2FsbGluZyBpbXBfbWF0Y2hfY2FsYyAobykgbGd0aCA9ICVkLCBpID0gJWRcbiIsIGxndGgxLCBpICk7CiNpZiAgMAoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWQoIGN1cnJlbnR3LCBpLCBsZ3RoMiApOwojZWxzZQoJCQlpbXBfbWF0Y2hfb3V0X3ZlYWRfZ2FwbWFwKCBjdXJyZW50dywgZ2FwbWFwMVtpXSwgbGd0aDIsIGdhcG1hcDIgKTsKI2VuZGlmCgkJfQojaWYgWFhYWFhYWApmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKZnByaW50Ziggc3RkZXJyLCAiaT0lZFxuIiwgaSApOwpmcHJpbnRmKCBzdGRlcnIsICJjdXJyZW50dyA9IFxuIiApOwpmb3IoIGo9MDsgajxsZ3RoMjsgaisrICkKewoJZnByaW50Ziggc3RkZXJyLCAiJTUuMmYgIiwgY3VycmVudHdbal0gKTsKfQpmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKI2VuZGlmCgkJY3VycmVudHdbMF0gPSBpbml0dmVydGljYWx3W2ldOwoKCgkJbWkgPSBwcmV2aW91c3dbMF0gKyBvZ2NwMlsxXTsgbXBpID0gMDsKCgkJaWpwcHQgPSBpanBbaV0gKyAxOwoJCW1qcHQgPSBtICsgMTsKCQlwcmVwdCA9IHByZXZpb3VzdzsKCQljdXJwdCA9IGN1cnJlbnR3ICsgMTsKCQltcGpwdCA9IG1wICsgMTsKCQlmZ2NwMnB0ID0gZmdjcDI7CgkJb2djcDJwdCA9IG9nY3AyICsgMTsKCQlmZ2NwMXZhID0gZmdjcDFbaS0xXTsKCQlvZ2NwMXZhID0gb2djcDFbaV07CgkJbGFzdGogPSBsZ3RoMisxOwoJCWZvciggaj0xOyBqPGxhc3RqOyBqKysgKQoJCXsKCQkJd20gPSAqcHJlcHQ7CgkJCSppanBwdCA9IDA7CgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZi0+Iiwgd20gKTsKI2VuZGlmCgkJCWcgPSBtaSArICpmZ2NwMnB0OwojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJKmlqcHB0ID0gLSggaiAtIG1waSApOwoJCQl9CgkJCWcgPSAqcHJlcHQgKyAqb2djcDJwdDsKCQkJaWYoIGcgPj0gbWkgKQoJCQl7CgkJCQltaSA9IGc7CgkJCQltcGkgPSBqLTE7CgkJCX0KI2lmIFVTRV9QRU5BTFRZX0VYCgkJCW1pICs9IGZwZW5hbHR5X2V4OwojZW5kaWYKCgkJCWcgPSAqbWpwdCArIGZnY3AxdmE7CiNpZiAwIAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZj8iLCBnICk7CiNlbmRpZgoJCQlpZiggZyA+IHdtICkKCQkJewoJCQkJd20gPSBnOwoJCQkJKmlqcHB0ID0gKyggaSAtICptcGpwdCApOwoJCQl9CgkJCWcgPSAqcHJlcHQgKyBvZ2NwMXZhOwoJCQlpZiggZyA+PSAqbWpwdCApCgkJCXsKCQkJCSptanB0ID0gZzsKCQkJCSptcGpwdCA9IGktMTsKCQkJfQojaWYgVVNFX1BFTkFMVFlfRVgKCQkJbVtqXSArPSBmcGVuYWx0eV9leDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICIlNS4wZiAiLCB3bSApOwojZW5kaWYKCQkJKmN1cnB0KysgKz0gd207CgkJCWlqcHB0Kys7CgkJCW1qcHQrKzsKCQkJcHJlcHQrKzsKCQkJbXBqcHQrKzsKCQkJZmdjcDJwdCsrOwoJCQlvZ2NwMnB0Kys7CgkJfQoJCWxhc3R2ZXJ0aWNhbHdbaV0gPSBjdXJyZW50d1tsZ3RoMi0xXTsKCX0KCiNpZiBPVVRHQVAwVFJZCglpZiggIW91dGdhcCApCgl7CgkJZm9yKCBqPTE7IGo8bGd0aDIrMTsgaisrICkKCQkJY3VycmVudHdbal0gLT0gb2Zmc2V0ICogKCBsZ3RoMiAtIGogKSAvIDIuMDsKCQlmb3IoIGk9MTsgaTxsZ3RoMSsxOyBpKysgKQoJCQlsYXN0dmVydGljYWx3W2ldIC09IG9mZnNldCAqICggbGd0aDEgLSBpICAvIDIuMCk7Cgl9CiNlbmRpZgoJCQoJLyoKCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgZnByaW50Ziggc3RkZXJyLCIlc1xuIiwgc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwiJXNcbiIsIHNlcTJbal0gKTsKCWZwcmludGYoIHN0ZGVyciwgIj09PT0+IiApOwoJZm9yKCBpPTA7IGk8aWN5YzsgaSsrICkgc3RyY3B5KCBtc2VxMVtpXSwgc2VxMVtpXSApOwoJZm9yKCBqPTA7IGo8amN5YzsgaisrICkgc3RyY3B5KCBtc2VxMltqXSwgc2VxMltqXSApOwoJKi8KCWlmKCBsb2NhbGhvbSApCgl7CgkJQXRyYWNraW5nX2xvY2FsaG9tX2dhcG1hcCggaW1wbWF0Y2gsIGN1cnJlbnR3LCBsYXN0dmVydGljYWx3LCBzZXExLCBzZXEyLCBtc2VxMSwgbXNlcTIsIGNwbXgxLCBjcG14MiwgaWpwLCBpY3ljLCBqY3ljLCBnYXBtYXAxLCBnYXBtYXAyICk7Cgl9CgllbHNlCgkJQXRyYWNraW5nKCBjdXJyZW50dywgbGFzdHZlcnRpY2Fsdywgc2VxMSwgc2VxMiwgbXNlcTEsIG1zZXEyLCBjcG14MSwgY3BteDIsIGlqcCwgaWN5YywgamN5YyApOwoKLy8JZnByaW50Ziggc3RkZXJyLCAiIyMjIGltcG1hdGNoID0gJWZcbiIsICppbXBtYXRjaCApOwoKCXJlc3VsdGxlbiA9IHN0cmxlbiggbXNlcTFbMF0gKTsKCWlmKCBhbGxvY2xlbiA8IHJlc3VsdGxlbiB8fCByZXN1bHRsZW4gPiBOICkKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbGxvY2xlbj0lZCwgcmVzdWx0bGVuPSVkLCBOPSVkXG4iLCBhbGxvY2xlbiwgcmVzdWx0bGVuLCBOICk7CgkJRXJyb3JFeGl0KCAiTEVOR1RIIE9WRVIhXG4iICk7Cgl9CgoKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIHN0cmNweSggc2VxMVtpXSwgbXNlcTFbaV0gKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIHN0cmNweSggc2VxMltqXSwgbXNlcTJbal0gKTsKCS8qCglmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCWZvciggaT0wOyBpPGljeWM7IGkrKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMVtpXSApOwoJZnByaW50Ziggc3RkZXJyLCAiIyMjIyNcbiIgKTsKCWZvciggaj0wOyBqPGpjeWM7IGorKyApIGZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtc2VxMltqXSApOwoJKi8KCi8vCWZwcmludGYoIHN0ZGVyciwgIndtID0gJWZcbiIsIHdtICk7CgoJcmV0dXJuKCB3bSApOwp9CgpmbG9hdCB0cmFuc2xhdGVfYW5kX0NhbGlnbiggY2hhciAqKm1zZXExLCBjaGFyICoqbXNlcTIsIGRvdWJsZSAqZWZmYXJyMSwgZG91YmxlICplZmZhcnIyLCBpbnQgY2x1czEsIGludCBjbHVzMiwgaW50IGFsbG9jbGVuICkKewogICAgaW50IGk7CiAgICBmbG9hdCB3bTsKICAgIGNoYXIgKipyZXN1bHQ7CiAgICBjaGFyICpzZXEgPSBOVUxMLCAqKmFzZXEgPSBOVUxMOwogICAgZG91YmxlICplZmZhcnIgPSBOVUxMOwogICAgaW50IG5zZXEgPSAwOwoJaW50IHJlc3VsdGxlbjsKCiAgICBpZiAgICAgKCBjbHVzMSA9PSAxICYmIGNsdXMyICE9IDEgKSAKICAgIHsKICAgICAgICBzZXEgPSBtc2VxMVswXTsgYXNlcSA9IG1zZXEyOyBlZmZhcnIgPSBlZmZhcnIyOyBuc2VxID0gY2x1czIrMTsKI2lmIDAKCQlwcmludGYoICJlZmZhcnIgaW4gdHJhbnNsLi4uID0gXG4iICk7CgkJZm9yKCBpPTA7IGk8Y2x1czI7IGkrKyApIHByaW50ZiggIiVmICIsIGVmZmFycjJbaV0gKTsKI2VuZGlmCiAgICB9CiAgICBlbHNlIGlmKCBjbHVzMSAhPSAxICYmIGNsdXMyID09IDEgKSAKICAgIHsKICAgICAgICBzZXEgPSBtc2VxMlswXTsgYXNlcSA9IG1zZXExOyBlZmZhcnIgPSBlZmZhcnIxOyBuc2VxID0gY2x1czErMTsKICAgIH0KICAgIGVsc2UgRXJyb3JFeGl0KCAiRVJST1IgaW4gdHJhbnNsYXRlX2FuZF9DYWxpZ24iICk7CgogICAgcmVzdWx0ID0gQ2FsaWdubTEoICZ3bSwgYXNlcSwgc2VxLCBlZmZhcnIsIG5zZXEtMiwgMCApOwoKCXJlc3VsdGxlbiA9IHN0cmxlbiggcmVzdWx0WzBdICk7CglpZiggYWxsb2NsZW4gPCByZXN1bHRsZW4gfHwgcmVzdWx0bGVuID4gTiApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiYWxsb2NsZW49JWQsIHJlc3VsdGxlbj0lZCwgTj0lZFxuIiwgYWxsb2NsZW4sIHJlc3VsdGxlbiwgTiApOwoJCUVycm9yRXhpdCggIkxFTkdUSCBPVkVSIVxuIiApOwoJfQogICAgZm9yKCBpPTA7IGk8bnNlcS0xOyBpKysgKSBzdHJjcHkoIGFzZXFbaV0sIHJlc3VsdFtpXSApOwogICAgc3RyY3B5KCBzZXEsIHJlc3VsdFtuc2VxLTFdICk7CgogICAgcmV0dXJuKCAwLjAgKTsKfQo=