I2luY2x1ZGUgIm1sdGFsbi5oIgoKc3RhdGljIGludCB1cHBlckNhc2UgPSAwOwoKI2RlZmluZSBERUJVRyAgIDAKI2RlZmluZSBJT0RFQlVHIDAKCiNpZiAwCgpzdGF0aWMgaW50IGFkZGxvY2FsaG9tMiggY2hhciAqYWwxLCBjaGFyICphbDIsIExvY2FsSG9tICpsb2NhbGhvbXB0LCBpbnQgb2ZmMSwgaW50IG9mZjIsIGludCBvcHQsIGludCBvdmVybGFwYWEsIGludCBza2lwICkKewoJaW50IHBvczEsIHBvczIsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJY2hhciAqcHQxLCAqcHQyOwoJaW50IGlzY29yZTsKCWludCBpc3Vtc2NvcmU7CglpbnQgc3Vtb3ZlcmxhcDsKCUxvY2FsSG9tICp0bXBwdDsKCWludCBzdDsKCWludCBubG9jYWxob20gPSAwOwoJcHQxID0gYWwxOyBwdDIgPSBhbDI7Cglwb3MxID0gb2ZmMTsgcG9zMiA9IG9mZjI7CgoJaXN1bXNjb3JlID0gMDsKCXN1bW92ZXJsYXAgPSAwOwoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgIm5sb2NhbGhvbSA9ICVkIGluIGFkZGxvY2FsaG9tXG4iLCBubG9jYWxob20gKTsKCWZwcmludGYoIHN0ZGVyciwgImFsMSA9ICVzLCBhbDIgPSAlc1xuIiwgYWwxLCBhbDIgKTsKCWZwcmludGYoIHN0ZGVyciwgIm9mZjEgPSAlZCwgb2ZmMiA9ICVkXG4iLCBvZmYxLCBvZmYyICk7CglmcHJpbnRmKCBzdGRlcnIsICJsb2NhbGhvcHQgPSAlcCwgc2tpcCA9ICVkXG4iLCBsb2NhbGhvbXB0LCBza2lwICk7CglmcHJpbnRmKCBzdGRlcnIsICJwdDEgPSBcbiVzXG4sIHB0MiA9IFxuJXNcbiIsIHB0MSwgcHQyICk7CiNlbmRpZgoKCWlmKCBza2lwICkKCXsKCQl3aGlsZSggLS1za2lwID4gMCApIGxvY2FsaG9tcHQgPSBsb2NhbGhvbXB0LT5uZXh0OwoJCWxvY2FsaG9tcHQtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwoJCWxvY2FsaG9tcHQgPSBsb2NhbGhvbXB0LT5uZXh0OwovLwkJZnByaW50Ziggc3RkZXJyLCAidG1wcHQgPSAlcCwgbG9jYWxob21wdCA9ICVwXG4iLCB0bXBwdCwgbG9jYWxob21wdCApOwoJfQoJdG1wcHQgPSBsb2NhbGhvbXB0OwoKCXN0ID0gMDsKCWlzY29yZSA9IDA7Cgl3aGlsZSggKnB0MSAhPSAwICkKCXsKLy8JCWZwcmludGYoIHN0ZGVyciwgIkluIGluIHdoaWxlIGxvb3BcbiIgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgInB0ID0gJWMsICVjLCBzdD0lZFxuIiwgKnB0MSwgKnB0Miwgc3QgKTsKCQlpZiggc3QgPT0gMSAmJiAoICpwdDEgPT0gJy0nIHx8ICpwdDIgPT0gJy0nICkgKQoJCXsKCQkJZW5kMSA9IHBvczEgLSAxOwoJCQllbmQyID0gcG9zMiAtIDE7CgoJCQlpZiggbmxvY2FsaG9tKysgPiAwICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcgLi4uXG4iICk7CgkJCQl0bXBwdC0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImRvbmVcbiIgKTsKCQkJCXRtcHB0ID0gdG1wcHQtPm5leHQ7CgkJCQl0bXBwdC0+bmV4dCA9IE5VTEw7CgkJCX0KCQkJdG1wcHQtPnN0YXJ0MSA9IHN0YXJ0MTsKCQkJdG1wcHQtPnN0YXJ0MiA9IHN0YXJ0MjsKCQkJdG1wcHQtPmVuZDEgICA9IGVuZDEgIDsKCQkJdG1wcHQtPmVuZDIgICA9IGVuZDIgIDsKCiNpZiAxCgkJCWlzdW1zY29yZSArPSBpc2NvcmU7CgkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKI2Vsc2UKCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJdG1wcHQtPm9wdCA9IGlzY29yZSAqIDUuOCAvIDYwMDsKCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gb3ZlcmxhcGFhOwoJCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlvcHQ7CiNlbmRpZgoKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiaXNjb3JlICgxKT0gJWRcbiIsIGlzY29yZSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDI6ICVkIC0gJWRcbiIsIHN0YXJ0MiwgZW5kMiApOwojZW5kaWYKCQkJaXNjb3JlID0gMDsKCQkJc3QgPSAwOwoJCX0KCQllbHNlIGlmKCAqcHQxICE9ICctJyAmJiAqcHQyICE9ICctJyApCgkJewoJCQlpZiggc3QgPT0gMCApCgkJCXsKCQkJCXN0YXJ0MSA9IHBvczE7IHN0YXJ0MiA9IHBvczI7CgkJCQlzdCA9IDE7CgkJCX0KCQkJaXNjb3JlICs9IG5fZGlzWyhpbnQpYW1pbm9fblsoaW50KSpwdDFdXVsoaW50KWFtaW5vX25bKGludCkqcHQyXV07Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiJWMtJWMsIHNjb3JlKDApID0gJWRcbiIsICpwdDEsICpwdDIsIGlzY29yZSApOwoJCX0KCQlpZiggKnB0MSsrICE9ICctJyApIHBvczErKzsKCQlpZiggKnB0MisrICE9ICctJyApIHBvczIrKzsKCX0KCglpZiggc3QgKQoJewoJCWlmKCBubG9jYWxob20rKyA+IDAgKQoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcgLi4uXG4iICk7CgkJCXRtcHB0LT5uZXh0ID0gKExvY2FsSG9tICopY2FsbG9jKCAxLCBzaXplb2YoIExvY2FsSG9tICkgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJCXRtcHB0ID0gdG1wcHQtPm5leHQ7CgkJCXRtcHB0LT5uZXh0ID0gTlVMTDsKCQl9CgkJZW5kMSA9IHBvczEgLSAxOwoJCWVuZDIgPSBwb3MyIC0gMTsKCQl0bXBwdC0+c3RhcnQxID0gc3RhcnQxOwoJCXRtcHB0LT5zdGFydDIgPSBzdGFydDI7CgkJdG1wcHQtPmVuZDEgICA9IGVuZDEgIDsKCQl0bXBwdC0+ZW5kMiAgID0gZW5kMiAgOwoKI2lmIDEKCQlpc3Vtc2NvcmUgKz0gaXNjb3JlOwoJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKI2Vsc2UKCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBlbmQyLXN0YXJ0MisxOwoJCXRtcHB0LT5vcHQgPSAoZG91YmxlKWlzY29yZSAqIDUuOCAvIDYwMDsKCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7CgkJdG1wcHQtPm9wdCA9IChkb3VibGUpb3B0OwojZW5kaWYKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJzY29yZSAoMik9ICVkXG4iLCBpc2NvcmUgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJCWZwcmludGYoIHN0ZGVyciwgImFsMjogJWQgLSAlZFxuIiwgc3RhcnQyLCBlbmQyICk7CiNlbmRpZgoJfQoKCWZvciggdG1wcHQ9bG9jYWxob21wdDsgdG1wcHQ7IHRtcHB0PXRtcHB0LT5uZXh0ICkKCXsKCQl0bXBwdC0+b3ZlcmxhcGFhID0gc3Vtb3ZlcmxhcDsKCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlzdW1zY29yZSAqIDUuOCAvIDYwMCAvIHN1bW92ZXJsYXA7Cgl9CglyZXR1cm4oIG5sb2NhbGhvbSApOwp9CgojZW5kaWYKCgoKc3RhdGljIGludCBhZGRsb2NhbGhvbV9yKCBjaGFyICphbDEsIGNoYXIgKmFsMiwgTG9jYWxIb20gKmxvY2FsaG9tcHQsIGludCBvZmYxLCBpbnQgb2ZmMiwgaW50IG9wdCwgaW50IG92ZXJsYXBhYSwgaW50IHNraXAgKQp7CglpbnQgcG9zMSwgcG9zMiwgc3RhcnQxLCBzdGFydDIsIGVuZDEsIGVuZDI7CgljaGFyICpwdDEsICpwdDI7Cglkb3VibGUgc2NvcmU7Cglkb3VibGUgc3Vtc2NvcmU7CglpbnQgc3Vtb3ZlcmxhcDsKCUxvY2FsSG9tICp0bXBwdCA9IE5VTEw7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCglpbnQgc3Q7CglpbnQgbmxvY2FsaG9tID0gMDsKCXB0MSA9IGFsMTsgcHQyID0gYWwyOwoJcG9zMSA9IG9mZjE7IHBvczIgPSBvZmYyOwoKCXN1bXNjb3JlID0gMC4wOwoJc3Vtb3ZlcmxhcCA9IDA7CglzdGFydDEgPSAwOyAvLyBieSBELk1hdGhvZywgYSBndWVzcwoJc3RhcnQyID0gMDsgLy8gYnkgRC5NYXRob2csIGEgZ3Vlc3MKCiNpZiAwCglmcHJpbnRmKCBzdGRlcnIsICJubG9jYWxob20gPSAlZCBpbiBhZGRsb2NhbGhvbVxuIiwgbmxvY2FsaG9tICk7CglmcHJpbnRmKCBzdGRlcnIsICJhbDEgPSAlcywgYWwyID0gJXNcbiIsIGFsMSwgYWwyICk7CglmcHJpbnRmKCBzdGRlcnIsICJvZmYxID0gJWQsIG9mZjIgPSAlZFxuIiwgb2ZmMSwgb2ZmMiApOwoJZnByaW50Ziggc3RkZXJyLCAibG9jYWxob3B0ID0gJXAsIHNraXAgPSAlZFxuIiwgbG9jYWxob21wdCwgc2tpcCApOwojZW5kaWYKCWZwcmludGYoIHN0ZGVyciwgInB0MSA9IFxuJXNcbiwgcHQyID0gXG4lc1xuIiwgcHQxLCBwdDIgKTsKCglpZiggc2tpcCApCgl7CgkJd2hpbGUoIC0tc2tpcCA+IDAgKSBsb2NhbGhvbXB0ID0gbG9jYWxob21wdC0+bmV4dDsKCQlsb2NhbGhvbXB0LT5uZXh0ID0gKExvY2FsSG9tICopY2FsbG9jKCAxLCBzaXplb2YoIExvY2FsSG9tICkgKTsKCQlsb2NhbGhvbXB0ID0gbG9jYWxob21wdC0+bmV4dDsKCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBwdCA9ICVwLCBsb2NhbGhvbXB0ID0gJXBcbiIsICh2b2lkICopdG1wcHQsICh2b2lkICopbG9jYWxob21wdCApOwoJfQoJdG1wcHQgPSBsb2NhbGhvbXB0OwoKCXN0ID0gMDsKCXNjb3JlID0gMC4wOwoJd2hpbGUoICpwdDEgIT0gMCApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiSW4gaW4gd2hpbGUgbG9vcFxuIiApOwoJCWZwcmludGYoIHN0ZGVyciwgInB0ID0gJWMsICVjLCBzdD0lZFxuIiwgKnB0MSwgKnB0Miwgc3QgKTsKCQlpZiggc3QgPT0gMSAmJiAoICpwdDEgPT0gJy0nIHx8ICpwdDIgPT0gJy0nICkgKQoJCXsKCQkJZW5kMSA9IHBvczEgLSAxOwoJCQllbmQyID0gcG9zMiAtIDE7CgoJCQlpZiggbmxvY2FsaG9tKysgPiAwICkKCQkJewovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcgLi4uXG4iICk7CgkJCQl0bXBwdC0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgImRvbmVcbiIgKTsKCQkJCXRtcHB0ID0gdG1wcHQtPm5leHQ7CgkJCQl0bXBwdC0+bmV4dCA9IE5VTEw7CgkJCX0KCQkJdG1wcHQtPnN0YXJ0MSA9IHN0YXJ0MTsKCQkJdG1wcHQtPnN0YXJ0MiA9IHN0YXJ0MjsKCQkJdG1wcHQtPmVuZDEgICA9IGVuZDEgIDsKCQkJdG1wcHQtPmVuZDIgICA9IGVuZDIgIDsKCiNpZiAxCgkJCXN1bXNjb3JlICs9IHNjb3JlOwoJCQlzdW1vdmVybGFwICs9IGVuZDItc3RhcnQyKzE7CiNlbHNlCgkJCXRtcHB0LT5vdmVybGFwYWEgICA9IGVuZDItc3RhcnQyKzE7CgkJCXRtcHB0LT5vcHQgPSBzY29yZSAqIDUuOCAvIDYwMDsKCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gb3ZlcmxhcGFhOwoJCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlvcHQ7CiNlbmRpZgoKCQkJZnByaW50Ziggc3RkZXJyLCAic2NvcmUgKDEpPSAlZlxuIiwgc2NvcmUgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYWwxOiAlZCAtICVkXG4iLCBzdGFydDEsIGVuZDEgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYWwyOiAlZCAtICVkXG4iLCBzdGFydDIsIGVuZDIgKTsKCQkJc2NvcmUgPSAwLjA7CgkJCXN0ID0gMDsKCQl9CgkJZWxzZSBpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCXsKCQkJaWYoIHN0ID09IDAgKQoJCQl7CgkJCQlzdGFydDEgPSBwb3MxOyBzdGFydDIgPSBwb3MyOwoJCQkJc3QgPSAxOwoJCQl9CgkJCXNjb3JlICs9IChkb3VibGUpbl9kaXNbKGludClhbWlub19uWyhpbnQpKnB0MV1dWyhpbnQpYW1pbm9fblsoaW50KSpwdDJdXTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIlYy0lYywgc2NvcmUoMCkgPSAlZlxuIiwgKnB0MSwgKnB0Miwgc2NvcmUgKTsKCQl9CgkJaWYoICpwdDErKyAhPSAnLScgKSBwb3MxKys7CgkJaWYoICpwdDIrKyAhPSAnLScgKSBwb3MyKys7Cgl9CglpZiggbmxvY2FsaG9tKysgPiAwICkKCXsKLy8JCWZwcmludGYoIHN0ZGVyciwgInJlYWxsb2NhdGluZyAuLi5cbiIgKTsKCQl0bXBwdC0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJdG1wcHQgPSB0bXBwdC0+bmV4dDsKCQl0bXBwdC0+bmV4dCA9IE5VTEw7Cgl9CgllbmQxID0gcG9zMSAtIDE7CgllbmQyID0gcG9zMiAtIDE7Cgl0bXBwdC0+c3RhcnQxID0gc3RhcnQxOwoJdG1wcHQtPnN0YXJ0MiA9IHN0YXJ0MjsKCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7Cgl0bXBwdC0+ZW5kMiAgID0gZW5kMiAgOwoKI2lmIDEKCXN1bXNjb3JlICs9IHNjb3JlOwoJc3Vtb3ZlcmxhcCArPSBlbmQyLXN0YXJ0MisxOwojZWxzZQoJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCXRtcHB0LT5vcHQgPSBzY29yZSAqIDUuOCAvIDYwMDsKCXRtcHB0LT5vdmVybGFwYWEgICA9IG92ZXJsYXBhYTsKCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgoJZnByaW50Ziggc3RkZXJyLCAic2NvcmUgKDIpPSAlZlxuIiwgc2NvcmUgKTsKCWZwcmludGYoIHN0ZGVyciwgImFsMTogJWQgLSAlZFxuIiwgc3RhcnQxLCBlbmQxICk7CglmcHJpbnRmKCBzdGRlcnIsICJhbDI6ICVkIC0gJWRcbiIsIHN0YXJ0MiwgZW5kMiApOwoKCWZvciggdG1wcHQ9bG9jYWxob21wdDsgdG1wcHQ7IHRtcHB0PXRtcHB0LT5uZXh0ICkKCXsKCQl0bXBwdC0+b3ZlcmxhcGFhID0gc3Vtb3ZlcmxhcDsKCQl0bXBwdC0+b3B0ID0gc3Vtc2NvcmUgKiA1LjggLyA2MDAgLyBzdW1vdmVybGFwOwoJfQoJcmV0dXJuKCBubG9jYWxob20gKTsKfQp2b2lkIHB1dGxvY2FsaG9tMyggY2hhciAqYWwxLCBjaGFyICphbDIsIExvY2FsSG9tICpsb2NhbGhvbXB0LCBpbnQgb2ZmMSwgaW50IG9mZjIsIGludCBvcHQsIGludCBvdmVybGFwYWEgKQp7CglpbnQgcG9zMSwgcG9zMiwgc3RhcnQxLCBzdGFydDIsIGVuZDEsIGVuZDI7CgljaGFyICpwdDEsICpwdDI7Cglkb3VibGUgc2NvcmU7Cglkb3VibGUgc3Vtc2NvcmU7CglpbnQgc3Vtb3ZlcmxhcDsKCUxvY2FsSG9tICp0bXBwdDsKCUxvY2FsSG9tICpzdWJub3NlbnRvOwoJaW50IHN0OwoJaW50IHNhaXNobzsKCglwdDEgPSBhbDE7IHB0MiA9IGFsMjsKCXBvczEgPSBvZmYxOyBwb3MyID0gb2ZmMjsKCglzdW1zY29yZSA9IDAuMDsKCXN1bW92ZXJsYXAgPSAwOwoJc3RhcnQxID0gMDsgLy8gYnkgTWF0aG9nLCBhIGd1ZXNzCglzdGFydDIgPSAwOyAvLyBieSBNYXRob2csIGEgZ3Vlc3MKCglzdWJub3NlbnRvID0gbG9jYWxob21wdDsKCXdoaWxlKCBzdWJub3NlbnRvLT5uZXh0ICkgc3Vibm9zZW50byA9IHN1Ym5vc2VudG8tPm5leHQ7Cgl0bXBwdCA9IHN1Ym5vc2VudG87CgoJc2Fpc2hvID0gKCBsb2NhbGhvbXB0LT5ub2tvcmkgPT0gMCApOwoKCWZwcmludGYoIHN0ZGVyciwgImxvY2FsaG9tcHQgPSAlcFxuIiwgKHZvaWQgKilsb2NhbGhvbXB0ICk7CglmcHJpbnRmKCBzdGRlcnIsICJ0bXBwdCA9ICVwXG4iLCAodm9pZCAqKXRtcHB0ICk7CglmcHJpbnRmKCBzdGRlcnIsICJzdWJub3NlbnRvID0gJXBcbiIsICh2b2lkICopc3Vibm9zZW50byApOwoKCXN0ID0gMDsKCXNjb3JlID0gMC4wOwoJd2hpbGUoICpwdDEgIT0gMCApCgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwdCA9ICVjLCAlYywgc3Q9JWRcbiIsICpwdDEsICpwdDIsIHN0ICk7CgkJaWYoIHN0ID09IDEgJiYgKCAqcHQxID09ICctJyB8fCAqcHQyID09ICctJyApICkKCQl7CgkJCWVuZDEgPSBwb3MxIC0gMTsKCQkJZW5kMiA9IHBvczIgLSAxOwoKCQkJaWYoIGxvY2FsaG9tcHQtPm5va29yaSsrID4gMCApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAicmVhbGxvY2F0aW5nIC4uLlxuIiApOwoJCQkJdG1wcHQtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJCQl0bXBwdCA9IHRtcHB0LT5uZXh0OwoJCQkJdG1wcHQtPm5leHQgPSBOVUxMOwoJCQl9CgkJCXRtcHB0LT5zdGFydDEgPSBzdGFydDE7CgkJCXRtcHB0LT5zdGFydDIgPSBzdGFydDI7CgkJCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7CgkJCXRtcHB0LT5lbmQyICAgPSBlbmQyICA7CgojaWYgMQoJCQlpZiggZGl2cGFpcnNjb3JlICkKCQkJewoJCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJCXRtcHB0LT5vcHQgPSBzY29yZSAvIHRtcHB0LT5vdmVybGFwYWEgKiA1LjggLyA2MDA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzdW1zY29yZSArPSBzY29yZTsKCQkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKCQkJfQojZWxzZQoJCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7CgkJCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICJzY29yZSAoMSk9ICVmXG4iLCBzY29yZSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDI6ICVkIC0gJWRcbiIsIHN0YXJ0MiwgZW5kMiApOwojZW5kaWYKCQkJc2NvcmUgPSAwLjA7CgkJCXN0ID0gMDsKCQl9CgkJZWxzZSBpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCXsKCQkJaWYoIHN0ID09IDAgKQoJCQl7CgkJCQlzdGFydDEgPSBwb3MxOyBzdGFydDIgPSBwb3MyOwoJCQkJc3QgPSAxOwoJCQl9CgkJCXNjb3JlICs9IChkb3VibGUpbl9kaXNbKGludClhbWlub19uWyhpbnQpKnB0MV1dWyhpbnQpYW1pbm9fblsoaW50KSpwdDJdXTsgLy8gLSBvZmZzZXQgpM+kpKTppMqkpKSrpOIKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIlYy0lYywgc2NvcmUoMCkgPSAlZlxuIiwgKnB0MSwgKnB0Miwgc2NvcmUgKTsKCQl9CgkJaWYoICpwdDErKyAhPSAnLScgKSBwb3MxKys7CgkJaWYoICpwdDIrKyAhPSAnLScgKSBwb3MyKys7Cgl9CglpZiggKihwdDEtMSkgIT0gJy0nICYmICoocHQyLTEpICE9ICctJyAgKQoJewoJCWlmKCBsb2NhbGhvbXB0LT5ub2tvcmkrKyA+IDAgKQoJCXsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcgLi4uXG4iICk7CgkJCXRtcHB0LT5uZXh0ID0gKExvY2FsSG9tICopY2FsbG9jKCAxLCBzaXplb2YoIExvY2FsSG9tICkgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJCXRtcHB0ID0gdG1wcHQtPm5leHQ7CgkJCXRtcHB0LT5uZXh0ID0gTlVMTDsKCQl9CgoJCWVuZDEgPSBwb3MxIC0gMTsKCQllbmQyID0gcG9zMiAtIDE7CgkJdG1wcHQtPnN0YXJ0MSA9IHN0YXJ0MTsKCQl0bXBwdC0+c3RhcnQyID0gc3RhcnQyOwoJCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7CgkJdG1wcHQtPmVuZDIgICA9IGVuZDIgIDsKCgojaWYgMQoJCWlmKCBkaXZwYWlyc2NvcmUgKQoJCXsKCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJdG1wcHQtPm9wdCA9IHNjb3JlIC8gdG1wcHQtPm92ZXJsYXBhYSAqIDUuOCAvIDYwMDsKCQl9CgkJZWxzZQoJCXsKCQkJc3Vtc2NvcmUgKz0gc2NvcmU7CgkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKCQl9CiNlbHNlCgkJdG1wcHQtPm92ZXJsYXBhYSAgID0gb3ZlcmxhcGFhOwoJCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgInNjb3JlICgyKT0gJWZcbiIsIHNjb3JlICk7CgkJZnByaW50Ziggc3RkZXJyLCAiYWwxOiAlZCAtICVkXG4iLCBzdGFydDEsIGVuZDEgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbDI6ICVkIC0gJWRcbiIsIHN0YXJ0MiwgZW5kMiApOwojZW5kaWYKCX0KCglmcHJpbnRmKCBzdGRlcnIsICJzdW1zY29yZSA9ICVmXG4iLCBzdW1zY29yZSApOwoJaWYoICFkaXZwYWlyc2NvcmUgKQoJewoKCQlpZiggIXNhaXNobyApIHN1Ym5vc2VudG8gPSBzdWJub3NlbnRvLT5uZXh0OwoJCWZvciggdG1wcHQ9c3Vibm9zZW50bzsgdG1wcHQ7IHRtcHB0PXRtcHB0LT5uZXh0ICkKCQl7CgkJCXRtcHB0LT5vdmVybGFwYWEgPSBzdW1vdmVybGFwOwoJCQl0bXBwdC0+b3B0ID0gc3Vtc2NvcmUgKiA1LjggLyA2MDAgLyBzdW1vdmVybGFwOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBwdHItPm9wdCA9ICVmXG4iLCB0bXBwdC0+b3B0ICk7CgkJfQoJfQp9CnZvaWQgcHV0bG9jYWxob21fZXh0KCBjaGFyICphbDEsIGNoYXIgKmFsMiwgTG9jYWxIb20gKmxvY2FsaG9tcHQsIGludCBvZmYxLCBpbnQgb2ZmMiwgaW50IG9wdCwgaW50IG92ZXJsYXBhYSApCnsKCWludCBwb3MxLCBwb3MyLCBzdGFydDEsIHN0YXJ0MiwgZW5kMSwgZW5kMjsKCWNoYXIgKnB0MSwgKnB0MjsKCWludCBpc2NvcmU7CglpbnQgaXN1bXNjb3JlOwoJaW50IHN1bW92ZXJsYXA7CglMb2NhbEhvbSAqdG1wcHQgPSBsb2NhbGhvbXB0OwoJaW50IG5sb2NhbGhvbSA9IDA7CglpbnQgc3Q7CglwdDEgPSBhbDE7IHB0MiA9IGFsMjsKCXBvczEgPSBvZmYxOyBwb3MyID0gb2ZmMjsKCgoJaXN1bXNjb3JlID0gMDsKCXN1bW92ZXJsYXAgPSAwOwoJc3RhcnQxID0gMDsgLy8gYnkgRC5NYXRob2csIGEgZ3Vlc3MKCXN0YXJ0MiA9IDA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCgoJc3QgPSAwOwoJaXNjb3JlID0gMDsKCXdoaWxlKCAqcHQxICE9IDAgKQoJewovLwkJZnByaW50Ziggc3RkZXJyLCAicHQgPSAlYywgJWMsIHN0PSVkXG4iLCAqcHQxLCAqcHQyLCBzdCApOwoJCWlmKCBzdCA9PSAxICYmICggKnB0MSA9PSAnLScgfHwgKnB0MiA9PSAnLScgKSApCgkJewoJCQllbmQxID0gcG9zMSAtIDE7CgkJCWVuZDIgPSBwb3MyIC0gMTsKCgkJCWlmKCBubG9jYWxob20rKyA+IDAgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInJlYWxsb2NhdGluZyAuLi5cbiIgKTsKCQkJCXRtcHB0LT5uZXh0ID0gKExvY2FsSG9tICopY2FsbG9jKCAxLCBzaXplb2YoIExvY2FsSG9tICkgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiZG9uZVxuIiApOwoJCQkJdG1wcHQgPSB0bXBwdC0+bmV4dDsKCQkJCXRtcHB0LT5uZXh0ID0gTlVMTDsKCQkJfQoJCQl0bXBwdC0+c3RhcnQxID0gc3RhcnQxOwoJCQl0bXBwdC0+c3RhcnQyID0gc3RhcnQyOwoJCQl0bXBwdC0+ZW5kMSAgID0gZW5kMSAgOwoJCQl0bXBwdC0+ZW5kMiAgID0gZW5kMiAgOwoKI2lmIDEKCQkJaWYoIGRpdnBhaXJzY29yZSApCgkJCXsKCQkJCXRtcHB0LT5vdmVybGFwYWEgICA9IGVuZDItc3RhcnQyKzE7CgkJCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlpc2NvcmUgLyB0bXBwdC0+b3ZlcmxhcGFhICogNS44IC8gNjAwOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaXN1bXNjb3JlICs9IGlzY29yZTsKCQkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKCQkJfQojZWxzZQoJCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7CgkJCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICJpc2NvcmUgKDEpPSAlZFxuIiwgaXNjb3JlICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImFsMTogJWQgLSAlZFxuIiwgc3RhcnQxLCBlbmQxICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImFsMjogJWQgLSAlZFxuIiwgc3RhcnQyLCBlbmQyICk7CiNlbmRpZgoJCQlpc2NvcmUgPSAwOwoJCQlzdCA9IDA7CgkJfQoJCWVsc2UgaWYoICpwdDEgIT0gJy0nICYmICpwdDIgIT0gJy0nICkKCQl7CgkJCWlmKCBzdCA9PSAwICkKCQkJewoJCQkJc3RhcnQxID0gcG9zMTsgc3RhcnQyID0gcG9zMjsKCQkJCXN0ID0gMTsKCQkJfQoJCQlpc2NvcmUgKz0gbl9kaXNbKGludClhbWlub19uWyhpbnQpKnB0MV1dWyhpbnQpYW1pbm9fblsoaW50KSpwdDJdXTsgLy8gLSBvZmZzZXQgpM+kpKTppMqkpKSrpOIKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIlYy0lYywgaXNjb3JlKDApID0gJWRcbiIsICpwdDEsICpwdDIsIGlzY29yZSApOwoJCX0KCQlpZiggKnB0MSsrICE9ICctJyApIHBvczErKzsKCQlpZiggKnB0MisrICE9ICctJyApIHBvczIrKzsKCX0KCWlmKCAqKHB0MS0xKSAhPSAnLScgJiYgKihwdDItMSkgIT0gJy0nICApCgl7CgkJaWYoIG5sb2NhbGhvbSsrID4gMCApCgkJewovLwkJCWZwcmludGYoIHN0ZGVyciwgInJlYWxsb2NhdGluZyAuLi5cbiIgKTsKCQkJdG1wcHQtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwovLwkJCWZwcmludGYoIHN0ZGVyciwgImRvbmVcbiIgKTsKCQkJdG1wcHQgPSB0bXBwdC0+bmV4dDsKCQkJdG1wcHQtPm5leHQgPSBOVUxMOwoJCX0KCQllbmQxID0gcG9zMSAtIDE7CgkJZW5kMiA9IHBvczIgLSAxOwoJCXRtcHB0LT5zdGFydDEgPSBzdGFydDE7CgkJdG1wcHQtPnN0YXJ0MiA9IHN0YXJ0MjsKCQl0bXBwdC0+ZW5kMSAgID0gZW5kMSAgOwoJCXRtcHB0LT5lbmQyICAgPSBlbmQyICA7CgkKI2lmIDEKCQlpZiggZGl2cGFpcnNjb3JlICkKCQl7CgkJCXRtcHB0LT5vdmVybGFwYWEgICA9IGVuZDItc3RhcnQyKzE7CgkJCXRtcHB0LT5vcHQgPSAoZG91YmxlKWlzY29yZSAvIHRtcHB0LT5vdmVybGFwYWEgKiA1LjggLyA2MDA7CgkJfQoJCWVsc2UKCQl7CgkJCWlzdW1zY29yZSArPSBpc2NvcmU7CgkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKCQl9CiNlbHNlCgkJdG1wcHQtPm92ZXJsYXBhYSAgID0gb3ZlcmxhcGFhOwoJCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgImlzY29yZSAoMik9ICVkXG4iLCBpc2NvcmUgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJCWZwcmludGYoIHN0ZGVyciwgImFsMjogJWQgLSAlZFxuIiwgc3RhcnQyLCBlbmQyICk7CiNlbmRpZgoJfQoKCWlmKCAhZGl2cGFpcnNjb3JlICkKCXsKCQlmb3IoIHRtcHB0PWxvY2FsaG9tcHQ7IHRtcHB0OyB0bXBwdD10bXBwdC0+bmV4dCApCgkJewoJCQl0bXBwdC0+b3ZlcmxhcGFhID0gc3Vtb3ZlcmxhcDsKLy8JCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlpc3Vtc2NvcmUgKiA1LjggLyAoIDYwMCAqIHN1bW92ZXJsYXAgKTsKCQkJdG1wcHQtPm9wdCA9IChkb3VibGUpNjAwICogNS44IC8gNjAwOwovLwkJCWZwcmludGYoIHN0ZGVyciwgInRtcHB0ci0+b3B0ID0gJWZcbiIsIHRtcHB0LT5vcHQgKTsKCQl9Cgl9Cn0Kdm9pZCBwdXRsb2NhbGhvbTIoIGNoYXIgKmFsMSwgY2hhciAqYWwyLCBMb2NhbEhvbSAqbG9jYWxob21wdCwgaW50IG9mZjEsIGludCBvZmYyLCBpbnQgb3B0LCBpbnQgb3ZlcmxhcGFhICkKewoJaW50IHBvczEsIHBvczIsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJY2hhciAqcHQxLCAqcHQyOwoJaW50IGlzY29yZTsKCWludCBpc3Vtc2NvcmU7CglpbnQgc3Vtb3ZlcmxhcDsKCUxvY2FsSG9tICp0bXBwdCA9IGxvY2FsaG9tcHQ7CglpbnQgbmxvY2FsaG9tID0gMDsKCWludCBzdDsKCXB0MSA9IGFsMTsgcHQyID0gYWwyOwoJcG9zMSA9IG9mZjE7IHBvczIgPSBvZmYyOwoKCglpc3Vtc2NvcmUgPSAwOwoJc3Vtb3ZlcmxhcCA9IDA7CglzdGFydDEgPSAwOyAvLyBieSBELk1hdGhvZywgYSBndWVzcwoJc3RhcnQyID0gMDsgLy8gYnkgRC5NYXRob2csIGEgZ3Vlc3MKCglzdCA9IDA7Cglpc2NvcmUgPSAwOwoJd2hpbGUoICpwdDEgIT0gMCApCgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwdCA9ICVjLCAlYywgc3Q9JWRcbiIsICpwdDEsICpwdDIsIHN0ICk7CgkJaWYoIHN0ID09IDEgJiYgKCAqcHQxID09ICctJyB8fCAqcHQyID09ICctJyApICkKCQl7CgkJCWVuZDEgPSBwb3MxIC0gMTsKCQkJZW5kMiA9IHBvczIgLSAxOwoKCQkJaWYoIG5sb2NhbGhvbSsrID4gMCApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAicmVhbGxvY2F0aW5nIC4uLlxuIiApOwoJCQkJdG1wcHQtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJCQl0bXBwdCA9IHRtcHB0LT5uZXh0OwoJCQkJdG1wcHQtPm5leHQgPSBOVUxMOwoJCQl9CgkJCXRtcHB0LT5zdGFydDEgPSBzdGFydDE7CgkJCXRtcHB0LT5zdGFydDIgPSBzdGFydDI7CgkJCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7CgkJCXRtcHB0LT5lbmQyICAgPSBlbmQyICA7CgojaWYgMQoJCQlpZiggZGl2cGFpcnNjb3JlICkKCQkJewoJCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJCXRtcHB0LT5vcHQgPSAoZG91YmxlKWlzY29yZSAvIHRtcHB0LT5vdmVybGFwYWEgKiA1LjggLyA2MDA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlpc3Vtc2NvcmUgKz0gaXNjb3JlOwoJCQkJc3Vtb3ZlcmxhcCArPSBlbmQyLXN0YXJ0MisxOwoJCQl9CiNlbHNlCgkJCXRtcHB0LT5vdmVybGFwYWEgICA9IG92ZXJsYXBhYTsKCQkJdG1wcHQtPm9wdCA9IChkb3VibGUpb3B0OwojZW5kaWYKCiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgImlzY29yZSAoMSk9ICVkXG4iLCBpc2NvcmUgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYWwxOiAlZCAtICVkXG4iLCBzdGFydDEsIGVuZDEgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiYWwyOiAlZCAtICVkXG4iLCBzdGFydDIsIGVuZDIgKTsKI2VuZGlmCgkJCWlzY29yZSA9IDA7CgkJCXN0ID0gMDsKCQl9CgkJZWxzZSBpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCXsKCQkJaWYoIHN0ID09IDAgKQoJCQl7CgkJCQlzdGFydDEgPSBwb3MxOyBzdGFydDIgPSBwb3MyOwoJCQkJc3QgPSAxOwoJCQl9CgkJCWlzY29yZSArPSBuX2Rpc1soaW50KWFtaW5vX25bKGludCkqcHQxXV1bKGludClhbWlub19uWyhpbnQpKnB0Ml1dOyAvLyAtIG9mZnNldCCkz6SkpOmkyqSkpKuk4govLwkJCWZwcmludGYoIHN0ZGVyciwgIiVjLSVjLCBpc2NvcmUoMCkgPSAlZFxuIiwgKnB0MSwgKnB0MiwgaXNjb3JlICk7CgkJfQoJCWlmKCAqcHQxKysgIT0gJy0nICkgcG9zMSsrOwoJCWlmKCAqcHQyKysgIT0gJy0nICkgcG9zMisrOwoJfQoJaWYoICoocHQxLTEpICE9ICctJyAmJiAqKHB0Mi0xKSAhPSAnLScgICkKCXsKCQlpZiggbmxvY2FsaG9tKysgPiAwICkKCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAicmVhbGxvY2F0aW5nIC4uLlxuIiApOwoJCQl0bXBwdC0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiZG9uZVxuIiApOwoJCQl0bXBwdCA9IHRtcHB0LT5uZXh0OwoJCQl0bXBwdC0+bmV4dCA9IE5VTEw7CgkJfQoJCWVuZDEgPSBwb3MxIC0gMTsKCQllbmQyID0gcG9zMiAtIDE7CgkJdG1wcHQtPnN0YXJ0MSA9IHN0YXJ0MTsKCQl0bXBwdC0+c3RhcnQyID0gc3RhcnQyOwoJCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7CgkJdG1wcHQtPmVuZDIgICA9IGVuZDIgIDsKCQojaWYgMQoJCWlmKCBkaXZwYWlyc2NvcmUgKQoJCXsKCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJdG1wcHQtPm9wdCA9IChkb3VibGUpaXNjb3JlIC8gdG1wcHQtPm92ZXJsYXBhYSAqIDUuOCAvIDYwMDsKCQl9CgkJZWxzZQoJCXsKCQkJaXN1bXNjb3JlICs9IGlzY29yZTsKCQkJc3Vtb3ZlcmxhcCArPSBlbmQyLXN0YXJ0MisxOwoJCX0KI2Vsc2UKCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7CgkJdG1wcHQtPm9wdCA9IChkb3VibGUpb3B0OwojZW5kaWYKCiNpZiAwCgkJZnByaW50Ziggc3RkZXJyLCAiaXNjb3JlICgyKT0gJWRcbiIsIGlzY29yZSApOwoJCWZwcmludGYoIHN0ZGVyciwgImFsMTogJWQgLSAlZFxuIiwgc3RhcnQxLCBlbmQxICk7CgkJZnByaW50Ziggc3RkZXJyLCAiYWwyOiAlZCAtICVkXG4iLCBzdGFydDIsIGVuZDIgKTsKI2VuZGlmCgl9CgoJaWYoICFkaXZwYWlyc2NvcmUgKQoJewoJCWZvciggdG1wcHQ9bG9jYWxob21wdDsgdG1wcHQ7IHRtcHB0PXRtcHB0LT5uZXh0ICkKCQl7CgkJCXRtcHB0LT5vdmVybGFwYWEgPSBzdW1vdmVybGFwOwoJCQl0bXBwdC0+b3B0ID0gKGRvdWJsZSlpc3Vtc2NvcmUgKiA1LjggLyAoIDYwMCAqIHN1bW92ZXJsYXAgKTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJ0bXBwdHItPm9wdCA9ICVmXG4iLCB0bXBwdC0+b3B0ICk7CgkJfQoJfQp9CnZvaWQgcHV0bG9jYWxob20oIGNoYXIgKmFsMSwgY2hhciAqYWwyLCBMb2NhbEhvbSAqbG9jYWxob21wdCwgaW50IG9mZjEsIGludCBvZmYyLCBpbnQgb3B0LCBpbnQgb3ZlcmxhcGFhICkKewoJaW50IHBvczEsIHBvczIsIHN0YXJ0MSwgc3RhcnQyLCBlbmQxLCBlbmQyOwoJY2hhciAqcHQxLCAqcHQyOwoJZG91YmxlIHNjb3JlOwoJZG91YmxlIHN1bXNjb3JlOwoJaW50IHN1bW92ZXJsYXA7CglMb2NhbEhvbSAqdG1wcHQgPSBsb2NhbGhvbXB0OwoJaW50IG5sb2NhbGhvbSA9IDA7CglpbnQgc3Q7CglwdDEgPSBhbDE7IHB0MiA9IGFsMjsKCXBvczEgPSBvZmYxOyBwb3MyID0gb2ZmMjsKCgoJc3Vtc2NvcmUgPSAwLjA7CglzdW1vdmVybGFwID0gMDsKCXN0YXJ0MSA9IDA7IC8vIGJ5IEQuTWF0aG9nLCBhIGd1ZXNzCglzdGFydDIgPSAwOyAvLyBieSBELk1hdGhvZywgYSBndWVzcwoKCXN0ID0gMDsKCXNjb3JlID0gMC4wOwoJd2hpbGUoICpwdDEgIT0gMCApCgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwdCA9ICVjLCAlYywgc3Q9JWRcbiIsICpwdDEsICpwdDIsIHN0ICk7CgkJaWYoIHN0ID09IDEgJiYgKCAqcHQxID09ICctJyB8fCAqcHQyID09ICctJyApICkKCQl7CgkJCWVuZDEgPSBwb3MxIC0gMTsKCQkJZW5kMiA9IHBvczIgLSAxOwoKCQkJaWYoIG5sb2NhbGhvbSsrID4gMCApCgkJCXsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAicmVhbGxvY2F0aW5nIC4uLlxuIiApOwoJCQkJdG1wcHQtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJCQl0bXBwdCA9IHRtcHB0LT5uZXh0OwoJCQkJdG1wcHQtPm5leHQgPSBOVUxMOwoJCQl9CgkJCXRtcHB0LT5zdGFydDEgPSBzdGFydDE7CgkJCXRtcHB0LT5zdGFydDIgPSBzdGFydDI7CgkJCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7CgkJCXRtcHB0LT5lbmQyICAgPSBlbmQyICA7CgojaWYgMQoJCQlpZiggZGl2cGFpcnNjb3JlICkKCQkJewoJCQkJdG1wcHQtPm92ZXJsYXBhYSAgID0gZW5kMi1zdGFydDIrMTsKCQkJCXRtcHB0LT5vcHQgPSBzY29yZSAvIHRtcHB0LT5vdmVybGFwYWEgKiA1LjggLyA2MDA7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzdW1zY29yZSArPSBzY29yZTsKCQkJCXN1bW92ZXJsYXAgKz0gZW5kMi1zdGFydDIrMTsKCQkJfQojZWxzZQoJCQl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7CgkJCXRtcHB0LT5vcHQgPSAoZG91YmxlKW9wdDsKI2VuZGlmCgojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICJzY29yZSAoMSk9ICVmXG4iLCBzY29yZSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJhbDI6ICVkIC0gJWRcbiIsIHN0YXJ0MiwgZW5kMiApOwojZW5kaWYKCQkJc2NvcmUgPSAwLjA7CgkJCXN0ID0gMDsKCQl9CgkJZWxzZSBpZiggKnB0MSAhPSAnLScgJiYgKnB0MiAhPSAnLScgKQoJCXsKCQkJaWYoIHN0ID09IDAgKQoJCQl7CgkJCQlzdGFydDEgPSBwb3MxOyBzdGFydDIgPSBwb3MyOwoJCQkJc3QgPSAxOwoJCQl9CgkJCXNjb3JlICs9IChkb3VibGUpbl9kaXNbKGludClhbWlub19uWyhpbnQpKnB0MV1dWyhpbnQpYW1pbm9fblsoaW50KSpwdDJdXTsgLy8gLSBvZmZzZXQgpM+kpKTppMqkpKSrpOIKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIlYy0lYywgc2NvcmUoMCkgPSAlZlxuIiwgKnB0MSwgKnB0Miwgc2NvcmUgKTsKCQl9CgkJaWYoICpwdDErKyAhPSAnLScgKSBwb3MxKys7CgkJaWYoICpwdDIrKyAhPSAnLScgKSBwb3MyKys7Cgl9CglpZiggbmxvY2FsaG9tKysgPiAwICkKCXsKLy8JCWZwcmludGYoIHN0ZGVyciwgInJlYWxsb2NhdGluZyAuLi5cbiIgKTsKCQl0bXBwdC0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lXG4iICk7CgkJdG1wcHQgPSB0bXBwdC0+bmV4dDsKCQl0bXBwdC0+bmV4dCA9IE5VTEw7Cgl9CgllbmQxID0gcG9zMSAtIDE7CgllbmQyID0gcG9zMiAtIDE7Cgl0bXBwdC0+c3RhcnQxID0gc3RhcnQxOwoJdG1wcHQtPnN0YXJ0MiA9IHN0YXJ0MjsKCXRtcHB0LT5lbmQxICAgPSBlbmQxICA7Cgl0bXBwdC0+ZW5kMiAgID0gZW5kMiAgOwoKI2lmIDEKCWlmKCBkaXZwYWlyc2NvcmUgKQoJewoJCXRtcHB0LT5vdmVybGFwYWEgICA9IGVuZDItc3RhcnQyKzE7CgkJdG1wcHQtPm9wdCA9IHNjb3JlIC8gdG1wcHQtPm92ZXJsYXBhYSAqIDUuOCAvIDYwMDsKCX0KCWVsc2UKCXsKCQlzdW1zY29yZSArPSBzY29yZTsKCQlzdW1vdmVybGFwICs9IGVuZDItc3RhcnQyKzE7Cgl9CiNlbHNlCgl0bXBwdC0+b3ZlcmxhcGFhICAgPSBvdmVybGFwYWE7Cgl0bXBwdC0+b3B0ID0gKGRvdWJsZSlvcHQ7CiNlbmRpZgoKI2lmIDAKCWZwcmludGYoIHN0ZGVyciwgInNjb3JlICgyKT0gJWZcbiIsIHNjb3JlICk7CglmcHJpbnRmKCBzdGRlcnIsICJhbDE6ICVkIC0gJWRcbiIsIHN0YXJ0MSwgZW5kMSApOwoJZnByaW50Ziggc3RkZXJyLCAiYWwyOiAlZCAtICVkXG4iLCBzdGFydDIsIGVuZDIgKTsKI2VuZGlmCgoJaWYoICFkaXZwYWlyc2NvcmUgKQoJewoJCWZvciggdG1wcHQ9bG9jYWxob21wdDsgdG1wcHQ7IHRtcHB0PXRtcHB0LT5uZXh0ICkKCQl7CgkJCXRtcHB0LT5vdmVybGFwYWEgPSBzdW1vdmVybGFwOwoJCQl0bXBwdC0+b3B0ID0gc3Vtc2NvcmUgKiA1LjggLyA2MDAgLyBzdW1vdmVybGFwOwovLwkJCWZwcmludGYoIHN0ZGVyciwgInRtcHB0ci0+b3B0ID0gJWZcbiIsIHRtcHB0LT5vcHQgKTsKCQl9Cgl9Cn0KCmNoYXIgKmN1dGFsKCBjaGFyICphbCwgaW50IGFsX2Rpc3BsYXlfc3RhcnQsIGludCBzdGFydCwgaW50IGVuZCApCnsKCWludCBwb3M7CgljaGFyICpwdCA9IGFsOwoJY2hhciAqdmFsID0gTlVMTDsKCglwb3MgPSBhbF9kaXNwbGF5X3N0YXJ0OwoJZG8KCXsKCQlpZiggc3RhcnQgPT0gcG9zICkgdmFsID0gcHQ7CgkJaWYoIGVuZCA9PSBwb3MgKSBicmVhazsKLy8JCWZwcmludGYoIHN0ZGVyciwgInBvcz0lZCwgKnB0PSVjLCB2YWw9JXBcbiIsIHBvcywgKnB0LCB2YWwgKTsKCQlpZiggKnB0ICE9ICctJyApIHBvcysrOwoJfSB3aGlsZSggKnB0KysgIT0gMCApOwoJKihwdCsxKSA9IDA7CglyZXR1cm4oIHZhbCApOwp9Cgp2b2lkIEVycm9yRXhpdCggY2hhciAqbWVzc2FnZSApCnsKCWZwcmludGYoIHN0ZGVyciwgIiVzXG4iLCBtZXNzYWdlICk7CglleGl0KCAxICk7Cn0KCnZvaWQgc3RybmNweV9jYXNlQyggY2hhciAqc3RyMSwgY2hhciAqc3RyMiwgaW50IGxlbiApCnsKCWlmKCBkb3JwID09ICdkJyAmJiB1cHBlckNhc2UgPiAwICkgCgl7CgkJd2hpbGUoIGxlbi0tICkKCQkJKnN0cjErKyA9IHRvdXBwZXIoICpzdHIyKysgKTsKCX0KCWVsc2Ugc3RybmNweSggc3RyMSwgc3RyMiwgbGVuICk7Cn0KCQp2b2lkIHNlcVVwcGVyKCBpbnQgbnNlcSwgY2hhciAqKnNlcSApIC8qIG5vdCB1c2VkICovCnsKCWludCBpLCBqLCBsZW47Cglmb3IoIGk9MDsgaTxuc2VxOyBpKysgKSAKCXsKCQlsZW4gPSBzdHJsZW4oIHNlcVtpXSApOwoJCWZvciggaj0wOyBqPGxlbjsgaisrICkgCgkJCXNlcVtpXVtqXSA9IHRvdXBwZXIoIHNlcVtpXVtqXSApOwoJfQp9Cgp2b2lkIHNlcUxvd2VyKCBpbnQgbnNlcSwgY2hhciAqKnNlcSApCnsKCWludCBpLCBqLCBsZW47Cglmb3IoIGk9MDsgaTxuc2VxOyBpKysgKSAKCXsKCQlsZW4gPSBzdHJsZW4oIHNlcVtpXSApOwoJCWZvciggaj0wOyBqPGxlbjsgaisrICkgCgkJCXNlcVtpXVtqXSA9IHRvbG93ZXIoIHNlcVtpXVtqXSApOwoJfQp9CgppbnQgZ2V0YWxpbmVfZnBfZW9mKCBjaGFyICpzLCBpbnQgbCwgRklMRSAqZnAgKSAgLyogZW5kIG9mIGZpbGUgLT4gcmV0dXJuIDEgKi8KewogICAgaW50IGMsIGkgPSAwIDsKICAgIGludCBub3Rlb2ZmbGFnID0gMDsKICAgIGZvciggaT0wOyBpPGwgJiYgKCBub3Rlb2ZmbGFnID0gKCAoYz1nZXRjKGZwKSkgIT0gRU9GICkgKSAmJiBjICE9ICdcbic7IGkrKyApIAogICAgCSpzKysgPSBjOwogICAgKnMgPSAnXDAnIDsKICAgICByZXR1cm4oICFub3Rlb2ZmbGFnICk7Cn0KCmludCBnZXRhbGluZV9mcF9lb2ZfbmV3KHMsIGwsIGZwKSAgLyogZW5kIG9mIGZpbGUgLT4gcmV0dXJuIDEgKi8KY2hhciAgICBzW10gOyBpbnQgbCA7IEZJTEUgKmZwIDsKewogICAgICAgIGludCBjID0gMCwgaSA9IDAgOwoJCWludCBub3Rlb2ZmbGFnID0gMDsKCgkJaWYoIGZlb2YoIGZwICkgKSByZXR1cm4oIDEgKTsKCgkJZm9yKCBpPTA7IGk8bCAmJiAoIG5vdGVvZmZsYWcgPSAoIChjPWdldGMoZnApKSAhPSBFT0YgKSApICYmIGMgIT0gJ1xuJzsgaSsrICkgCiAgICAgICAgeyAqcysrID0gYyA7IH0KICAgICAgICAqcyA9ICdcMCcgOwoJCWlmKCBjICE9ICdcbicgJiYgYyAhPSBFT0YgKSB3aGlsZSggZ2V0YyhmcCkgIT0gJ1xuJyApCgkJCTsKCQlyZXR1cm4oICFub3Rlb2ZmbGFnICk7Cn0KCmludCBteWZnZXRzKHMsIGwsIGZwKSAgLyogbLDKvuWkz6GiudTL9qTepMfGyaTfyPSk0KS5ICovCmNoYXIgICAgc1tdIDsgaW50IGwgOyBGSUxFICpmcCA7CnsKICAgICAgICBpbnQgICAgIGMgPSAwLCBpID0gMCA7CgoJCWlmKCBmZW9mKCBmcCApICkgcmV0dXJuKCAxICk7CgoJCWZvciggaT0wOyBpPGwgJiYgKCBjPWdldGMoIGZwICkgKSAhPSAnXG4nOyBpKysgKSAKICAgICAgICAJKnMrKyA9IGM7CiAgICAgICAgKnMgPSAnXDAnIDsKCQlpZiggYyAhPSAnXG4nICkgCgkJCXdoaWxlKCBnZXRjKGZwKSAhPSAnXG4nICkKCQkJCTsKCQlyZXR1cm4oIDAgKTsKfQoKZmxvYXQgaW5wdXRfbmV3KCBGSUxFICpmcCwgaW50IGQgKQp7CgljaGFyIG1vamlyZXRzdVsxMF07CglpbnQgaSwgYzsKCgljID0gZ2V0YyggZnAgKTsKCWlmKCBjICE9ICdcbicgKQoJCXVuZ2V0YyggYywgZnAgKTsKCglmb3IoIGk9MDsgaTxkOyBpKysgKQoJCW1vamlyZXRzdVtpXSA9IGdldGMoIGZwICk7Cgltb2ppcmV0c3VbaV0gPSAwOwoKCXJldHVybiggYXRvZiggbW9qaXJldHN1ICkgKTsKfQoKCnZvaWQgUHJlUmVhZCggRklMRSAqZnAsIGludCAqbG9jbmpvYiwgaW50ICpsb2NubGVubWF4ICkKewoJaW50IGksIG5sZW5pOwoJY2hhciBiW0JdOwoKCWZnZXRzKCBiLCBCLTEsIGZwICk7ICpsb2Nuam9iID0gYXRvaSggYiApOwoJKmxvY25sZW5tYXggPSAwOwoJaT0wOyAKCXdoaWxlKCBpPCpsb2Nuam9iICkKCXsKCQlmZ2V0cyggYiwgQi0xLCBmcCApOwoJCWlmKCAhc3RybmNtcCggYiwgIj0iLCAxICkgKQoJCXsKCQkJaSsrOwoJCQlmZ2V0cyggYiwgQi0xLCBmcCApOyBubGVuaSA9IGF0b2koIGIgKTsKCQkJaWYoIG5sZW5pID4gKmxvY25sZW5tYXggKSAqbG9jbmxlbm1heCA9IG5sZW5pOwoJCX0KCX0KCWlmKCAqbG9jbmxlbm1heCA+IE4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIlRPTyBMT05HIFNFUVVFTkNFIVxuIiApOwoJCWV4aXQoIDEgKTsKCX0KCWlmKCBuam9iID4gTSAgKSAKCXsKCQlmcHJpbnRmKCBzdGRlcnIsICJUT08gTUFOWSBTRVFVRU5DRSFcbiIgKTsKCQlmcHJpbnRmKCBzdGRlcnIsICIlZCA+ICVkXG4iLCBuam9iLCBNICk7CgkJZXhpdCggMSApOwoJfQp9CQoKaW50IGFsbFNwYWNlKCBjaGFyICpzdHIgKQp7CglpbnQgdmFsdWUgPSAxOwoJd2hpbGUoICpzdHIgKSB2YWx1ZSAqPSAoICFpc2RpZ2l0KCAqc3RyKysgKSApOwoJcmV0dXJuKCB2YWx1ZSApOwp9CgkKdm9pZCBSZWFkKCBjaGFyIG5hbWVbTV1bQl0sIGludCBubGVuW01dLCBjaGFyICoqc2VxICkKewoJZXh0ZXJuIHZvaWQgRlJlYWQoIEZJTEUgKngsIGNoYXIgeVtNXVtCXSwgaW50IHpbTV0sIGNoYXIgKip3ICk7CglGUmVhZCggc3RkaW4sIG5hbWUsIG5sZW4sIHNlcSApOwp9CgoKdm9pZCBGUmVhZCggRklMRSAqZnAsIGNoYXIgbmFtZVtdW0JdLCBpbnQgbmxlbltdLCBjaGFyICoqc2VxICkKewoJaW50IGksIGo7IAoJY2hhciBiW0JdOwoKCWZnZXRzKCBiLCBCLTEsIGZwICk7CiNpZiBERUJVRwoJZnByaW50Ziggc3RkZXJyLCAiYiA9ICVzXG4iLCBiICk7CiNlbmRpZgoKICAgIGlmKCBzdHJzdHIoIGIsICJvbm5ldCIgKSApIHNjb3JlbXR4ID0gMTsKICAgIGVsc2UgaWYoIHN0cnN0ciggYiwgIkRuQSIgKSApIAoJewoJCXNjb3JlbXR4ID0gLTE7IAoJCXVwcGVyQ2FzZSA9IC0xOwoJfQogICAgZWxzZSBpZiggc3Ryc3RyKCBiLCAiZG5hIiApICkgCgl7CgkJc2NvcmVtdHggPSAtMTsgCgkJdXBwZXJDYXNlID0gMDsKCX0KCWVsc2UgaWYoIHN0cnN0ciggYiwgIkROQSIgKSApCgl7CgkJc2NvcmVtdHggPSAtMTsgCgkJdXBwZXJDYXNlID0gMTsKCX0KICAgIGVsc2UgaWYoIHN0cnN0ciggYiwgIk0tWSIgKSB8fCBzdHJzdHIoIGIsICJpeWF0YSIgKSApIHNjb3JlbXR4ID0gMjsgCiAgICBlbHNlIHNjb3JlbXR4ID0gMDsKI2lmIERFQlVHCglmcHJpbnRmKCBzdGRlcnIsICIgJXMtPnNjb3JlbXR4ID0gJWRcbiIsIGIsIHNjb3JlbXR4ICk7CiNlbmRpZgoKCWdldGEyID0gR0VUQTI7CgojaWYgMAoJaWYoIHN0cmxlbiggYiApID49MjUgKQoJewoJCWJbMjVdID0gMDsKCSNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgImtpbXVyYVIgPSAlc1xuIiwgYisyMCApOwoJI2VuZGlmCgkJa2ltdXJhUiA9IGF0b2koIGIrMjAgKTsKCgkJaWYoIGtpbXVyYVIgPCAwIHx8IDIwIDwga2ltdXJhUiApIEVycm9yRXhpdCggIklsbGVhZ2FsIGtpbXVyYVIgdmFsdWUuXG4iICk7CgkJaWYoIGFsbFNwYWNlKCBiKzIwICkgKSBraW11cmFSID0gTk9UU1BFQ0lGSUVEOwoJfQoJZWxzZSBraW11cmFSID0gTk9UU1BFQ0lGSUVEOwoJI2lmIERFQlVHCglmcHJpbnRmKCBzdGRlcnIsICJraW11cmFSID0gJWRcbiIsIGtpbXVyYVIgKTsKCSNlbmRpZgoKCWlmKCBzdHJsZW4oIGIgKSA+PTIwICkKCXsKCQliWzIwXSA9IDA7CgkjaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJwYW1OID0gJXNcbiIsIGIrMTUgKTsKCSNlbmRpZgoJCXBhbU4gPSBhdG9pKCBiKzE1ICk7CgkJaWYoIHBhbU4gPCAwIHx8IDQwMCA8IHBhbU4gKSBFcnJvckV4aXQoICJJbGxlYWdhbCBwYW0gdmFsdWUuXG4iICk7CgkJaWYoIGFsbFNwYWNlKCBiKzE1ICkgKSBwYW1OID0gTk9UU1BFQ0lGSUVEOwoJfQoJZWxzZSBwYW1OID0gTk9UU1BFQ0lGSUVEOwoKCWlmKCBzdHJsZW4oIGIgKSA+PSAxNSApCgl7CgkJYlsxNV0gPSAwOwoJI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAicG9mZnNldCA9ICVzXG4iLCBiKzEwICk7CgkjZW5kaWYKCQlwb2Zmc2V0ID0gYXRvaSggYisxMCApOwoJCWlmKCBwb2Zmc2V0ID4gNTAwICkgRXJyb3JFeGl0KCAiSWxsZWdhbCBleHRlbmRpbmcgZ2FwIHBwZW5hbHR5XG4iICk7CgkJaWYoIGFsbFNwYWNlKCBiKzEwICkgKSBwb2Zmc2V0ID0gTk9UU1BFQ0lGSUVEOwoJfQoJZWxzZSBwb2Zmc2V0ID0gTk9UU1BFQ0lGSUVEOwoKCWlmKCBzdHJsZW4oIGIgKSA+PSAxMCApCgl7CgkJYlsxMF0gPSAwOwoJI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAicHBlbmFsdHkgPSAlc1xuIiwgYis1ICk7CgkjZW5kaWYKCQlwcGVuYWx0eSA9IGF0b2koIGIrNSApOwoJCWlmKCBwcGVuYWx0eSA+IDAgKSBFcnJvckV4aXQoICJJbGxlZ2FsIG9wZW5pbmcgZ2FwIHBwZW5hbHR5XG4iICk7CgkJaWYoIGFsbFNwYWNlKCBiKzUgKSApIHBwZW5hbHR5ID0gTk9UU1BFQ0lGSUVEOwoJfQoJZWxzZSBwcGVuYWx0eSA9IE5PVFNQRUNJRklFRDsKI2VuZGlmCgoJZm9yKCBpPTA7IGk8bmpvYjsgaSsrICkKCXsKCQlnZXRhbGluZV9mcF9lb2ZfbmV3KCBiLCBCLTEsIGZwICk7CgkJc3RyY3B5KCBuYW1lW2ldLCBiICk7CiNpZiBERUJVRwoJCWZwcmludGYoIHN0ZGVyciwgIm5hbWVbJWRdID0gJXNcbiIsIGksIG5hbWVbaV0gKTsKI2VuZGlmCgkJZmdldHMoIGIsIEItMSwgZnAgKTsgbmxlbltpXSA9IGF0b2koIGIgKTsgICAgICAvKiBzZXEgaSBubyBuYWdhc2EgKi8KCQlzZXFbaV1bMF0gPSAwOwoJCWlmKCBubGVuW2ldICkgZm9yKCBqPTA7IGogPD0gKG5sZW5baV0tMSkvQzsgaisrICkKCQl7CgkJCWdldGFsaW5lX2ZwX2VvZl9uZXcoIGIsIEItMSwgZnAgKTsKCQkJLyoJYltDXSA9IDA7ICAqLwoJCQlzdHJjYXQoIHNlcVtpXSwgYiApOwoJCX0gCgkJc2VxW2ldW25sZW5baV1dID0gMDsKCX0KCWlmKCBzY29yZW10eCA9PSAtMSAmJiB1cHBlckNhc2UgIT0gLTEgKSBzZXFMb3dlciggbmpvYiwgc2VxICk7Cn0KCgpzdGF0aWMgaW50IGNvdW50S1VvcldBKCBGSUxFICpmcCApCnsKCWludCB2YWx1ZTsKCWludCBjLCBiOwoKCXZhbHVlPSAwOwoJYiA9ICdcbic7Cgl3aGlsZSggKCBjID0gZ2V0YyggZnAgKSApICE9IEVPRiApCgl7CgkJaWYoIGIgPT0gJ1xuJyAmJiAoIGMgPT0gJz0nIHx8IGMgPT0gJz4nICkgKQoJCQl2YWx1ZSsrOwoJCWIgPSBjOwoJfQoJcmV3aW5kKCBmcCApOwoJcmV0dXJuKCB2YWx1ZSApOwp9Cgp2b2lkIHNlYXJjaEtVb3JXQSggRklMRSAqZnAgKQp7CglpbnQgYywgYjsKCWIgPSAnXG4nOwoJd2hpbGUoICEoICggKCBjID0gZ2V0YyggZnAgKSApID09ICc+JyB8fCBjID09ICc9JyB8fCBjID09IEVPRiApICYmIGIgPT0gJ1xuJyApICkKCQliID0gYzsKCXVuZ2V0YyggYywgZnAgKTsKfQoKc3RhdGljIGludCBvbmx5QWxwaGFfbG93ZXIoIGNoYXIgKnN0ciApCnsKCWNoYXIgdG1wOwoJY2hhciAqcmVzID0gc3RyOwoJY2hhciAqYmsgPSBzdHI7CgoJd2hpbGUoICh0bXA9KnN0cisrKSApCgkJaWYoIGlzYWxwaGEoIHRtcCApIHx8IHRtcCA9PSAnLScgfHwgdG1wID09ICcqJyB8fCB0bXAgPT0gJy4nICkKCQkJKnJlcysrID0gdG9sb3dlciggdG1wICk7CgkqcmVzID0gMDsKCXJldHVybiggcmVzIC0gYmsgKTsKfQpzdGF0aWMgaW50IG9ubHlBbHBoYV91cHBlciggY2hhciAqc3RyICkKewoJY2hhciB0bXA7CgljaGFyICpyZXMgPSBzdHI7CgljaGFyICpiayA9IHN0cjsKCgl3aGlsZSggKHRtcD0qc3RyKyspICkKCQlpZiggaXNhbHBoYSggdG1wICkgfHwgdG1wID09ICctJyB8fCB0bXAgPT0gJyonIHx8IHRtcCA9PSAnLicgKQoJCQkqcmVzKysgPSB0b3VwcGVyKCB0bXAgKTsKCSpyZXMgPSAwOwoJcmV0dXJuKCByZXMgLSBiayApOwp9Cgp2b2lkIGtha2UyaGlrdSggY2hhciAqc3RyICkKewoJZG8KCQlpZiggKnN0ciA9PSAnKicgKSAqc3RyID0gJy0nOwoJd2hpbGUoICpzdHIrKyApOwp9CgpjaGFyICpsb2FkMVNlcVdpdGhvdXROYW1lX3JlYWxsb2MoIEZJTEUgKmZwcCApCnsKCWludCBjLCBiOwoJY2hhciAqY2J1ZjsKCWludCBzaXplID0gTjsKCWNoYXIgKnZhbDsKCgl2YWwgPSBtYWxsb2MoIChzaXplKzEpICogc2l6ZW9mKCBjaGFyICkgKTsKCWNidWYgPSB2YWw7CgoJYiA9ICdcbic7Cgl3aGlsZSggKCBjID0gZ2V0YyggZnBwICkgKSAhPSBFT0YgJiYgICAgICAgICAgIAogICAgICAgICAgISggKCBjID09ICc+JyB8fCBjID09ICc9JyB8fCBjID09ICcoJyB8fCBjID09IEVPRiApICYmIGIgPT0gJ1xuJyApICkKCXsKCQkqY2J1ZisrID0gKGNoYXIpYzsgIC8qIMS5pLmkrqTGpOKkt6TppMqkpCAqLwoJCWlmKCBjYnVmIC0gdmFsID09IHNpemUgKQoJCXsKCQkJc2l6ZSArPSBOOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcuLi5cbiIgKTsKCQkJdmFsID0gKGNoYXIgKilyZWFsbG9jKCB2YWwsIChzaXplKzEpICogc2l6ZW9mKCBjaGFyICkgKTsKCQkJaWYoICF2YWwgKQoJCQl7CgkJCQlmcHJpbnRmKCBzdGRlcnIsICJBbGxvY2F0aW9uIGVycm9yIGluIGxvYWQxU2VxV2l0aG91dE5hbWVfcmVhbGxvYyBcbiIgKTsKCQkJCWV4aXQoIDEgKTsKCQkJfQoJCQlmcHJpbnRmKCBzdGRlcnIsICJkb25lLlxuIiApOwoJCQljYnVmID0gdmFsICsgc2l6ZS1OOwoJCX0KCQliID0gYzsKCX0KCXVuZ2V0YyggYywgZnBwICk7CgkqY2J1ZiA9IDA7CglpZiggZG9ycCA9PSAnZCcgKQoJCW9ubHlBbHBoYV9sb3dlciggdmFsICk7CgllbHNlCgkJb25seUFscGhhX3VwcGVyKCB2YWwgKTsKCWtha2UyaGlrdSggdmFsICk7CglyZXR1cm4oIHZhbCApOwp9CgppbnQgbG9hZDFTZXFXaXRob3V0TmFtZV9uZXcoIEZJTEUgKmZwcCwgY2hhciAqY2J1ZiApCnsKCWludCBjLCBiOwoJY2hhciAqYmsgPSBjYnVmOwoKCWIgPSAnXG4nOwoJd2hpbGUoICggYyA9IGdldGMoIGZwcCApICkgIT0gRU9GICYmICAgICAgICAgICAgICAgICAgICAvKiBieSBULiBOaXNoaXlhbWEgKi8KICAgICAgICAgICEoICggYyA9PSAnPicgfHwgYyA9PSAnPScgfHwgYyA9PSAnKCcgfHwgYyA9PSBFT0YgKSAmJiBiID09ICdcbicgKSApCgl7CgkJKmNidWYrKyA9IChjaGFyKWM7ICAvKiDEuaS5pK6kxqTipLek6aTKpKQgKi8KCQliID0gYzsKCX0KCXVuZ2V0YyggYywgZnBwICk7CgkqY2J1ZiA9IDA7CglpZiggZG9ycCA9PSAnZCcgKQoJCW9ubHlBbHBoYV9sb3dlciggYmsgKTsKCWVsc2UKCQlvbmx5QWxwaGFfdXBwZXIoIGJrICk7CglrYWtlMmhpa3UoIGJrICk7CglyZXR1cm4oIDAgKTsKfQoKCnZvaWQgcmVhZERhdGFmb3JnYWxuKCBGSUxFICpmcCwgY2hhciAqKm5hbWUsIGludCAqbmxlbiwgY2hhciAqKnNlcSApCnsKCWludCBpOyAKCXN0YXRpYyBjaGFyICp0bXBzZXEgPSBOVUxMOwoKI2lmIDAKCWlmKCAhdG1wc2VxICkKCXsKCQl0bXBzZXEgPSBBbGxvY2F0ZUNoYXJWZWMoIE4gKTsKCX0KI2VuZGlmCgoJcmV3aW5kKCBmcCApOwoJc2VhcmNoS1VvcldBKCBmcCApOwoKCWZvciggaT0wOyBpPG5qb2I7IGkrKyApCgl7CgkJbmFtZVtpXVswXSA9ICc9JzsgZ2V0YyggZnAgKTsgCiNpZiAwCgkJZmdldHMoIG5hbWVbaV0rMSwgQi0yLCBmcCApOyAKCQlqID0gc3RybGVuKCBuYW1lW2ldICk7CgkJaWYoIG5hbWVbaV1bai0xXSAhPSAnXG4nICkKCQkJRXJyb3JFeGl0KCAiVG9vIGxvbmcgbmFtZVxuIiApOwoJCW5hbWVbaV1bai0xXSA9IDA7CiNlbHNlCgkJbXlmZ2V0cyggbmFtZVtpXSsxLCBCLTIsIGZwICk7IAojZW5kaWYKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJuYW1lWyVkXSA9ICVzXG4iLCBpLCBuYW1lW2ldICk7CiNlbmRpZgoJCXRtcHNlcSA9IGxvYWQxU2VxV2l0aG91dE5hbWVfcmVhbGxvYyggZnAgKTsKCQlzdHJjcHkoIHNlcVtpXSwgdG1wc2VxICk7CgkJbmxlbltpXSA9IHN0cmxlbiggc2VxW2ldICk7CgkJZnJlZSggdG1wc2VxICk7Cgl9CglpZiggZG9ycCA9PSAnZCcgJiYgdXBwZXJDYXNlICE9IC0xICkgc2VxTG93ZXIoIG5qb2IsIHNlcSApOwojaWYgMAoJZnJlZSggdG1wc2VxICk7CiNlbmRpZgp9Cgp2b2lkIHJlYWREYXRhX3ZhcmxlbiggRklMRSAqZnAsIGNoYXIgKipuYW1lLCBpbnQgKm5sZW4sIGNoYXIgKipzZXEgKQp7CglpbnQgaTsgCglzdGF0aWMgY2hhciAqdG1wc2VxID0gTlVMTDsKCglyZXdpbmQoIGZwICk7CglzZWFyY2hLVW9yV0EoIGZwICk7CgoJZm9yKCBpPTA7IGk8bmpvYjsgaSsrICkKCXsKCQluYW1lW2ldWzBdID0gJz0nOyBnZXRjKCBmcCApOyAKI2lmIDAKCQlmZ2V0cyggbmFtZVtpXSsxLCBCLTIsIGZwICk7IAoJCWogPSBzdHJsZW4oIG5hbWVbaV0gKTsKCQlpZiggbmFtZVtpXVtqLTFdICE9ICdcbicgKQoJCQlFcnJvckV4aXQoICJUb28gbG9uZyBuYW1lXG4iICk7CgkJbmFtZVtpXVtqLTFdID0gMDsKI2Vsc2UKCQlteWZnZXRzKCBuYW1lW2ldKzEsIEItMiwgZnAgKTsgCiNlbmRpZgojaWYgMAoJCWZwcmludGYoIHN0ZGVyciwgIm5hbWVbJWRdID0gJXNcbiIsIGksIG5hbWVbaV0gKTsKI2VuZGlmCgkJdG1wc2VxID0gbG9hZDFTZXFXaXRob3V0TmFtZV9yZWFsbG9jKCBmcCApOwoJCW5sZW5baV0gPSBzdHJsZW4oIHRtcHNlcSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAibmxlblslZF0gPSAlZFxuIiwgaSsxLCBubGVuW2ldICk7CgkJc2VxW2ldID0gY2FsbG9jKCBubGVuW2ldKzEsIHNpemVvZiggY2hhciApICk7CgkJc3RyY3B5KCBzZXFbaV0sIHRtcHNlcSApOwoJCWZyZWUoIHRtcHNlcSApOwoJfQoJaWYoIGRvcnAgPT0gJ2QnICYmIHVwcGVyQ2FzZSAhPSAtMSApIHNlcUxvd2VyKCBuam9iLCBzZXEgKTsKI2lmIDAKCWZyZWUoIHRtcHNlcSApOwojZW5kaWYKfQoKdm9pZCByZWFkRGF0YV9wb2ludGVyKCBGSUxFICpmcCwgY2hhciAqKm5hbWUsIGludCAqbmxlbiwgY2hhciAqKnNlcSApCnsKCWludCBpOyAKCXN0YXRpYyBjaGFyICp0bXBzZXEgPSBOVUxMOwoKI2lmIDAKCWlmKCAhdG1wc2VxICkKCXsKCQl0bXBzZXEgPSBBbGxvY2F0ZUNoYXJWZWMoIE4gKTsKCX0KI2VuZGlmCgoJcmV3aW5kKCBmcCApOwoJc2VhcmNoS1VvcldBKCBmcCApOwoKCWZvciggaT0wOyBpPG5qb2I7IGkrKyApCgl7CgkJbmFtZVtpXVswXSA9ICc9JzsgZ2V0YyggZnAgKTsgCiNpZiAwCgkJZmdldHMoIG5hbWVbaV0rMSwgQi0yLCBmcCApOyAKCQlqID0gc3RybGVuKCBuYW1lW2ldICk7CgkJaWYoIG5hbWVbaV1bai0xXSAhPSAnXG4nICkKCQkJRXJyb3JFeGl0KCAiVG9vIGxvbmcgbmFtZVxuIiApOwoJCW5hbWVbaV1bai0xXSA9IDA7CiNlbHNlCgkJbXlmZ2V0cyggbmFtZVtpXSsxLCBCLTIsIGZwICk7IAojZW5kaWYKI2lmIDAKCQlmcHJpbnRmKCBzdGRlcnIsICJuYW1lWyVkXSA9ICVzXG4iLCBpLCBuYW1lW2ldICk7CiNlbmRpZgoJCXRtcHNlcSA9IGxvYWQxU2VxV2l0aG91dE5hbWVfcmVhbGxvYyggZnAgKTsKCQlzdHJjcHkoIHNlcVtpXSwgdG1wc2VxICk7CgkJZnJlZSggdG1wc2VxICk7CgkJbmxlbltpXSA9IHN0cmxlbiggc2VxW2ldICk7Cgl9CglpZiggZG9ycCA9PSAnZCcgJiYgdXBwZXJDYXNlICE9IC0xICkgc2VxTG93ZXIoIG5qb2IsIHNlcSApOwojaWYgMAoJZnJlZSggdG1wc2VxICk7CiNlbmRpZgp9Cgp2b2lkIHJlYWREYXRhKCBGSUxFICpmcCwgY2hhciBuYW1lW11bQl0sIGludCBubGVuW10sIGNoYXIgKipzZXEgKQp7CglpbnQgaTsgCglzdGF0aWMgY2hhciAqdG1wc2VxID0gTlVMTDsKCiNpZiAwCglpZiggIXRtcHNlcSApCgl7CgkJdG1wc2VxID0gQWxsb2NhdGVDaGFyVmVjKCBOICk7Cgl9CiNlbmRpZgoKCXJld2luZCggZnAgKTsKCXNlYXJjaEtVb3JXQSggZnAgKTsKCglmb3IoIGk9MDsgaTxuam9iOyBpKysgKQoJewoJCW5hbWVbaV1bMF0gPSAnPSc7IGdldGMoIGZwICk7IAojaWYgMAoJCWZnZXRzKCBuYW1lW2ldKzEsIEItMiwgZnAgKTsgCgkJaiA9IHN0cmxlbiggbmFtZVtpXSApOwoJCWlmKCBuYW1lW2ldW2otMV0gIT0gJ1xuJyApCgkJCUVycm9yRXhpdCggIlRvbyBsb25nIG5hbWVcbiIgKTsKCQluYW1lW2ldW2otMV0gPSAwOwojZWxzZQoJCW15ZmdldHMoIG5hbWVbaV0rMSwgQi0yLCBmcCApOyAKI2VuZGlmCiNpZiAwCgkJZnByaW50Ziggc3RkZXJyLCAibmFtZVslZF0gPSAlc1xuIiwgaSwgbmFtZVtpXSApOwojZW5kaWYKCQl0bXBzZXEgPSBsb2FkMVNlcVdpdGhvdXROYW1lX3JlYWxsb2MoIGZwICk7CgkJc3RyY3B5KCBzZXFbaV0sIHRtcHNlcSApOwoJCW5sZW5baV0gPSBzdHJsZW4oIHNlcVtpXSApOwoJCWZyZWUoIHRtcHNlcSApOwoJfQoJaWYoIGRvcnAgPT0gJ2QnICYmIHVwcGVyQ2FzZSAhPSAtMSApIHNlcUxvd2VyKCBuam9iLCBzZXEgKTsKI2lmIDAKCWZyZWUoIHRtcHNlcSApOwojZW5kaWYKfQoKCmludCBjb3VudEFUR0MoIGNoYXIgKnMsIGludCAqdG90YWwgKQp7CglpbnQgbkFUR0M7CglpbnQgbkNoYXI7CgljaGFyIGM7CgluQVRHQyA9IG5DaGFyID0gMDsKCglpZiggKnMgPT0gMCApIAoJewoJCXRvdGFsID0gMDsKCQlyZXR1cm4oIDAgKTsKCX0KCglkbwoJewoJCWMgPSB0b2xvd2VyKCAqcyApOwoJCWlmKCBpc2FscGhhKCBjICkgKQoJCXsKCQkJbkNoYXIrKzsKCQkJaWYoIGMgPT0gJ2EnIHx8IGMgPT0gJ3QnIHx8IGMgPT0gJ2cnIHx8IGMgPT0gJ2MnIHx8IGMgPT0gJ3UnIHx8IGMgPT0gJ24nICkKCQkJCW5BVEdDKys7CgkJfQoJfQoJd2hpbGUoICorK3MgKTsKCgkqdG90YWwgPSBuQ2hhcjsKCXJldHVybiggbkFUR0MgKTsKfQoKZG91YmxlIGNvdW50QVRHQ2JrKCBjaGFyICpzICkKewoJaW50IG5BVEdDOwoJaW50IG5DaGFyOwoJY2hhciBjOwoJbkFUR0MgPSBuQ2hhciA9IDA7CgoJZG8KCXsKCQljID0gdG9sb3dlciggKnMgKTsKCQlpZiggaXNhbHBoYSggYyApICkKCQl7CgkJCW5DaGFyKys7CgkJCWlmKCBjID09ICdhJyB8fCBjID09ICd0JyB8fCBjID09ICdnJyB8fCBjID09ICdjJyB8fCBjID09ICd1JyB8fCBjID09ICduJyApCgkJCQluQVRHQysrOwoJCX0KCX0KCXdoaWxlKCAqKytzICk7CglyZXR1cm4oIChkb3VibGUpbkFUR0MgLyBuQ2hhciApOwp9CgoKaW50IGNvdW50YWxwaGEoIGNoYXIgKnNlcSApCnsKCWludCB2YWwgPSAwOwoJd2hpbGUoICpzZXEgKQoJCWlmKCBpc2FscGhhKCAqc2VxKysgKSApIHZhbCsrOwoJcmV0dXJuKCB2YWwgKTsKfQoKdm9pZCBnZXRudW1sZW5fbm9nYXAoIEZJTEUgKmZwLCBpbnQgKm5sZW5taW5wdCApCnsKCWludCB0b3RhbDsKCWludCBuc2l0ZTsKCWludCBhdGdjbnVtOwoJaW50IGksIHRtcDsKCWNoYXIgKnRtcHNlcSwgKnRtcG5hbWU7Cglkb3VibGUgYXRnY2ZyZXE7Cgl0bXBuYW1lID0gQWxsb2NhdGVDaGFyVmVjKCBOICk7Cgluam9iID0gY291bnRLVW9yV0EoIGZwICk7CglzZWFyY2hLVW9yV0EoIGZwICk7CglubGVubWF4ID0gMDsKCSpubGVubWlucHQgPSA5OTk5OTk5OTsKCWF0Z2NudW0gPSAwOwoJdG90YWwgPSAwOwoJZm9yKCBpPTA7IGk8bmpvYjsgaSsrICkKCXsKCQlteWZnZXRzKCB0bXBuYW1lLCBOLTEsIGZwICk7CgkJdG1wc2VxID0gbG9hZDFTZXFXaXRob3V0TmFtZV9yZWFsbG9jKCBmcCApOwoJCXRtcCA9IGNvdW50YWxwaGEoIHRtcHNlcSApOwoJCWlmKCB0bXAgPiBubGVubWF4ICkgbmxlbm1heCAgPSB0bXA7CgkJaWYoIHRtcCA8ICpubGVubWlucHQgKSAqbmxlbm1pbnB0ICA9IHRtcDsKCQlhdGdjbnVtICs9IGNvdW50QVRHQyggdG1wc2VxLCAmbnNpdGUgKTsKCQl0b3RhbCArPSBuc2l0ZTsKCQlmcmVlKCB0bXBzZXEgKTsKCX0KCWZyZWUoIHRtcG5hbWUgKTsKCWF0Z2NmcmVxID0gKGRvdWJsZSlhdGdjbnVtIC8gdG90YWw7CglmcHJpbnRmKCBzdGRlcnIsICIjIyMjIyBhdGdjZnJlcSA9ICVmXG4iLCBhdGdjZnJlcSApOwoJaWYoIGRvcnAgPT0gTk9UU1BFQ0lGSUVEICkKCXsKCQlpZiggYXRnY2ZyZXEgPiAwLjc1ICkgCQoJCXsKCQkJZG9ycCA9ICdkJzsKCQkJdXBwZXJDYXNlID0gLTE7CgkJfQoJCWVsc2UgICAgICAgICAgICAgICAgICAKCQl7CgkJCWRvcnAgPSAncCc7CgkJCXVwcGVyQ2FzZSA9IDA7CgkJfQoJfQp9Cgp2b2lkIGdldG51bWxlbiggRklMRSAqZnAgKQp7CglpbnQgdG90YWw7CglpbnQgbnNpdGU7CglpbnQgYXRnY251bTsKCWludCBpLCB0bXA7CgljaGFyICp0bXBzZXE7CgljaGFyICp0bXBuYW1lOwoJZG91YmxlIGF0Z2NmcmVxOwoJdG1wbmFtZSA9IEFsbG9jYXRlQ2hhclZlYyggTiApOwoJbmpvYiA9IGNvdW50S1VvcldBKCBmcCApOwoJc2VhcmNoS1VvcldBKCBmcCApOwoJbmxlbm1heCA9IDA7CglhdGdjbnVtID0gMDsKCXRvdGFsID0gMDsKCWZvciggaT0wOyBpPG5qb2I7IGkrKyApCgl7CgkJbXlmZ2V0cyggdG1wbmFtZSwgTi0xLCBmcCApOwoJCXRtcHNlcSA9IGxvYWQxU2VxV2l0aG91dE5hbWVfcmVhbGxvYyggZnAgKTsKCQl0bXAgPSBzdHJsZW4oIHRtcHNlcSApOwoJCWlmKCB0bXAgPiBubGVubWF4ICkgbmxlbm1heCAgPSB0bXA7CgkJYXRnY251bSArPSBjb3VudEFUR0MoIHRtcHNlcSwgJm5zaXRlICk7CgkJdG90YWwgKz0gbnNpdGU7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICIjIyMjIyB0b3RhbCA9ICVkXG4iLCB0b3RhbCApOwoJCWZyZWUoIHRtcHNlcSApOwoJfQoKCWF0Z2NmcmVxID0gKGRvdWJsZSlhdGdjbnVtIC8gdG90YWw7Ci8vCWZwcmludGYoIHN0ZGVyciwgIiMjIyMjIGF0Z2NmcmVxID0gJWZcbiIsIGF0Z2NmcmVxICk7CglpZiggZG9ycCA9PSBOT1RTUEVDSUZJRUQgKQoJewoJCWlmKCBhdGdjZnJlcSA+IDAuNzUgKSAJCgkJewoJCQlkb3JwID0gJ2QnOwoJCQl1cHBlckNhc2UgPSAtMTsKCQl9CgkJZWxzZSAgICAgICAgICAgICAgICAgIAoJCXsKCQkJZG9ycCA9ICdwJzsKCQkJdXBwZXJDYXNlID0gMDsKCQl9Cgl9CglmcmVlKCB0bXBuYW1lICk7Cn0KCQoKCnZvaWQgV3JpdGVHYXBGaWxsKCBGSUxFICpmcCwgaW50IGxvY25qb2IsIGNoYXIgbmFtZVtdW0JdLCBpbnQgbmxlbltNXSwgY2hhciAqKmFzZXEgKQp7CglzdGF0aWMgY2hhciBiW05dOwoJaW50IGksIGo7CglpbnQgbmFsZW5bTV07CglzdGF0aWMgY2hhciBnYXBbTl07CglzdGF0aWMgY2hhciBidWZmW05dOwoKI2lmIElPREVCVUcKCWZwcmludGYoIHN0ZGVyciwgIklNQUtBUkEgS0FLVVxuIiApOwojZW5kaWYKCW5sZW5tYXggPSAwOwoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkKCXsKCQlpbnQgbGVuID0gc3RybGVuKCBhc2VxW2ldICk7CgkJaWYoIG5sZW5tYXggPCBsZW4gKSBubGVubWF4ID0gbGVuOwoJfQoKCWZvciggaT0wOyBpPG5sZW5tYXg7IGkrKyApIGdhcFtpXSA9ICctJzsKCWdhcFtubGVubWF4XSA9IDA7CgoJZnByaW50ZiggZnAsICIlNWQiLCBsb2Nuam9iICk7CglmcHJpbnRmKCBmcCwgIlxuIiApOwoKCWZvciggaT0wOyBpPGxvY25qb2I7IGkrKyApCgl7CgkJc3RyY3B5KCBidWZmLCBhc2VxW2ldICk7CgkJc3RybmNhdCggYnVmZiwgZ2FwLCBubGVubWF4LXN0cmxlbiggYXNlcVtpXSApICk7CgkJYnVmZltubGVubWF4XSA9IDA7CgkJbmFsZW5baV0gPSBzdHJsZW4oIGJ1ZmYgKTsKCQlmcHJpbnRmKCBmcCwgIiVzXG4iLCBuYW1lW2ldICk7CgkJZnByaW50ZiggZnAsICIlNWRcbiIsIG5hbGVuW2ldICk7CgkJZm9yKCBqPTA7IGo8bmFsZW5baV07IGo9aitDICkKCQl7CgkJCXN0cm5jcHlfY2FzZUMoIGIsIGJ1ZmYraiwgQyApOyBiW0NdID0gMDsKCQkJZnByaW50ZiggZnAsICIlc1xuIixiICk7CgkJfQoJfQojaWYgREVCVUcKCWZwcmludGYoIHN0ZGVyciwgIm5hbGVuWzBdID0gJWRcbiIsIG5hbGVuWzBdICk7CiNlbmRpZgojaWYgSU9ERUJVRwoJZnByaW50Ziggc3RkZXJyLCAiS0FLSU9XQVRUQVxuIiApOwojZW5kaWYKfQoKdm9pZCB3cml0ZURhdGFmb3JnYWxuKCBGSUxFICpmcCwgaW50IGxvY25qb2IsIGNoYXIgKipuYW1lLCBpbnQgKm5sZW4sIGNoYXIgKiphc2VxICkKewoJaW50IGksIGo7CglpbnQgbmFsZW47CgoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkKCXsKCQluYWxlbiA9IHN0cmxlbiggYXNlcVtpXSApOwoJCWZwcmludGYoIGZwLCAiPiVzXG4iLCBuYW1lW2ldKzEgKTsKCQlmb3IoIGo9MDsgajxuYWxlbjsgaj1qK0MgKQoJCXsKI2lmIDAKCQkJc3RybmNweSggYiwgYXNlcVtpXStqLCBDICk7IGJbQ10gPSAwOwoJCQlmcHJpbnRmKCBmcCwgIiVzXG4iLGIgKTsKI2Vsc2UKCQkJZnByaW50ZiggZnAsICIlLipzXG4iLCBDLCBhc2VxW2ldK2ogKTsKI2VuZGlmCgkJfQoJfQp9Cgp2b2lkIHdyaXRlRGF0YV9wb2ludGVyKCBGSUxFICpmcCwgaW50IGxvY25qb2IsIGNoYXIgKipuYW1lLCBpbnQgKm5sZW4sIGNoYXIgKiphc2VxICkKewoJaW50IGksIGo7CglpbnQgbmFsZW47CgoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkKCXsKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkIGluIHdyaXRlRGF0YVxuIiwgaSApOwojZW5kaWYKCQluYWxlbiA9IHN0cmxlbiggYXNlcVtpXSApOwoJCWZwcmludGYoIGZwLCAiPiVzXG4iLCBuYW1lW2ldKzEgKTsKCQlmb3IoIGo9MDsgajxuYWxlbjsgaj1qK0MgKQoJCXsKI2lmIDAKCQkJc3RybmNweSggYiwgYXNlcVtpXStqLCBDICk7IGJbQ10gPSAwOwoJCQlmcHJpbnRmKCBmcCwgIiVzXG4iLGIgKTsKI2Vsc2UKCQkJZnByaW50ZiggZnAsICIlLipzXG4iLCBDLCBhc2VxW2ldK2ogKTsKI2VuZGlmCgkJfQoJfQp9Cgp2b2lkIHdyaXRlRGF0YSggRklMRSAqZnAsIGludCBsb2Nuam9iLCBjaGFyIG5hbWVbXVtCXSwgaW50IG5sZW5bXSwgY2hhciAqKmFzZXEgKQp7CglpbnQgaSwgajsKCWludCBuYWxlbjsKCglmb3IoIGk9MDsgaTxsb2Nuam9iOyBpKysgKQoJewojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQgaW4gd3JpdGVEYXRhXG4iLCBpICk7CiNlbmRpZgoJCW5hbGVuID0gc3RybGVuKCBhc2VxW2ldICk7CgkJZnByaW50ZiggZnAsICI+JXNcbiIsIG5hbWVbaV0rMSApOwoJCWZvciggaj0wOyBqPG5hbGVuOyBqPWorQyApCgkJewojaWYgMAoJCQlzdHJuY3B5KCBiLCBhc2VxW2ldK2osIEMgKTsgYltDXSA9IDA7CgkJCWZwcmludGYoIGZwLCAiJXNcbiIsYiApOwojZWxzZQoJCQlmcHJpbnRmKCBmcCwgIiUuKnNcbiIsIEMsIGFzZXFbaV0raiApOwojZW5kaWYKCQl9Cgl9Cn0KCgp2b2lkIHdyaXRlMXNlcSggRklMRSAqZnAsIGNoYXIgKmFzZXEgKQp7CglpbnQgajsKCWludCBuYWxlbjsKCgluYWxlbiA9IHN0cmxlbiggYXNlcSApOwoJZm9yKCBqPTA7IGo8bmFsZW47IGo9aitDICkKCQlmcHJpbnRmKCBmcCwgIiUuKnNcbiIsIEMsIGFzZXEraiApOwp9CgoKCnZvaWQgcmVhZGhhdDJfZmxvYXRoYWxmX3BvaW50ZXIoIEZJTEUgKmZwLCBpbnQgbnNlcSwgY2hhciAqKm5hbWUsIGZsb2F0ICoqbXR4ICkKewogICAgaW50IGksIGosIG5zZXEwOwogICAgY2hhciBiW0JdOwoKICAgIGZnZXRzKCBiLCBCLCBmcCApOwogICAgZmdldHMoIGIsIEIsIGZwICk7IGJbNV0gPSAwOyBuc2VxMCA9IGF0b2koIGIgKTsgaWYoIG5zZXEgIT0gbnNlcTAgKSBFcnJvckV4aXQoICJoYXQyIGlzIHdyb25nLiIgKTsKICAgIGZnZXRzKCBiLCBCLCBmcCApOwogICAgZm9yKCBpPTA7IGk8bnNlcTsgaSsrICkKICAgIHsKI2lmIDAKICAgICAgICBnZXRhbGluZV9mcF9lb2YoIGIsIEIsIGZwICk7IAojZWxzZQoJCW15ZmdldHMoIGIsIEItMiwgZnAgKTsKI2VuZGlmCiNpZiAwCgkJaiA9IE1JTiggc3RybGVuKCBiKzYgKSwgMTAgKTsKICAgICAgICBpZiggc3RybmNtcCggbmFtZVtpXSwgYis2ICwgaiApICkgCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJFcnJvciBpbiBoYXQyXG4iICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIiVzICE9ICVzXG4iLCBiLCBuYW1lW2ldICk7CgkJCWV4aXQoIDEgKTsKCQl9CiNlbmRpZgogICAgfQogICAgZm9yKCBpPTA7IGk8bnNlcS0xOyBpKysgKSBmb3IoIGo9aSsxOyBqPG5zZXE7IGorKyApCiAgICB7CiAgICAgICAgbXR4W2ldW2otaV0gPSAoIGlucHV0X25ldyggZnAsIEQgKSApOwogICAgfQp9CnZvaWQgcmVhZGhhdDJfZmxvYXRoYWxmKCBGSUxFICpmcCwgaW50IG5zZXEsIGNoYXIgbmFtZVtNXVtCXSwgZmxvYXQgKiptdHggKQp7CiAgICBpbnQgaSwgaiwgbnNlcTA7CiAgICBjaGFyIGJbQl07CgogICAgZmdldHMoIGIsIEIsIGZwICk7CiAgICBmZ2V0cyggYiwgQiwgZnAgKTsgYls1XSA9IDA7IG5zZXEwID0gYXRvaSggYiApOyBpZiggbnNlcSAhPSBuc2VxMCApIEVycm9yRXhpdCggImhhdDIgaXMgd3JvbmcuIiApOwogICAgZmdldHMoIGIsIEIsIGZwICk7CiAgICBmb3IoIGk9MDsgaTxuc2VxOyBpKysgKQogICAgewojaWYgMAogICAgICAgIGdldGFsaW5lX2ZwX2VvZiggYiwgQiwgZnAgKTsgCiNlbHNlCgkJbXlmZ2V0cyggYiwgQi0yLCBmcCApOwojZW5kaWYKI2lmIDAKCQlqID0gTUlOKCBzdHJsZW4oIGIrNiApLCAxMCApOwogICAgICAgIGlmKCBzdHJuY21wKCBuYW1lW2ldLCBiKzYgLCBqICkgKSAKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgIkVycm9yIGluIGhhdDJcbiIgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiJXMgIT0gJXNcbiIsIGIsIG5hbWVbaV0gKTsKCQkJZXhpdCggMSApOwoJCX0KI2VuZGlmCiAgICB9CiAgICBmb3IoIGk9MDsgaTxuc2VxLTE7IGkrKyApIGZvciggaj1pKzE7IGo8bnNlcTsgaisrICkKICAgIHsKICAgICAgICBtdHhbaV1bai1pXSA9ICggaW5wdXRfbmV3KCBmcCwgRCApICk7CiAgICB9Cn0Kdm9pZCByZWFkaGF0Ml9mbG9hdCggRklMRSAqZnAsIGludCBuc2VxLCBjaGFyIG5hbWVbTV1bQl0sIGZsb2F0ICoqbXR4ICkKewogICAgaW50IGksIGosIG5zZXEwOwogICAgY2hhciBiW0JdOwoKICAgIGZnZXRzKCBiLCBCLCBmcCApOwogICAgZmdldHMoIGIsIEIsIGZwICk7IGJbNV0gPSAwOyBuc2VxMCA9IGF0b2koIGIgKTsgaWYoIG5zZXEgIT0gbnNlcTAgKSBFcnJvckV4aXQoICJoYXQyIGlzIHdyb25nLiIgKTsKICAgIGZnZXRzKCBiLCBCLCBmcCApOwogICAgZm9yKCBpPTA7IGk8bnNlcTsgaSsrICkKICAgIHsKI2lmIDAKICAgICAgICBnZXRhbGluZV9mcF9lb2YoIGIsIEIsIGZwICk7IAojZWxzZQoJCW15ZmdldHMoIGIsIEItMiwgZnAgKTsKI2VuZGlmCiNpZiAwCgkJaiA9IE1JTiggc3RybGVuKCBiKzYgKSwgMTAgKTsKICAgICAgICBpZiggc3RybmNtcCggbmFtZVtpXSwgYis2ICwgaiApICkgCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJFcnJvciBpbiBoYXQyXG4iICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIiVzICE9ICVzXG4iLCBiLCBuYW1lW2ldICk7CgkJCWV4aXQoIDEgKTsKCQl9CiNlbmRpZgogICAgfQogICAgZm9yKCBpPTA7IGk8bnNlcS0xOyBpKysgKSBmb3IoIGo9aSsxOyBqPG5zZXE7IGorKyApCiAgICB7CiAgICAgICAgbXR4W2ldW2pdID0gKCBpbnB1dF9uZXcoIGZwLCBEICkgKTsKICAgIH0KfQp2b2lkIHJlYWRoYXQyX2ludCggRklMRSAqZnAsIGludCBuc2VxLCBjaGFyIG5hbWVbTV1bQl0sIGludCAqKm10eCApCnsKICAgIGludCBpLCBqLCBuc2VxMDsKICAgIGNoYXIgYltCXTsKCiAgICBmZ2V0cyggYiwgQiwgZnAgKTsKICAgIGZnZXRzKCBiLCBCLCBmcCApOyBiWzVdID0gMDsgbnNlcTAgPSBhdG9pKCBiICk7IGlmKCBuc2VxICE9IG5zZXEwICkgRXJyb3JFeGl0KCAiaGF0MiBpcyB3cm9uZy4iICk7CiAgICBmZ2V0cyggYiwgQiwgZnAgKTsKICAgIGZvciggaT0wOyBpPG5zZXE7IGkrKyApCiAgICB7CiNpZiAwCiAgICAgICAgZ2V0YWxpbmVfZnBfZW9mKCBiLCBCLCBmcCApOyAKI2Vsc2UKCQlteWZnZXRzKCBiLCBCLTIsIGZwICk7CiNlbmRpZgojaWYgMAoJCWogPSBNSU4oIHN0cmxlbiggYis2ICksIDEwICk7CiAgICAgICAgaWYoIHN0cm5jbXAoIG5hbWVbaV0sIGIrNiAsIGogKSApIAoJCXsKCQkJZnByaW50Ziggc3RkZXJyLCAiRXJyb3IgaW4gaGF0MlxuIiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICIlcyAhPSAlc1xuIiwgYiwgbmFtZVtpXSApOwoJCQlleGl0KCAxICk7CgkJfQojZW5kaWYKICAgIH0KICAgIGZvciggaT0wOyBpPG5zZXEtMTsgaSsrICkgZm9yKCBqPWkrMTsgajxuc2VxOyBqKysgKQogICAgewogICAgICAgIG10eFtpXVtqXSA9IChpbnQpKCBpbnB1dF9uZXcoIGZwLCBEICkgKiBJTlRNVFhTQ0FMRSArIDAuNSApOwogICAgfQp9CnZvaWQgcmVhZGhhdDIoIEZJTEUgKmZwLCBpbnQgbnNlcSwgY2hhciBuYW1lW01dW0JdLCBkb3VibGUgKiptdHggKQp7CiAgICBpbnQgaSwgaiwgbnNlcTA7CiAgICBjaGFyIGJbQl07CgogICAgZmdldHMoIGIsIEIsIGZwICk7CiAgICBmZ2V0cyggYiwgQiwgZnAgKTsgYls1XSA9IDA7IG5zZXEwID0gYXRvaSggYiApOyBpZiggbnNlcSAhPSBuc2VxMCApIEVycm9yRXhpdCggImhhdDIgaXMgd3JvbmcuIiApOwogICAgZmdldHMoIGIsIEIsIGZwICk7CiAgICBmb3IoIGk9MDsgaTxuc2VxOyBpKysgKQogICAgewojaWYgMAogICAgICAgIGdldGFsaW5lX2ZwX2VvZiggYiwgQiwgZnAgKTsgCiNlbHNlCgkJbXlmZ2V0cyggYiwgQi0yLCBmcCApOwojZW5kaWYKI2lmIDAKCQlqID0gTUlOKCBzdHJsZW4oIGIrNiApLCAxMCApOwogICAgICAgIGlmKCBzdHJuY21wKCBuYW1lW2ldLCBiKzYgLCBqICkgKSAKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgIkVycm9yIGluIGhhdDJcbiIgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiJXMgIT0gJXNcbiIsIGIsIG5hbWVbaV0gKTsKCQkJZXhpdCggMSApOwoJCX0KI2VuZGlmCiAgICB9CiAgICBmb3IoIGk9MDsgaTxuc2VxLTE7IGkrKyApIGZvciggaj1pKzE7IGo8bnNlcTsgaisrICkKICAgIHsKICAgICAgICBtdHhbaV1bal0gPSAoZG91YmxlKWlucHV0X25ldyggZnAsIEQpOwogICAgfQp9Cgp2b2lkIFdyaXRlRmxvYXRIYXQyX3BvaW50ZXIoIEZJTEUgKmhhdDJwLCBpbnQgbG9jbmpvYiwgY2hhciAqKm5hbWUsIGZsb2F0ICoqbXR4ICkKewoJaW50IGksIGo7Cglkb3VibGUgbWF4ID0gMC4wOwoJZm9yKCBpPTA7IGk8bG9jbmpvYi0xOyBpKysgKSBmb3IoIGo9MTsgajxsb2Nuam9iLWk7IGorKyApIGlmKCBtdHhbaV1bal0gPiBtYXggKSBtYXggPSBtdHhbaV1bal07CgoJZnByaW50ZiggaGF0MnAsICIlNWRcbiIsIDEgKTsKCWZwcmludGYoIGhhdDJwLCAiJTVkXG4iLCBsb2Nuam9iICk7CglmcHJpbnRmKCBoYXQycCwgIiAlIzYuM2ZcbiIsIG1heCAqIDIuNSApOwoKCWZvciggaT0wOyBpPGxvY25qb2I7IGkrKyApIGZwcmludGYoIGhhdDJwLCAiJTRkLiAlc1xuIiwgaSsxLCBuYW1lW2ldICk7Cglmb3IoIGk9MDsgaTxsb2Nuam9iOyBpKysgKQoJewoJCWZvciggaj0xOyBqPGxvY25qb2ItaTsgaisrICkgCgkJewoJCQlmcHJpbnRmKCBoYXQycCwgIiUjNi4zZiIsIG10eFtpXVtqXSApOwoJCQlpZiggaiAlIDEyID09IDAgfHwgaiA9PSBsb2Nuam9iLWktMSApIGZwcmludGYoIGhhdDJwLCAiXG4iICk7CgkJfQoJfQp9Cgp2b2lkIFdyaXRlRmxvYXRIYXQyKCBGSUxFICpoYXQycCwgaW50IGxvY25qb2IsIGNoYXIgbmFtZVtNXVtCXSwgZmxvYXQgKiptdHggKQp7CglpbnQgaSwgajsKCWRvdWJsZSBtYXggPSAwLjA7Cglmb3IoIGk9MDsgaTxsb2Nuam9iLTE7IGkrKyApIGZvciggaj0xOyBqPGxvY25qb2ItaTsgaisrICkgaWYoIG10eFtpXVtqXSA+IG1heCApIG1heCA9IG10eFtpXVtqXTsKCglmcHJpbnRmKCBoYXQycCwgIiU1ZFxuIiwgMSApOwoJZnByaW50ZiggaGF0MnAsICIlNWRcbiIsIGxvY25qb2IgKTsKCWZwcmludGYoIGhhdDJwLCAiICUjNi4zZlxuIiwgbWF4ICogMi41ICk7CgoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkgZnByaW50ZiggaGF0MnAsICIlNGQuICVzXG4iLCBpKzEsIG5hbWVbaV0gKTsKCWZvciggaT0wOyBpPGxvY25qb2I7IGkrKyApCgl7CgkJZm9yKCBqPTE7IGo8bG9jbmpvYi1pOyBqKysgKSAKCQl7CgkJCWZwcmludGYoIGhhdDJwLCAiJSM2LjNmIiwgbXR4W2ldW2pdICk7CgkJCWlmKCBqICUgMTIgPT0gMCB8fCBqID09IGxvY25qb2ItaS0xICkgZnByaW50ZiggaGF0MnAsICJcbiIgKTsKCQl9Cgl9Cn0KCnZvaWQgV3JpdGVIYXQyX2ludCggRklMRSAqaGF0MnAsIGludCBsb2Nuam9iLCBjaGFyIG5hbWVbTV1bQl0sIGludCAqKm10eCApCnsKCWludCBpLCBqOwoJZG91YmxlIG1heCA9IDAuMDsKCWZvciggaT0wOyBpPGxvY25qb2ItMTsgaSsrICkgZm9yKCBqPWkrMTsgajxsb2Nuam9iOyBqKysgKSBpZiggbXR4W2ldW2pdID4gbWF4ICkgbWF4ID0gbXR4W2ldW2pdOwoJbWF4IC89IElOVE1UWFNDQUxFOwoKCWZwcmludGYoIGhhdDJwLCAiJTVkXG4iLCAxICk7CglmcHJpbnRmKCBoYXQycCwgIiU1ZFxuIiwgbG9jbmpvYiApOwoJZnByaW50ZiggaGF0MnAsICIgJSM2LjNmXG4iLCBtYXggKiAyLjUgKTsKCglmb3IoIGk9MDsgaTxsb2Nuam9iOyBpKysgKSBmcHJpbnRmKCBoYXQycCwgIiU0ZC4gJXNcbiIsIGkrMSwgbmFtZVtpXSApOwoJZm9yKCBpPTA7IGk8bG9jbmpvYi0xOyBpKysgKQoJewoJCWZvciggaj1pKzE7IGo8bG9jbmpvYjsgaisrICkgCgkJewoJCQlmcHJpbnRmKCBoYXQycCwgIiUjNi4zZiIsIChmbG9hdCltdHhbaV1bal0gLyBJTlRNVFhTQ0FMRSApOwoJCQlpZiggKGotaSkgJSAxMiA9PSAwIHx8IGogPT0gbG9jbmpvYi0xICkgZnByaW50ZiggaGF0MnAsICJcbiIgKTsKCQl9Cgl9Cn0Kdm9pZCBXcml0ZUhhdDIoIEZJTEUgKmhhdDJwLCBpbnQgbG9jbmpvYiwgY2hhciBuYW1lW01dW0JdLCBkb3VibGUgKiptdHggKQp7CglpbnQgaSwgajsKCWRvdWJsZSBtYXggPSAwLjA7Cglmb3IoIGk9MDsgaTxsb2Nuam9iLTE7IGkrKyApIGZvciggaj1pKzE7IGo8bG9jbmpvYjsgaisrICkgaWYoIG10eFtpXVtqXSA+IG1heCApIG1heCA9IG10eFtpXVtqXTsKCglmcHJpbnRmKCBoYXQycCwgIiU1ZFxuIiwgMSApOwoJZnByaW50ZiggaGF0MnAsICIlNWRcbiIsIGxvY25qb2IgKTsKCWZwcmludGYoIGhhdDJwLCAiICUjNi4zZlxuIiwgbWF4ICogMi41ICk7CgoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkgZnByaW50ZiggaGF0MnAsICIlNGQuICVzXG4iLCBpKzEsIG5hbWVbaV0gKTsKCWZvciggaT0wOyBpPGxvY25qb2ItMTsgaSsrICkKCXsKCQlmb3IoIGo9aSsxOyBqPGxvY25qb2I7IGorKyApIAoJCXsKCQkJZnByaW50ZiggaGF0MnAsICIlIzYuM2YiLCBtdHhbaV1bal0gKTsKCQkJaWYoIChqLWkpICUgMTIgPT0gMCB8fCBqID09IGxvY25qb2ItMSApIGZwcmludGYoIGhhdDJwLCAiXG4iICk7CgkJfQoJfQp9Cgp2b2lkIFdyaXRlSGF0MnBsYWluKCBGSUxFICpoYXQycCwgaW50IGxvY25qb2IsIGRvdWJsZSAqKm10eCApCnsKCWludCBpLCBqOwoKCWZvciggaT0wOyBpPGxvY25qb2ItMTsgaSsrICkKCXsKCQlmb3IoIGo9aSsxOyBqPGxvY25qb2I7IGorKyApIAoJCXsKCQkJZnByaW50ZiggaGF0MnAsICIlZC0lZCBkPSUuM2ZcbiIsIGkrMSwgaisxLCBtdHhbaV1bal0gKTsKCQl9Cgl9Cn0KCmludCBSZWFkRmFzdGFfc3ViKCBGSUxFICpmcCwgZG91YmxlICpkaXMsIGludCBuc2VxLCBjaGFyIG5hbWVbTV1bQl0gKQp7CiAgICBpbnQgaSwgY291bnQ9MDsKICAgIGNoYXIgYltCXTsKICAgIGludCBqdW5iYW5bTV07CgogICAgY291bnQgPSAwOwogICAgZm9yKCBpPTA7IGk8MTAwMDAwMDAgJiYgY291bnQ8bnNlcTsgaSsrICkKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggIis9PT09PT09PT09KyIsIGIsIDEyICkgKQogICAgICAgIHsKICAgICAgICAgICAganVuYmFuW2NvdW50XSA9IGF0b2koIGIrMTIgKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICB9CgoJZm9yKCBpPTA7IGk8bnNlcTsgaSsrICkgZGlzW2ldID0gMC4wOwogICAgY291bnQgPSAwOwogICAgZm9yKCBpPTA7IGk8MTAwMDAwICYmIGNvdW50PG5zZXE7IGkrKyApCiAgICB7CgkJaWYoIGZnZXRzKCBiLCBCLTEsIGZwICkgKSBicmVhazsKICAgICAgICBpZiggIXN0cm5jbXAoIG5hbWVbanVuYmFuW2NvdW50XV0sIGIsIDIwICApICkKICAgICAgICB7CiAgICAgICAgICAgIGZnZXRzKCBiLCBCLTEsIGZwICk7CiAgICAgICAgICAgIGRpc1tqdW5iYW5bY291bnRdXSA9IGF0b2YoIGIgKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCmludCBSZWFkU3NlYXJjaCggRklMRSAqZnAsIGRvdWJsZSAqZGlzLCBpbnQgbnNlcSwgY2hhciBuYW1lW01dW0JdICkKewogICAgaW50IGksIGNvdW50PTA7CiAgICBjaGFyIGJbQl07CiAgICBpbnQganVuYmFuW01dOwoJaW50IG9wdDsKCiAgICBjb3VudCA9IDA7CiAgICBmb3IoIGk9MDsgaTwxMDAwMDAwMCAmJiBjb3VudDxuc2VxOyBpKysgKQogICAgewogICAgICAgIGZnZXRzKCBiLCBCLTEsIGZwICk7CiAgICAgICAgaWYoICFzdHJuY21wKCAiKz09PT09PT09PT0rIiwgYiwgMTIgKSApCiAgICAgICAgewogICAgICAgICAgICBqdW5iYW5bY291bnRdID0gYXRvaSggYisxMiApOwoJCQlzc2NhbmYoIGIrNzUsICIlZCIsICZvcHQgKTsgCiAgICAgICAgICAgIGRpc1tqdW5iYW5bY291bnRdXSA9IChkb3VibGUpb3B0OwogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgIH0KCi8qCiAgICBjb3VudCA9IDA7CiAgICBmb3IoIGk9MDsgaTwxMDAwMDAgJiYgY291bnQ8bnNlcTsgaSsrICkKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggbmFtZVtqdW5iYW5bY291bnRdXSwgYiwgMjAgICkgKQogICAgICAgIHsKICAgICAgICAgICAgZGlzW2p1bmJhbltjb3VudF1dID0gYXRvZiggYis2NSApOwogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgIH0KKi8KICAgIHJldHVybiAwOwp9CgppbnQgUmVhZEJsYXN0bTdfYXZzY29yZSggRklMRSAqZnAsIGRvdWJsZSAqZGlzLCBpbnQgbmluICkKewogICAgaW50IGNvdW50PTA7CiAgICBjaGFyIGJbQl07CgljaGFyICpwdDsKICAgIGludCAqanVuYmFuOwoJZG91YmxlIHNjb3JlLCBzdW1zY29yZTsKCWRvdWJsZSBsZW4sIHN1bWxlbjsKCWludCBxc3RhcnQsIHFlbmQsIHRzdGFydCwgdGVuZDsKCWRvdWJsZSBzY29yZXBlcnNpdGU7CglzdGF0aWMgY2hhciBxYWxbTl0sIHRhbFtOXSwgYWxbTl07CglpbnQgbmxvY2FsaG9tOwoKCWp1bmJhbiA9IGNhbGxvYyggbmluLCBzaXplb2YoIGludCApICk7CgoJY291bnQgPSAwOwoJc3Vtc2NvcmUgPSAwLjA7CglzdW1sZW4gPSAwLjA7CglzY29yZSA9IDAuMDsKCWxlbiA9IDAuMDsKCXNjb3JlcGVyc2l0ZSA9IDAuMDsgLy8gYnkgRC5NYXRob2csIGEgZ3Vlc3MKICAgIHdoaWxlKCAxICkKCXsKCgkJaWYoIGZlb2YoIGZwICkgKSBicmVhazsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCXsKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgIDxIaXRfZGVmPiIsIGIsIDE5ICkgfHwgIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfbnVtPiIsIGIsIDIzICkgKSBicmVhazsKCQl9CgoJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICA8SGl0X2RlZj4iLCBiLCAxOSApICkKCQl7CgkJCWp1bmJhbltjb3VudF0gPSBhdG9pKCBiKzMxICk7CgkJCW5sb2NhbGhvbSA9IDA7CgkJfQoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3Bfc2NvcmU+IiwgYiwgMjUgKSApIGJyZWFrOwoJCXB0ID0gYiArIDI1OwoJCXNjb3JlID0gYXRvZiggcHQgKTsKCQlzdW1zY29yZSArPSBzY29yZTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX3F1ZXJ5LWZyb20+IiwgYiwgMzAgKSApIGJyZWFrOwoJCXB0ID0gYiArIDMwOwoJCXFzdGFydCA9IGF0b2koIHB0ICkgLSAxOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfcXVlcnktdG8+IiwgYiwgMjggKSApIGJyZWFrOwoJCXB0ID0gYiArIDI4OwoJCXFlbmQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2hpdC1mcm9tPiIsIGIsIDI4ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyODsKCQl0c3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2hpdC10bz4iLCBiLCAyNiApICkgYnJlYWs7CgkJcHQgPSBiICsgMjY7CgkJdGVuZCA9IGF0b2koIHB0ICkgLSAxOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfYWxpZ24tbGVuPiIsIGIsIDI5ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyOTsKCQlsZW4gPSBhdG9pKCBwdCApOwoJCXN1bWxlbiArPSBsZW47CgoKCQl3aGlsZSggZmdldHMoIGFsLCBOLTEwMCwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgICAgPEhzcF9xc2VxPiIsIGFsLCAyNCApICkgYnJlYWs7CgoJCXN0cmNweSggcWFsLCBhbCsyNCApOwoJCXB0ID0gcWFsOwoJCXdoaWxlKCAqKytwdCAhPSAnPCcgKQoJCQk7CgkJKnB0ID0gMDsKCgoJCXdoaWxlKCBmZ2V0cyggYWwsIE4tMTAwLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2hzZXE+IiwgYWwsIDI0ICkgKSBicmVhazsKCgkJc3RyY3B5KCB0YWwsIGFsKzI0ICk7CgkJcHQgPSB0YWw7CgkJd2hpbGUoICorK3B0ICE9ICc8JyApCgkJCTsKCQkqcHQgPSAwOwoKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJ0PSVkLCBzY29yZSA9ICVmLCBxc3RhcnQ9JWQsIHFlbmQ9JWQsIHRzdGFydD0lZCwgdGVuZD0lZCwgb3ZlcmxhcGFhPSVkXG4iLCBqdW5iYW5bY291bnRdLCBzY29yZSwgcXN0YXJ0LCBxZW5kLCB0c3RhcnQsIHRlbmQsIG92ZXJsYXBhYSApOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICA8L0hzcD46IiwgYiwgMTggKSApIGJyZWFrOwoKCgkJZmdldHMoIGIsIEItMSwgZnAgKTsKCgoJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICA8L0hpdF9oc3BzPiIsIGIsIDIxICkgKQoJCXsKCQkJZGlzW2p1bmJhbltjb3VudCsrXV0gPSBzdW1zY29yZTsKCQkJc3Vtc2NvcmUgPSAwLjA7CgkJCWZnZXRzKCBiLCBCLTEsIGZwICk7CgkJCWZnZXRzKCBiLCBCLTEsIGZwICk7CgkJCXNjb3JlcGVyc2l0ZSA9IHN1bXNjb3JlIC8gc3VtbGVuOwoJCQlpZiggc2NvcmVwZXJzaXRlICE9IChpbnQpc2NvcmVwZXJzaXRlICkKCQkJewoJCQkJZnByaW50Ziggc3RkZXJyLCAiRVJST1IhIHN1bXNjb3JlPSVmLCBzdW1sZW49JWYsIGFuZCBzY29yZXBlcnNpdGU9JWZcbiIsIHN1bXNjb3JlLCBzdW1sZW4sIHNjb3JlcGVyc2l0ZSApOwoJCQkJZXhpdCggMSApOwoJCQl9CgoJCQlpZiggIXN0cm5jbXAoICIgICAgICA8L0l0ZXJhdGlvbl9oaXRzPiIsIGIsIDIzICkgKSBicmVhazsKCQl9Cgl9CgoJZnJlZSgganVuYmFuICk7CgogICAgcmV0dXJuIChpbnQpc2NvcmVwZXJzaXRlOwp9CmludCBSZWFkQmxhc3RtN19zY29yZW9ubHkoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5pbiApCnsKICAgIGludCBjb3VudD0wOwogICAgY2hhciBiW0JdOwoJY2hhciAqcHQ7CiAgICBpbnQgKmp1bmJhbjsKCWludCBvdmVybGFwYWE7Cglkb3VibGUgc2NvcmUsIHN1bXNjb3JlOwoJaW50IHFzdGFydCwgcWVuZCwgdHN0YXJ0LCB0ZW5kOwoJc3RhdGljIGNoYXIgcWFsW05dLCB0YWxbTl0sIGFsW05dOwoJaW50IG5sb2NhbGhvbTsKCglqdW5iYW4gPSBjYWxsb2MoIG5pbiwgc2l6ZW9mKCBpbnQgKSApOwoKCWNvdW50ID0gMDsKCXN1bXNjb3JlID0gMC4wOwoJc2NvcmUgPSAwLjA7CiAgICB3aGlsZSggMSApCgl7CgoJCWlmKCBmZW9mKCBmcCApICkgYnJlYWs7CgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQl7CgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICA8SGl0X2RlZj4iLCBiLCAxOSApIHx8ICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX251bT4iLCBiLCAyMyApICkgYnJlYWs7CgkJfQoKCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgPEhpdF9kZWY+IiwgYiwgMTkgKSApCgkJewoJCQlqdW5iYW5bY291bnRdID0gYXRvaSggYiszMSApOwoJCQlubG9jYWxob20gPSAwOwoJCX0KCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX3Njb3JlPiIsIGIsIDI1ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyNTsKCQlzY29yZSA9IGF0b2YoIHB0ICk7CgkJc3Vtc2NvcmUgKz0gc2NvcmU7CgoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgICAgPEhzcF9xdWVyeS1mcm9tPiIsIGIsIDMwICkgKSBicmVhazsKCQlwdCA9IGIgKyAzMDsKCQlxc3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX3F1ZXJ5LXRvPiIsIGIsIDI4ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyODsKCQlxZW5kID0gYXRvaSggcHQgKSAtIDE7CgoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgICAgPEhzcF9oaXQtZnJvbT4iLCBiLCAyOCApICkgYnJlYWs7CgkJcHQgPSBiICsgMjg7CgkJdHN0YXJ0ID0gYXRvaSggcHQgKSAtIDE7CgoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgICAgPEhzcF9oaXQtdG8+IiwgYiwgMjYgKSApIGJyZWFrOwoJCXB0ID0gYiArIDI2OwoJCXRlbmQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2FsaWduLWxlbj4iLCBiLCAyOSApICkgYnJlYWs7CgkJcHQgPSBiICsgMjk7CgkJb3ZlcmxhcGFhID0gYXRvaSggcHQgKTsKCgoJCXdoaWxlKCBmZ2V0cyggYWwsIE4tMTAwLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX3FzZXE+IiwgYWwsIDI0ICkgKSBicmVhazsKCgkJc3RyY3B5KCBxYWwsIGFsKzI0ICk7CgkJcHQgPSBxYWw7CgkJd2hpbGUoICorK3B0ICE9ICc8JyApCgkJCTsKCQkqcHQgPSAwOwoKCgkJd2hpbGUoIGZnZXRzKCBhbCwgTi0xMDAsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfaHNlcT4iLCBhbCwgMjQgKSApIGJyZWFrOwoKCQlzdHJjcHkoIHRhbCwgYWwrMjQgKTsKCQlwdCA9IHRhbDsKCQl3aGlsZSggKisrcHQgIT0gJzwnICkKCQkJOwoJCSpwdCA9IDA7CgoKLy8JCWZwcmludGYoIHN0ZGVyciwgInQ9JWQsIHNjb3JlID0gJWYsIHFzdGFydD0lZCwgcWVuZD0lZCwgdHN0YXJ0PSVkLCB0ZW5kPSVkLCBvdmVybGFwYWE9JWRcbiIsIGp1bmJhbltjb3VudF0sIHNjb3JlLCBxc3RhcnQsIHFlbmQsIHRzdGFydCwgdGVuZCwgb3ZlcmxhcGFhICk7CgovLwkJbmxvY2FsaG9tICs9IGFkZGxvY2FsaG9tX3IoIHFhbCwgdGFsLCBsb2NhbGhvbWxpc3QranVuYmFuW2NvdW50XSwgcXN0YXJ0LCB0c3RhcnQsIHNjb3JlLCBvdmVybGFwYWEsIG5sb2NhbGhvbSApOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgIDwvSHNwPjoiLCBiLCAxOCApICkgYnJlYWs7CgoKCQlmZ2V0cyggYiwgQi0xLCBmcCApOwoKCgkJaWYoICFzdHJuY21wKCAiICAgICAgICAgIDwvSGl0X2hzcHM+IiwgYiwgMjEgKSApCgkJewoJCQlkaXNbanVuYmFuW2NvdW50KytdXSA9IHN1bXNjb3JlOwoJCQlzdW1zY29yZSA9IDAuMDsKCQkJZmdldHMoIGIsIEItMSwgZnAgKTsKCQkJZmdldHMoIGIsIEItMSwgZnAgKTsKCQkJaWYoICFzdHJuY21wKCAiICAgICAgPC9JdGVyYXRpb25faGl0cz4iLCBiLCAyMyApICkgYnJlYWs7CgkJfQoJfQoKCWZyZWUoIGp1bmJhbiApOwoKICAgIHJldHVybiBjb3VudDsKfQoKaW50IFJlYWRCbGFzdG03KCBGSUxFICpmcCwgZG91YmxlICpkaXMsIGludCBxbWVtLCBjaGFyIG5hbWVbTV1bQl0sIExvY2FsSG9tICpsb2NhbGhvbWxpc3QgKQp7CiAgICBpbnQgY291bnQ9MDsKICAgIGNoYXIgYltCXTsKCWNoYXIgKnB0OwogICAgc3RhdGljIGludCBqdW5iYW5bTV07CglpbnQgb3ZlcmxhcGFhOwoJZG91YmxlIHNjb3JlLCBzdW1zY29yZTsKCWludCBxc3RhcnQsIHFlbmQsIHRzdGFydCwgdGVuZDsKCXN0YXRpYyBjaGFyIHFhbFtOXSwgdGFsW05dLCBhbFtOXTsKCWludCBubG9jYWxob207CgoKCgljb3VudCA9IDA7CglzdW1zY29yZSA9IDAuMDsKCXNjb3JlID0gMC4wOwoJbmxvY2FsaG9tID0gMDsKICAgIHdoaWxlKCAxICkKCXsKCgkJaWYoIGZlb2YoIGZwICkgKSBicmVhazsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCXsKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgIDxIaXRfZGVmPiIsIGIsIDE5ICkgfHwgIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfbnVtPiIsIGIsIDIzICkgKSBicmVhazsKCQl9CgoJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICA8SGl0X2RlZj4iLCBiLCAxOSApICkKCQl7CgkJCWp1bmJhbltjb3VudF0gPSBhdG9pKCBiKzMxICk7CgkJCW5sb2NhbGhvbSA9IDA7CgkJfQoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3Bfc2NvcmU+IiwgYiwgMjUgKSApIGJyZWFrOwoJCXB0ID0gYiArIDI1OwoJCXNjb3JlID0gYXRvZiggcHQgKTsKCQlzdW1zY29yZSArPSBzY29yZTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX3F1ZXJ5LWZyb20+IiwgYiwgMzAgKSApIGJyZWFrOwoJCXB0ID0gYiArIDMwOwoJCXFzdGFydCA9IGF0b2koIHB0ICkgLSAxOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfcXVlcnktdG8+IiwgYiwgMjggKSApIGJyZWFrOwoJCXB0ID0gYiArIDI4OwoJCXFlbmQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2hpdC1mcm9tPiIsIGIsIDI4ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyODsKCQl0c3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiICAgICAgICAgICAgICA8SHNwX2hpdC10bz4iLCBiLCAyNiApICkgYnJlYWs7CgkJcHQgPSBiICsgMjY7CgkJdGVuZCA9IGF0b2koIHB0ICkgLSAxOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfYWxpZ24tbGVuPiIsIGIsIDI5ICkgKSBicmVhazsKCQlwdCA9IGIgKyAyOTsKCQlvdmVybGFwYWEgPSBhdG9pKCBwdCApOwoKCgkJd2hpbGUoIGZnZXRzKCBhbCwgTi0xMDAsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICIgICAgICAgICAgICAgIDxIc3BfcXNlcT4iLCBhbCwgMjQgKSApIGJyZWFrOwoKCQlzdHJjcHkoIHFhbCwgYWwrMjQgKTsKCQlwdCA9IHFhbDsKCQl3aGlsZSggKisrcHQgIT0gJzwnICkKCQkJOwoJCSpwdCA9IDA7CgoKCQl3aGlsZSggZmdldHMoIGFsLCBOLTEwMCwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgICAgPEhzcF9oc2VxPiIsIGFsLCAyNCApICkgYnJlYWs7CgoJCXN0cmNweSggdGFsLCBhbCsyNCApOwoJCXB0ID0gdGFsOwoJCXdoaWxlKCAqKytwdCAhPSAnPCcgKQoJCQk7CgkJKnB0ID0gMDsKCgovLwkJZnByaW50Ziggc3RkZXJyLCAidD0lZCwgc2NvcmUgPSAlZiwgcXN0YXJ0PSVkLCBxZW5kPSVkLCB0c3RhcnQ9JWQsIHRlbmQ9JWQsIG92ZXJsYXBhYT0lZFxuIiwganVuYmFuW2NvdW50XSwgc2NvcmUsIHFzdGFydCwgcWVuZCwgdHN0YXJ0LCB0ZW5kLCBvdmVybGFwYWEgKTsKCgkJbmxvY2FsaG9tICs9IGFkZGxvY2FsaG9tX3IoIHFhbCwgdGFsLCBsb2NhbGhvbWxpc3QranVuYmFuW2NvdW50XSwgcXN0YXJ0LCB0c3RhcnQsIHNjb3JlLCBvdmVybGFwYWEsIG5sb2NhbGhvbSApOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIiAgICAgICAgICAgIDwvSHNwPjoiLCBiLCAxOCApICkgYnJlYWs7CgoKCQlmZ2V0cyggYiwgQi0xLCBmcCApOwoKCgkJaWYoICFzdHJuY21wKCAiICAgICAgICAgIDwvSGl0X2hzcHM+IiwgYiwgMjEgKSApCgkJewoJCQlkaXNbanVuYmFuW2NvdW50KytdXSA9IHN1bXNjb3JlOwoJCQlzdW1zY29yZSA9IDAuMDsKCQkJZmdldHMoIGIsIEItMSwgZnAgKTsKCQkJZmdldHMoIGIsIEItMSwgZnAgKTsKCQkJaWYoICFzdHJuY21wKCAiICAgICAgPC9JdGVyYXRpb25faGl0cz4iLCBiLCAyMyApICkgYnJlYWs7CgkJfQoJfQogICAgcmV0dXJuIGNvdW50Owp9CgppbnQgUmVhZEZhc3RhMzRub2FsaWduKCBGSUxFICpmcCwgZG91YmxlICpkaXMsIGludCBxbWVtLCBjaGFyIG5hbWVbTV1bQl0sIExvY2FsSG9tICpsb2NhbGhvbWxpc3QgKQp7CiAgICBpbnQgY291bnQ9MDsKICAgIGNoYXIgYltCXTsKCWNoYXIgKnB0OwogICAgc3RhdGljIGludCBqdW5iYW5bTV07CglpbnQgb3B0OwoJZG91YmxlIHosIGJpdHM7CgoKICAgIGNvdW50ID0gMDsKI2lmIDAKICAgIGZvciggaT0wOyBpPDEwMDAwMDAwICYmIGNvdW50PG5zZXE7IGkrKyApCiNlbHNlCiAgICB3aGlsZSggIWZlb2YoIGZwICkgKQojZW5kaWYKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggIis9PT09PT09PT09KyIsIGIsIDEyICkgKQogICAgICAgIHsKICAgICAgICAgICAganVuYmFuW2NvdW50XSA9IGF0b2koIGIrMTIgKTsKCgkJCXB0ID0gc3RyY2hyKCBiLCAnKScgKSArIDE7CgkJCXNzY2FuZiggcHQsICIlZCAlbGYgJWxmIiwgICZvcHQsICZiaXRzLCAmeiApOyAKICAgICAgICAgICAgZGlzW2p1bmJhbltjb3VudF1dID0gKGRvdWJsZSlvcHQ7CiAgICAgICAgICAgIGNvdW50Kys7CgogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gY291bnQ7Cn0KaW50IFJlYWRGYXN0YTM0bTEwX251YyggRklMRSAqZnAsIGRvdWJsZSAqZGlzLCBpbnQgcW1lbSwgY2hhciBuYW1lW01dW0JdLCBMb2NhbEhvbSAqbG9jYWxob21saXN0ICkKewogICAgaW50IGNvdW50PTA7CiAgICBjaGFyIGJbQl07CgljaGFyICpwdDsKICAgIHN0YXRpYyBpbnQganVuYmFuW01dOwoJaW50IG92ZXJsYXBhYTsKCWludCBvcHQsIHFzdGFydCwgcWVuZCwgdHN0YXJ0LCB0ZW5kOwoJZG91YmxlIHosIGJpdHM7CglpbnQgcWFsX2Rpc3BsYXlfc3RhcnQsIHRhbF9kaXNwbGF5X3N0YXJ0OwoJc3RhdGljIGNoYXIgcWFsW05dLCB0YWxbTl07CgljaGFyICpxYWwyLCAqdGFsMjsKCWludCBjOwoKCiAgICBjb3VudCA9IDA7CiNpZiAwCiAgICBmb3IoIGk9MDsgaTwxMDAwMDAwMCAmJiBjb3VudDxuc2VxOyBpKysgKQojZWxzZQogICAgd2hpbGUoICFmZW9mKCBmcCApICkKI2VuZGlmCiAgICB7CiAgICAgICAgZmdldHMoIGIsIEItMSwgZnAgKTsKICAgICAgICBpZiggIXN0cm5jbXAoICIrPT09PT09PT09PSsiLCBiLCAxMiApICkKICAgICAgICB7CiAgICAgICAgICAgIGp1bmJhbltjb3VudF0gPSBhdG9pKCBiKzEyICk7CgoJCQlpZiggc3RyY2hyKCBiLCAncicgKSApIGNvbnRpbnVlOwoKCQkJcHQgPSBzdHJjaHIoIGIsICddJyApICsgMTsKCQkJc3NjYW5mKCBwdCwgIiVkICVsZiAlbGYiLCAgJm9wdCwgJmJpdHMsICZ6ICk7IAogICAgICAgICAgICBkaXNbanVuYmFuW2NvdW50XV0gPSAoZG91YmxlKW9wdDsKICAgICAgICAgICAgY291bnQrKzsKCiAgICAgICAgfQoJCWVsc2UgaWYoIDAgPT0gc3RybmNtcCggIj4+Kz09PT09PT09PT0rIiwgYiwgMTQgKSApCgkJewoJCQlicmVhazsKCQl9CgogICAgfQoJaWYoICFjb3VudCApIHJldHVybiAtMTsKCgljb3VudCA9IDA7CiAgICB3aGlsZSggMSApCgl7CgkJaWYoIHN0cm5jbXAoICI+Pis9PT09PT09PT09KyIsIGIsIDE0ICkgKQoJCXsKCQkJZmdldHMoIGIsIEItMSwgZnAgKTsKCQkJaWYoIGZlb2YoIGZwICkgKSBicmVhazsKCQkJY29udGludWU7CgkJfQoJCWp1bmJhbltjb3VudCsrXSA9IGF0b2koIGIrMTQgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgInQgPSAlZFxuIiwgYXRvaSggYisxNCApICk7CgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICI7IGZhX29wdDoiLCBiLCA5ICkgfHwgIXN0cm5jbXAoICI7IHN3X3MtdyBvcHQ6IiwgYiwgMTMgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArMTsKCQlvcHQgPSBhdG9pKCBwdCApOwoKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICJfb3ZlcmxhcDoiLCBiKzQsIDkgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArMTsKCQlvdmVybGFwYWEgPSBhdG9pKCBwdCApOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIl9zdGFydDoiLCBiKzQsIDcgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArMTsKCQlxc3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICJfc3RvcDoiLCBiKzQsIDYgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArMTsKCQlxZW5kID0gYXRvaSggcHQgKSAtIDE7CgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiX2Rpc3BsYXlfc3RhcnQ6IiwgYis0LCAxNSApICkgYnJlYWs7CgkJcHQgPSBzdHJzdHIoIGIsICI6IiApICsxOwoJCXFhbF9kaXNwbGF5X3N0YXJ0ID0gYXRvaSggcHQgKSAtIDE7CgoJCXB0ID0gcWFsOwoJCXdoaWxlKCAoYyA9IGZnZXRjKCBmcCApKSApCgkJewoJCQlpZiggYyA9PSAnPicgKSAKCQkJewoJCQkJdW5nZXRjKCBjLCBmcCApOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoIGlzYWxwaGEoIGMgKSB8fCBjID09ICctJyApIAoJCQkqcHQrKyA9IGM7CgkJfQoJCSpwdCA9IDA7CgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiX3N0YXJ0OiIsIGIrNCwgNyApICkgYnJlYWs7CgkJcHQgPSBzdHJzdHIoIGIsICI6IiApICsgMTsKCQl0c3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICJfc3RvcDoiLCBiKzQsIDYgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArIDE7CgkJdGVuZCA9IGF0b2koIHB0ICkgLSAxOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIl9kaXNwbGF5X3N0YXJ0OiIsIGIrNCwgMTUgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArIDE7CgkJdGFsX2Rpc3BsYXlfc3RhcnQgPSBhdG9pKCBwdCApIC0gMTsKCgkJcHQgPSB0YWw7CgkJd2hpbGUoICggYyA9IGZnZXRjKCBmcCApICkgKQoJCXsKCQkJaWYoIGMgPT0gJz4nICkgCgkJCXsKCQkJCXVuZ2V0YyggYywgZnAgKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmKCBpc2FscGhhKCBjICkgfHwgYyA9PSAnLScgKSAKCQkJKnB0KysgPSBjOwoJCX0KCQkqcHQgPSAwOwoKLy8JCWZwcmludGYoIHN0ZGVyciwgIiglZC0lZDolZC0lZClcbiIsIHFzdGFydCwgcWVuZCwgdHN0YXJ0LCB0ZW5kICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJxYWxfZGlzcGxheV9zdGFydCA9ICVkLCB0YWxfZGlzcGxheV9zdGFydCA9ICVkXG4iLCBxYWxfZGlzcGxheV9zdGFydCwgdGFsX2Rpc3BsYXlfc3RhcnQgKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJxYWwgPSAlc1xuIiwgcWFsICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJ0YWwgPSAlc1xuIiwgdGFsICk7CgoJCXFhbDIgPSBjdXRhbCggcWFsLCBxYWxfZGlzcGxheV9zdGFydCwgcXN0YXJ0LCBxZW5kICk7CgkJdGFsMiA9IGN1dGFsKCB0YWwsIHRhbF9kaXNwbGF5X3N0YXJ0LCB0c3RhcnQsIHRlbmQgKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJxYWwyID0gJXNcbiIsIHFhbDIgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgInRhbDIgPSAlc1xuIiwgdGFsMiApOwoKLy8JCWZwcmludGYoIHN0ZGVyciwgInB1dHRpbmcgICAlZCAtICVkLCBvcHQgPSAlZFxuIiwgcW1lbSwganVuYmFuW2NvdW50LTFdLCBvcHQgKTsKCQlwdXRsb2NhbGhvbSggcWFsMiwgdGFsMiwgbG9jYWxob21saXN0K2p1bmJhbltjb3VudC0xXSwgcXN0YXJ0LCB0c3RhcnQsIG9wdCwgb3ZlcmxhcGFhICk7Cgl9Ci8vCWZwcmludGYoIHN0ZGVyciwgImNvdW50ID0gJWRcbiIsIGNvdW50ICk7CiAgICByZXR1cm4gY291bnQ7Cn0KaW50IFJlYWRGYXN0YTM0bTEwKCBGSUxFICpmcCwgZG91YmxlICpkaXMsIGludCBxbWVtLCBjaGFyIG5hbWVbTV1bQl0sIExvY2FsSG9tICpsb2NhbGhvbWxpc3QgKQp7CiAgICBpbnQgY291bnQ9MDsKICAgIGNoYXIgYltCXTsKCWNoYXIgKnB0OwogICAgc3RhdGljIGludCBqdW5iYW5bTV07CglpbnQgb3ZlcmxhcGFhOwoJaW50IG9wdCwgcXN0YXJ0LCBxZW5kLCB0c3RhcnQsIHRlbmQ7Cglkb3VibGUgeiwgYml0czsKCWludCBxYWxfZGlzcGxheV9zdGFydCwgdGFsX2Rpc3BsYXlfc3RhcnQ7CglzdGF0aWMgY2hhciBxYWxbTl0sIHRhbFtOXTsKCWNoYXIgKnFhbDIsICp0YWwyOwoJaW50IGM7CgoKICAgIGNvdW50ID0gMDsKI2lmIDAKICAgIGZvciggaT0wOyBpPDEwMDAwMDAwICYmIGNvdW50PG5zZXE7IGkrKyApCiNlbHNlCiAgICB3aGlsZSggIWZlb2YoIGZwICkgKQojZW5kaWYKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggIis9PT09PT09PT09KyIsIGIsIDEyICkgKQogICAgICAgIHsKICAgICAgICAgICAganVuYmFuW2NvdW50XSA9IGF0b2koIGIrMTIgKTsKCgkJCXB0ID0gc3RyY2hyKCBiLCAnKScgKSArIDE7CgkJCXNzY2FuZiggcHQsICIlZCAlbGYgJWxmIiwgICZvcHQsICZiaXRzLCAmeiApOyAKICAgICAgICAgICAgZGlzW2p1bmJhbltjb3VudF1dID0gKGRvdWJsZSlvcHQ7CiAgICAgICAgICAgIGNvdW50Kys7CgogICAgICAgIH0KCQllbHNlIGlmKCAwID09IHN0cm5jbXAoICI+Pis9PT09PT09PT09KyIsIGIsIDE0ICkgKQoJCXsKCQkJYnJlYWs7CgkJfQoKICAgIH0KCWlmKCAhY291bnQgKSByZXR1cm4gLTE7CgoJY291bnQgPSAwOwogICAgd2hpbGUoIDEgKQoJewoJCWlmKCBzdHJuY21wKCAiPj4rPT09PT09PT09PSsiLCBiLCAxNCApICkKCQl7CgkJCWZnZXRzKCBiLCBCLTEsIGZwICk7CgkJCWlmKCBmZW9mKCBmcCApICkgYnJlYWs7CgkJCWNvbnRpbnVlOwoJCX0KCQlqdW5iYW5bY291bnQrK10gPSBhdG9pKCBiKzE0ICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJ0ID0gJWRcbiIsIGF0b2koIGIrMTQgKSApOwoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiOyBmYV9vcHQ6IiwgYiwgOSApIHx8ICFzdHJuY21wKCAiOyBzd19zLXcgb3B0OiIsIGIsIDEzICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKzE7CgkJb3B0ID0gYXRvaSggcHQgKTsKCgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiX292ZXJsYXA6IiwgYis0LCA5ICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKzE7CgkJb3ZlcmxhcGFhID0gYXRvaSggcHQgKTsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICJfc3RhcnQ6IiwgYis0LCA3ICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKzE7CgkJcXN0YXJ0ID0gYXRvaSggcHQgKSAtIDE7CgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiX3N0b3A6IiwgYis0LCA2ICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKzE7CgkJcWVuZCA9IGF0b2koIHB0ICkgLSAxOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIl9kaXNwbGF5X3N0YXJ0OiIsIGIrNCwgMTUgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArMTsKCQlxYWxfZGlzcGxheV9zdGFydCA9IGF0b2koIHB0ICkgLSAxOwoKCQlwdCA9IHFhbDsKCQl3aGlsZSggKGMgPSBmZ2V0YyggZnAgKSkgKQoJCXsKCQkJaWYoIGMgPT0gJz4nICkgCgkJCXsKCQkJCXVuZ2V0YyggYywgZnAgKTsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmKCBpc2FscGhhKCBjICkgfHwgYyA9PSAnLScgKSAKCQkJKnB0KysgPSBjOwoJCX0KCQkqcHQgPSAwOwoKCQl3aGlsZSggZmdldHMoIGIsIEItMSwgZnAgKSApCgkJCWlmKCAhc3RybmNtcCggIl9zdGFydDoiLCBiKzQsIDcgKSApIGJyZWFrOwoJCXB0ID0gc3Ryc3RyKCBiLCAiOiIgKSArIDE7CgkJdHN0YXJ0ID0gYXRvaSggcHQgKSAtIDE7CgoJCXdoaWxlKCBmZ2V0cyggYiwgQi0xLCBmcCApICkKCQkJaWYoICFzdHJuY21wKCAiX3N0b3A6IiwgYis0LCA2ICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKyAxOwoJCXRlbmQgPSBhdG9pKCBwdCApIC0gMTsKCgkJd2hpbGUoIGZnZXRzKCBiLCBCLTEsIGZwICkgKQoJCQlpZiggIXN0cm5jbXAoICJfZGlzcGxheV9zdGFydDoiLCBiKzQsIDE1ICkgKSBicmVhazsKCQlwdCA9IHN0cnN0ciggYiwgIjoiICkgKyAxOwoJCXRhbF9kaXNwbGF5X3N0YXJ0ID0gYXRvaSggcHQgKSAtIDE7CgoJCXB0ID0gdGFsOwoJCXdoaWxlKCAoIGMgPSBmZ2V0YyggZnAgKSApICkKCQl7CgkJCWlmKCBjID09ICc+JyApIAoJCQl7CgkJCQl1bmdldGMoIGMsIGZwICk7CgkJCQlicmVhazsKCQkJfQoJCQlpZiggaXNhbHBoYSggYyApIHx8IGMgPT0gJy0nICkgCgkJCSpwdCsrID0gYzsKCQl9CgkJKnB0ID0gMDsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICIoJWQtJWQ6JWQtJWQpXG4iLCBxc3RhcnQsIHFlbmQsIHRzdGFydCwgdGVuZCApOwovLwkJZnByaW50Ziggc3RkZXJyLCAicWFsX2Rpc3BsYXlfc3RhcnQgPSAlZCwgdGFsX2Rpc3BsYXlfc3RhcnQgPSAlZFxuIiwgcWFsX2Rpc3BsYXlfc3RhcnQsIHRhbF9kaXNwbGF5X3N0YXJ0ICk7CgovLwkJZnByaW50Ziggc3RkZXJyLCAicWFsID0gJXNcbiIsIHFhbCApOwovLwkJZnByaW50Ziggc3RkZXJyLCAidGFsID0gJXNcbiIsIHRhbCApOwoKCQlxYWwyID0gY3V0YWwoIHFhbCwgcWFsX2Rpc3BsYXlfc3RhcnQsIHFzdGFydCwgcWVuZCApOwoJCXRhbDIgPSBjdXRhbCggdGFsLCB0YWxfZGlzcGxheV9zdGFydCwgdHN0YXJ0LCB0ZW5kICk7CgovLwkJZnByaW50Ziggc3RkZXJyLCAicWFsMiA9ICVzXG4iLCBxYWwyICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJ0YWwyID0gJXNcbiIsIHRhbDIgKTsKCi8vCQlmcHJpbnRmKCBzdGRlcnIsICJwdXR0aW5nICAgJWQgLSAlZCwgb3B0ID0gJWRcbiIsIHFtZW0sIGp1bmJhbltjb3VudC0xXSwgb3B0ICk7CgkJcHV0bG9jYWxob20oIHFhbDIsIHRhbDIsIGxvY2FsaG9tbGlzdCtqdW5iYW5bY291bnQtMV0sIHFzdGFydCwgdHN0YXJ0LCBvcHQsIG92ZXJsYXBhYSApOwoJfQovLwlmcHJpbnRmKCBzdGRlcnIsICJjb3VudCA9ICVkXG4iLCBjb3VudCApOwogICAgcmV0dXJuIGNvdW50Owp9CmludCBSZWFkRmFzdGEzNG0xMF9zY29yZW9ubHlfbnVjYmsoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5pbiApCnsKICAgIGludCBjb3VudD0wOwogICAgY2hhciBiW0JdOwoJY2hhciAqcHQ7CiAgICBpbnQgcG9zOwoJaW50IG9wdDsKCWRvdWJsZSB6LCBiaXRzOwoKICAgIGNvdW50ID0gMDsKICAgIHdoaWxlKCAhZmVvZiggZnAgKSApCiAgICB7CiAgICAgICAgZmdldHMoIGIsIEItMSwgZnAgKTsKICAgICAgICBpZiggIXN0cm5jbXAoICIrPT09PT09PT09PT0rIiwgYiwgMTMgKSApCiAgICAgICAgewogICAgICAgICAgICBwb3MgPSBhdG9pKCBiKzEzICk7CgoJCQlpZiggc3RyY2hyKCBiLCAncicgKSApIGNvbnRpbnVlOwoKLy8JCQlwdCA9IHN0cmNociggYiwgJyknICkgKyAxOwoJCQlwdCA9IHN0cmNociggYiwgJ10nICkgKyAxOwoJCQlzc2NhbmYoIHB0LCAiJWQgJWxmICVsZiIsICAmb3B0LCAmYml0cywgJnogKTsgCiAgICAgICAgICAgIGRpc1twb3NdICs9IChkb3VibGUpb3B0OwogICAgICAgICAgICBjb3VudCsrOwojaWYgMAoJCQlmcHJpbnRmKCBzdGRlcnIsICJiPSVzXG4iLCBiICk7CgkJCWZwcmludGYoIHN0ZGVyciwgIm9wdD0lZFxuIiwgb3B0ICk7CgkJCWZwcmludGYoIHN0ZGVyciwgInBvcz0lZFxuIiwgcG9zICk7CgkJCWZwcmludGYoIHN0ZGVyciwgImRpc1twb3NdPSVmXG4iLCBkaXNbcG9zXSApOwojZW5kaWYKCiAgICAgICAgfQoJCWVsc2UgaWYoIDAgPT0gc3RybmNtcCggIj4+Pjw8PCIsIGIsIDYgKSApCgkJewoJCQlicmVhazsKCQl9CgogICAgfQoJaWYoICFjb3VudCApIHJldHVybiAtMTsKCiAgICByZXR1cm4gY291bnQ7Cn0KCmludCBSZWFkRmFzdGEzNG0xMF9zY29yZW9ubHlfbnVjKCBGSUxFICpmcCwgZG91YmxlICpkaXMsIGludCBuaW4gKQp7CiAgICBpbnQgY291bnQ9MDsKICAgIGNoYXIgYltCXTsKCWNoYXIgKnB0OwogICAgaW50IHBvczsKCWludCBvcHQ7Cglkb3VibGUgeiwgYml0czsKCWludCBjOwoJaW50ICp5b25kYTsKCgoJeW9uZGEgPSBBbGxvY2F0ZUludFZlYyggbmluICk7Cglmb3IoIGM9MDsgYzxuaW47IGMrKyApIHlvbmRhW2NdID0gMDsKCWZvciggYz0wOyBjPG5pbjsgYysrICkgZGlzW2NdID0gMC4wOwoKICAgIGNvdW50ID0gMDsKICAgIHdoaWxlKCAhZmVvZiggZnAgKSApCiAgICB7CiAgICAgICAgZmdldHMoIGIsIEItMSwgZnAgKTsKICAgICAgICBpZiggIXN0cm5jbXAoICIrPT09PT09PT09PT0rIiwgYiwgMTMgKSApCiAgICAgICAgewogICAgICAgICAgICBwb3MgPSBhdG9pKCBiKzEzICk7CgoJCQlpZiggc3RyY2hyKCBiLCAncicgKSApIGNvbnRpbnVlOwoKLy8JCQlwdCA9IHN0cmNociggYiwgJyknICkgKyAxOwoJCQlwdCA9IHN0cmNociggYiwgJ10nICkgKyAxOwoJCQlzc2NhbmYoIHB0LCAiJWQgJWxmICVsZiIsICAmb3B0LCAmYml0cywgJnogKTsgCgkJCWlmKCB5b25kYVtwb3NdID09IDAgKQoJCQl7CgkgICAgICAgICAgICBkaXNbcG9zXSArPSAoZG91YmxlKW9wdDsKCQkJCXlvbmRhW3Bvc10gPSAxOwoJCQl9CiAgICAgICAgICAgIGNvdW50Kys7CiNpZiAwCgkJCWZwcmludGYoIHN0ZGVyciwgImI9JXNcbiIsIGIgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAib3B0PSVkXG4iLCBvcHQgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAicG9zPSVkXG4iLCBwb3MgKTsKCQkJZnByaW50Ziggc3RkZXJyLCAiZGlzW3Bvc109JWZcbiIsIGRpc1twb3NdICk7CiNlbmRpZgoKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiggIXN0cm5jbXAoICI+Pj4iLCBiLCAzICkgKQoJCXsKCQkJZm9yKCBjPTA7IGM8bmluOyBjKysgKSB5b25kYVtjXSA9IDA7CgkJfQoJCWVsc2UgaWYoIDAgPT0gc3RybmNtcCggIj4+Pjw8PCIsIGIsIDYgKSApCgkJewoJCQlicmVhazsKCQl9CgogICAgfQoKCWZyZWUoIHlvbmRhICk7CgoJaWYoICFjb3VudCApIHJldHVybiAtMTsKCiAgICByZXR1cm4gY291bnQ7Cn0KCmludCBSZWFkRmFzdGEzNG0xMF9zY29yZW9ubHkoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5pbiApCnsKICAgIGludCBjb3VudD0wOwogICAgY2hhciBiW0JdOwoJY2hhciAqcHQ7CiAgICBpbnQgcG9zOwoJaW50IG9wdDsKCWRvdWJsZSB6LCBiaXRzOwoJaW50IGM7CglpbnQgKnlvbmRhOwoKCgl5b25kYSA9IEFsbG9jYXRlSW50VmVjKCBuaW4gKTsKCWZvciggYz0wOyBjPG5pbjsgYysrICkgeW9uZGFbY10gPSAwOwoJZm9yKCBjPTA7IGM8bmluOyBjKysgKSBkaXNbY10gPSAwLjA7CgogICAgY291bnQgPSAwOwogICAgd2hpbGUoICFmZW9mKCBmcCApICkKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggIis9PT09PT09PT09PSsiLCBiLCAxMyApICkKICAgICAgICB7CiAgICAgICAgICAgIHBvcyA9IGF0b2koIGIrMTMgKTsKCgkJCXB0ID0gc3RyY2hyKCBiLCAnKScgKSArIDE7CgkJCXNzY2FuZiggcHQsICIlZCAlbGYgJWxmIiwgICZvcHQsICZiaXRzLCAmeiApOyAKCQkJaWYoIHlvbmRhW3Bvc10gPT0gMCApCgkJCXsKCSAgICAgICAgICAgIGRpc1twb3NdICs9IChkb3VibGUpb3B0OwoJCQkJeW9uZGFbcG9zXSA9IDE7CgkJCX0KICAgICAgICAgICAgY291bnQrKzsKI2lmIDAKCQkJZnByaW50Ziggc3RkZXJyLCAiYj0lc1xuIiwgYiApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJvcHQ9JWRcbiIsIG9wdCApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJwb3M9JWRcbiIsIHBvcyApOwoJCQlmcHJpbnRmKCBzdGRlcnIsICJkaXNbcG9zXT0lZlxuIiwgZGlzW3Bvc10gKTsKI2VuZGlmCgogICAgICAgIH0KICAgICAgICBlbHNlIGlmKCAhc3RybmNtcCggIj4+PiIsIGIsIDMgKSApCgkJewoJCQlmb3IoIGM9MDsgYzxuaW47IGMrKyApIHlvbmRhW2NdID0gMDsKCQl9CgkJZWxzZSBpZiggMCA9PSBzdHJuY21wKCAiPj4+PDw8IiwgYiwgNiApICkKCQl7CgkJCWJyZWFrOwoJCX0KCiAgICB9CgoJZnJlZSggeW9uZGEgKTsKCglpZiggIWNvdW50ICkgcmV0dXJuIC0xOwoKICAgIHJldHVybiBjb3VudDsKfQppbnQgUmVhZEZhc3RhMzQoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5zZXEsIGNoYXIgbmFtZVtNXVtCXSwgTG9jYWxIb20gKmxvY2FsaG9tbGlzdCApCnsKICAgIGludCBjb3VudD0wOwogICAgY2hhciBiW0JdOwoJY2hhciAqcHQ7CiAgICBzdGF0aWMgaW50IGp1bmJhbltNXTsKCWludCBvdmVybGFwYWE7CglpbnQgb3B0LCBxc3RhcnQsIHFlbmQsIHRzdGFydCwgdGVuZDsKCWRvdWJsZSB6LCBiaXRzOwoKCiAgICBjb3VudCA9IDA7CiNpZiAwCiAgICBmb3IoIGk9MDsgaTwxMDAwMDAwMCAmJiBjb3VudDxuc2VxOyBpKysgKQojZWxzZQogICAgd2hpbGUoICFmZW9mKCBmcCApICkKI2VuZGlmCiAgICB7CiAgICAgICAgZmdldHMoIGIsIEItMSwgZnAgKTsKICAgICAgICBpZiggIXN0cm5jbXAoICIrPT09PT09PT09PSsiLCBiLCAxMiApICkKICAgICAgICB7CiAgICAgICAgICAgIGp1bmJhbltjb3VudF0gPSBhdG9pKCBiKzEyICk7CgoJCQlwdCA9IHN0cmNociggYiwgJyknICkgKyAxOwoJCQlzc2NhbmYoIHB0LCAiJWQgJWxmICVsZiIsICAmb3B0LCAmYml0cywgJnogKTsgCiAgICAgICAgICAgIGRpc1tqdW5iYW5bY291bnRdXSA9IChkb3VibGUpb3B0OwogICAgICAgICAgICBjb3VudCsrOwoKICAgICAgICB9CgkJZWxzZSBpZiggMCA9PSBzdHJuY21wKCAiPj4rPT09PT09PT09PSsiLCBiLCAxNCApICkKCQl7CgkJCWJyZWFrOwoJCX0KCiAgICB9CglpZiggIWNvdW50ICkgcmV0dXJuIC0xOwoKCWNvdW50ID0gMDsKICAgIHdoaWxlKCAhZmVvZiggZnAgKSApCgl7CgkJaWYoICFzdHJuY21wKCI+Pis9PT09PT09PT09KyIsIGIsIDE0ICkgKQoJCXsKICAgICAgICAgICAganVuYmFuW2NvdW50XSA9IGF0b2koIGIrMTQgKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICAJZmdldHMoIGIsIEItMSwgZnAgKTsgLy8gaW5pdG46CgkJCXB0ID0gc3Ryc3RyKCBiLCAib3B0OiAiICkgKyA1OwoJCQlsb2NhbGhvbWxpc3RbanVuYmFuW2NvdW50LTFdXS5vcHQgPSBhdG9mKCBwdCApOwogICAgICAgIAlmZ2V0cyggYiwgQi0xLCBmcCApOyAvLyBTbWl0aC1XYXRlcm1hbiBzY29yZQoJCQlwdCA9IHN0cnN0ciggYiwgInVuZ2FwcGVkKSBpbiAiICkgKyAxMzsKCQkJc3NjYW5mKCBwdCwgIiVkIiwgJm92ZXJsYXBhYSApOyAKCQkJZnByaW50Ziggc3RkZXJyLCAicHQgPSAlcywgb3ZlcmxhcGFhID0gJWRcbiIsIHB0LCBvdmVybGFwYWEgKTsKCQkJcHQgPSBzdHJzdHIoIGIsICJvdmVybGFwICgiICkgKyA4OwoJCQlzc2NhbmYoIHB0LCAiKCVkLSVkOiVkLSVkKSIsICZxc3RhcnQsICZxZW5kLCAmdHN0YXJ0LCAmdGVuZCApOyAKCQkJbG9jYWxob21saXN0W2p1bmJhbltjb3VudC0xXV0ub3ZlcmxhcGFhID0gb3ZlcmxhcGFhOwoJCQlsb2NhbGhvbWxpc3RbanVuYmFuW2NvdW50LTFdXS5zdGFydDEgPSBxc3RhcnQtMTsKCQkJbG9jYWxob21saXN0W2p1bmJhbltjb3VudC0xXV0uZW5kMSAgID0gcWVuZC0xOwoJCQlsb2NhbGhvbWxpc3RbanVuYmFuW2NvdW50LTFdXS5zdGFydDIgPSB0c3RhcnQtMTsKCQkJbG9jYWxob21saXN0W2p1bmJhbltjb3VudC0xXV0uZW5kMiAgID0gdGVuZC0xOwoJCX0KICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwoJfQoJZnByaW50Ziggc3RkZXJyLCAiY291bnQgPSAlZFxuIiwgY291bnQgKTsKICAgIHJldHVybiBjb3VudDsKfQoKaW50IFJlYWRGYXN0YTMoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5zZXEsIGNoYXIgbmFtZVtNXVtCXSApCnsKICAgIGludCBjb3VudD0wOwogICAgY2hhciBiW0JdOwoJY2hhciAqcHQ7CiAgICBpbnQganVuYmFuW01dOwoJaW50IGluaXRuLCBpbml0MSwgb3B0OwoJZG91YmxlIHo7CgogICAgY291bnQgPSAwOwojaWYgMAogICAgZm9yKCBpPTA7IGk8MTAwMDAwMDAgJiYgY291bnQ8bnNlcTsgaSsrICkKI2Vsc2UKICAgIHdoaWxlKCAhZmVvZiggZnAgKSApCiNlbmRpZgogICAgewogICAgICAgIGZnZXRzKCBiLCBCLTEsIGZwICk7CiAgICAgICAgaWYoICFzdHJuY21wKCAiKz09PT09PT09PT0rIiwgYiwgMTIgKSApCiAgICAgICAgewogICAgICAgICAgICBqdW5iYW5bY291bnRdID0gYXRvaSggYisxMiApOwoKCQkJcHQgPSBzdHJjaHIoIGIsICcpJyApICsgMTsKCQkJc3NjYW5mKCBwdCwgIiVkICVkICVkICVsZiIsICZpbml0biwgJmluaXQxLCAmb3B0LCAmeiApOyAKICAgICAgICAgICAgZGlzW2p1bmJhbltjb3VudF1dID0gKGRvdWJsZSlvcHQ7CiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDA7Cn0KCmludCBSZWFkRmFzdGEoIEZJTEUgKmZwLCBkb3VibGUgKmRpcywgaW50IG5zZXEsIGNoYXIgbmFtZVtNXVtCXSApCnsKICAgIGludCBpLCBjb3VudD0wOwogICAgY2hhciBiW0JdOwogICAgaW50IGp1bmJhbltNXTsKCWludCBpbml0biwgaW5pdDEsIG9wdDsKCiAgICBjb3VudCA9IDA7Cglmb3IoIGk9MDsgaTxuc2VxOyBpKysgKSBkaXNbaV0gPSAwLjA7CiAgICBmb3IoIGk9MDsgIWZlb2YoIGZwICkgJiYgY291bnQ8bnNlcTsgaSsrICkKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggIis9PT09PT09PT09KyIsIGIsIDEyICkgKQogICAgICAgIHsKICAgICAgICAgICAganVuYmFuW2NvdW50XSA9IGF0b2koIGIrMTIgKTsKCgkJCXNzY2FuZiggYis1MCwgIiVkICVkICVkIiwgJmluaXRuLCAmaW5pdDEsICZvcHQgKTsgCiAgICAgICAgICAgIGRpc1tqdW5iYW5bY291bnRdXSA9IChkb3VibGUpb3B0OwogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgIH0KCi8qCiAgICBjb3VudCA9IDA7CiAgICBmb3IoIGk9MDsgaTwxMDAwMDAgJiYgY291bnQ8bnNlcTsgaSsrICkKICAgIHsKICAgICAgICBmZ2V0cyggYiwgQi0xLCBmcCApOwogICAgICAgIGlmKCAhc3RybmNtcCggbmFtZVtqdW5iYW5bY291bnRdXSwgYiwgMjAgICkgKQogICAgICAgIHsKICAgICAgICAgICAgZGlzW2p1bmJhbltjb3VudF1dID0gYXRvZiggYis2NSApOwogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgIH0KKi8KICAgIHJldHVybiAwOwp9CgoKaW50IFJlYWRPcHQoIEZJTEUgKmZwLCBpbnQgb3B0W01dLCBpbnQgbnNlcSwgY2hhciBuYW1lW01dW0JdICkKewogICAgaW50IGksIGNvdW50PTA7CiAgICBjaGFyIGJbQl07CiAgICBpbnQganVuYmFuW01dOwoJaW50IG9wdHQsIGluaXRuLCBpbml0MTsKCiAgICBjb3VudCA9IDA7CiAgICBmb3IoIGk9MDsgaTwxMDAwMDAwMCAmJiBjb3VudDxuc2VxOyBpKysgKQogICAgewogICAgICAgIGZnZXRzKCBiLCBCLTEsIGZwICk7CiAgICAgICAgaWYoICFzdHJuY21wKCAiKz09PT09PT09PT0rIiwgYiwgMTIgKSApCiAgICAgICAgewogICAgICAgICAgICBqdW5iYW5bY291bnRdID0gYXRvaSggYisxMiApOwoJCQlzc2NhbmYoIGIrNTAsICIlZCAlZCAlZCIsICZpbml0biwgJmluaXQxLCAmb3B0dCApOyAKICAgICAgICAgICAgb3B0W2p1bmJhbltjb3VudF1dID0gKGRvdWJsZSlvcHR0OwogICAgICAgICAgICBjb3VudCsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAwOwp9CgppbnQgUmVhZE9wdDIoIEZJTEUgKmZwLCBpbnQgb3B0W01dLCBpbnQgbnNlcSwgY2hhciBuYW1lW01dW0JdICkKewogICAgaW50IGksIGNvdW50PTA7CiAgICBjaGFyIGJbQl07CiAgICBpbnQganVuYmFuW01dOwoKICAgIGNvdW50ID0gMDsKICAgIGZvciggaT0wOyBpPDEwMDAwMDAwICYmIGNvdW50PG5zZXE7IGkrKyApCiAgICB7CiAgICAgICAgZmdldHMoIGIsIEItMSwgZnAgKTsKICAgICAgICBpZiggIXN0cm5jbXAoICIrPT09PT09PT09PSsiLCBiLCAxMiApICkKICAgICAgICB7CiAgICAgICAgICAgIGp1bmJhbltjb3VudF0gPSBhdG9pKCBiKzEyICk7CiAgICAgICAgICAgIG9wdFtqdW5iYW5bY291bnRdXSA9IGF0b2koIGIrNjUgKTsKICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKCgppbnQgd3JpdGVQcmUoIGludCBuc2VxLCBjaGFyIG5hbWVbXVtCXSwgaW50IG5sZW5bTV0sIGNoYXIgKiphc2VxLCBpbnQgZm9yY2UgKQp7CiNpZiBVU0VfWENFRAoJaW50IGksIHZhbHVlOwoJaWYoICFzaWduYWxTTSApCgl7CgkJaWYoIGZvcmNlICkgCgkJewoJCQlyZXdpbmQoIHByZXBfZyApOwoJCQlpZiggZGV2aWRlICkgZHZXcml0ZSggcHJlcF9nLCBuc2VxLCBuYW1lLCBubGVuLCBhc2VxICk7CiNpZiAwCgkJCWVsc2UgICAgV3JpdGVHYXBGaWxsKCBwcmVwX2csIG5zZXEsIG5hbWUsIG5sZW4sIGFzZXEgKTsKI2Vsc2UKCQkJZWxzZSAgICB3cml0ZURhdGEoIHByZXBfZywgbnNlcSwgbmFtZSwgbmxlbiwgYXNlcSApOwojZW5kaWYKCQl9CgkJcmV0dXJuKCAwICk7Cgl9Cglmb3IoIGk9MDsgaTwxMDsgaSsrICkKCXsKI2lmIElPREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJTRU1BUEhPUkUgPSAlZFxuIiwgc2lnbmFsU01bU0VNQVBIT1JFXSApOwojZW5kaWYKCQlpZiggc2lnbmFsU01bU0VNQVBIT1JFXS0tID4gMCApCgkJewojaWYgMCAvKiAvdG1wL3ByZSCkzrTYt7ikx6TPpLqkt6S/ICovCgkJCWlmKCBmZXJyb3IoIHByZXBfZyApICkgcHJlcF9nID0gZm9wZW4oICJwcmUiLCAidyIgKTsKCQkJaWYoICFwcmVwX2cgKSBFcnJvckV4aXQoICJDYW5ub3QgcmUtb3BlbiBwcmUuIiApOyAKI2VuZGlmCgkJCXJld2luZCggcHJlcF9nICk7CgkJCXNpZ25hbFNNW1NUQVRVU10gPSBJTUFfS0FJVEVSVTsKI2lmIElPREVCVUcKCQkJaWYoIGZvcmNlICkgZnByaW50Ziggc3RkZXJyLCAiRklOQUwgIiApOwojZW5kaWYKCQkJaWYoIGRldmlkZSApIGR2V3JpdGUoIHByZXBfZywgbnNlcSwgbmFtZSwgbmxlbiwgYXNlcSApOwoJCQllbHNlICAgIFdyaXRlR2FwRmlsbCggcHJlcF9nLCBuc2VxLCBuYW1lLCBubGVuLCBhc2VxICk7CgkJCS8qCgkJCWZwcmludGYoIHByZXBfZywgJ1xFT0YnICk7CgkJCSovCgkJCWZmbHVzaCggcHJlcF9nICk7CgkJCWlmKCBmb3JjZSApIHNpZ25hbFNNW1NUQVRVU10gPSBPU0hJTUFJOwoJCQllbHNlICAgICAgICBzaWduYWxTTVtTVEFUVVNdID0gS0FLSU9XQVRUQTsKCQkJdmFsdWUgPSAxOwoJCQlzaWduYWxTTVtTRU1BUEhPUkVdKys7CiNpZiBJT0RFQlVHCgkJCWZwcmludGYoIHN0ZGVyciwgInNpZ25hbFNNW1NUQVRVU10gPSAlY1xuIiwgc2lnbmFsU01bU1RBVFVTXSApOwojZW5kaWYKCQkJYnJlYWs7CgkJfQoJCWVsc2UKCQl7CiNpZiBJT0RFQlVHCgkJCWZwcmludGYoIHN0ZGVyciwgIllPTkRFUlVLQVJBX0FLSVJBTUVSVVxuIiApOwojZW5kaWYKCQkJdmFsdWUgPSAwOwoJCQlzaWduYWxTTVtTRU1BUEhPUkVdKys7CgkJCWlmKCAhZm9yY2UgKSBicmVhazsKI2lmIElPREVCVUcKCQkJZnByaW50Ziggc3RkZXJyLCAiTUFUU1VcbiIgKTsKI2VuZGlmCgkJCXNsZWVwKCAxICk7CgkJfQoJfQoJaWYoIGZvcmNlICYmICF2YWx1ZSApIEVycm9yRXhpdCggInhjZWQgZ2EgcHJlIHdvIGhhbmFzYW5haSBcbiIgKTsKCXJldHVybiggdmFsdWUgKTsKI2Vsc2UKCWlmKCBmb3JjZSApIAoJewoJCXJld2luZCggcHJlcF9nICk7CgkJCXdyaXRlRGF0YSggcHJlcF9nLCBuc2VxLCBuYW1lLCBubGVuLCBhc2VxICk7Cgl9CiNlbmRpZgoJcmV0dXJuKCAwICk7Cn0KCgp2b2lkIHJlYWRPdGhlck9wdGlvbnMoIGludCAqcHBpZHB0ciwgaW50ICpmZnRUaHJlc2hvbGRwdHIsIGludCAqZmZ0V2luU2l6ZXB0ciApCnsKCWlmKCBjYWxsZWRCeVhjZWQgKQoJewoJCUZJTEUgKmZwID0gZm9wZW4oICJwcmUiLCAiciIgKTsKCQljaGFyIGJbQl07CgkJaWYoICFmcCApIEVycm9yRXhpdCggIkNhbm5vdCBvcGVuIHByZS5cbiIgKTsKCQlmZ2V0cyggYiwgQi0xLCBmcCApOwoJCXNzY2FuZiggYiwgIiVkICVkICVkIiwgcHBpZHB0ciwgZmZ0VGhyZXNob2xkcHRyLCBmZnRXaW5TaXplcHRyICk7CgkJZmNsb3NlKCBmcCApOwojaWYgSU9ERUJVRwoJZnByaW50Ziggc3RkZXJyLCAiYiA9ICVzXG4iLCBiICk7CglmcHJpbnRmKCBzdGRlcnIsICJwcGlkID0gJWRcbiIsIHBwaWQgKTsKCWZwcmludGYoIHN0ZGVyciwgImZmdFRocmVzaG9sZCA9ICVkXG4iLCBmZnRUaHJlc2hvbGQgKTsKCWZwcmludGYoIHN0ZGVyciwgImZmdFdpblNpemUgPSAlZFxuIiwgZmZ0V2luU2l6ZSApOwojZW5kaWYKCX0KCWVsc2UKCXsKCQkqcHBpZHB0ciA9IDA7CgkJKmZmdFRocmVzaG9sZHB0ciA9IEZGVF9USFJFU0hPTEQ7CgkJaWYoIGRvcnAgPT0gJ2QnICkKCQkJKmZmdFdpblNpemVwdHIgPSBGRlRfV0lOU0laRV9EOwoJCWVsc2UKCQkJKmZmdFdpblNpemVwdHIgPSBGRlRfV0lOU0laRV9QOwoJfQojaWYgMAoJZnByaW50Ziggc3RkZXJyLCAiZmZ0VGhyZXNob2xkcHRyPSVkXG4iLCAqZmZ0VGhyZXNob2xkcHRyICk7CglmcHJpbnRmKCBzdGRlcnIsICJmZnRXaW5TaXplcHRyPSVkXG4iLCAqZmZ0V2luU2l6ZXB0ciApOwojZW5kaWYKfQoKdm9pZCBpbml0U2lnbmFsU00oIHZvaWQgKQp7Ci8vCWludCBzaWduYWxzbWlkOwoKI2lmIElPREVCVUcKCWlmKCBwcGlkICkgZnByaW50Ziggc3RkZXJyLCAiUElEIG9mIHhjZWQgPSAlZFxuIiwgcHBpZCApOwojZW5kaWYKCWlmKCAhcHBpZCApCgl7CgkJc2lnbmFsU00gPSBOVUxMOwoJCXJldHVybjsKCX0KCiNpZiAwCglzaWduYWxzbWlkID0gc2htZ2V0KCAoa2V5X3QpcHBpZCwgMywgSVBDX0FMTE9DIHwgMDY2NiApOwoJaWYoIHNpZ25hbHNtaWQgPT0gLTEgKSBFcnJvckV4aXQoICJDYW5ub3QgZ2V0IFNoYXJlZCBtZW1vcnkgZm9yIHNpZ25hbC5cbiIgKTsKCXNpZ25hbFNNID0gc2htYXQoIHNpZ25hbHNtaWQsIDAsIDAgKTsKCWlmKCAoaW50KXNpZ25hbFNNID09IC0xICkgRXJyb3JFeGl0KCAiQ2Fubm90IGF0dGF0Y2ggU2hhcmVkIE1lbW9yeSBmb3Igc2lnbmFsIVxuIiApOwoJc2lnbmFsU01bU1RBVFVTXSA9IElNQV9LQUlURVJVOwoJc2lnbmFsU01bU0VNQVBIT1JFXSA9IDE7CiNlbmRpZgp9Cgp2b2lkIGluaXRGaWxlcyggdm9pZCApCnsKCWNoYXIgcG5hbWVbMTAwXTsKCWlmKCBwcGlkICkKCQlzcHJpbnRmKCBwbmFtZSwgIi90bXAvcHJlLiVkIiwgcHBpZCApOwoJZWxzZQoJCXNwcmludGYoIHBuYW1lLCAicHJlIiApOwoJcHJlcF9nID0gZm9wZW4oIHBuYW1lLCAidyIgKTsKCWlmKCAhcHJlcF9nICkgRXJyb3JFeGl0KCAiQ2Fubm90IG9wZW4gcHJlIiApOwoKCXRyYXBfZyA9IGZvcGVuKCAidHJhY2UiLCAidyIgKTsKCWlmKCAhdHJhcF9nICkgRXJyb3JFeGl0KCAiY2Fubm90IG9wZW4gdHJhY2UiICk7CglmcHJpbnRmKCB0cmFwX2csICJQSUQgPSAlZFxuIiwgZ2V0cGlkKCkgKTsKCWZmbHVzaCggdHJhcF9nICk7Cn0KCgp2b2lkIFdyaXRlRm9yRmFzdGEoIEZJTEUgKmZwLCBpbnQgbG9jbmpvYiwgY2hhciBuYW1lW11bQl0sIGludCBubGVuW01dLCBjaGFyICoqYXNlcSApCnsKICAgIHN0YXRpYyBjaGFyIGJbTl07CiAgICBpbnQgaSwgajsKICAgIGludCBuYWxlbltNXTsKCiAgICBmb3IoIGk9MDsgaTxsb2Nuam9iOyBpKysgKQogICAgewogICAgICAgIG5hbGVuW2ldID0gc3RybGVuKCBhc2VxW2ldICk7CiAgICAgICAgZnByaW50ZiggZnAsICI+JXNcbiIsIG5hbWVbaV0gKTsKICAgICAgICBmb3IoIGo9MDsgajxuYWxlbltpXTsgaj1qK0MgKSAKICAgICAgICB7CiAgICAgICAgICAgIHN0cm5jcHkoIGIsIGFzZXFbaV0raiwgQyApOyBiW0NdID0gMDsKICAgICAgICAgICAgZnByaW50ZiggZnAsICIlc1xuIixiICk7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIHJlYWRsb2NhbGhvbXRhYmxlMiggRklMRSpmcCwgaW50IG5qb2IsIExvY2FsSG9tICoqbG9jYWxob210YWJsZSApCnsKCWRvdWJsZSBvcHQ7CglzdGF0aWMgY2hhciBidWZmW0JdOwoJaW50IGksIGosIG92ZXJsYXBhYSwgc3RhcnQxLCBlbmQxLCBzdGFydDIsIGVuZDI7CglMb2NhbEhvbSAqdG1wcHRyMSwgKnRtcHB0cjI7CgovLwlmb3IoIGk9MDsgaTxuam9iOyBpKysgKSBmb3IoIGo9MDsgajxuam9iOyBqKysgKSBubG9jYWxob21baV1bal0gPSAwOwoKCXdoaWxlICggTlVMTCAhPSBmZ2V0cyggYnVmZiwgQi0xLCBmcCApICkKCXsKLy8JCWZwcmludGYoIHN0ZGVyciwgIlxuIiApOwoJCXNzY2FuZiggYnVmZiwgIiVkICVkICVkICVsZiAlZCAlZCAlZCAlZCIsICAmaSwgJmosICZvdmVybGFwYWEsICZvcHQsICZzdGFydDEsICZlbmQxLCAmc3RhcnQyLCAmZW5kMiApOwoKI2lmIDAKCQlpZiggc3RhcnQxID09IGVuZDEgfHwgc3RhcnQyID09IGVuZDIgKSBjb250aW51ZTsgLy9tb25kYWkgYXJpCiNlbmRpZgoKLy8JCWlmKCBpIDwgaiApCgkJewoJCQlpZiggbG9jYWxob210YWJsZVtpXVtqXS5ub2tvcmkrKyA+IDAgKQoJCQl7CgkJCQl0bXBwdHIxID0gbG9jYWxob210YWJsZVtpXVtqXS5sYXN0OwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWFsbG9jYXRpbmcsIGxvY2FsaG9tdGFibGVbJWRdWyVkXS5ub2tvcmkgPSAlZFxuIiwgaSwgaiwgbG9jYWxob210YWJsZVtpXVtqXS5ub2tvcmkgKTsKCQkJCXRtcHB0cjEtPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwoJCQkJdG1wcHRyMSA9IHRtcHB0cjEtPm5leHQ7CgkJCQl0bXBwdHIxLT5leHRlbmRlZCA9IC0xOwoJCQkJdG1wcHRyMS0+bmV4dCA9IE5VTEw7CgkJCQlsb2NhbGhvbXRhYmxlW2ldW2pdLmxhc3QgPSB0bXBwdHIxOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICIjIyMgaSxqID0gJWQsJWQsIG5va29yaT0lZFxuIiwgaSwgaiwgbG9jYWxob210YWJsZVtpXVtqXS5ub2tvcmkgKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXRtcHB0cjEgPSBsb2NhbGhvbXRhYmxlW2ldK2o7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgIiMjIyBpLGogPSAlZCwlZCwgbm9rb3JpPSVkXG4iLCBpLCBqLCBsb2NhbGhvbXRhYmxlW2ldW2pdLm5va29yaSApOwoJCQl9CgkKCQkJdG1wcHRyMS0+c3RhcnQxID0gc3RhcnQxOwoJCQl0bXBwdHIxLT5zdGFydDIgPSBzdGFydDI7CgkJCXRtcHB0cjEtPmVuZDEgPSBlbmQxOwoJCQl0bXBwdHIxLT5lbmQyID0gZW5kMjsKLy8JCQl0bXBwdHIxLT5vcHQgPSAoIG9wdCAvIG92ZXJsYXBhYSArIDAuMDAgKSAvIDUuOCAgKiA2MDA7Ci8vCQkJdG1wcHRyMS0+b3B0ID0gb3B0OwoJCQl0bXBwdHIxLT5vcHQgPSAoIG9wdCArIDAuMDAgKSAvIDUuOCAgKiA2MDA7CgkJCXRtcHB0cjEtPm92ZXJsYXBhYSA9IG92ZXJsYXBhYTsKCQl9Ci8vCQllbHNlCgkJewoJCQlpZiggbG9jYWxob210YWJsZVtqXVtpXS5ub2tvcmkrKyA+IDAgKQoJCQl7CgkJCQl0bXBwdHIyID0gbG9jYWxob210YWJsZVtqXVtpXS5sYXN0OwoJCQkJdG1wcHRyMi0+bmV4dCA9IChMb2NhbEhvbSAqKWNhbGxvYyggMSwgc2l6ZW9mKCBMb2NhbEhvbSApICk7CgkJCQl0bXBwdHIyID0gdG1wcHRyMi0+bmV4dDsKCQkJCXRtcHB0cjItPmV4dGVuZGVkID0gLTE7CgkJCQl0bXBwdHIyLT5uZXh0ID0gTlVMTDsKCQkJCWxvY2FsaG9tdGFibGVbal1baV0ubGFzdCA9IHRtcHB0cjI7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgIiMjIyBpLGogPSAlZCwlZCwgbm9rb3JpPSVkXG4iLCBqLCBpLCBsb2NhbGhvbXRhYmxlW2pdW2ldLm5va29yaSApOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJdG1wcHRyMiA9IGxvY2FsaG9tdGFibGVbal0raTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAiIyMjIGksaiA9ICVkLCVkLCBub2tvcmk9JWRcbiIsIGosIGksIGxvY2FsaG9tdGFibGVbal1baV0ubm9rb3JpICk7CgkJCX0KCQoJCQl0bXBwdHIyLT5zdGFydDIgPSBzdGFydDE7CgkJCXRtcHB0cjItPnN0YXJ0MSA9IHN0YXJ0MjsKCQkJdG1wcHRyMi0+ZW5kMiA9IGVuZDE7CgkJCXRtcHB0cjItPmVuZDEgPSBlbmQyOwovLwkJCXRtcHB0cjItPm9wdCA9ICggb3B0IC8gb3ZlcmxhcGFhICsgMC4wMCApIC8gNS44ICAqIDYwMDsKLy8JCQl0bXBwdHIyLT5vcHQgPSBvcHQ7CgkJCXRtcHB0cjItPm9wdCA9ICggb3B0ICsgMC4wMCApIC8gNS44ICAqIDYwMDsKCQkJdG1wcHRyMi0+b3ZlcmxhcGFhID0gb3ZlcmxhcGFhOwoJCi8vCQkJZnByaW50Ziggc3RkZXJyLCAiaT0lZCwgaj0lZCwgc3QxPSVkLCBlbjE9JWQsIG9wdCA9ICVmXG4iLCBpLCBqLCB0bXBwdHIxLT5zdGFydDEsIHRtcHB0cjEtPmVuZDEsIG9wdCApOwoJCX0KCgl9Cn0Kdm9pZCByZWFkbG9jYWxob210YWJsZSggRklMRSpmcCwgaW50IG5qb2IsIExvY2FsSG9tICoqbG9jYWxob210YWJsZSApCnsKCWRvdWJsZSBvcHQ7CglzdGF0aWMgY2hhciBidWZmW0JdOwoJaW50IGksIGosIG92ZXJsYXBhYSwgc3RhcnQxLCBlbmQxLCBzdGFydDIsIGVuZDI7CglpbnQgKipubG9jYWxob20gPSBOVUxMOwoJTG9jYWxIb20gKnRtcHB0cjE9TlVMTCwgKnRtcHB0cjI9TlVMTDsgLy8gYnkgRC5NYXRob2csIGEgZ3Vlc3MKCglubG9jYWxob20gPSBBbGxvY2F0ZUludE10eCggbmpvYiwgbmpvYiApOwoJZm9yKCBpPTA7IGk8bmpvYjsgaSsrICkgZm9yKCBqPTA7IGo8bmpvYjsgaisrICkgbmxvY2FsaG9tW2ldW2pdID0gMDsKCgl3aGlsZSAoIE5VTEwgIT0gZmdldHMoIGJ1ZmYsIEItMSwgZnAgKSApCgl7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKCQlzc2NhbmYoIGJ1ZmYsICIlZCAlZCAlZCAlbGYgJWQgJWQgJWQgJWQiLCAgJmksICZqLCAmb3ZlcmxhcGFhLCAmb3B0LCAmc3RhcnQxLCAmZW5kMSwgJnN0YXJ0MiwgJmVuZDIgKTsKCiNpZiAwCgkJaWYoIHN0YXJ0MSA9PSBlbmQxIHx8IHN0YXJ0MiA9PSBlbmQyICkgY29udGludWU7IC8vbW9uZGFpIGFyaQojZW5kaWYKCgovLwkJaWYoIGkgPCBqICkKCQl7CgkJCWlmKCBubG9jYWxob21baV1bal0rKyA+IDAgKQoJCQl7Ci8vCQkJCWZwcmludGYoIHN0ZGVyciwgInJlYWxsb2NhdGluZywgbmxvY2FsaG9tWyVkXVslZF0gPSAlZFxuIiwgaSwgaiwgbmxvY2FsaG9tW2ldW2pdICk7CgkJCQl0bXBwdHIxLT5uZXh0ID0gKExvY2FsSG9tICopY2FsbG9jKCAxLCBzaXplb2YoIExvY2FsSG9tICkgKTsKCQkJCXRtcHB0cjEgPSB0bXBwdHIxLT5uZXh0OwoJCQkJdG1wcHRyMS0+bmV4dCA9IE5VTEw7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQl0bXBwdHIxID0gbG9jYWxob210YWJsZVtpXStqOwovLwkJCQlmcHJpbnRmKCBzdGRlcnIsICJubG9jYWxob21bJWRdWyVkXSA9ICVkXG4iLCBpLCBqLCBubG9jYWxob21baV1bal0gKTsKCQkJfQoJCgkJCXRtcHB0cjEtPnN0YXJ0MSA9IHN0YXJ0MTsKCQkJdG1wcHRyMS0+c3RhcnQyID0gc3RhcnQyOwoJCQl0bXBwdHIxLT5lbmQxID0gZW5kMTsKCQkJdG1wcHRyMS0+ZW5kMiA9IGVuZDI7Ci8vCQkJdG1wcHRyMS0+b3B0ID0gKCBvcHQgLyBvdmVybGFwYWEgKyAwLjAwICkgLyA1LjggICogNjAwOwovLwkJCXRtcHB0cjEtPm9wdCA9IG9wdDsKCQkJdG1wcHRyMS0+b3B0ID0gKCBvcHQgKyAwLjAwICkgLyA1LjggICogNjAwOwoJCQl0bXBwdHIxLT5vdmVybGFwYWEgPSBvdmVybGFwYWE7CgkKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICJpPSVkLCBqPSVkLCBvcHQgPSAlZlxuIiwgaSwgaiwgb3B0ICk7CgkJfQovLwkJZWxzZQoJCXsKCQkJaWYoIG5sb2NhbGhvbVtqXVtpXSsrID4gMCApCgkJCXsKCQkJCXRtcHB0cjItPm5leHQgPSAoTG9jYWxIb20gKiljYWxsb2MoIDEsIHNpemVvZiggTG9jYWxIb20gKSApOwoJCQkJdG1wcHRyMiA9IHRtcHB0cjItPm5leHQ7CgkJCQl0bXBwdHIyLT5uZXh0ID0gTlVMTDsKCQkJfQoJCQllbHNlCgkJCQl0bXBwdHIyID0gbG9jYWxob210YWJsZVtqXStpOwoJCgkJCXRtcHB0cjItPnN0YXJ0MiA9IHN0YXJ0MTsKCQkJdG1wcHRyMi0+c3RhcnQxID0gc3RhcnQyOwoJCQl0bXBwdHIyLT5lbmQyID0gZW5kMTsKCQkJdG1wcHRyMi0+ZW5kMSA9IGVuZDI7Ci8vCQkJdG1wcHRyMi0+b3B0ID0gKCBvcHQgLyBvdmVybGFwYWEgKyAwLjAwICkgLyA1LjggICogNjAwOwovLwkJCXRtcHB0cjItPm9wdCA9IG9wdDsKCQkJdG1wcHRyMi0+b3B0ID0gKCBvcHQgKyAwLjAwICkgLyA1LjggICogNjAwOwoJCQl0bXBwdHIyLT5vdmVybGFwYWEgPSBvdmVybGFwYWE7CgkJfQoKCX0KCUZyZWVJbnRNdHgoIG5sb2NhbGhvbSApOwp9Cgp2b2lkIG91dGxvY2FsaG9tKCBMb2NhbEhvbSAqKmxvY2FsaG9tLCBpbnQgbnNlcSApCnsKCWludCBpLCBqOwoJTG9jYWxIb20gKnRtcHB0cjsKCWZvciggaT0wOyBpPG5zZXE7IGkrKyApIGZvciggaj0wOyBqPG5zZXE7IGorKyApCgl7CgkJdG1wcHRyID0gbG9jYWxob21baV0rajsKCQlmcHJpbnRmKCBzdGRlcnIsICIlZC0lZFxuIiwgaSwgaiApOwoJCWRvCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJyZWcxPSVkLSVkLCByZWcyPSVkLSVkLCBpbXA9JWYsIG9wdD0lZlxuIiwgdG1wcHRyLT5zdGFydDEsIHRtcHB0ci0+ZW5kMSwgdG1wcHRyLT5zdGFydDIsIHRtcHB0ci0+ZW5kMiwgdG1wcHRyLT5pbXBvcnRhbmNlLCB0bXBwdHItPm9wdCApOwoJCX0KCQl3aGlsZSggKHRtcHB0cj10bXBwdHItPm5leHQpICk7Cgl9Cn0KCnZvaWQgb3V0bG9jYWxob21wdCggTG9jYWxIb20gKioqbG9jYWxob20sIGludCBuMSwgaW50IG4yICkKewoJaW50IGksIGo7CglMb2NhbEhvbSAqdG1wcHRyOwoJZm9yKCBpPTA7IGk8bjE7IGkrKyApIGZvciggaj0wOyBqPG4yOyBqKysgKQoJewoJCXRtcHB0ciA9IGxvY2FsaG9tW2ldW2pdOwoJCWZwcmludGYoIHN0ZGVyciwgIiVkLSVkXG4iLCBpLCBqICk7CgkJZG8KCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgInJlZzE9JWQtJWQsIHJlZzI9JWQtJWQsIGltcD0lZiwgb3B0PSVmLCB3aW1wPSVmXG4iLCB0bXBwdHItPnN0YXJ0MSwgdG1wcHRyLT5lbmQxLCB0bXBwdHItPnN0YXJ0MiwgdG1wcHRyLT5lbmQyLCB0bXBwdHItPmltcG9ydGFuY2UsIHRtcHB0ci0+b3B0LCB0bXBwdHItPndpbXBvcnRhbmNlICk7CgkJfQoJCXdoaWxlKCAodG1wcHRyPXRtcHB0ci0+bmV4dCkgKTsKCX0KfQoKdm9pZCBGcmVlTG9jYWxIb21UYWJsZSggTG9jYWxIb20gKipsb2NhbGhvbXRhYmxlLCBpbnQgbiApIAp7CglpbnQgaSwgajsKCUxvY2FsSG9tICpwcHAsICp0bXBwdHI7CglmcHJpbnRmKCBzdGRvdXQsICJmcmVlaW5nIGxvY2FsaG9tXG4iICk7Cglmb3IoIGk9MDsgaTxuOyBpKysgKSAKCXsKCQlmb3IoIGo9MDsgajxuOyBqKysgKQoJCXsKCQkJdG1wcHRyPWxvY2FsaG9tdGFibGVbaV0rajsKCQkJcHBwID0gdG1wcHRyLT5uZXh0OwoJCQlmb3IoIDsgdG1wcHRyOyB0bXBwdHI9cHBwICkKCQkJewojaWYgREVCVUcKCQkJCWZwcmludGYoIHN0ZGVyciwgImk9JWQsIGo9JWRcbiIsIGksIGogKTsgCiNlbmRpZgoJCQkJcHBwID0gdG1wcHRyLT5uZXh0OwoJCQkJaWYoIHRtcHB0ciE9bG9jYWxob210YWJsZVtpXStqICkgCgkJCQl7CiNpZiBERUJVRwoJCQkJCWZwcmludGYoIHN0ZGVyciwgImZyZWVpbmcgJXBcbiIsIHRtcHB0ciApOwojZW5kaWYKCQkJCQlmcmVlKCB0bXBwdHIgKTsKCQkJCX0KCQkJfQoJCX0KI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiZnJlZWluZyBsb2NhbGhvbXRhYmxlWyVkXVxuIiwgaSApOwojZW5kaWYKCQlmcmVlKCBsb2NhbGhvbXRhYmxlW2ldICk7Cgl9CiNpZiBERUJVRwoJZnByaW50Ziggc3RkZXJyLCAiZnJlZWluZyBsb2NhbGhvbXRhYmxlXG4iICk7CiNlbmRpZgoJZnJlZSggbG9jYWxob210YWJsZSApOwojaWYgREVCVUcKCWZwcmludGYoIHN0ZGVyciwgImZyZWVkXG4iICk7CiNlbmRpZgp9CgpjaGFyICpwcm9nTmFtZSggY2hhciAqc3RyICkKewogICAgY2hhciAqdmFsdWU7IAogICAgaWYoICggdmFsdWUgPSBzdHJyY2hyKCBzdHIsICcvJyApICkgIT0gTlVMTCApCiAgICAgICAgcmV0dXJuKCB2YWx1ZSsxICk7CiAgICBlbHNlICAgIAogICAgICAgIHJldHVybiggc3RyICk7Cn0KCnN0YXRpYyB2b2lkIHRhYnRvc3BhY2UoIGNoYXIgKnN0ciApCnsKCWNoYXIgKnA7Ci8vCWZwcmludGYoIHN0ZGVyciwgImJlZm9yZSA9ICVzXG4iLCBzdHIgKTsKCXdoaWxlKCBOVUxMICE9ICggcCA9IHN0cmNociggc3RyICwgJ1x0JyApICkgKQoJewoJCSpwID0gJyAnOwoJfQovLwlmcHJpbnRmKCBzdGRlcnIsICJhZnRlciA9ICVzXG4iLCBzdHIgKTsKfQoKc3RhdGljIGNoYXIgKmV4dHJhY3RmaXJzdHdvcmQoIGNoYXIgKnN0ciApCnsKCWNoYXIgKnZhbCA9IHN0cjsKCgl0YWJ0b3NwYWNlKCBzdHIgKTsKCXdoaWxlKCAqc3RyICkKCXsKCQlpZiggdmFsID09IHN0ciAmJiAqc3RyID09ICcgJyApCgkJewoJCQl2YWwrKzsgc3RyKys7CgkJfQoJCWVsc2UgaWYoICpzdHIgIT0gJyAnICkKCQl7CgkJCXN0cisrOwoJCX0KCQllbHNlIGlmKCAqc3RyID09ICcgJyApCgkJewoJCQkqc3RyID0gMDsKCQl9Cgl9CglyZXR1cm4oIHZhbCApOwp9CgoKdm9pZCBjbHVzdGFsb3V0X3BvaW50ZXIoIEZJTEUgKmZwLCBpbnQgbnNlcSwgaW50IG1heGxlbiwgY2hhciAqKnNlcSwgY2hhciAqKm5hbWUsIGNoYXIgKm1hcmssIGNoYXIgKmNvbW1lbnQsIGludCAqb3JkZXIgKQp7CglpbnQgcG9zLCBqOwoJcG9zID0gMDsKCWlmKCBjb21tZW50ID09IE5VTEwgKQoJCWZwcmludGYoIGZwLCAiQ0xVU1RBTCBmb3JtYXQgYWxpZ25tZW50IGJ5IE1BRkZUICh2JXMpXG5cbiIsIFZFUlNJT04gKTsKCWVsc2UKCQlmcHJpbnRmKCBmcCwgIkNMVVNUQUwgZm9ybWF0IGFsaWdubWVudCBieSBNQUZGVCAlcyAodiVzKVxuXG4iLCBjb21tZW50LCBWRVJTSU9OICk7CgkKCXdoaWxlKCBwb3MgPCBtYXhsZW4gKQoJewoJCWZwcmludGYoIGZwLCAiXG4iICk7CgkJZm9yKCBqPTA7IGo8bnNlcTsgaisrICkKCQl7CgkJCWZwcmludGYoIGZwLCAiJS0xNS4xNXMgIiwgZXh0cmFjdGZpcnN0d29yZCggbmFtZVtvcmRlcltqXV0rMSApICk7CgkJCWZwcmludGYoIGZwLCAiJS42MHNcbiIsIHNlcVtvcmRlcltqXV0rcG9zICk7IC8vIMS5pLWkrLDjpKakyKTApOGhowoJCX0KCQlpZiggbWFyayApCgkJewoJCQlmcHJpbnRmKCBmcCwgIiUtMTUuMTVzICIsICIiICk7CgkJCWZwcmludGYoIGZwLCAiJS42MHNcbiIsIG1hcmsgKyBwb3MgKTsgLy8gxLmktaSssOOkpqTIpMCk4aGjCgkJfQoJCXBvcyArPSA2MDsKCX0KfQoKCnZvaWQgd3JpdGVEYXRhX3Jlb3JkZXJfcG9pbnRlciggRklMRSAqZnAsIGludCBsb2Nuam9iLCBjaGFyICoqbmFtZSwgaW50ICpubGVuLCBjaGFyICoqYXNlcSwgaW50ICpvcmRlciApCnsKCWludCBpLCBqLCBrOwoJaW50IG5hbGVuOwoKCWZvciggaT0wOyBpPGxvY25qb2I7IGkrKyApCgl7CgkJayA9IG9yZGVyW2ldOwojaWYgREVCVUcKCQlmcHJpbnRmKCBzdGRlcnIsICJpID0gJWQgaW4gd3JpdGVEYXRhXG4iLCBpICk7CiNlbmRpZgoJCW5hbGVuID0gc3RybGVuKCBhc2VxW2tdICk7CgkJZnByaW50ZiggZnAsICI+JXNcbiIsIG5hbWVba10rMSApOwoJCWZvciggaj0wOyBqPG5hbGVuOyBqPWorQyApCgkJewojaWYgMAoJCQlzdHJuY3B5KCBiLCBhc2VxW2tdK2osIEMgKTsgYltDXSA9IDA7CgkJCWZwcmludGYoIGZwLCAiJXNcbiIsYiApOwojZWxzZQoJCQlmcHJpbnRmKCBmcCwgIiUuKnNcbiIsIEMsIGFzZXFba10raiApOwojZW5kaWYKCQl9Cgl9Cn0Kdm9pZCB3cml0ZURhdGFfcmVvcmRlciggRklMRSAqZnAsIGludCBsb2Nuam9iLCBjaGFyIG5hbWVbXVtCXSwgaW50IG5sZW5bXSwgY2hhciAqKmFzZXEsIGludCAqb3JkZXIgKQp7CglpbnQgaSwgaiwgazsKCWludCBuYWxlbjsKCglmb3IoIGk9MDsgaTxsb2Nuam9iOyBpKysgKQoJewoJCWsgPSBvcmRlcltpXTsKI2lmIERFQlVHCgkJZnByaW50Ziggc3RkZXJyLCAiaSA9ICVkIGluIHdyaXRlRGF0YVxuIiwgaSApOwojZW5kaWYKCQluYWxlbiA9IHN0cmxlbiggYXNlcVtrXSApOwoJCWZwcmludGYoIGZwLCAiPiVzXG4iLCBuYW1lW2tdKzEgKTsKCQlmb3IoIGo9MDsgajxuYWxlbjsgaj1qK0MgKQoJCXsKI2lmIDAKCQkJc3RybmNweSggYiwgYXNlcVtrXStqLCBDICk7IGJbQ10gPSAwOwoJCQlmcHJpbnRmKCBmcCwgIiVzXG4iLGIgKTsKI2Vsc2UKCQkJZnByaW50ZiggZnAsICIlLipzXG4iLCBDLCBhc2VxW2tdK2ogKTsKI2VuZGlmCgkJfQoJfQp9CnN0YXRpYyB2b2lkIHNob3dhYW10eGV4YW1wbGUoKQp7CglmcHJpbnRmKCBzdGRlcnIsICJGb3JtYXQgZXJyb3IgaW4gYWEgbWF0cml4XG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIEV4YW1wbGU6XG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICIjIGNvbW1lbnRcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIiAgIEEgIFIgIE4gIEQgIEMgIFEgIEUgIEcgIEggIEkgIEwgIEsgIE0gIEYgIFAgIFMgIFQgIFcgIFkgIFZcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIkEgIDQgLTEgLTIgLTIgIDAgLTEgLTEgIDAgLTIgLTEgLTEgLTEgLTEgLTIgLTEgIDEgIDAgLTMgLTIgIDBcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIlIgLTEgIDUgIDAgLTIgLTMgIDEgIDAgLTIgIDAgLTMgLTIgIDIgLTEgLTMgLTIgLTEgLTEgLTMgLTIgLTNcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIi4uLlxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAiViAgMCAtMyAtMyAtMyAtMSAtMiAtMiAtMyAtMyAgMyAgMSAtMiAgMSAtMSAtMiAtMiAgMCAtMyAtMSAgNFxuIiApOwoJZnByaW50Ziggc3RkZXJyLCAiZnJlcXVlbmN5IDAuMDcgMC4wNSAwLjA0IDAuMDUgMC4wMiAuLiBcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIiMgRXhhbXBsZSBlbmRcbiIgKTsKCWZwcmludGYoIHN0ZGVyciwgIk9ubHkgdGhlIGxvd2VyIGhhbGYgaXMgbG9hZGVkXG4iICk7CglmcHJpbnRmKCBzdGRlcnIsICJUaGUgbGFzdCBsaW5lIChmcmVxdWVuY3kpIGlzIG9wdGlvbmFsLlxuIiApOwoJZXhpdCggMSApOwp9Cgpkb3VibGUgKmxvYWRhYW10eCggdm9pZCApCnsKCWludCBpLCBqLCBrLCBpaSwgamo7Cglkb3VibGUgKnZhbDsKCWRvdWJsZSAqKnJhdzsKCWludCAqbWFwOwoJY2hhciAqYWFvcmRlciA9ICJBUk5EQ1FFR0hJTEtNRlBTVFdZViI7CgljaGFyICppbm9yZGVyOwoJY2hhciAqbGluZTsKCWNoYXIgKnB0cjE7CgljaGFyICpwdHIyOwoJY2hhciAqbXR4Zm5hbWUgPSAiX2FhbXR4IjsKCUZJTEUgKm1mOwoKCXJhdyA9IEFsbG9jYXRlRG91YmxlTXR4KCAyMSwgMjAgKTsKCXZhbCA9IEFsbG9jYXRlRG91YmxlVmVjKCA0MjAgKTsKCW1hcCA9IEFsbG9jYXRlSW50VmVjKCAyMCApOwoKCWlmKCBkb3JwICE9ICdwJyApCgl7CgkJZnByaW50Ziggc3RkZXJyLCAiVXNlci1kZWZpbmVkIG1hdHJpeCBpcyBub3Qgc3VwcG9ydGVkIGZvciBETkFcbiIgKTsKCQlleGl0KCAxICk7Cgl9CgoJbWYgPSBmb3BlbiggbXR4Zm5hbWUsICJyIiApOwoJaWYoIG1mID09IE5VTEwgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIkNhbm5vdCBvcGVuIHRoZSBfYWFtdHggZmlsZVxuIiApOwoJCWV4aXQoIDEgKTsKCX0KCglpbm9yZGVyID0gY2FsbG9jKCAxMDAwLCBzaXplb2YoIGNoYXIgKSApOwoJbGluZSA9IGNhbGxvYyggMTAwMCwgc2l6ZW9mKCBjaGFyICkgKTsKCQoKCXdoaWxlKCAhZmVvZiggbWYgKSApCgl7CgkJZmdldHMoIGlub3JkZXIsIDk5OSwgbWYgKTsKCQlpZiggaW5vcmRlclswXSAhPSAnIycgKSBicmVhazsKCX0KCXB0cjEgPSBwdHIyID0gaW5vcmRlcjsKCXdoaWxlKCAqcHRyMiApCgl7CgkJaWYoIGlzYWxwaGEoICpwdHIyICkgKQoJCXsKCQkJKnB0cjEgPSB0b3VwcGVyKCAqcHRyMiApOwoJCQlwdHIxKys7CgkJfQoJCXB0cjIrKzsKCX0KCWlub3JkZXJbMjBdID0gMDsKCglmb3IoIGk9MDsgaTwyMDsgaSsrICkKCXsKCQlwdHIyID0gc3RyY2hyKCBpbm9yZGVyLCBhYW9yZGVyW2ldICk7CgkJaWYoIHB0cjIgPT0gTlVMTCApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICIlYzogbm90IGZvdW5kIGluIHRoZSBmaXJzdCAyMCBsZXR0ZXJzLlxuIiwgYWFvcmRlcltpXSApOwoJCQlzaG93YWFtdHhleGFtcGxlKCk7CgkJfQoJCWVsc2UKCQl7CgkJCW1hcFtpXSA9IHB0cjIgLSBpbm9yZGVyOwoJCX0KCX0KCglpID0gMDsKCXdoaWxlKCAhZmVvZiggbWYgKSApCgl7CgkJZmdldHMoIGxpbmUsIDk5OSwgbWYgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImxpbmUgPSAlc1xuIiwgbGluZSApOwoJCWlmKCBsaW5lWzBdID09ICcjJyApIGNvbnRpbnVlOwoJCXB0cjEgPSBsaW5lOwovLwkJZnByaW50Ziggc3RkZXJyLCAibGluZSA9ICVzXG4iLCBsaW5lICk7CgkJZm9yKCBqPTA7IGo8PWk7IGorKyApCgkJewoJCQl3aGlsZSggIWlzZGlnaXQoICpwdHIxICkgJiYgKnB0cjEgIT0gJy0nICYmICpwdHIxICE9ICcuJyApCgkJCQlwdHIxKys7CgoJCQlyYXdbaV1bal0gPSBhdG9mKCBwdHIxICk7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAicmF3W11bXT0lZiwgJWMtJWMgJWQtJWRcbiIsIHJhd1tpXVtqXSwgaW5vcmRlcltpXSwgaW5vcmRlcltqXSwgaSwgaiApOwoJCQlwdHIxID0gc3RyY2hyKCBwdHIxLCAnICcgKTsKCQkJaWYoIHB0cjEgPT0gTlVMTCAmJiBqPGkpIHNob3dhYW10eGV4YW1wbGUoKTsKCQl9CgkJaSsrOwoJCWlmKCBpID4gMTkgKSBicmVhazsKCX0KCglmb3IoIGk9MDsgaTwyMDsgaSsrICkgcmF3WzIwXVtpXSA9IC0xLjA7Cgl3aGlsZSggIWZlb2YoIG1mICkgKQoJewoJCWZnZXRzKCBsaW5lLCA5OTksIG1mICk7CgkJaWYoIGxpbmVbMF0gPT0gJ2YnICkKCQl7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAibGluZSA9ICVzXG4iLCBsaW5lICk7CgkJCXB0cjEgPSBsaW5lOwoJCQlmb3IoIGo9MDsgajwyMDsgaisrICkKCQkJewoJCQkJd2hpbGUoICFpc2RpZ2l0KCAqcHRyMSApICYmICpwdHIxICE9ICctJyAmJiAqcHRyMSAhPSAnLicgKQoJCQkJCXB0cjErKzsKCQoJCQkJcmF3WzIwXVtqXSA9IGF0b2YoIHB0cjEgKTsKLy8JCQkJZnByaW50Ziggc3RkZXJyLCAicmF3WzIwXVtdPSVmLCAlYyAlZFxuIiwgcmF3WzIwXVtqXSwgaW5vcmRlcltpXSwgaiApOwoJCQkJcHRyMSA9IHN0cmNociggcHRyMSwgJyAnICk7CgkJCQlpZiggcHRyMSA9PSBOVUxMICYmIGo8MTkpIHNob3dhYW10eGV4YW1wbGUoKTsKCQkJfQoJCQlicmVhazsKCQl9Cgl9CgoJayA9IDA7Cglmb3IoIGk9MDsgaTwyMDsgaSsrICkKCXsKCQlmb3IoIGo9MDsgajw9aTsgaisrICkKCQl7CgkJCWlmKCBpICE9IGogKQoJCQl7CgkJCQlpaSA9IE1BWCggbWFwW2ldLCBtYXBbal0gKTsKCQkJCWpqID0gTUlOKCBtYXBbaV0sIG1hcFtqXSApOwoJCQl9CgkJCWVsc2UgaWkgPSBqaiA9IG1hcFtpXTsKCQkJdmFsW2srK10gPSByYXdbaWldW2pqXTsKLy8JCQlmcHJpbnRmKCBzdGRlcnIsICIlYy0lYywgJWZcbiIsIGFhb3JkZXJbaV0sIGFhb3JkZXJbal0sIHZhbFtrLTFdICk7CgkJfQoJfQoJZm9yKCBpPTA7IGk8MjA7IGkrKyApIHZhbFs0MDAraV0gPSByYXdbMjBdW21hcFtpXV07CgoJZnByaW50Ziggc3RkZXJyLCAiaW5vcmRlciA9ICVzXG4iLCBpbm9yZGVyICk7CglmY2xvc2UoIG1mICk7CglmcmVlKCBpbm9yZGVyICk7CglmcmVlKCBsaW5lICk7CglGcmVlRG91YmxlTXR4KCByYXcgKTsKCWZyZWUoIG1hcCApOwoJcmV0dXJuKCB2YWwgKTsKfQoKdm9pZCBtaXlhdGFvdXRfcmVvcmRlcl9wb2ludGVyKCBGSUxFICpmcCwgaW50IGxvY25qb2IsIGludCBubGVubWF4LCBjaGFyICoqbmFtZSwgaW50ICpubGVuLCBjaGFyICoqYXNlcSwgaW50ICpvcmRlciApCnsKCWludCBpLCBqLCBrOwoJaW50IG5hbGVuOwoKCWZwcmludGYoIGZwLCAiJTVkXG4iLCAxICk7CglmcHJpbnRmKCBmcCwgIiU1ZFxuIiwgMSApOwoJZnByaW50ZiggZnAsICIlNWQlNWRcbiIsIDEsIG5sZW5tYXggKTsKCWZwcmludGYoIGZwLCAiJTVkXG4iLCAwICk7CglmcHJpbnRmKCBmcCwgIiU1ZFxuIiwgbG9jbmpvYiApOwoJZm9yKCBpPTA7IGk8bG9jbmpvYjsgaSsrICkKCXsKCQlrID0gb3JkZXJbaV07CgkJbmFsZW4gPSBzdHJsZW4oIGFzZXFba10gKTsKCQlmcHJpbnRmKCBmcCwgIj0lc1xuJWRcbiIsIG5hbWVba10rMSwgbmFsZW4gKTsKCQlmb3IoIGo9MDsgajxuYWxlbjsgaj1qK0MgKQoJCXsKCQkJZnByaW50ZiggZnAsICIlLipzXG4iLCBDLCBhc2VxW2tdK2ogKTsKCQl9Cgl9Cn0KCnZvaWQgcmVhZG1jY2Fza2lsbCggRklMRSAqZnAsIFJOQXBhaXIgKipwYWlycHJvYiwgaW50IGxlbmd0aCApCnsKCWNoYXIgZ2V0dFsxMDAwXTsKCWludCAqcGFpcm51bTsKCWludCBpOwoJaW50IGxlZnQsIHJpZ2h0OwoJZmxvYXQgcHJvYjsKCWludCBjOwoKCXBhaXJudW0gPSAoaW50ICopY2FsbG9jKCBsZW5ndGgsIHNpemVvZiggaW50ICkgKTsKCWZvciggaT0wOyBpPGxlbmd0aDsgaSsrICkgcGFpcm51bVtpXSA9IDA7CgoJYyA9IGdldGMoIGZwICk7Cgl7CgkJaWYoIGMgIT0gJz4nICkKCQl7CgkJCWZwcmludGYoIHN0ZGVyciwgImZvcm1hdCBlcnJvciBpbiBoYXQ0XG4iICk7CgkJCWV4aXQoIDEgKTsKCQl9Cgl9CglmZ2V0cyggZ2V0dCwgOTk5LCBmcCApOwoJd2hpbGUoIDEgKQoJewoJCWlmKCBmZW9mKCBmcCApICkgYnJlYWs7CgkJYyA9IGdldGMoIGZwICk7CgkJdW5nZXRjKCBjLCBmcCApOwoJCWlmKCBjID09ICc+JyApCgkJewoJCQlicmVhazsKCQl9CgkJZmdldHMoIGdldHQsIDk5OSwgZnAgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgImdldHQgPSAlc1xuIiwgZ2V0dCApOwoJCXNzY2FuZiggZ2V0dCwgIiVkICVkICVmIiwgJmxlZnQsICZyaWdodCwgJnByb2IgKTsKCgkJaWYoIGxlZnQgPj0gbGVuZ3RoIHx8IHJpZ2h0ID49IGxlbmd0aCApCgkJewoJCQlmcHJpbnRmKCBzdGRlcnIsICJmb3JtYXQgZXJyb3IgaW4gaGF0NFxuIiApOwoJCQlleGl0KCAxICk7CgkJfQoKCQlpZiggcHJvYiA8IDAuMDEgKSBjb250aW51ZTsgLy8gMDgwNjA3LCBtYWZmdCBuaSBkYWtlIGVpa3lvdQoKCQlpZiggbGVmdCAhPSByaWdodCAmJiBwcm9iID4gMC4wICkKCQl7CgkJCXBhaXJwcm9iW2xlZnRdID0gKFJOQXBhaXIgKilyZWFsbG9jKCBwYWlycHJvYltsZWZ0XSwgKHBhaXJudW1bbGVmdF0rMikgKiBzaXplb2YoIFJOQXBhaXIgKSApOwoJCQlwYWlycHJvYltsZWZ0XVtwYWlybnVtW2xlZnRdXS5iZXN0c2NvcmUgPSBwcm9iOwoJCQlwYWlycHJvYltsZWZ0XVtwYWlybnVtW2xlZnRdXS5iZXN0cG9zID0gcmlnaHQ7CgkJCXBhaXJudW1bbGVmdF0rKzsKCQkJcGFpcnByb2JbbGVmdF1bcGFpcm51bVtsZWZ0XV0uYmVzdHNjb3JlID0gLTEuMDsKCQkJcGFpcnByb2JbbGVmdF1bcGFpcm51bVtsZWZ0XV0uYmVzdHBvcyA9IC0xOwovLwkJCWZwcmludGYoIHN0ZGVyciwgIiVkLSVkLCAlZlxuIiwgbGVmdCwgcmlnaHQsIHByb2IgKTsKCgkJCXBhaXJwcm9iW3JpZ2h0XSA9IChSTkFwYWlyICopcmVhbGxvYyggcGFpcnByb2JbcmlnaHRdLCAocGFpcm51bVtyaWdodF0rMikgKiBzaXplb2YoIFJOQXBhaXIgKSApOwoJCQlwYWlycHJvYltyaWdodF1bcGFpcm51bVtyaWdodF1dLmJlc3RzY29yZSA9IHByb2I7CgkJCXBhaXJwcm9iW3JpZ2h0XVtwYWlybnVtW3JpZ2h0XV0uYmVzdHBvcyA9IGxlZnQ7CgkJCXBhaXJudW1bcmlnaHRdKys7CgkJCXBhaXJwcm9iW3JpZ2h0XVtwYWlybnVtW3JpZ2h0XV0uYmVzdHNjb3JlID0gLTEuMDsKCQkJcGFpcnByb2JbcmlnaHRdW3BhaXJudW1bcmlnaHRdXS5iZXN0cG9zID0gLTE7Ci8vCQkJZnByaW50Ziggc3RkZXJyLCAiJWQtJWQsICVmXG4iLCByaWdodCwgbGVmdCwgcHJvYiApOwoJCX0KCX0KCWZyZWUoIHBhaXJudW0gKTsKfQoKdm9pZCByZWFkcGFpcmZvbGRhbGlnbiggRklMRSAqZnAsIGNoYXIgKnMxLCBjaGFyICpzMiwgY2hhciAqYWxuMSwgY2hhciAqYWxuMiwgaW50IHExLCBpbnQgcTIsIGludCAqb2YxLCBpbnQgKm9mMiwgaW50IHN1bWxlbiApCnsKCWNoYXIgZ2V0dFsxMDAwXTsKCWludCAqbWFwdG9zZXExOwoJaW50ICptYXB0b3NlcTI7CgljaGFyIGR1bWM7CglpbnQgZHVtaTsKCWNoYXIgc2luc2VxWzEwMF0sIHNpbmFsblsxMDBdOwoJaW50IHBvc2luc2VxLCBwb3NpbmFsbjsKCWludCBhbG5sZW47CglpbnQgaTsKCWludCBwb3MxLCBwb3MyOwoJY2hhciAqcGExLCAqcGEyOwoJY2hhciBxc3RyWzEwMDBdOwoKCSpvZjEgPSAtMTsKCSpvZjIgPSAtMTsKCgltYXB0b3NlcTEgPSBBbGxvY2F0ZUludFZlYyggc3VtbGVuKzEgKTsKCW1hcHRvc2VxMiA9IEFsbG9jYXRlSW50VmVjKCBzdW1sZW4rMSApOwoKCXBvc2luYWxuID0gMDsgLy8gZm9sZGFsaWduIGdhIGFsaW5nbWVudCB3byBrYWVzYW5haXRvayBubyB0YW1lLgoKCXdoaWxlKCAhZmVvZiggZnAgKSApCgl7CgkJZmdldHMoIGdldHQsIDk5OSwgZnAgKTsKCQlpZiggIXN0cm5jbXAoIGdldHQsICI7IEFMSUdOSU5HIiwgMTAgKSApIGJyZWFrOwoJfQoJc3ByaW50ZiggcXN0ciwgIjsgQUxJR05JTkcgICAgICAgICAgICAlZCBhZ2FpbnN0ICVkXG4iLCBxMSsxLCBxMisxICk7CglpZiggc3RyY21wKCBnZXR0LCBxc3RyICkgKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIkVycm9yIGluIEZPTERBTElHTlxuIiApOwoJCWZwcmludGYoIHN0ZGVyciwgInFzdHIgPSAlcywgYnV0IGdldHQgPSAlc1xuIiwgcXN0ciwgZ2V0dCApOwoJCWV4aXQoIDEgKTsKCX0KCgl3aGlsZSggIWZlb2YoIGZwICkgKQoJewoJCWZnZXRzKCBnZXR0LCA5OTksIGZwICk7CgkJaWYoICFzdHJuY21wKCBnZXR0LCAiOyAtLS0tLS0tLSIsIDEwICkgKSBicmVhazsKCX0KCgoJd2hpbGUoICFmZW9mKCBmcCApICkKCXsKCQlmZ2V0cyggZ2V0dCwgOTk5LCBmcCApOwoJCWlmKCAhc3RybmNtcCggZ2V0dCwgIjsgKioqKioqKioiLCAxMCApICkgYnJlYWs7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJnZXR0ID0gJXNcbiIsIGdldHQgKTsKCQlzc2NhbmYoIGdldHQsICIlYyAlYyAlcyAlcyAlZCAlZCIsICZkdW1jLCAmZHVtYywgc2luc2VxLCBzaW5hbG4sICZkdW1pLCAmZHVtaSApOwoJCXBvc2luYWxuID0gYXRvaSggc2luYWxuICk7CgkJcG9zaW5zZXEgPSBhdG9pKCBzaW5zZXEgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgInBvc2luc2VxID0gJWRcbiIsIHBvc2luc2VxICk7Ci8vCQlmcHJpbnRmKCBzdGRlcnIsICJwb3NpbmFsbiA9ICVkXG4iLCBwb3NpbmFsbiApOwoJCW1hcHRvc2VxMVtwb3NpbmFsbi0xXSA9IHBvc2luc2VxLTE7Cgl9CglhbG5sZW4gPSBwb3NpbmFsbjsKCgl3aGlsZSggIWZlb2YoIGZwICkgKQoJewoJCWZnZXRzKCBnZXR0LCA5OTksIGZwICk7CgkJaWYoICFzdHJuY21wKCBnZXR0LCAiOyAtLS0tLS0tLSIsIDEwICkgKSBicmVhazsKCX0KCgl3aGlsZSggIWZlb2YoIGZwICkgKQoJewoJCWZnZXRzKCBnZXR0LCA5OTksIGZwICk7CgkJaWYoICFzdHJuY21wKCBnZXR0LCAiOyAqKioqKioqKiIsIDEwICkgKSBicmVhazsKLy8JCWZwcmludGYoIHN0ZGVyciwgImdldHQgPSAlc1xuIiwgZ2V0dCApOwoJCXNzY2FuZiggZ2V0dCwgIiVjICVjICVzICVzICVkICVkIiwgJmR1bWMsICZkdW1jLCBzaW5zZXEsIHNpbmFsbiwgJmR1bWksICZkdW1pICk7CgkJcG9zaW5hbG4gPSBhdG9mKCBzaW5hbG4gKTsKCQlwb3NpbnNlcSA9IGF0b2YoIHNpbnNlcSApOwovLwkJZnByaW50Ziggc3RkZXJyLCAicG9zaW5zZXEgPSAlZFxuIiwgcG9zaW5zZXEgKTsKLy8JCWZwcmludGYoIHN0ZGVyciwgInBvc2luYWxuID0gJWRcbiIsIHBvc2luYWxuICk7CgkJbWFwdG9zZXEyW3Bvc2luYWxuLTFdID0gcG9zaW5zZXEtMTsKCX0KCWlmKCBhbG5sZW4gIT0gcG9zaW5hbG4gKQoJewoJCWZwcmludGYoIHN0ZGVyciwgIkVycm9yIGluIGZvbGRhbGlnbj9cbiIgKTsKCQlleGl0KCAxICk7Cgl9CgoJcGExID0gYWxuMTsKCXBhMiA9IGFsbjI7Cglmb3IoIGk9MDsgaTxhbG5sZW47IGkrKyApCgl7CgkJcG9zMSA9IG1hcHRvc2VxMVtpXTsKCQlwb3MyID0gbWFwdG9zZXEyW2ldOwoKCQlpZiggcG9zMSA+IC0xICkKCQkJKnBhMSsrID0gczFbcG9zMV07CgkJZWxzZQoJCQkqcGExKysgPSAnLSc7CgoJCWlmKCBwb3MyID4gLTEgKQoJCQkqcGEyKysgPSBzMltwb3MyXTsKCQllbHNlCgkJCSpwYTIrKyA9ICctJzsKCX0KCSpwYTEgPSAwOwoJKnBhMiA9IDA7CgoJKm9mMSA9IDA7Cglmb3IoIGk9MDsgaTxhbG5sZW47IGkrKyApCgl7CgkJKm9mMSA9IG1hcHRvc2VxMVtpXTsKCQlpZiggKm9mMSA+IC0xICkgYnJlYWs7Cgl9Cgkqb2YyID0gMDsKCWZvciggaT0wOyBpPGFsbmxlbjsgaSsrICkKCXsKCQkqb2YyID0gbWFwdG9zZXEyW2ldOwoJCWlmKCAqb2YyID4gLTEgKSBicmVhazsKCX0KCi8vCWZwcmludGYoIHN0ZGVyciwgIipvZjE9JWQsIGFsbjEgPSA6JXM6XG4iLCAqb2YxLCBhbG4xICk7Ci8vCWZwcmludGYoIHN0ZGVyciwgIipvZjI9JWQsIGFsbjIgPSA6JXM6XG4iLCAqb2YyLCBhbG4yICk7CgoJZnJlZSggbWFwdG9zZXExICk7CglmcmVlKCBtYXB0b3NlcTIgKTsKfQo=