LyoJJE9wZW5CU0Q6IGNvbmYuYyx2IDEuNTUgMjAwMy8wNi8wMyAxNDoyODoxNiBobyBFeHAgJAkqLwovKgkkRU9NOiBjb25mLmMsdiAxLjQ4IDIwMDAvMTIvMDQgMDI6MDQ6MjkgYW5nZWxvcyBFeHAgJAkqLwoKLyoKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxIE5pa2xhcyBIYWxscXZpc3QuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDEsIDIwMDIgSOVrYW4gT2xzc29uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKi8KCi8qCiAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB1bmRlciBmdW5kaW5nIGJ5IEVyaWNzc29uIFJhZGlvIFN5c3RlbXMuCiAqLwoKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL21tYW4uaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxlcnIuaD4KI2luY2x1ZGUgPHN5c2xvZy5oPgoKI2luY2x1ZGUgImNvbmZmaWxlLmgiCiNpbmNsdWRlICJ4bG9nLmgiCgpzdGF0aWMgdm9pZCBjb25mX2xvYWRfZGVmYXVsdHMgKGludCk7CnN0YXRpYyBpbnQgY29uZl9zZXQoaW50ICwgY2hhciAqLCBjaGFyICosIGNoYXIgKiwgCgljaGFyICosIGludCAsIGludCApOwoKc3RydWN0IGNvbmZfdHJhbnMgewoJVEFJTFFfRU5UUlkgKGNvbmZfdHJhbnMpIGxpbms7CglpbnQgdHJhbnM7CgllbnVtIGNvbmZfb3AgeyBDT05GX1NFVCwgQ09ORl9SRU1PVkUsIENPTkZfUkVNT1ZFX1NFQ1RJT04gfSBvcDsKCWNoYXIgKnNlY3Rpb247CgljaGFyICphcmc7CgljaGFyICp0YWc7CgljaGFyICp2YWx1ZTsKCWludCBvdmVycmlkZTsKCWludCBpc19kZWZhdWx0Owp9OwoKVEFJTFFfSEVBRCAoY29uZl90cmFuc19oZWFkLCBjb25mX3RyYW5zKSBjb25mX3RyYW5zX3F1ZXVlOwoKLyoKICogUmFkaXgtNjQgRW5jb2RpbmcuCiAqLwpzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYmluMmFzY1tdCiAgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7CgpzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYXNjMmJpbltdID0KewogIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgMjU1LCAyNTUsICA2MiwgMjU1LCAyNTUsIDI1NSwgIDYzLAogICA1MiwgIDUzLCAgNTQsICA1NSwgIDU2LCAgNTcsICA1OCwgIDU5LAogICA2MCwgIDYxLCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgICAwLCAgIDEsICAgMiwgICAzLCAgIDQsICAgNSwgICA2LAogICAgNywgICA4LCAgIDksICAxMCwgIDExLCAgMTIsICAxMywgIDE0LAogICAxNSwgIDE2LCAgMTcsICAxOCwgIDE5LCAgMjAsICAyMSwgIDIyLAogICAyMywgIDI0LCAgMjUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LAogIDI1NSwgIDI2LCAgMjcsICAyOCwgIDI5LCAgMzAsICAzMSwgIDMyLAogICAzMywgIDM0LCAgMzUsICAzNiwgIDM3LCAgMzgsICAzOSwgIDQwLAogICA0MSwgIDQyLCAgNDMsICA0NCwgIDQ1LCAgNDYsICA0NywgIDQ4LAogICA0OSwgIDUwLCAgNTEsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1Cn07CgpzdHJ1Y3QgY29uZl9iaW5kaW5nIHsKICBMSVNUX0VOVFJZIChjb25mX2JpbmRpbmcpIGxpbms7CiAgY2hhciAqc2VjdGlvbjsKICBjaGFyICphcmc7CiAgY2hhciAqdGFnOwogIGNoYXIgKnZhbHVlOwogIGludCBpc19kZWZhdWx0Owp9OwoKY2hhciAqY29uZl9wYXRoOwpMSVNUX0hFQUQgKGNvbmZfYmluZGluZ3MsIGNvbmZfYmluZGluZykgY29uZl9iaW5kaW5nc1syNTZdOwoKc3RhdGljIGNoYXIgKmNvbmZfYWRkcjsKCnN0YXRpYyBfX2lubGluZV9fIHVfaW50OF90CmNvbmZfaGFzaChjaGFyICpzKQp7Cgl1X2ludDhfdCBoYXNoID0gMDsKCgl3aGlsZSAoKnMpIHsKCQloYXNoID0gKChoYXNoIDw8IDEpIHwgKGhhc2ggPj4gNykpIF4gdG9sb3dlciAoKnMpOwoJCXMrKzsKCX0KCXJldHVybiBoYXNoOwp9CgovKgogKiBJbnNlcnQgYSB0YWctdmFsdWUgY29tYmluYXRpb24gZnJvbSBMSU5FICh0aGUgZXF1YWwgc2lnbiBpcyBhdCBQT1MpCiAqLwpzdGF0aWMgaW50CmNvbmZfcmVtb3ZlX25vdyhjaGFyICpzZWN0aW9uLCBjaGFyICp0YWcpCnsKCXN0cnVjdCBjb25mX2JpbmRpbmcgKmNiLCAqbmV4dDsKCgljYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOwoJZm9yICg7IGNiOyBjYiA9IG5leHQpIHsKCQluZXh0ID0gTElTVF9ORVhUKGNiLCBsaW5rKTsKCQlpZiAoc3RyY2FzZWNtcChjYi0+c2VjdGlvbiwgc2VjdGlvbikgPT0gMAoJCQkJJiYgc3RyY2FzZWNtcChjYi0+dGFnLCB0YWcpID09IDApIHsKCQkJTElTVF9SRU1PVkUoY2IsIGxpbmspOwoJCQl4bG9nKExPR19JTkZPLCJbJXNdOiVzLT4lcyByZW1vdmVkIiwgc2VjdGlvbiwgdGFnLCBjYi0+dmFsdWUpOwoJCQlmcmVlKGNiLT5zZWN0aW9uKTsKCQkJZnJlZShjYi0+YXJnKTsKCQkJZnJlZShjYi0+dGFnKTsKCQkJZnJlZShjYi0+dmFsdWUpOwoJCQlmcmVlKGNiKTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQKY29uZl9yZW1vdmVfc2VjdGlvbl9ub3coY2hhciAqc2VjdGlvbikKewogIHN0cnVjdCBjb25mX2JpbmRpbmcgKmNiLCAqbmV4dDsKICBpbnQgdW5zZWVuID0gMTsKCgljYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOwoJZm9yICg7IGNiOyBjYiA9IG5leHQpIHsKCQluZXh0ID0gTElTVF9ORVhUKGNiLCBsaW5rKTsKCQlpZiAoc3RyY2FzZWNtcChjYi0+c2VjdGlvbiwgc2VjdGlvbikgPT0gMCkgewoJCQl1bnNlZW4gPSAwOwoJCQlMSVNUX1JFTU9WRShjYiwgbGluayk7CgkJCXhsb2coTE9HX0lORk8sICJbJXNdOiVzLT4lcyByZW1vdmVkIiwgc2VjdGlvbiwgY2ItPnRhZywgY2ItPnZhbHVlKTsKCQkJZnJlZShjYi0+c2VjdGlvbik7CgkJCWZyZWUoY2ItPmFyZyk7CgkJCWZyZWUoY2ItPnRhZyk7CgkJCWZyZWUoY2ItPnZhbHVlKTsKCQkJZnJlZShjYik7CgkJCX0KCQl9CglyZXR1cm4gdW5zZWVuOwp9CgovKgogKiBJbnNlcnQgYSB0YWctdmFsdWUgY29tYmluYXRpb24gZnJvbSBMSU5FICh0aGUgZXF1YWwgc2lnbiBpcyBhdCBQT1MpCiAqIGludG8gU0VDVElPTiBvZiBvdXIgY29uZmlndXJhdGlvbiBkYXRhYmFzZS4KICovCnN0YXRpYyBpbnQKY29uZl9zZXRfbm93KGNoYXIgKnNlY3Rpb24sIGNoYXIgKmFyZywgY2hhciAqdGFnLCAKCWNoYXIgKnZhbHVlLCBpbnQgb3ZlcnJpZGUsIGludCBpc19kZWZhdWx0KQp7CglzdHJ1Y3QgY29uZl9iaW5kaW5nICpub2RlID0gMDsKCglpZiAob3ZlcnJpZGUpCgkJY29uZl9yZW1vdmVfbm93KHNlY3Rpb24sIHRhZyk7CgllbHNlIGlmIChjb25mX2dldF9zZWN0aW9uKHNlY3Rpb24sIGFyZywgdGFnKSkgewoJCWlmICghaXNfZGVmYXVsdCkgewoJCQl4bG9nKExPR19JTkZPLCAiY29uZl9zZXQ6IGR1cGxpY2F0ZSB0YWcgWyVzXTolcywgaWdub3JpbmcuLi5cbiIsIAoJCQkJc2VjdGlvbiwgdGFnKTsKCQl9CgkJcmV0dXJuIDE7Cgl9Cglub2RlID0gY2FsbG9jKDEsIHNpemVvZiAqbm9kZSk7CglpZiAoIW5vZGUpIHsKCQl4bG9nX3dhcm4oImNvbmZfc2V0OiBjYWxsb2MgKDEsICVsdSkgZmFpbGVkIiwgKHVuc2lnbmVkIGxvbmcpc2l6ZW9mICpub2RlKTsKCQlyZXR1cm4gMTsKCX0KCW5vZGUtPnNlY3Rpb24gPSBzdHJkdXAoc2VjdGlvbik7CglpZiAoYXJnKQoJCW5vZGUtPmFyZyA9IHN0cmR1cChhcmcpOwoJbm9kZS0+dGFnID0gc3RyZHVwKHRhZyk7Cglub2RlLT52YWx1ZSA9IHN0cmR1cCh2YWx1ZSk7Cglub2RlLT5pc19kZWZhdWx0ID0gaXNfZGVmYXVsdDsKCglMSVNUX0lOU0VSVF9IRUFEKCZjb25mX2JpbmRpbmdzW2NvbmZfaGFzaCAoc2VjdGlvbildLCBub2RlLCBsaW5rKTsKCXJldHVybiAwOwp9CgovKgogKiBQYXJzZSB0aGUgbGluZSBMSU5FIG9mIFNaIGJ5dGVzLiAgU2tpcCBDb21tZW50cywgcmVjb2duaXplIHNlY3Rpb24KICogaGVhZGVycyBhbmQgZmVlZCB0YWctdmFsdWUgcGFpcnMgaW50byBvdXIgY29uZmlndXJhdGlvbiBkYXRhYmFzZS4KICovCnN0YXRpYyB2b2lkCmNvbmZfcGFyc2VfbGluZShpbnQgdHJhbnMsIGNoYXIgKmxpbmUsIHNpemVfdCBzeikKewoJY2hhciAqdmFsLCAqcHRyOwoJc2l6ZV90IGk7CglpbnQgajsKCXN0YXRpYyBjaGFyICpzZWN0aW9uID0gMDsKCXN0YXRpYyBjaGFyICphcmcgPSAwOwoJc3RhdGljIGludCBsbiA9IDA7CgoJLyogTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgb3IgJzsnIGFyZSBjb21tZW50cy4gICovCglsbisrOwoJLyogSWdub3JlIGJsYW5rIGxpbmVzICovCglpZiAoKmxpbmUgPT0gJ1wwJykKCQlyZXR1cm47CgoJLyogU3RyaXAgb2ZmIGFueSBsZWFkaW5nIGJsYW5rcyAqLwoJd2hpbGUgKGlzYmxhbmsoKmxpbmUpKSAKCQlsaW5lKys7CgoJaWYgKCpsaW5lID09ICcjJyB8fCAqbGluZSA9PSAnOycpCgkJcmV0dXJuOwoKCS8qICdbc2VjdGlvbl0nIHBhcnNpbmcuLi4gICovCglpZiAoKmxpbmUgPT0gJ1snKSB7CgkJbGluZSsrOwoJCS8qIFN0cmlwIG9mZiBhbnkgYmxhbmtzIGFmdGVyICdbJyAqLwoJCXdoaWxlIChpc2JsYW5rKCpsaW5lKSkgCgkJCWxpbmUrKzsKCQlmb3IgKGkgPSAwOyBpIDwgc3o7IGkrKykgewoJCQlpZiAobGluZVtpXSA9PSAnXScpIHsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmIChzZWN0aW9uKQoJCQlmcmVlKHNlY3Rpb24pOwoJCWlmIChpID09IHN6KSB7CgkJCXhsb2dfd2FybigiY29uZmlnIGZpbGUgZXJyb3I6IGxpbmUgJWQ6ICIKIAkJCQkibm9uLW1hdGNoZWQgJ10nLCBpZ25vcmluZyB1bnRpbCBuZXh0IHNlY3Rpb24iLCBsbik7CgkJCXNlY3Rpb24gPSAwOwoJCQlyZXR1cm47CgkJfQoJCS8qIFN0cmlwIG9mZiBhbnkgYmxhbmtzIGJlZm9yZSAnXScgKi8KCQl2YWwgPSBsaW5lOwoJCXdoaWxlICgqdmFsICYmICFpc2JsYW5rKCp2YWwpKSAKCQkJdmFsKyssIGorKzsKCQlpZiAoKnZhbCkKCQkJaSA9IGo7CgkJc2VjdGlvbiA9IG1hbGxvYyhpKTsKCQlpZiAoIXNlY3Rpb24pIHsKCQkJeGxvZ193YXJuKCJjb25mX3BhcnNlX2xpbmU6ICVkOiBtYWxsb2MgKCVsdSkgZmFpbGVkIiwgbG4sCgkJCQkJCSh1bnNpZ25lZCBsb25nKWkpOwoJCQlyZXR1cm47CgkJfQoJCXN0cm5jcHkoc2VjdGlvbiwgbGluZSwgaSk7CgoJCWlmIChhcmcpIAoJCQlmcmVlKGFyZyk7CgkJYXJnID0gMDsKCgkJcHRyID0gc3RyY2hyKHZhbCwgJyInKTsKCQlpZiAocHRyID09IE5VTEwpCgkJCXJldHVybjsKCQlsaW5lID0gKytwdHI7CgkJd2hpbGUgKCpwdHIgJiYgKnB0ciAhPSAnIicpCgkJCXB0cisrOwoJCWlmICgqcHRyID09ICdcMCcpIHsKCQkJeGxvZ193YXJuKCJjb25maWcgZmlsZSBlcnJvcjogbGluZSAlZDogIgogCQkJCSJub24tbWF0Y2hlZCAnXCInLCBpZ25vcmluZyB1bnRpbCBuZXh0IHNlY3Rpb24iLCBsbik7CgkJfSAgZWxzZSB7CgkJCSpwdHIgPSAnXDAnOwoJCQlhcmcgPSBzdHJkdXAobGluZSk7CgkJCWlmICghYXJnKSAKCQkJCXhsb2dfd2FybigiY29uZl9wYXJzZV9saW5lOiAlZDogbWFsbG9jIGFyZyBmYWlsZWQiLCBsbik7CgkJfQoJCXJldHVybjsKCX0KCgkvKiBEZWFsIHdpdGggYXNzaWdubWVudHMuICAqLwoJZm9yIChpID0gMDsgaSA8IHN6OyBpKyspIHsKCQlpZiAobGluZVtpXSA9PSAnPScpIHsKCQkJLyogSWYgbm8gc2VjdGlvbiwgd2UgYXJlIGlnbm9yaW5nIHRoZSBsaW5lcy4gICovCgkJCWlmICghc2VjdGlvbikgewoJCQl4bG9nX3dhcm4oImNvbmZpZyBmaWxlIGVycm9yOiBsaW5lICVkOiAiCgkJCQkiaWdub3JpbmcgbGluZSBkdWUgdG8gbm8gc2VjdGlvbiIsIGxuKTsKCQkJCXJldHVybjsKCQkJfQoJCQlsaW5lW3N0cmNzcG4gKGxpbmUsICIgXHQ9IildID0gJ1wwJzsKCQkJdmFsID0gbGluZSArIGkgKyAxICsgc3Ryc3BuIChsaW5lICsgaSArIDEsICIgXHQiKTsKCgkJCS8qIFNraXAgdHJhaWxpbmcgY29tbWVudHMsIGlmIGFueSAqLwoJCQlmb3IgKGogPSAwOyBqIDwgc3ogLSAodmFsIC0gbGluZSk7IGorKykgewoJCQkJaWYgKHZhbFtqXSA9PSAnIycgfHwgdmFsW2pdID09ICc7JykgewoJCQkJCXZhbFtqXSA9ICdcMCc7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCX0KCgkJCS8qIFNraXAgdHJhaWxpbmcgd2hpdGVzcGFjZSwgaWYgYW55ICovCgkJCWZvciAoai0tOyBqID4gMDsgai0tKSB7CgkJCQlpZiAoaXNzcGFjZSh2YWxbal0pKQoJCQkJCXZhbFtqXSA9ICdcMCc7CgkJCQllbHNlIAoJCQkJCWJyZWFrOwoJCQl9CgoJCQkvKiBYWFggUGVyaGFwcyBzaG91bGQgd2Ugbm90IGlnbm9yZSBlcnJvcnM/ICAqLwoJCQljb25mX3NldCh0cmFucywgc2VjdGlvbiwgYXJnLCBsaW5lLCB2YWwsIDAsIDApOwoJCQlyZXR1cm47CgkJfQoJfQoJLyogT3RoZXIgbm9uLWVtcHR5IGxpbmVzIGFyZSB3ZWlyZC4gICovCglpID0gc3Ryc3BuKGxpbmUsICIgXHQiKTsKCWlmIChsaW5lW2ldKQoJCXhsb2dfd2FybigiY29uZmlnIGZpbGUgZXJyb3I6IGxpbmUgJWQ6IiwgbG4pOwoKCXJldHVybjsKfQoKLyogUGFyc2UgdGhlIG1hcHBlZCBjb25maWd1cmF0aW9uIGZpbGUuICAqLwpzdGF0aWMgdm9pZApjb25mX3BhcnNlKGludCB0cmFucywgY2hhciAqYnVmLCBzaXplX3Qgc3opCnsKCWNoYXIgKmNwID0gYnVmOwoJY2hhciAqYnVmZW5kID0gYnVmICsgc3o7CgljaGFyICpsaW5lOwoKCWxpbmUgPSBjcDsKCXdoaWxlIChjcCA8IGJ1ZmVuZCkgewoJCWlmICgqY3AgPT0gJ1xuJykgewoJCQkvKiBDaGVjayBmb3IgZXNjYXBlZCBuZXdsaW5lcy4gICovCgkJCWlmIChjcCA+IGJ1ZiAmJiAqKGNwIC0gMSkgPT0gJ1xcJykKCQkJCSooY3AgLSAxKSA9ICpjcCA9ICcgJzsKCQkJZWxzZSB7CgkJCQkqY3AgPSAnXDAnOwoJCQkJY29uZl9wYXJzZV9saW5lKHRyYW5zLCBsaW5lLCBjcCAtIGxpbmUpOwoJCQkJbGluZSA9IGNwICsgMTsKCQkJfQoJCX0KCQljcCsrOwoJfQoJaWYgKGNwICE9IGxpbmUpCgkJeGxvZ193YXJuKCJjb25mX3BhcnNlOiBsYXN0IGxpbmUgbm9uLXRlcm1pbmF0ZWQsIGlnbm9yZWQuIik7Cn0KCnN0YXRpYyB2b2lkCmNvbmZfbG9hZF9kZWZhdWx0cyhpbnQgdHIpCnsKCS8qIE5vIGRlZmF1bHRzICovCglyZXR1cm47Cn0KCnZvaWQKY29uZl9pbml0ICh2b2lkKQp7Cgl1bnNpZ25lZCBpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mIGNvbmZfYmluZGluZ3MgLyBzaXplb2YgY29uZl9iaW5kaW5nc1swXTsgaSsrKQoJCUxJU1RfSU5JVCAoJmNvbmZfYmluZGluZ3NbaV0pOwoKCVRBSUxRX0lOSVQgKCZjb25mX3RyYW5zX3F1ZXVlKTsKCWNvbmZfcmVpbml0KCk7Cn0KCi8qIE9wZW4gdGhlIGNvbmZpZyBmaWxlIGFuZCBtYXAgaXQgaW50byBvdXIgYWRkcmVzcyBzcGFjZSwgdGhlbiBwYXJzZSBpdC4gICovCnZvaWQKY29uZl9yZWluaXQodm9pZCkKewoJc3RydWN0IGNvbmZfYmluZGluZyAqY2IgPSAwOwoJaW50IGZkLCB0cmFuczsKCXVuc2lnbmVkIGludCBpOwoJc2l6ZV90IHN6OwoJY2hhciAqbmV3X2NvbmZfYWRkciA9IDA7CglzdHJ1Y3Qgc3RhdCBzYjsKCglpZiAoKHN0YXQgKGNvbmZfcGF0aCwgJnNiKSA9PSAwKSB8fCAoZXJybm8gIT0gRU5PRU5UKSkgewoJCXN6ID0gc2Iuc3Rfc2l6ZTsKCQlmZCA9IG9wZW4gKGNvbmZfcGF0aCwgT19SRE9OTFksIDApOwoJCWlmIChmZCA9PSAtMSkgewoJCQl4bG9nX3dhcm4oImNvbmZfcmVpbml0OiBvcGVuIChcIiVzXCIsIE9fUkRPTkxZKSBmYWlsZWQiLCBjb25mX3BhdGgpOwoJCQlyZXR1cm47CgkJfQoKCQluZXdfY29uZl9hZGRyID0gbWFsbG9jKHN6KTsKCQlpZiAoIW5ld19jb25mX2FkZHIpIHsKCQkJeGxvZ193YXJuKCJjb25mX3JlaW5pdDogbWFsbG9jICglbHUpIGZhaWxlZCIsICh1bnNpZ25lZCBsb25nKXN6KTsKCQkJZ290byBmYWlsOwoJCX0KCgkJLyogWFhYIEkgYXNzdW1lIHNob3J0IHJlYWRzIHdvbid0IGhhcHBlbiBoZXJlLiAgKi8KCQlpZiAocmVhZCAoZmQsIG5ld19jb25mX2FkZHIsIHN6KSAhPSAoaW50KXN6KSB7CgkJCXhsb2dfd2FybigiY29uZl9yZWluaXQ6IHJlYWQgKCVkLCAlcCwgJWx1KSBmYWlsZWQiLAogICAJCQkJZmQsIG5ld19jb25mX2FkZHIsICh1bnNpZ25lZCBsb25nKXN6KTsKCQkJZ290byBmYWlsOwoJCX0KCQljbG9zZShmZCk7CgoJCXRyYW5zID0gY29uZl9iZWdpbigpOwoJCS8qIFhYWCBTaG91bGQgd2Ugbm90IGNhcmUgYWJvdXQgZXJyb3JzIGFuZCByb2xsYmFjaz8gICovCgkJY29uZl9wYXJzZSh0cmFucywgbmV3X2NvbmZfYWRkciwgc3opOwoJfQoJZWxzZQoJCXRyYW5zID0gY29uZl9iZWdpbigpOwoKCS8qIExvYWQgZGVmYXVsdCBjb25maWd1cmF0aW9uIHZhbHVlcy4gICovCgljb25mX2xvYWRfZGVmYXVsdHModHJhbnMpOwoKCS8qIEZyZWUgcG90ZW50aWFsIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uICAqLwoJaWYgKGNvbmZfYWRkcikgewoJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgY29uZl9iaW5kaW5ncyAvIHNpemVvZiBjb25mX2JpbmRpbmdzWzBdOyBpKyspIHsKCQkJY2IgPSBMSVNUX0ZJUlNUICgmY29uZl9iaW5kaW5nc1tpXSk7CgkJCWZvciAoOyBjYjsgY2IgPSBMSVNUX0ZJUlNUICgmY29uZl9iaW5kaW5nc1tpXSkpCgkJCQljb25mX3JlbW92ZV9ub3coY2ItPnNlY3Rpb24sIGNiLT50YWcpOwoJCX0KCQlmcmVlIChjb25mX2FkZHIpOwoJfQoKCWNvbmZfZW5kKHRyYW5zLCAxKTsKCWNvbmZfYWRkciA9IG5ld19jb25mX2FkZHI7CglyZXR1cm47CgpmYWlsOgoJaWYgKG5ld19jb25mX2FkZHIpCgkJZnJlZShuZXdfY29uZl9hZGRyKTsKCWNsb3NlIChmZCk7Cn0KCi8qCiAqIFJldHVybiB0aGUgbnVtZXJpYyB2YWx1ZSBkZW5vdGVkIGJ5IFRBRyBpbiBzZWN0aW9uIFNFQ1RJT04gb3IgREVGCiAqIGlmIHRoYXQgdGFnIGRvZXMgbm90IGV4aXN0LgogKi8KaW50CmNvbmZfZ2V0X251bShjaGFyICpzZWN0aW9uLCBjaGFyICp0YWcsIGludCBkZWYpCnsKCWNoYXIgKnZhbHVlID0gY29uZl9nZXRfc3RyKHNlY3Rpb24sIHRhZyk7CgoJaWYgKHZhbHVlKQoJCXJldHVybiBhdG9pKHZhbHVlKTsKCglyZXR1cm4gZGVmOwp9CgovKiBWYWxpZGF0ZSBYIGFjY29yZGluZyB0byB0aGUgcmFuZ2UgZGVub3RlZCBieSBUQUcgaW4gc2VjdGlvbiBTRUNUSU9OLiAgKi8KaW50CmNvbmZfbWF0Y2hfbnVtKGNoYXIgKnNlY3Rpb24sIGNoYXIgKnRhZywgaW50IHgpCnsKCWNoYXIgKnZhbHVlID0gY29uZl9nZXRfc3RyIChzZWN0aW9uLCB0YWcpOwoJaW50IHZhbCwgbWluLCBtYXgsIG47CgoJaWYgKCF2YWx1ZSkKCQlyZXR1cm4gMDsKCW4gPSBzc2NhbmYgKHZhbHVlLCAiJWQsJWQ6JWQiLCAmdmFsLCAmbWluLCAmbWF4KTsKCXN3aXRjaCAobikgewoJY2FzZSAxOgoJCXhsb2coTE9HX0lORk8sICJjb25mX21hdGNoX251bTogJXM6JXMgJWQ9PSVkPyIsIHNlY3Rpb24sIHRhZywgdmFsLCB4KTsKCQlyZXR1cm4geCA9PSB2YWw7CgljYXNlIDM6CgkJeGxvZyhMT0dfSU5GTywgImNvbmZfbWF0Y2hfbnVtOiAlczolcyAlZDw9JWQ8PSVkPyIsIHNlY3Rpb24sIAoJCQl0YWcsIG1pbiwgeCwgbWF4KTsKCQlyZXR1cm4gbWluIDw9IHggJiYgbWF4ID49IHg7CglkZWZhdWx0OgoJCXhsb2coTE9HX0lORk8sICJjb25mX21hdGNoX251bTogc2VjdGlvbiAlcyB0YWcgJXM6IGludmFsaWQgbnVtYmVyIHNwZWMgJXMiLAoJCQlzZWN0aW9uLCB0YWcsIHZhbHVlKTsKCX0KCXJldHVybiAwOwp9CgovKiBSZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBkZW5vdGVkIGJ5IFRBRyBpbiBzZWN0aW9uIFNFQ1RJT04uICAqLwpjaGFyICoKY29uZl9nZXRfc3RyKGNoYXIgKnNlY3Rpb24sIGNoYXIgKnRhZykKewoJc3RydWN0IGNvbmZfYmluZGluZyAqY2I7CgoJY2IgPSBMSVNUX0ZJUlNUICgmY29uZl9iaW5kaW5nc1tjb25mX2hhc2ggKHNlY3Rpb24pXSk7Cglmb3IgKDsgY2I7IGNiID0gTElTVF9ORVhUIChjYiwgbGluaykpIHsKCQlpZiAoc3RyY2FzZWNtcCAoc2VjdGlvbiwgY2ItPnNlY3Rpb24pID09IDAKCQkJCSYmIHN0cmNhc2VjbXAgKHRhZywgY2ItPnRhZykgPT0gMCkKCQkJcmV0dXJuIGNiLT52YWx1ZTsKCX0KCXJldHVybiAwOwp9Ci8qCiAqIEZpbmQgYSBzZWN0aW9uIHRoYXQgbWF5IG9yIG1heSBub3QgaGF2ZSBhbiBhcmd1bWVudAogKi8KY2hhciAqCmNvbmZfZ2V0X3NlY3Rpb24oY2hhciAqc2VjdGlvbiwgY2hhciAqYXJnLCBjaGFyICp0YWcpCnsKCXN0cnVjdCBjb25mX2JpbmRpbmcgKmNiOwoKCWNiID0gTElTVF9GSVJTVCAoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOwoJZm9yICg7IGNiOyBjYiA9IExJU1RfTkVYVCAoY2IsIGxpbmspKSB7CgkJaWYgKHN0cmNhc2VjbXAoc2VjdGlvbiwgY2ItPnNlY3Rpb24pICE9IDApCgkJCWNvbnRpbnVlOwoJCWlmIChhcmcgJiYgc3RyY2FzZWNtcChhcmcsIGNiLT5hcmcpICE9IDApCgkJCWNvbnRpbnVlOwoJCWlmIChzdHJjYXNlY21wKHRhZywgY2ItPnRhZykgIT0gMCkKCQkJY29udGludWU7CgkJcmV0dXJuIGNiLT52YWx1ZTsKCX0KCXJldHVybiAwOwp9CgovKgogKiBCdWlsZCBhIGxpc3Qgb2Ygc3RyaW5nIHZhbHVlcyBvdXQgb2YgdGhlIGNvbW1hIHNlcGFyYXRlZCB2YWx1ZSBkZW5vdGVkIGJ5CiAqIFRBRyBpbiBTRUNUSU9OLgogKi8Kc3RydWN0IGNvbmZfbGlzdCAqCmNvbmZfZ2V0X2xpc3QoY2hhciAqc2VjdGlvbiwgY2hhciAqdGFnKQp7CgljaGFyICpsaXN0c3RyID0gMCwgKnAsICpmaWVsZCwgKnQ7CglzdHJ1Y3QgY29uZl9saXN0ICpsaXN0ID0gMDsKCXN0cnVjdCBjb25mX2xpc3Rfbm9kZSAqbm9kZTsKCglsaXN0ID0gbWFsbG9jIChzaXplb2YgKmxpc3QpOwoJaWYgKCFsaXN0KQoJCWdvdG8gY2xlYW51cDsKCVRBSUxRX0lOSVQgKCZsaXN0LT5maWVsZHMpOwoJbGlzdC0+Y250ID0gMDsKCWxpc3RzdHIgPSBjb25mX2dldF9zdHIoc2VjdGlvbiwgdGFnKTsKCWlmICghbGlzdHN0cikKCQlnb3RvIGNsZWFudXA7CglsaXN0c3RyID0gc3RyZHVwIChsaXN0c3RyKTsKCWlmICghbGlzdHN0cikKCQlnb3RvIGNsZWFudXA7CglwID0gbGlzdHN0cjsKCXdoaWxlICgoZmllbGQgPSBzdHJzZXAgKCZwLCAiLCIpKSAhPSBOVUxMKSB7CgkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgKi8KCQl3aGlsZSAoaXNzcGFjZSAoKmZpZWxkKSkKCQkJZmllbGQrKzsKCQkvKiBTa2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KCQlpZiAocCkgewoJCQlmb3IgKHQgPSBwIC0gMTsgdCA+IGZpZWxkICYmIGlzc3BhY2UgKCp0KTsgdC0tKQoJCQkJKnQgPSAnXDAnOwoJCX0KCQlpZiAoKmZpZWxkID09ICdcMCcpIHsKCQkJeGxvZyhMT0dfSU5GTywgImNvbmZfZ2V0X2xpc3Q6IGVtcHR5IGZpZWxkLCBpZ25vcmluZy4uLiIpOwoJCQljb250aW51ZTsKCQl9CgkJbGlzdC0+Y250Kys7CgkJbm9kZSA9IGNhbGxvYyAoMSwgc2l6ZW9mICpub2RlKTsKCQlpZiAoIW5vZGUpCgkJCWdvdG8gY2xlYW51cDsKCQlub2RlLT5maWVsZCA9IHN0cmR1cCAoZmllbGQpOwoJCWlmICghbm9kZS0+ZmllbGQpIHsKCQkJZnJlZShub2RlKTsKCQkJZ290byBjbGVhbnVwOwoJCX0KCQlUQUlMUV9JTlNFUlRfVEFJTCAoJmxpc3QtPmZpZWxkcywgbm9kZSwgbGluayk7Cgl9CglmcmVlIChsaXN0c3RyKTsKCXJldHVybiBsaXN0OwoKY2xlYW51cDoKCWlmIChsaXN0KQoJCWNvbmZfZnJlZV9saXN0KGxpc3QpOwoJaWYgKGxpc3RzdHIpCgkJZnJlZShsaXN0c3RyKTsKCXJldHVybiAwOwp9CgpzdHJ1Y3QgY29uZl9saXN0ICoKY29uZl9nZXRfdGFnX2xpc3QoY2hhciAqc2VjdGlvbikKewoJc3RydWN0IGNvbmZfbGlzdCAqbGlzdCA9IDA7CglzdHJ1Y3QgY29uZl9saXN0X25vZGUgKm5vZGU7CglzdHJ1Y3QgY29uZl9iaW5kaW5nICpjYjsKCglsaXN0ID0gbWFsbG9jKHNpemVvZiAqbGlzdCk7CglpZiAoIWxpc3QpCgkJZ290byBjbGVhbnVwOwoJVEFJTFFfSU5JVCgmbGlzdC0+ZmllbGRzKTsKCWxpc3QtPmNudCA9IDA7CgljYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbY29uZl9oYXNoIChzZWN0aW9uKV0pOwoJZm9yICg7IGNiOyBjYiA9IExJU1RfTkVYVChjYiwgbGluaykpIHsKCQlpZiAoc3RyY2FzZWNtcCAoc2VjdGlvbiwgY2ItPnNlY3Rpb24pID09IDApIHsKCQkJbGlzdC0+Y250Kys7CgkJCW5vZGUgPSBjYWxsb2MoMSwgc2l6ZW9mICpub2RlKTsKCQkJaWYgKCFub2RlKQoJCQkJZ290byBjbGVhbnVwOwoJCQlub2RlLT5maWVsZCA9IHN0cmR1cChjYi0+dGFnKTsKCQkJaWYgKCFub2RlLT5maWVsZCkgewoJCQkJZnJlZShub2RlKTsKCQkJCWdvdG8gY2xlYW51cDsKCQkJfQoJCQlUQUlMUV9JTlNFUlRfVEFJTCgmbGlzdC0+ZmllbGRzLCBub2RlLCBsaW5rKTsKCQl9Cgl9CglyZXR1cm4gbGlzdDsKCmNsZWFudXA6CglpZiAobGlzdCkKCQljb25mX2ZyZWVfbGlzdChsaXN0KTsKCXJldHVybiAwOwp9CgovKiBEZWNvZGUgYSBQRU0gZW5jb2RlZCBidWZmZXIuICAqLwppbnQKY29uZl9kZWNvZGVfYmFzZTY0ICh1X2ludDhfdCAqb3V0LCB1X2ludDMyX3QgKmxlbiwgdV9jaGFyICpidWYpCnsKCXVfaW50MzJfdCBjID0gMDsKCXVfaW50OF90IGMxLCBjMiwgYzMsIGM0OwoKCXdoaWxlICgqYnVmKSB7CgkJaWYgKCpidWYgPiAxMjcgfHwgKGMxID0gYXNjMmJpblsqYnVmXSkgPT0gMjU1KQoJCQlyZXR1cm4gMDsKCgkJYnVmKys7CgkJaWYgKCpidWYgPiAxMjcgfHwgKGMyID0gYXNjMmJpblsqYnVmXSkgPT0gMjU1KQoJCQlyZXR1cm4gMDsKCgkJYnVmKys7CgkJaWYgKCpidWYgPT0gJz0nKSB7CgkJCWMzID0gYzQgPSAwOwoJCQljKys7CgoJCQkvKiBDaGVjayBsYXN0IGZvdXIgYml0ICovCgkJCWlmIChjMiAmIDB4RikKCQkJCXJldHVybiAwOwoKCQkJaWYgKHN0cmNtcCgoY2hhciAqKWJ1ZiwgIj09IikgPT0gMCkKCQkJCWJ1ZisrOwoJCQllbHNlCgkJCQlyZXR1cm4gMDsKCQl9IGVsc2UgaWYgKCpidWYgPiAxMjcgfHwgKGMzID0gYXNjMmJpblsqYnVmXSkgPT0gMjU1KQoJCQlyZXR1cm4gMDsKCQllbHNlIHsKCQkJaWYgKCorK2J1ZiA9PSAnPScpIHsKCQkJCWM0ID0gMDsKCQkJCWMgKz0gMjsKCgkJCQkvKiBDaGVjayBsYXN0IHR3byBiaXQgKi8KCQkJCWlmIChjMyAmIDMpCgkJCQkJcmV0dXJuIDA7CgoJCQlpZiAoc3RyY21wKChjaGFyICopYnVmLCAiPSIpKQoJCQkJcmV0dXJuIDA7CgkJCX0gZWxzZSBpZiAoKmJ1ZiA+IDEyNyB8fCAoYzQgPSBhc2MyYmluWypidWZdKSA9PSAyNTUpCgkJCQlyZXR1cm4gMDsKCQkJZWxzZQoJCQkJYyArPSAzOwoJCX0KCgkJYnVmKys7CgkJKm91dCsrID0gKGMxIDw8IDIpIHwgKGMyID4+IDQpOwoJCSpvdXQrKyA9IChjMiA8PCA0KSB8IChjMyA+PiAyKTsKCQkqb3V0KysgPSAoYzMgPDwgNikgfCBjNDsKCX0KCgkqbGVuID0gYzsKCXJldHVybiAxOwp9Cgp2b2lkCmNvbmZfZnJlZV9saXN0KHN0cnVjdCBjb25mX2xpc3QgKmxpc3QpCnsKCXN0cnVjdCBjb25mX2xpc3Rfbm9kZSAqbm9kZSA9IFRBSUxRX0ZJUlNUKCZsaXN0LT5maWVsZHMpOwoKCXdoaWxlIChub2RlKSB7CgkJVEFJTFFfUkVNT1ZFKCZsaXN0LT5maWVsZHMsIG5vZGUsIGxpbmspOwoJCWlmIChub2RlLT5maWVsZCkKCQkJZnJlZShub2RlLT5maWVsZCk7CgkJZnJlZSAobm9kZSk7CgkJbm9kZSA9IFRBSUxRX0ZJUlNUKCZsaXN0LT5maWVsZHMpOwoJfQoJZnJlZSAobGlzdCk7Cn0KCmludApjb25mX2JlZ2luKHZvaWQpCnsKICBzdGF0aWMgaW50IHNlcSA9IDA7CgogIHJldHVybiArK3NlcTsKfQoKc3RhdGljIHN0cnVjdCBjb25mX3RyYW5zICoKY29uZl90cmFuc19ub2RlKGludCB0cmFuc2FjdGlvbiwgZW51bSBjb25mX29wIG9wKQp7CglzdHJ1Y3QgY29uZl90cmFucyAqbm9kZTsKCglub2RlID0gY2FsbG9jICgxLCBzaXplb2YgKm5vZGUpOwoJaWYgKCFub2RlKSB7CgkJeGxvZ193YXJuKCJjb25mX3RyYW5zX25vZGU6IGNhbGxvYyAoMSwgJWx1KSBmYWlsZWQiLAoJCSh1bnNpZ25lZCBsb25nKXNpemVvZiAqbm9kZSk7CgkJcmV0dXJuIDA7Cgl9Cglub2RlLT50cmFucyA9IHRyYW5zYWN0aW9uOwoJbm9kZS0+b3AgPSBvcDsKCVRBSUxRX0lOU0VSVF9UQUlMICgmY29uZl90cmFuc19xdWV1ZSwgbm9kZSwgbGluayk7CglyZXR1cm4gbm9kZTsKfQoKLyogUXVldWUgYSBzZXQgb3BlcmF0aW9uLiAgKi8Kc3RhdGljIGludApjb25mX3NldChpbnQgdHJhbnNhY3Rpb24sIGNoYXIgKnNlY3Rpb24sIGNoYXIgKmFyZywKCWNoYXIgKnRhZywgY2hhciAqdmFsdWUsIGludCBvdmVycmlkZSwgaW50IGlzX2RlZmF1bHQpCnsKCXN0cnVjdCBjb25mX3RyYW5zICpub2RlOwoKCW5vZGUgPSBjb25mX3RyYW5zX25vZGUodHJhbnNhY3Rpb24sIENPTkZfU0VUKTsKCWlmICghbm9kZSkKCQlyZXR1cm4gMTsKCW5vZGUtPnNlY3Rpb24gPSBzdHJkdXAoc2VjdGlvbik7CglpZiAoIW5vZGUtPnNlY3Rpb24pIHsKCQl4bG9nX3dhcm4oImNvbmZfc2V0OiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCBzZWN0aW9uKTsKCQlnb3RvIGZhaWw7Cgl9CgkvKiBNYWtlIFNlY3Rpb24gbmFtZXMgY2FzZS1pbnNlbnNpdGl2ZSAqLwoJdXBwZXIybG93ZXIobm9kZS0+c2VjdGlvbik7CgoJaWYgKGFyZykgewoJCW5vZGUtPmFyZyA9IHN0cmR1cChhcmcpOwoJCWlmICghbm9kZS0+YXJnKSB7CgkJCXhsb2dfd2FybigiY29uZl9zZXQ6IHN0cmR1cChcIiVzXCIpIGZhaWxlZCIsIGFyZyk7CgkJCWdvdG8gZmFpbDsKCQl9Cgl9IGVsc2UKCQlub2RlLT5hcmcgPSBOVUxMOwoKCW5vZGUtPnRhZyA9IHN0cmR1cCh0YWcpOwoJaWYgKCFub2RlLT50YWcpIHsKCQl4bG9nX3dhcm4oImNvbmZfc2V0OiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCB0YWcpOwoJCWdvdG8gZmFpbDsKCX0KCW5vZGUtPnZhbHVlID0gc3RyZHVwKHZhbHVlKTsKCWlmICghbm9kZS0+dmFsdWUpIHsKCQl4bG9nX3dhcm4oImNvbmZfc2V0OiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCB2YWx1ZSk7CgkJZ290byBmYWlsOwoJfQoJbm9kZS0+b3ZlcnJpZGUgPSBvdmVycmlkZTsKCW5vZGUtPmlzX2RlZmF1bHQgPSBpc19kZWZhdWx0OwoJcmV0dXJuIDA7CgpmYWlsOgoJaWYgKG5vZGUtPnRhZykKCQlmcmVlKG5vZGUtPnRhZyk7CglpZiAobm9kZS0+c2VjdGlvbikKCQlmcmVlKG5vZGUtPnNlY3Rpb24pOwoJaWYgKG5vZGUpCgkJZnJlZShub2RlKTsKCXJldHVybiAxOwp9CgovKiBRdWV1ZSBhIHJlbW92ZSBvcGVyYXRpb24uICAqLwppbnQKY29uZl9yZW1vdmUoaW50IHRyYW5zYWN0aW9uLCBjaGFyICpzZWN0aW9uLCBjaGFyICp0YWcpCnsKCXN0cnVjdCBjb25mX3RyYW5zICpub2RlOwoKCW5vZGUgPSBjb25mX3RyYW5zX25vZGUodHJhbnNhY3Rpb24sIENPTkZfUkVNT1ZFKTsKCWlmICghbm9kZSkKCQlnb3RvIGZhaWw7Cglub2RlLT5zZWN0aW9uID0gc3RyZHVwKHNlY3Rpb24pOwoJaWYgKCFub2RlLT5zZWN0aW9uKSB7CgkJeGxvZ193YXJuKCJjb25mX3JlbW92ZTogc3RyZHVwKFwiJXNcIikgZmFpbGVkIiwgc2VjdGlvbik7CgkJZ290byBmYWlsOwoJfQoJbm9kZS0+dGFnID0gc3RyZHVwKHRhZyk7CglpZiAoIW5vZGUtPnRhZykgewoJCXhsb2dfd2FybigiY29uZl9yZW1vdmU6IHN0cmR1cChcIiVzXCIpIGZhaWxlZCIsIHRhZyk7CgkJZ290byBmYWlsOwoJfQoJcmV0dXJuIDA7CgpmYWlsOgoJaWYgKG5vZGUgJiYgbm9kZS0+c2VjdGlvbikKCQlmcmVlIChub2RlLT5zZWN0aW9uKTsKCWlmIChub2RlKQoJCWZyZWUgKG5vZGUpOwoJcmV0dXJuIDE7Cn0KCi8qIFF1ZXVlIGEgcmVtb3ZlIHNlY3Rpb24gb3BlcmF0aW9uLiAgKi8KaW50CmNvbmZfcmVtb3ZlX3NlY3Rpb24oaW50IHRyYW5zYWN0aW9uLCBjaGFyICpzZWN0aW9uKQp7CglzdHJ1Y3QgY29uZl90cmFucyAqbm9kZTsKCglub2RlID0gY29uZl90cmFuc19ub2RlKHRyYW5zYWN0aW9uLCBDT05GX1JFTU9WRV9TRUNUSU9OKTsKCWlmICghbm9kZSkKCQlnb3RvIGZhaWw7Cglub2RlLT5zZWN0aW9uID0gc3RyZHVwKHNlY3Rpb24pOwoJaWYgKCFub2RlLT5zZWN0aW9uKSB7CgkJeGxvZ193YXJuKCJjb25mX3JlbW92ZV9zZWN0aW9uOiBzdHJkdXAoXCIlc1wiKSBmYWlsZWQiLCBzZWN0aW9uKTsKCQlnb3RvIGZhaWw7Cgl9CglyZXR1cm4gMDsKCmZhaWw6CglpZiAobm9kZSkKCQlmcmVlKG5vZGUpOwoJcmV0dXJuIDE7Cn0KCi8qIEV4ZWN1dGUgYWxsIHF1ZXVlZCBvcGVyYXRpb25zIGZvciB0aGlzIHRyYW5zYWN0aW9uLiAgQ2xlYW51cC4gICovCmludApjb25mX2VuZChpbnQgdHJhbnNhY3Rpb24sIGludCBjb21taXQpCnsKCXN0cnVjdCBjb25mX3RyYW5zICpub2RlLCAqbmV4dDsKCglmb3IgKG5vZGUgPSBUQUlMUV9GSVJTVCgmY29uZl90cmFuc19xdWV1ZSk7IG5vZGU7IG5vZGUgPSBuZXh0KSB7CgkJbmV4dCA9IFRBSUxRX05FWFQobm9kZSwgbGluayk7CgkJaWYgKG5vZGUtPnRyYW5zID09IHRyYW5zYWN0aW9uKSB7CgkJCWlmIChjb21taXQpIHsKCQkJCXN3aXRjaCAobm9kZS0+b3ApIHsKCQkJCWNhc2UgQ09ORl9TRVQ6CgkJCQkJY29uZl9zZXRfbm93KG5vZGUtPnNlY3Rpb24sIG5vZGUtPmFyZywgCgkJCQkJCW5vZGUtPnRhZywgbm9kZS0+dmFsdWUsIG5vZGUtPm92ZXJyaWRlLCAKCQkJCQkJbm9kZS0+aXNfZGVmYXVsdCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIENPTkZfUkVNT1ZFOgoJCQkJCWNvbmZfcmVtb3ZlX25vdyhub2RlLT5zZWN0aW9uLCBub2RlLT50YWcpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSBDT05GX1JFTU9WRV9TRUNUSU9OOgoJCQkJCWNvbmZfcmVtb3ZlX3NlY3Rpb25fbm93KG5vZGUtPnNlY3Rpb24pOwoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQl4bG9nKExPR19JTkZPLCAiY29uZl9lbmQ6IHVua25vd24gb3BlcmF0aW9uOiAlZCIsIG5vZGUtPm9wKTsKCQkJCX0KCQkJfQoJCQlUQUlMUV9SRU1PVkUgKCZjb25mX3RyYW5zX3F1ZXVlLCBub2RlLCBsaW5rKTsKCQkJaWYgKG5vZGUtPnNlY3Rpb24pCgkJCQlmcmVlKG5vZGUtPnNlY3Rpb24pOwoJCQlpZiAobm9kZS0+dGFnKQoJCQkJZnJlZShub2RlLT50YWcpOwoJCQlpZiAobm9kZS0+dmFsdWUpCgkJCQlmcmVlKG5vZGUtPnZhbHVlKTsKCQkJZnJlZSAobm9kZSk7CgkJfQoJfQoJcmV0dXJuIDA7Cn0KCi8qCiAqIER1bXAgcnVubmluZyBjb25maWd1cmF0aW9uIHVwb24gU0lHVVNSMS4KICogQ29uZmlndXJhdGlvbiBpcyAic3RvcmVkIGluIHJldmVyc2Ugb3JkZXIiLCBzbyByZXZlcnNlIGl0IGFnYWluLgogKi8Kc3RydWN0IGR1bXBlciB7CgljaGFyICpzLCAqdjsKCXN0cnVjdCBkdW1wZXIgKm5leHQ7Cn07CgpzdGF0aWMgdm9pZApjb25mX3JlcG9ydF9kdW1wKHN0cnVjdCBkdW1wZXIgKm5vZGUpCnsKCS8qIFJlY3Vyc2l2ZSwgY2xlYW51cCB3aGVuIHdlJ3JlIGRvbmUuICAqLwoJaWYgKG5vZGUtPm5leHQpCgkJY29uZl9yZXBvcnRfZHVtcChub2RlLT5uZXh0KTsKCglpZiAobm9kZS0+dikKCQl4bG9nKExPR19JTkZPLCAiJXM9XHQlcyIsIG5vZGUtPnMsIG5vZGUtPnYpOwoJZWxzZSBpZiAobm9kZS0+cykgewoJCXhsb2coTE9HX0lORk8sICIlcyIsIG5vZGUtPnMpOwoJCWlmIChzdHJsZW4obm9kZS0+cykgPiAwKQoJCQlmcmVlKG5vZGUtPnMpOwoJfQoKCWZyZWUgKG5vZGUpOwp9Cgp2b2lkCmNvbmZfcmVwb3J0ICh2b2lkKQp7CglzdHJ1Y3QgY29uZl9iaW5kaW5nICpjYiwgKmxhc3QgPSAwOwoJdW5zaWduZWQgaW50IGksIGxlbiwgZGlmZl9hcmcgPSAwOwoJY2hhciAqY3VycmVudF9zZWN0aW9uID0gKGNoYXIgKikwOwoJY2hhciAqY3VycmVudF9hcmcgPSAoY2hhciAqKTA7CglzdHJ1Y3QgZHVtcGVyICpkdW1wZXIsICpkbm9kZTsKCglkdW1wZXIgPSBkbm9kZSA9IChzdHJ1Y3QgZHVtcGVyICopY2FsbG9jKDEsIHNpemVvZiAqZHVtcGVyKTsKCWlmICghZHVtcGVyKQoJCWdvdG8gbWVtX2ZhaWw7CgoJeGxvZyhMT0dfSU5GTywgImNvbmZfcmVwb3J0OiBkdW1waW5nIHJ1bm5pbmcgY29uZmlndXJhdGlvbiIpOwoKCWZvciAoaSA9IDA7IGkgPCBzaXplb2YgY29uZl9iaW5kaW5ncyAvIHNpemVvZiBjb25mX2JpbmRpbmdzWzBdOyBpKyspCgkJZm9yIChjYiA9IExJU1RfRklSU1QoJmNvbmZfYmluZGluZ3NbaV0pOyBjYjsgY2IgPSBMSVNUX05FWFQoY2IsIGxpbmspKSB7CgkJCWlmICghY2ItPmlzX2RlZmF1bHQpIHsKCQkJCS8qIE1ha2Ugc3VyZSB0aGUgU2VjdGlvbiBhcnVnbWVudCBpcyB0aGUgc2FtZSAqLwoJCQkJaWYgKGN1cnJlbnRfYXJnICYmIGN1cnJlbnRfc2VjdGlvbiAmJiBjYi0+YXJnKSB7CgkJCQkJaWYgKHN0cmNtcChjYi0+c2VjdGlvbiwgY3VycmVudF9zZWN0aW9uKSA9PSAwICYmCgkJCQkJCXN0cmNtcChjYi0+YXJnLCBjdXJyZW50X2FyZykgIT0gMCkKCQkJCQlkaWZmX2FyZyA9IDE7CgkJCQl9CgkJCQkvKiBEdW1wIHRoaXMgZW50cnkuICAqLwoJCQkJaWYgKCFjdXJyZW50X3NlY3Rpb24gfHwgc3RyY21wKGNiLT5zZWN0aW9uLCBjdXJyZW50X3NlY3Rpb24pIAoJCQkJCQkJfHwgZGlmZl9hcmcpIHsKCQkJCQlpZiAoY3VycmVudF9zZWN0aW9uIHx8IGRpZmZfYXJnKSB7CgkJCQkJCWxlbiA9IHN0cmxlbiAoY3VycmVudF9zZWN0aW9uKSArIDM7CgkJCQkJCWlmIChjdXJyZW50X2FyZykKCQkJCQkJCWxlbiArPSBzdHJsZW4oY3VycmVudF9hcmcpICsgMzsKCQkJCQkJZG5vZGUtPnMgPSBtYWxsb2MobGVuKTsKCQkJCQkJaWYgKCFkbm9kZS0+cykKCQkJCQkJCWdvdG8gbWVtX2ZhaWw7CgoJCQkJCQlpZiAoY3VycmVudF9hcmcpCgkJCQkJCQlzbnByaW50Zihkbm9kZS0+cywgbGVuLCAiWyVzIFwiJXNcIl0iLCAKCQkJCQkJCQljdXJyZW50X3NlY3Rpb24sIGN1cnJlbnRfYXJnKTsKCQkJCQkJZWxzZQoJCQkJCQkJc25wcmludGYoZG5vZGUtPnMsIGxlbiwgIlslc10iLCBjdXJyZW50X3NlY3Rpb24pOwoKCQkJCQkJZG5vZGUtPm5leHQgPSAKCQkJCQkJCShzdHJ1Y3QgZHVtcGVyICopY2FsbG9jKDEsIHNpemVvZiAoc3RydWN0IGR1bXBlcikpOwoJCQkJCQlkbm9kZSA9IGRub2RlLT5uZXh0OwoJCQkJCQlpZiAoIWRub2RlKQoJCQkJCQkJZ290byBtZW1fZmFpbDsKCgkJCQkJCWRub2RlLT5zID0gIiI7CgkJCQkJCWRub2RlLT5uZXh0ID0gCgkJCQkJCQkoc3RydWN0IGR1bXBlciAqKWNhbGxvYygxLCBzaXplb2YgKHN0cnVjdCBkdW1wZXIpKTsKCQkJCQkJZG5vZGUgPSBkbm9kZS0+bmV4dDsKCQkJCQkJaWYgKCFkbm9kZSkKCQkJCQkJZ290byBtZW1fZmFpbDsKCQkJCQl9CgkJCQkJY3VycmVudF9zZWN0aW9uID0gY2ItPnNlY3Rpb247CgkJCQkJY3VycmVudF9hcmcgPSBjYi0+YXJnOwoJCQkJCWRpZmZfYXJnID0gMDsKCQkJCX0KCQkJCWRub2RlLT5zID0gY2ItPnRhZzsKCQkJCWRub2RlLT52ID0gY2ItPnZhbHVlOwoJCQkJZG5vZGUtPm5leHQgPSAoc3RydWN0IGR1bXBlciAqKWNhbGxvYyAoMSwgc2l6ZW9mIChzdHJ1Y3QgZHVtcGVyKSk7CgkJCQlkbm9kZSA9IGRub2RlLT5uZXh0OwoJCQkJaWYgKCFkbm9kZSkKCQkJCQlnb3RvIG1lbV9mYWlsOwoJCQkJbGFzdCA9IGNiOwoJCX0KCX0KCglpZiAobGFzdCkgewoJCWxlbiA9IHN0cmxlbihsYXN0LT5zZWN0aW9uKSArIDM7CgkJaWYgKGxhc3QtPmFyZykKCQkJbGVuICs9IHN0cmxlbihsYXN0LT5hcmcpICsgMzsKCQlkbm9kZS0+cyA9IG1hbGxvYyhsZW4pOwoJCWlmICghZG5vZGUtPnMpCgkJCWdvdG8gbWVtX2ZhaWw7CgkJaWYgKGxhc3QtPmFyZykKCQkJc25wcmludGYoZG5vZGUtPnMsIGxlbiwgIlslcyBcIiVzXCJdIiwgbGFzdC0+c2VjdGlvbiwgbGFzdC0+YXJnKTsKCQllbHNlCgkJCXNucHJpbnRmKGRub2RlLT5zLCBsZW4sICJbJXNdIiwgbGFzdC0+c2VjdGlvbik7Cgl9Cgljb25mX3JlcG9ydF9kdW1wKGR1bXBlcik7CglyZXR1cm47CgptZW1fZmFpbDoKCXhsb2dfd2FybigiY29uZl9yZXBvcnQ6IG1hbGxvYy9jYWxsb2MgZmFpbGVkIik7Cgl3aGlsZSAoKGRub2RlID0gZHVtcGVyKSAhPSAwKSB7CgkJZHVtcGVyID0gZHVtcGVyLT5uZXh0OwoJCWlmIChkbm9kZS0+cykKCQkJZnJlZShkbm9kZS0+cyk7CgkJZnJlZShkbm9kZSk7Cgl9CglyZXR1cm47Cn0K