Lyogdmk6c2V0IHRzPTggc3RzPTQgc3c9NDoKICoKICogVklNIC0gVmkgSU1wcm92ZWQJYnkgQnJhbSBNb29sZW5hYXIKICoKICogRG8gIjpoZWxwIHVnYW5kYSIgIGluIFZpbSB0byByZWFkIGNvcHlpbmcgYW5kIHVzYWdlIGNvbmRpdGlvbnMuCiAqIERvICI6aGVscCBjcmVkaXRzIiBpbiBWaW0gdG8gc2VlIGEgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkLgogKiBTZWUgUkVBRE1FLnR4dCBmb3IgYW4gb3ZlcnZpZXcgb2YgdGhlIFZpbSBzb3VyY2UgY29kZS4KICovCgojaW5jbHVkZSAidmltLmgiCgojaWZkZWYgRkVBVF9MSU5FQlJFQUsKc3RhdGljIGludCB3aW5fY2hhcnRhYnNpemUgX19BUkdTKCh3aW5fVCAqd3AsIGNoYXJfdSAqcCwgY29sbnJfVCBjb2wpKTsKI2VuZGlmCgojaWZkZWYgRkVBVF9NQllURQojIGlmIGRlZmluZWQoSEFWRV9XQ0hBUl9IKQojICBpbmNsdWRlIDx3Y2hhci5oPgkgICAgLyogZm9yIHRvd3VwcGVyKCkgYW5kIHRvd2xvd2VyKCkgKi8KIyBlbmRpZgpzdGF0aWMgaW50IHdpbl9ub2xicl9jaGFydGFic2l6ZSBfX0FSR1MoKHdpbl9UICp3cCwgY2hhcl91ICpzLCBjb2xucl9UIGNvbCwgaW50ICpoZWFkcCkpOwojZW5kaWYKCnN0YXRpYyB1bnNpZ25lZCBucjJoZXggX19BUkdTKCh1bnNpZ25lZCBjKSk7CgpzdGF0aWMgaW50ICAgIGNoYXJ0YWJfaW5pdGlhbGl6ZWQgPSBGQUxTRTsKCi8qIGJfY2hhcnRhYltdIGlzIGFuIGFycmF5IG9mIDMyIGJ5dGVzLCBlYWNoIGJpdCByZXByZXNlbnRpbmcgb25lIG9mIHRoZQogKiBjaGFyYWN0ZXJzIDAtMjU1LiAqLwojZGVmaW5lIFNFVF9DSEFSVEFCKGJ1ZiwgYykgKGJ1ZiktPmJfY2hhcnRhYlsodW5zaWduZWQpKGMpID4+IDNdIHw9ICgxIDw8ICgoYykgJiAweDcpKQojZGVmaW5lIFJFU0VUX0NIQVJUQUIoYnVmLCBjKSAoYnVmKS0+Yl9jaGFydGFiWyh1bnNpZ25lZCkoYykgPj4gM10gJj0gfigxIDw8ICgoYykgJiAweDcpKQojZGVmaW5lIEdFVF9DSEFSVEFCKGJ1ZiwgYykgKChidWYpLT5iX2NoYXJ0YWJbKHVuc2lnbmVkKShjKSA+PiAzXSAmICgxIDw8ICgoYykgJiAweDcpKSkKCi8qCiAqIEZpbGwgY2hhcnRhYltdLiAgQWxzbyBmaWxscyBjdXJidWYtPmJfY2hhcnRhYltdIHdpdGggZmxhZ3MgZm9yIGtleXdvcmQKICogY2hhcmFjdGVycyBmb3IgY3VycmVudCBidWZmZXIuCiAqCiAqIERlcGVuZHMgb24gdGhlIG9wdGlvbiBzZXR0aW5ncyAnaXNrZXl3b3JkJywgJ2lzaWRlbnQnLCAnaXNmbmFtZScsCiAqICdpc3ByaW50JyBhbmQgJ2VuY29kaW5nJy4KICoKICogVGhlIGluZGV4IGluIGNoYXJ0YWJbXSBkZXBlbmRzIG9uICdlbmNvZGluZyc6CiAqIC0gRm9yIG5vbi1tdWx0aS1ieXRlIGluZGV4IHdpdGggdGhlIGJ5dGUgKHNhbWUgYXMgdGhlIGNoYXJhY3RlcikuCiAqIC0gRm9yIERCQ1MgaW5kZXggd2l0aCB0aGUgZmlyc3QgYnl0ZS4KICogLSBGb3IgVVRGLTggaW5kZXggd2l0aCB0aGUgY2hhcmFjdGVyICh3aGVuIGZpcnN0IGJ5dGUgaXMgdXAgdG8gMHg4MCBpdCBpcwogKiAgIHRoZSBzYW1lIGFzIHRoZSBjaGFyYWN0ZXIsIGlmIHRoZSBmaXJzdCBieXRlIGlzIDB4ODAgYW5kIGFib3ZlIGl0IGRlcGVuZHMKICogICBvbiBmdXJ0aGVyIGJ5dGVzKS4KICoKICogVGhlIGNvbnRlbnRzIG9mIGNoYXJ0YWJbXToKICogLSBUaGUgbG93ZXIgdHdvIGJpdHMsIG1hc2tlZCBieSBDVF9DRUxMX01BU0ssIGdpdmUgdGhlIG51bWJlciBvZiBkaXNwbGF5CiAqICAgY2VsbHMgdGhlIGNoYXJhY3RlciBvY2N1cGllcyAoMSBvciAyKS4gIE5vdCB2YWxpZCBmb3IgVVRGLTggYWJvdmUgMHg4MC4KICogLSBDVF9QUklOVF9DSEFSIGJpdCBpcyBzZXQgd2hlbiB0aGUgY2hhcmFjdGVyIGlzIHByaW50YWJsZSAobm8gbmVlZCB0bwogKiAgIHRyYW5zbGF0ZSB0aGUgY2hhcmFjdGVyIGJlZm9yZSBkaXNwbGF5aW5nIGl0KS4gIE5vdGUgdGhhdCBvbmx5IERCQ1MKICogICBjaGFyYWN0ZXJzIGNhbiBoYXZlIDIgZGlzcGxheSBjZWxscyBhbmQgc3RpbGwgYmUgcHJpbnRhYmxlLgogKiAtIENUX0ZOQU1FX0NIQVIgYml0IGlzIHNldCB3aGVuIHRoZSBjaGFyYWN0ZXIgY2FuIGJlIGluIGEgZmlsZSBuYW1lLgogKiAtIENUX0lEX0NIQVIgYml0IGlzIHNldCB3aGVuIHRoZSBjaGFyYWN0ZXIgY2FuIGJlIGluIGFuIGlkZW50aWZpZXIuCiAqCiAqIFJldHVybiBGQUlMIGlmICdpc2tleXdvcmQnLCAnaXNpZGVudCcsICdpc2ZuYW1lJyBvciAnaXNwcmludCcgb3B0aW9uIGhhcyBhbgogKiBlcnJvciwgT0sgb3RoZXJ3aXNlLgogKi8KICAgIGludAppbml0X2NoYXJ0YWIoKQp7CiAgICByZXR1cm4gYnVmX2luaXRfY2hhcnRhYihjdXJidWYsIFRSVUUpOwp9CgogICAgaW50CmJ1Zl9pbml0X2NoYXJ0YWIoYnVmLCBnbG9iYWwpCiAgICBidWZfVAkqYnVmOwogICAgaW50CQlnbG9iYWw7CQkvKiBGQUxTRTogb25seSBzZXQgYnVmLT5iX2NoYXJ0YWJbXSAqLwp7CiAgICBpbnQJCWM7CiAgICBpbnQJCWMyOwogICAgY2hhcl91CSpwOwogICAgaW50CQlpOwogICAgaW50CQl0aWxkZTsKICAgIGludAkJZG9faXNhbHBoYTsKCiAgICBpZiAoZ2xvYmFsKQogICAgewoJLyoKCSAqIFNldCB0aGUgZGVmYXVsdCBzaXplIGZvciBwcmludGFibGUgY2hhcmFjdGVyczoKCSAqIEZyb20gPFNwYWNlPiB0byAnficgaXMgMSAocHJpbnRhYmxlKSwgb3RoZXJzIGFyZSAyIChub3QgcHJpbnRhYmxlKS4KCSAqIFRoaXMgYWxzbyBpbml0cyBhbGwgJ2lzaWRlbnQnIGFuZCAnaXNmbmFtZScgZmxhZ3MgdG8gRkFMU0UuCgkgKgoJICogRUJDRElDOiBhbGwgY2hhcnMgYmVsb3cgJyAnIGFyZSBub3QgcHJpbnRhYmxlLCBhbGwgb3RoZXJzIGFyZQoJICogcHJpbnRhYmxlLgoJICovCgljID0gMDsKCXdoaWxlIChjIDwgJyAnKQoJICAgIGNoYXJ0YWJbYysrXSA9IChkeV9mbGFncyAmIERZX1VIRVgpID8gNCA6IDI7CiNpZmRlZiBFQkNESUMKCXdoaWxlIChjIDwgMjU1KQojZWxzZQoJd2hpbGUgKGMgPD0gJ34nKQojZW5kaWYKCSAgICBjaGFydGFiW2MrK10gPSAxICsgQ1RfUFJJTlRfQ0hBUjsKI2lmZGVmIEZFQVRfRktNQVAKCWlmIChwX2FsdGtleW1hcCkKCXsKCSAgICB3aGlsZSAoYyA8IFlFKQoJCWNoYXJ0YWJbYysrXSA9IDEgKyBDVF9QUklOVF9DSEFSOwoJfQojZW5kaWYKCXdoaWxlIChjIDwgMjU2KQoJewojaWZkZWYgRkVBVF9NQllURQoJICAgIC8qIFVURi04OiBieXRlcyAweGEwIC0gMHhmZiBhcmUgcHJpbnRhYmxlIChsYXRpbjEpICovCgkgICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHhhMCkKCQljaGFydGFiW2MrK10gPSBDVF9QUklOVF9DSEFSICsgMTsKCSAgICAvKiBldWMtanAgY2hhcmFjdGVycyBzdGFydGluZyB3aXRoIDB4OGUgYXJlIHNpbmdsZSB3aWR0aCAqLwoJICAgIGVsc2UgaWYgKGVuY19kYmNzID09IERCQ1NfSlBOVSAmJiBjID09IDB4OGUpCgkJY2hhcnRhYltjKytdID0gQ1RfUFJJTlRfQ0hBUiArIDE7CgkgICAgLyogb3RoZXIgZG91YmxlLWJ5dGUgY2hhcnMgY2FuIGJlIHByaW50YWJsZSBBTkQgZG91YmxlLXdpZHRoICovCgkgICAgZWxzZSBpZiAoZW5jX2RiY3MgIT0gMCAmJiBNQl9CWVRFMkxFTihjKSA9PSAyKQoJCWNoYXJ0YWJbYysrXSA9IENUX1BSSU5UX0NIQVIgKyAyOwoJICAgIGVsc2UKI2VuZGlmCgkJLyogdGhlIHJlc3QgaXMgdW5wcmludGFibGUgYnkgZGVmYXVsdCAqLwoJCWNoYXJ0YWJbYysrXSA9IChkeV9mbGFncyAmIERZX1VIRVgpID8gNCA6IDI7Cgl9CgojaWZkZWYgRkVBVF9NQllURQoJLyogQXNzdW1lIHRoYXQgZXZlcnkgbXVsdGktYnl0ZSBjaGFyIGlzIGEgZmlsZW5hbWUgY2hhcmFjdGVyLiAqLwoJZm9yIChjID0gMTsgYyA8IDI1NjsgKytjKQoJICAgIGlmICgoZW5jX2RiY3MgIT0gMCAmJiBNQl9CWVRFMkxFTihjKSA+IDEpCgkJICAgIHx8IChlbmNfZGJjcyA9PSBEQkNTX0pQTlUgJiYgYyA9PSAweDhlKQoJCSAgICB8fCAoZW5jX3V0ZjggJiYgYyA+PSAweGEwKSkKCQljaGFydGFiW2NdIHw9IENUX0ZOQU1FX0NIQVI7CiNlbmRpZgogICAgfQoKICAgIC8qCiAgICAgKiBJbml0IHdvcmQgY2hhciBmbGFncyBhbGwgdG8gRkFMU0UKICAgICAqLwogICAgdmltX21lbXNldChidWYtPmJfY2hhcnRhYiwgMCwgKHNpemVfdCkzMik7CiNpZmRlZiBGRUFUX01CWVRFCiAgICBpZiAoZW5jX2RiY3MgIT0gMCkKCWZvciAoYyA9IDA7IGMgPCAyNTY7ICsrYykKCXsKCSAgICAvKiBkb3VibGUtYnl0ZSBjaGFyYWN0ZXJzIGFyZSBwcm9iYWJseSB3b3JkIGNoYXJhY3RlcnMgKi8KCSAgICBpZiAoTUJfQllURTJMRU4oYykgPT0gMikKCQlTRVRfQ0hBUlRBQihidWYsIGMpOwoJfQojZW5kaWYKCiNpZmRlZiBGRUFUX0xJU1AKICAgIC8qCiAgICAgKiBJbiBsaXNwIG1vZGUgdGhlICctJyBjaGFyYWN0ZXIgaXMgaW5jbHVkZWQgaW4ga2V5d29yZHMuCiAgICAgKi8KICAgIGlmIChidWYtPmJfcF9saXNwKQoJU0VUX0NIQVJUQUIoYnVmLCAnLScpOwojZW5kaWYKCiAgICAvKiBXYWxrIHRocm91Z2ggdGhlICdpc2lkZW50JywgJ2lza2V5d29yZCcsICdpc2ZuYW1lJyBhbmQgJ2lzcHJpbnQnCiAgICAgKiBvcHRpb25zIEVhY2ggb3B0aW9uIGlzIGEgbGlzdCBvZiBjaGFyYWN0ZXJzLCBjaGFyYWN0ZXIgbnVtYmVycyBvcgogICAgICogcmFuZ2VzLCBzZXBhcmF0ZWQgYnkgY29tbWFzLCBlLmcuOiAiMjAwLTIxMCx4LCMtMTc4LC0iCiAgICAgKi8KICAgIGZvciAoaSA9IGdsb2JhbCA/IDAgOiAzOyBpIDw9IDM7ICsraSkKICAgIHsKCWlmIChpID09IDApCgkgICAgcCA9IHBfaXNpOwkJLyogZmlyc3Qgcm91bmQ6ICdpc2lkZW50JyAqLwoJZWxzZSBpZiAoaSA9PSAxKQoJICAgIHAgPSBwX2lzcDsJCS8qIHNlY29uZCByb3VuZDogJ2lzcHJpbnQnICovCgllbHNlIGlmIChpID09IDIpCgkgICAgcCA9IHBfaXNmOwkJLyogdGhpcmQgcm91bmQ6ICdpc2ZuYW1lJyAqLwoJZWxzZQkvKiBpID09IDMgKi8KCSAgICBwID0gYnVmLT5iX3BfaXNrOwkvKiBmb3VydGggcm91bmQ6ICdpc2tleXdvcmQnICovCgoJd2hpbGUgKCpwKQoJewoJICAgIHRpbGRlID0gRkFMU0U7CgkgICAgZG9faXNhbHBoYSA9IEZBTFNFOwoJICAgIGlmICgqcCA9PSAnXicgJiYgcFsxXSAhPSBOVUwpCgkgICAgewoJCXRpbGRlID0gVFJVRTsKCQkrK3A7CgkgICAgfQoJICAgIGlmIChWSU1fSVNESUdJVCgqcCkpCgkJYyA9IGdldGRpZ2l0cygmcCk7CgkgICAgZWxzZQojaWZkZWYgRkVBVF9NQllURQoJCSBpZiAoaGFzX21ieXRlKQoJCWMgPSBtYl9wdHIyY2hhcl9hZHYoJnApOwoJICAgIGVsc2UKI2VuZGlmCgkJYyA9ICpwKys7CgkgICAgYzIgPSAtMTsKCSAgICBpZiAoKnAgPT0gJy0nICYmIHBbMV0gIT0gTlVMKQoJICAgIHsKCQkrK3A7CgkJaWYgKFZJTV9JU0RJR0lUKCpwKSkKCQkgICAgYzIgPSBnZXRkaWdpdHMoJnApOwoJCWVsc2UKI2lmZGVmIEZFQVRfTUJZVEUKCQkgICAgIGlmIChoYXNfbWJ5dGUpCgkJICAgIGMyID0gbWJfcHRyMmNoYXJfYWR2KCZwKTsKCQllbHNlCiNlbmRpZgoJCSAgICBjMiA9ICpwKys7CgkgICAgfQoJICAgIGlmIChjIDw9IDAgfHwgYyA+PSAyNTYgfHwgKGMyIDwgYyAmJiBjMiAhPSAtMSkgfHwgYzIgPj0gMjU2CgkJCQkJCSB8fCAhKCpwID09IE5VTCB8fCAqcCA9PSAnLCcpKQoJCXJldHVybiBGQUlMOwoKCSAgICBpZiAoYzIgPT0gLTEpCS8qIG5vdCBhIHJhbmdlICovCgkgICAgewoJCS8qCgkJICogQSBzaW5nbGUgJ0AnIChub3QgIkAtQCIpOgoJCSAqIERlY2lkZSBvbiBsZXR0ZXJzIGJlaW5nIElEL3ByaW50YWJsZS9rZXl3b3JkIGNoYXJzIHdpdGgKCQkgKiBzdGFuZGFyZCBmdW5jdGlvbiBpc2FscGhhKCkuIFRoaXMgdGFrZXMgY2FyZSBvZiBsb2NhbGUgZm9yCgkJICogc2luZ2xlLWJ5dGUgY2hhcmFjdGVycykuCgkJICovCgkJaWYgKGMgPT0gJ0AnKQoJCXsKCQkgICAgZG9faXNhbHBoYSA9IFRSVUU7CgkJICAgIGMgPSAxOwoJCSAgICBjMiA9IDI1NTsKCQl9CgkJZWxzZQoJCSAgICBjMiA9IGM7CgkgICAgfQoJICAgIHdoaWxlIChjIDw9IGMyKQoJICAgIHsKCQkvKiBVc2UgdGhlIE1CXyBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSBpc2FscGhhKCkgZG9lc24ndAoJCSAqIHdvcmsgcHJvcGVybHkgd2hlbiAnZW5jb2RpbmcnIGlzICJsYXRpbjEiIGFuZCB0aGUgbG9jYWxlIGlzCgkJICogIkMiLiAgKi8KCQlpZiAoIWRvX2lzYWxwaGEgfHwgTUJfSVNMT1dFUihjKSB8fCBNQl9JU1VQUEVSKGMpCiNpZmRlZiBGRUFUX0ZLTUFQCgkJCXx8IChwX2FsdGtleW1hcCAmJiAoRl9pc2FscGhhKGMpIHx8IEZfaXNkaWdpdChjKSkpCiNlbmRpZgoJCQkgICAgKQoJCXsKCQkgICAgaWYgKGkgPT0gMCkJCQkvKiAocmUpc2V0IElEIGZsYWcgKi8KCQkgICAgewoJCQlpZiAodGlsZGUpCgkJCSAgICBjaGFydGFiW2NdICY9IH5DVF9JRF9DSEFSOwoJCQllbHNlCgkJCSAgICBjaGFydGFiW2NdIHw9IENUX0lEX0NIQVI7CgkJICAgIH0KCQkgICAgZWxzZSBpZiAoaSA9PSAxKQkJLyogKHJlKXNldCBwcmludGFibGUgKi8KCQkgICAgewoJCQlpZiAoKGMgPCAnICcKI2lmbmRlZiBFQkNESUMKCQkJCSAgICB8fCBjID4gJ34nCiNlbmRpZgojaWZkZWYgRkVBVF9GS01BUAoJCQkJICAgIHx8IChwX2FsdGtleW1hcAoJCQkJCSYmIChGX2lzYWxwaGEoYykgfHwgRl9pc2RpZ2l0KGMpKSkKI2VuZGlmCgkJCSAgICApCiNpZmRlZiBGRUFUX01CWVRFCgkJCQkvKiBGb3IgZG91YmxlLWJ5dGUgd2Uga2VlcCB0aGUgY2VsbCB3aWR0aCwgc28KCQkJCSAqIHRoYXQgd2UgY2FuIGRldGVjdCBpdCBmcm9tIHRoZSBmaXJzdCBieXRlLiAqLwoJCQkJJiYgIShlbmNfZGJjcyAmJiBNQl9CWVRFMkxFTihjKSA9PSAyKQojZW5kaWYKCQkJICAgKQoJCQl7CgkJCSAgICBpZiAodGlsZGUpCgkJCSAgICB7CgkJCQljaGFydGFiW2NdID0gKGNoYXJ0YWJbY10gJiB+Q1RfQ0VMTF9NQVNLKQoJCQkJCSAgICAgKyAoKGR5X2ZsYWdzICYgRFlfVUhFWCkgPyA0IDogMik7CgkJCQljaGFydGFiW2NdICY9IH5DVF9QUklOVF9DSEFSOwoJCQkgICAgfQoJCQkgICAgZWxzZQoJCQkgICAgewoJCQkJY2hhcnRhYltjXSA9IChjaGFydGFiW2NdICYgfkNUX0NFTExfTUFTSykgKyAxOwoJCQkJY2hhcnRhYltjXSB8PSBDVF9QUklOVF9DSEFSOwoJCQkgICAgfQoJCQl9CgkJICAgIH0KCQkgICAgZWxzZSBpZiAoaSA9PSAyKQkJLyogKHJlKXNldCBmbmFtZSBmbGFnICovCgkJICAgIHsKCQkJaWYgKHRpbGRlKQoJCQkgICAgY2hhcnRhYltjXSAmPSB+Q1RfRk5BTUVfQ0hBUjsKCQkJZWxzZQoJCQkgICAgY2hhcnRhYltjXSB8PSBDVF9GTkFNRV9DSEFSOwoJCSAgICB9CgkJICAgIGVsc2UgLyogaSA9PSAzICovCQkvKiAocmUpc2V0IGtleXdvcmQgZmxhZyAqLwoJCSAgICB7CgkJCWlmICh0aWxkZSkKCQkJICAgIFJFU0VUX0NIQVJUQUIoYnVmLCBjKTsKCQkJZWxzZQoJCQkgICAgU0VUX0NIQVJUQUIoYnVmLCBjKTsKCQkgICAgfQoJCX0KCQkrK2M7CgkgICAgfQoJICAgIHAgPSBza2lwX3RvX29wdGlvbl9wYXJ0KHApOwoJfQogICAgfQogICAgY2hhcnRhYl9pbml0aWFsaXplZCA9IFRSVUU7CiAgICByZXR1cm4gT0s7Cn0KCi8qCiAqIFRyYW5zbGF0ZSBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJzIGluIGJ1ZltidWZzaXplXSBpbi1wbGFjZS4KICogVGhlIHJlc3VsdCBpcyBhIHN0cmluZyB3aXRoIG9ubHkgcHJpbnRhYmxlIGNoYXJhY3RlcnMsIGJ1dCBpZiB0aGVyZSBpcyBub3QKICogZW5vdWdoIHJvb20sIG5vdCBhbGwgY2hhcmFjdGVycyB3aWxsIGJlIHRyYW5zbGF0ZWQuCiAqLwogICAgdm9pZAp0cmFuc19jaGFyYWN0ZXJzKGJ1ZiwgYnVmc2l6ZSkKICAgIGNoYXJfdQkqYnVmOwogICAgaW50CQlidWZzaXplOwp7CiAgICBpbnQJCWxlbjsJCS8qIGxlbmd0aCBvZiBzdHJpbmcgbmVlZGluZyB0cmFuc2xhdGlvbiAqLwogICAgaW50CQlyb29tOwkJLyogcm9vbSBpbiBidWZmZXIgYWZ0ZXIgc3RyaW5nICovCiAgICBjaGFyX3UJKnRyczsJCS8qIHRyYW5zbGF0ZWQgY2hhcmFjdGVyICovCiAgICBpbnQJCXRyc19sZW47CS8qIGxlbmd0aCBvZiB0cnNbXSAqLwoKICAgIGxlbiA9IChpbnQpU1RSTEVOKGJ1Zik7CiAgICByb29tID0gYnVmc2l6ZSAtIGxlbjsKICAgIHdoaWxlICgqYnVmICE9IDApCiAgICB7CiMgaWZkZWYgRkVBVF9NQllURQoJLyogQXNzdW1lIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIgZG9lc24ndCBuZWVkIHRyYW5zbGF0aW9uLiAqLwoJaWYgKGhhc19tYnl0ZSAmJiAodHJzX2xlbiA9ICgqbWJfcHRyMmxlbikoYnVmKSkgPiAxKQoJICAgIGxlbiAtPSB0cnNfbGVuOwoJZWxzZQojIGVuZGlmCgl7CgkgICAgdHJzID0gdHJhbnNjaGFyX2J5dGUoKmJ1Zik7CgkgICAgdHJzX2xlbiA9IChpbnQpU1RSTEVOKHRycyk7CgkgICAgaWYgKHRyc19sZW4gPiAxKQoJICAgIHsKCQlyb29tIC09IHRyc19sZW4gLSAxOwoJCWlmIChyb29tIDw9IDApCgkJICAgIHJldHVybjsKCQltY2hfbWVtbW92ZShidWYgKyB0cnNfbGVuLCBidWYgKyAxLCAoc2l6ZV90KWxlbik7CgkgICAgfQoJICAgIG1jaF9tZW1tb3ZlKGJ1ZiwgdHJzLCAoc2l6ZV90KXRyc19sZW4pOwoJICAgIC0tbGVuOwoJfQoJYnVmICs9IHRyc19sZW47CiAgICB9Cn0KCiNpZiBkZWZpbmVkKEZFQVRfRVZBTCkgfHwgZGVmaW5lZChGRUFUX1RJVExFKSB8fCBkZWZpbmVkKEZFQVRfSU5TX0VYUEFORCkgXAoJfHwgZGVmaW5lZChQUk9UTykKLyoKICogVHJhbnNsYXRlIGEgc3RyaW5nIGludG8gYWxsb2NhdGVkIG1lbW9yeSwgcmVwbGFjaW5nIHNwZWNpYWwgY2hhcnMgd2l0aAogKiBwcmludGFibGUgY2hhcnMuICBSZXR1cm5zIE5VTEwgd2hlbiBvdXQgb2YgbWVtb3J5LgogKi8KICAgIGNoYXJfdSAqCnRyYW5zc3RyKHMpCiAgICBjaGFyX3UJKnM7CnsKICAgIGNoYXJfdQkqcmVzOwogICAgY2hhcl91CSpwOwojaWZkZWYgRkVBVF9NQllURQogICAgaW50CQlsLCBsZW4sIGM7CiAgICBjaGFyX3UJaGV4YnVmWzExXTsKI2VuZGlmCgojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGhhc19tYnl0ZSkKICAgIHsKCS8qIENvbXB1dGUgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0LCB0YWtpbmcgYWNjb3VudCBvZiB1bnByaW50YWJsZQoJICogbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiAqLwoJbGVuID0gMDsKCXAgPSBzOwoJd2hpbGUgKCpwICE9IE5VTCkKCXsKCSAgICBpZiAoKGwgPSAoKm1iX3B0cjJsZW4pKHApKSA+IDEpCgkgICAgewoJCWMgPSAoKm1iX3B0cjJjaGFyKShwKTsKCQlwICs9IGw7CgkJaWYgKHZpbV9pc3ByaW50YyhjKSkKCQkgICAgbGVuICs9IGw7CgkJZWxzZQoJCXsKCQkgICAgdHJhbnNjaGFyX2hleChoZXhidWYsIGMpOwoJCSAgICBsZW4gKz0gKGludClTVFJMRU4oaGV4YnVmKTsKCQl9CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgkJbCA9IGJ5dGUyY2VsbHMoKnArKyk7CgkJaWYgKGwgPiAwKQoJCSAgICBsZW4gKz0gbDsKCQllbHNlCgkJICAgIGxlbiArPSA0OwkvKiBpbGxlZ2FsIGJ5dGUgc2VxdWVuY2UgKi8KCSAgICB9Cgl9CglyZXMgPSBhbGxvYygodW5zaWduZWQpKGxlbiArIDEpKTsKICAgIH0KICAgIGVsc2UKI2VuZGlmCglyZXMgPSBhbGxvYygodW5zaWduZWQpKHZpbV9zdHJzaXplKHMpICsgMSkpOwogICAgaWYgKHJlcyAhPSBOVUxMKQogICAgewoJKnJlcyA9IE5VTDsKCXAgPSBzOwoJd2hpbGUgKCpwICE9IE5VTCkKCXsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBpZiAoaGFzX21ieXRlICYmIChsID0gKCptYl9wdHIybGVuKShwKSkgPiAxKQoJICAgIHsKCQljID0gKCptYl9wdHIyY2hhcikocCk7CgkJaWYgKHZpbV9pc3ByaW50YyhjKSkKCQkgICAgU1RSTkNBVChyZXMsIHAsIGwpOwkvKiBhcHBlbmQgcHJpbnRhYmxlIG11bHRpLWJ5dGUgY2hhciAqLwoJCWVsc2UKCQkgICAgdHJhbnNjaGFyX2hleChyZXMgKyBTVFJMRU4ocmVzKSwgYyk7CgkJcCArPSBsOwoJICAgIH0KCSAgICBlbHNlCiNlbmRpZgoJCVNUUkNBVChyZXMsIHRyYW5zY2hhcl9ieXRlKCpwKyspKTsKCX0KICAgIH0KICAgIHJldHVybiByZXM7Cn0KI2VuZGlmCgojaWYgZGVmaW5lZChGRUFUX1NZTl9ITCkgfHwgZGVmaW5lZChGRUFUX0lOU19FWFBBTkQpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIENvbnZlcnQgdGhlIHN0cmluZyAic3RyW29yZ2xlbl0iIHRvIGRvIGlnbm9yZS1jYXNlIGNvbXBhcmluZy4gIFVzZXMgdGhlCiAqIGN1cnJlbnQgbG9jYWxlLgogKiBXaGVuICJidWYiIGlzIE5VTEwgcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIChOVUxMIGZvciBvdXQtb2YtbWVtb3J5KS4KICogT3RoZXJ3aXNlIHB1dHMgdGhlIHJlc3VsdCBpbiAiYnVmW2J1Zmxlbl0iLgogKi8KICAgIGNoYXJfdSAqCnN0cl9mb2xkY2FzZShzdHIsIG9yZ2xlbiwgYnVmLCBidWZsZW4pCiAgICBjaGFyX3UJKnN0cjsKICAgIGludAkJb3JnbGVuOwogICAgY2hhcl91CSpidWY7CiAgICBpbnQJCWJ1ZmxlbjsKewogICAgZ2FycmF5X1QJZ2E7CiAgICBpbnQJCWk7CiAgICBpbnQJCWxlbiA9IG9yZ2xlbjsKCiNkZWZpbmUgR0FfQ0hBUihpKSAgKChjaGFyX3UgKilnYS5nYV9kYXRhKVtpXQojZGVmaW5lIEdBX1BUUihpKSAgICgoY2hhcl91ICopZ2EuZ2FfZGF0YSArIGkpCiNkZWZpbmUgU1RSX0NIQVIoaSkgIChidWYgPT0gTlVMTCA/IEdBX0NIQVIoaSkgOiBidWZbaV0pCiNkZWZpbmUgU1RSX1BUUihpKSAgIChidWYgPT0gTlVMTCA/IEdBX1BUUihpKSA6IGJ1ZiArIGkpCgogICAgLyogQ29weSAic3RyIiBpbnRvICJidWYiIG9yIGFsbG9jYXRlZCBtZW1vcnksIHVubW9kaWZpZWQuICovCiAgICBpZiAoYnVmID09IE5VTEwpCiAgICB7CglnYV9pbml0MigmZ2EsIDEsIDEwKTsKCWlmIChnYV9ncm93KCZnYSwgbGVuICsgMSkgPT0gRkFJTCkKCSAgICByZXR1cm4gTlVMTDsKCW1jaF9tZW1tb3ZlKGdhLmdhX2RhdGEsIHN0ciwgKHNpemVfdClsZW4pOwoJZ2EuZ2FfbGVuID0gbGVuOwogICAgfQogICAgZWxzZQogICAgewoJaWYgKGxlbiA+PSBidWZsZW4pCSAgICAvKiBVZ2x5ISAqLwoJICAgIGxlbiA9IGJ1ZmxlbiAtIDE7CgltY2hfbWVtbW92ZShidWYsIHN0ciwgKHNpemVfdClsZW4pOwogICAgfQogICAgaWYgKGJ1ZiA9PSBOVUxMKQoJR0FfQ0hBUihsZW4pID0gTlVMOwogICAgZWxzZQoJYnVmW2xlbl0gPSBOVUw7CgogICAgLyogTWFrZSBlYWNoIGNoYXJhY3RlciBsb3dlciBjYXNlLiAqLwogICAgaSA9IDA7CiAgICB3aGlsZSAoU1RSX0NIQVIoaSkgIT0gTlVMKQogICAgewojaWZkZWYgRkVBVF9NQllURQoJaWYgKGVuY191dGY4IHx8IChoYXNfbWJ5dGUgJiYgTUJfQllURTJMRU4oU1RSX0NIQVIoaSkpID4gMSkpCgl7CgkgICAgaWYgKGVuY191dGY4KQoJICAgIHsKCQlpbnQJYyA9IHV0Zl9wdHIyY2hhcihTVFJfUFRSKGkpKTsKCQlpbnQJb2wgPSB1dGZfcHRyMmxlbihTVFJfUFRSKGkpKTsKCQlpbnQJbGMgPSB1dGZfdG9sb3dlcihjKTsKCgkJLyogT25seSByZXBsYWNlIHRoZSBjaGFyYWN0ZXIgd2hlbiBpdCBpcyBub3QgYW4gaW52YWxpZAoJCSAqIHNlcXVlbmNlIChBU0NJSSBjaGFyYWN0ZXIgb3IgbW9yZSB0aGFuIG9uZSBieXRlKSBhbmQKCQkgKiB1dGZfdG9sb3dlcigpIGRvZXNuJ3QgcmV0dXJuIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuICovCgkJaWYgKChjIDwgMHg4MCB8fCBvbCA+IDEpICYmIGMgIT0gbGMpCgkJewoJCSAgICBpbnQJICAgIG5sID0gdXRmX2NoYXIybGVuKGxjKTsKCgkJICAgIC8qIElmIHRoZSBieXRlIGxlbmd0aCBjaGFuZ2VzIG5lZWQgdG8gc2hpZnQgdGhlIGZvbGxvd2luZwoJCSAgICAgKiBjaGFyYWN0ZXJzIGZvcndhcmQgb3IgYmFja3dhcmQuICovCgkJICAgIGlmIChvbCAhPSBubCkKCQkgICAgewoJCQlpZiAobmwgPiBvbCkKCQkJewoJCQkgICAgaWYgKGJ1ZiA9PSBOVUxMID8gZ2FfZ3JvdygmZ2EsIG5sIC0gb2wgKyAxKSA9PSBGQUlMCgkJCQkJCSAgICA6IGxlbiArIG5sIC0gb2wgPj0gYnVmbGVuKQoJCQkgICAgewoJCQkJLyogb3V0IG9mIG1lbW9yeSwga2VlcCBvbGQgY2hhciAqLwoJCQkJbGMgPSBjOwoJCQkJbmwgPSBvbDsKCQkJICAgIH0KCQkJfQoJCQlpZiAob2wgIT0gbmwpCgkJCXsKCQkJICAgIGlmIChidWYgPT0gTlVMTCkKCQkJICAgIHsKCQkJCVNUUk1PVkUoR0FfUFRSKGkpICsgbmwsIEdBX1BUUihpKSArIG9sKTsKCQkJCWdhLmdhX2xlbiArPSBubCAtIG9sOwoJCQkgICAgfQoJCQkgICAgZWxzZQoJCQkgICAgewoJCQkJU1RSTU9WRShidWYgKyBpICsgbmwsIGJ1ZiArIGkgKyBvbCk7CgkJCQlsZW4gKz0gbmwgLSBvbDsKCQkJICAgIH0KCQkJfQoJCSAgICB9CgkJICAgICh2b2lkKXV0Zl9jaGFyMmJ5dGVzKGxjLCBTVFJfUFRSKGkpKTsKCQl9CgkgICAgfQoJICAgIC8qIHNraXAgdG8gbmV4dCBtdWx0aS1ieXRlIGNoYXIgKi8KCSAgICBpICs9ICgqbWJfcHRyMmxlbikoU1RSX1BUUihpKSk7Cgl9CgllbHNlCiNlbmRpZgoJewoJICAgIGlmIChidWYgPT0gTlVMTCkKCQlHQV9DSEFSKGkpID0gVE9MT1dFUl9MT0MoR0FfQ0hBUihpKSk7CgkgICAgZWxzZQoJCWJ1ZltpXSA9IFRPTE9XRVJfTE9DKGJ1ZltpXSk7CgkgICAgKytpOwoJfQogICAgfQoKICAgIGlmIChidWYgPT0gTlVMTCkKCXJldHVybiAoY2hhcl91ICopZ2EuZ2FfZGF0YTsKICAgIHJldHVybiBidWY7Cn0KI2VuZGlmCgovKgogKiBDYXRjaCAyMjogY2hhcnRhYltdIGNhbid0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgb3B0aW9ucyBhcmUKICogaW5pdGlhbGl6ZWQsIGFuZCBpbml0aWFsaXppbmcgb3B0aW9ucyBtYXkgY2F1c2UgdHJhbnNjaGFyKCkgdG8gYmUgY2FsbGVkIQogKiBXaGVuIGNoYXJ0YWJfaW5pdGlhbGl6ZWQgPT0gRkFMU0UgZG9uJ3QgdXNlIGNoYXJ0YWJbXS4KICogRG9lcyBOT1Qgd29yayBmb3IgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLCBjIG11c3QgYmUgPD0gMjU1LgogKiBBbHNvIGRvZXNuJ3Qgd29yayBmb3IgdGhlIGZpcnN0IGJ5dGUgb2YgYSBtdWx0aS1ieXRlLCAiYyIgbXVzdCBiZSBhCiAqIGNoYXJhY3RlciEKICovCnN0YXRpYyBjaGFyX3UJdHJhbnNjaGFyX2J1Zls3XTsKCiAgICBjaGFyX3UgKgp0cmFuc2NoYXIoYykKICAgIGludAkJYzsKewogICAgaW50CQkJaTsKCiAgICBpID0gMDsKICAgIGlmIChJU19TUEVDSUFMKGMpKQkgICAgLyogc3BlY2lhbCBrZXkgY29kZSwgZGlzcGxheSBhcyB+QCBjaGFyICovCiAgICB7Cgl0cmFuc2NoYXJfYnVmWzBdID0gJ34nOwoJdHJhbnNjaGFyX2J1ZlsxXSA9ICdAJzsKCWkgPSAyOwoJYyA9IEtfU0VDT05EKGMpOwogICAgfQoKICAgIGlmICgoIWNoYXJ0YWJfaW5pdGlhbGl6ZWQgJiYgKAojaWZkZWYgRUJDRElDCgkJICAgIChjID49IDY0ICYmIGMgPCAyNTUpCiNlbHNlCgkJICAgIChjID49ICcgJyAmJiBjIDw9ICd+JykKI2VuZGlmCiNpZmRlZiBGRUFUX0ZLTUFQCgkJCXx8IEZfaXNjaGFyKGMpCiNlbmRpZgoJCSkpIHx8IChjIDwgMjU2ICYmIHZpbV9pc3ByaW50Y19zdHJpY3QoYykpKQogICAgewoJLyogcHJpbnRhYmxlIGNoYXJhY3RlciAqLwoJdHJhbnNjaGFyX2J1ZltpXSA9IGM7Cgl0cmFuc2NoYXJfYnVmW2kgKyAxXSA9IE5VTDsKICAgIH0KICAgIGVsc2UKCXRyYW5zY2hhcl9ub25wcmludCh0cmFuc2NoYXJfYnVmICsgaSwgYyk7CiAgICByZXR1cm4gdHJhbnNjaGFyX2J1ZjsKfQoKI2lmIGRlZmluZWQoRkVBVF9NQllURSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogTGlrZSB0cmFuc2NoYXIoKSwgYnV0IGNhbGxlZCB3aXRoIGEgYnl0ZSBpbnN0ZWFkIG9mIGEgY2hhcmFjdGVyLiAgQ2hlY2tzCiAqIGZvciBhbiBpbGxlZ2FsIFVURi04IGJ5dGUuCiAqLwogICAgY2hhcl91ICoKdHJhbnNjaGFyX2J5dGUoYykKICAgIGludAkJYzsKewogICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkKICAgIHsKCXRyYW5zY2hhcl9ub25wcmludCh0cmFuc2NoYXJfYnVmLCBjKTsKCXJldHVybiB0cmFuc2NoYXJfYnVmOwogICAgfQogICAgcmV0dXJuIHRyYW5zY2hhcihjKTsKfQojZW5kaWYKCi8qCiAqIENvbnZlcnQgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXIgdG8gdHdvIG9yIG1vcmUgcHJpbnRhYmxlIGNoYXJhY3RlcnMgaW4KICogImJ1ZltdIi4gICJidWYiIG5lZWRzIHRvIGJlIGFibGUgdG8gaG9sZCBmaXZlIGJ5dGVzLgogKiBEb2VzIE5PVCB3b3JrIGZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMsIGMgbXVzdCBiZSA8PSAyNTUuCiAqLwogICAgdm9pZAp0cmFuc2NoYXJfbm9ucHJpbnQoYnVmLCBjKQogICAgY2hhcl91CSpidWY7CiAgICBpbnQJCWM7CnsKICAgIGlmIChjID09IE5MKQoJYyA9IE5VTDsJCS8qIHdlIHVzZSBuZXdsaW5lIGluIHBsYWNlIG9mIGEgTlVMICovCiAgICBlbHNlIGlmIChjID09IENBUiAmJiBnZXRfZmlsZWZvcm1hdChjdXJidWYpID09IEVPTF9NQUMpCgljID0gTkw7CQkJLyogd2UgdXNlIENSIGluIHBsYWNlIG9mICBOTCBpbiB0aGlzIGNhc2UgKi8KCiAgICBpZiAoZHlfZmxhZ3MgJiBEWV9VSEVYKQkJLyogJ2Rpc3BsYXknIGhhcyAidWhleCIgKi8KCXRyYW5zY2hhcl9oZXgoYnVmLCBjKTsKCiNpZmRlZiBFQkNESUMKICAgIC8qIEZvciBFQkNESUMgb25seSB0aGUgY2hhcmFjdGVycyAwLTYzIGFuZCAyNTUgYXJlIG5vdCBwcmludGFibGUgKi8KICAgIGVsc2UgaWYgKEN0cmxDaGFyKGMpICE9IDAgfHwgYyA9PSBERUwpCiNlbHNlCiAgICBlbHNlIGlmIChjIDw9IDB4N2YpCQkJCS8qIDB4MDAgLSAweDFmIGFuZCAweDdmICovCiNlbmRpZgogICAgewoJYnVmWzBdID0gJ14nOwojaWZkZWYgRUJDRElDCglpZiAoYyA9PSBERUwpCgkgICAgYnVmWzFdID0gJz8nOwkJLyogREVMIGRpc3BsYXllZCBhcyBePyAqLwoJZWxzZQoJICAgIGJ1ZlsxXSA9IEN0cmxDaGFyKGMpOwojZWxzZQoJYnVmWzFdID0gYyBeIDB4NDA7CQkvKiBERUwgZGlzcGxheWVkIGFzIF4/ICovCiNlbmRpZgoKCWJ1ZlsyXSA9IE5VTDsKICAgIH0KI2lmZGVmIEZFQVRfTUJZVEUKICAgIGVsc2UgaWYgKGVuY191dGY4ICYmIGMgPj0gMHg4MCkKICAgIHsKCXRyYW5zY2hhcl9oZXgoYnVmLCBjKTsKICAgIH0KI2VuZGlmCiNpZm5kZWYgRUJDRElDCiAgICBlbHNlIGlmIChjID49ICcgJyArIDB4ODAgJiYgYyA8PSAnficgKyAweDgwKSAgICAvKiAweGEwIC0gMHhmZSAqLwogICAgewoJYnVmWzBdID0gJ3wnOwoJYnVmWzFdID0gYyAtIDB4ODA7CglidWZbMl0gPSBOVUw7CiAgICB9CiNlbHNlCiAgICBlbHNlIGlmIChjIDwgNjQpCiAgICB7CglidWZbMF0gPSAnfic7CglidWZbMV0gPSBNZXRhQ2hhcihjKTsKCWJ1ZlsyXSA9IE5VTDsKICAgIH0KI2VuZGlmCiAgICBlbHNlCQkJCQkgICAgLyogMHg4MCAtIDB4OWYgYW5kIDB4ZmYgKi8KICAgIHsKCS8qCgkgKiBUT0RPOiBFQkNESUMgSSBkb24ndCBrbm93IHdoYXQgdG8gZG8gd2l0aCB0aGlzIGNoYXJzLCBzbyBJIGRpc3BsYXkKCSAqIHRoZW0gYXMgJ34/JyBmb3Igbm93CgkgKi8KCWJ1ZlswXSA9ICd+JzsKI2lmZGVmIEVCQ0RJQwoJYnVmWzFdID0gJz8nOwkJCS8qIDB4ZmYgZGlzcGxheWVkIGFzIH4/ICovCiNlbHNlCglidWZbMV0gPSAoYyAtIDB4ODApIF4gMHg0MDsJLyogMHhmZiBkaXNwbGF5ZWQgYXMgfj8gKi8KI2VuZGlmCglidWZbMl0gPSBOVUw7CiAgICB9Cn0KCiAgICB2b2lkCnRyYW5zY2hhcl9oZXgoYnVmLCBjKQogICAgY2hhcl91CSpidWY7CiAgICBpbnQJCWM7CnsKICAgIGludAkJaSA9IDA7CgogICAgYnVmWzBdID0gJzwnOwojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGMgPiAyNTUpCiAgICB7CglidWZbKytpXSA9IG5yMmhleCgodW5zaWduZWQpYyA+PiAxMik7CglidWZbKytpXSA9IG5yMmhleCgodW5zaWduZWQpYyA+PiA4KTsKICAgIH0KI2VuZGlmCiAgICBidWZbKytpXSA9IG5yMmhleCgodW5zaWduZWQpYyA+PiA0KTsKICAgIGJ1ZlsrK2ldID0gbnIyaGV4KCh1bnNpZ25lZCljKTsKICAgIGJ1ZlsrK2ldID0gJz4nOwogICAgYnVmWysraV0gPSBOVUw7Cn0KCi8qCiAqIENvbnZlcnQgdGhlIGxvd2VyIDQgYml0cyBvZiBieXRlICJjIiB0byBpdHMgaGV4IGNoYXJhY3Rlci4KICogTG93ZXIgY2FzZSBsZXR0ZXJzIGFyZSB1c2VkIHRvIGF2b2lkIHRoZSBjb25mdXNpb24gb2YgPEYxPiBiZWluZyAweGYxIG9yCiAqIGZ1bmN0aW9uIGtleSAxLgogKi8KICAgIHN0YXRpYyB1bnNpZ25lZApucjJoZXgoYykKICAgIHVuc2lnbmVkCWM7CnsKICAgIGlmICgoYyAmIDB4ZikgPD0gOSkKCXJldHVybiAoYyAmIDB4ZikgKyAnMCc7CiAgICByZXR1cm4gKGMgJiAweGYpIC0gMTAgKyAnYSc7Cn0KCi8qCiAqIFJldHVybiBudW1iZXIgb2YgZGlzcGxheSBjZWxscyBvY2N1cGllZCBieSBieXRlICJiIi4KICogQ2FsbGVyIG11c3QgbWFrZSBzdXJlIDAgPD0gYiA8PSAyNTUuCiAqIEZvciBtdWx0aS1ieXRlIG1vZGUgImIiIG11c3QgYmUgdGhlIGZpcnN0IGJ5dGUgb2YgYSBjaGFyYWN0ZXIuCiAqIEEgVEFCIGlzIGNvdW50ZWQgYXMgdHdvIGNlbGxzOiAiXkkiLgogKiBGb3IgVVRGLTggbW9kZSB0aGlzIHdpbGwgcmV0dXJuIDAgZm9yIGJ5dGVzID49IDB4ODAsIGJlY2F1c2UgdGhlIG51bWJlciBvZgogKiBjZWxscyBkZXBlbmRzIG9uIGZ1cnRoZXIgYnl0ZXMuCiAqLwogICAgaW50CmJ5dGUyY2VsbHMoYikKICAgIGludAkJYjsKewojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGVuY191dGY4ICYmIGIgPj0gMHg4MCkKCXJldHVybiAwOwojZW5kaWYKICAgIHJldHVybiAoY2hhcnRhYltiXSAmIENUX0NFTExfTUFTSyk7Cn0KCi8qCiAqIFJldHVybiBudW1iZXIgb2YgZGlzcGxheSBjZWxscyBvY2N1cGllZCBieSBjaGFyYWN0ZXIgImMiLgogKiAiYyIgY2FuIGJlIGEgc3BlY2lhbCBrZXkgKG5lZ2F0aXZlIG51bWJlcikgaW4gd2hpY2ggY2FzZSAzIG9yIDQgaXMgcmV0dXJuZWQuCiAqIEEgVEFCIGlzIGNvdW50ZWQgYXMgdHdvIGNlbGxzOiAiXkkiIG9yIGZvdXI6ICI8MDk+Ii4KICovCiAgICBpbnQKY2hhcjJjZWxscyhjKQogICAgaW50CQljOwp7CiAgICBpZiAoSVNfU1BFQ0lBTChjKSkKCXJldHVybiBjaGFyMmNlbGxzKEtfU0VDT05EKGMpKSArIDI7CiNpZmRlZiBGRUFUX01CWVRFCiAgICBpZiAoYyA+PSAweDgwKQogICAgewoJLyogVVRGLTg6IGFib3ZlIDB4ODAgbmVlZCB0byBjaGVjayB0aGUgdmFsdWUgKi8KCWlmIChlbmNfdXRmOCkKCSAgICByZXR1cm4gdXRmX2NoYXIyY2VsbHMoYyk7CgkvKiBEQkNTOiBkb3VibGUtYnl0ZSBtZWFucyBkb3VibGUtd2lkdGgsIGV4Y2VwdCBmb3IgZXVjLWpwIHdpdGggZmlyc3QKCSAqIGJ5dGUgMHg4ZSAqLwoJaWYgKGVuY19kYmNzICE9IDAgJiYgYyA+PSAweDEwMCkKCXsKCSAgICBpZiAoZW5jX2RiY3MgPT0gREJDU19KUE5VICYmICgodW5zaWduZWQpYyA+PiA4KSA9PSAweDhlKQoJCXJldHVybiAxOwoJICAgIHJldHVybiAyOwoJfQogICAgfQojZW5kaWYKICAgIHJldHVybiAoY2hhcnRhYltjICYgMHhmZl0gJiBDVF9DRUxMX01BU0spOwp9CgovKgogKiBSZXR1cm4gbnVtYmVyIG9mIGRpc3BsYXkgY2VsbHMgb2NjdXBpZWQgYnkgY2hhcmFjdGVyIGF0ICIqcCIuCiAqIEEgVEFCIGlzIGNvdW50ZWQgYXMgdHdvIGNlbGxzOiAiXkkiIG9yIGZvdXI6ICI8MDk+Ii4KICovCiAgICBpbnQKcHRyMmNlbGxzKHApCiAgICBjaGFyX3UJKnA7CnsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIC8qIEZvciBVVEYtOCB3ZSBuZWVkIHRvIGxvb2sgYXQgbW9yZSBieXRlcyBpZiB0aGUgZmlyc3QgYnl0ZSBpcyA+PSAweDgwLiAqLwogICAgaWYgKGVuY191dGY4ICYmICpwID49IDB4ODApCglyZXR1cm4gdXRmX3B0cjJjZWxscyhwKTsKICAgIC8qIEZvciBEQkNTIHdlIGNhbiB0ZWxsIHRoZSBjZWxsIGNvdW50IGZyb20gdGhlIGZpcnN0IGJ5dGUuICovCiNlbmRpZgogICAgcmV0dXJuIChjaGFydGFiWypwXSAmIENUX0NFTExfTUFTSyk7Cn0KCi8qCiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc3RyaW5nICJzIiB3aWxsIHRha2Ugb24gdGhlIHNjcmVlbiwKICogY291bnRpbmcgVEFCcyBhcyB0d28gY2hhcmFjdGVyczogIl5JIi4KICovCiAgICBpbnQKdmltX3N0cnNpemUocykKICAgIGNoYXJfdQkqczsKewogICAgcmV0dXJuIHZpbV9zdHJuc2l6ZShzLCAoaW50KU1BWENPTCk7Cn0KCi8qCiAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgc3RyaW5nICJzW2xlbl0iIHdpbGwgdGFrZSBvbiB0aGUgc2NyZWVuLAogKiBjb3VudGluZyBUQUJzIGFzIHR3byBjaGFyYWN0ZXJzOiAiXkkiLgogKi8KICAgIGludAp2aW1fc3RybnNpemUocywgbGVuKQogICAgY2hhcl91CSpzOwogICAgaW50CQlsZW47CnsKICAgIGludAkJc2l6ZSA9IDA7CgogICAgd2hpbGUgKCpzICE9IE5VTCAmJiAtLWxlbiA+PSAwKQogICAgewojaWZkZWYgRkVBVF9NQllURQoJaWYgKGhhc19tYnl0ZSkKCXsKCSAgICBpbnQJICAgIGwgPSAoKm1iX3B0cjJsZW4pKHMpOwoKCSAgICBzaXplICs9IHB0cjJjZWxscyhzKTsKCSAgICBzICs9IGw7CgkgICAgbGVuIC09IGwgLSAxOwoJfQoJZWxzZQojZW5kaWYKCSAgICBzaXplICs9IGJ5dGUyY2VsbHMoKnMrKyk7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKfQoKLyoKICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyAnYycgd2lsbCB0YWtlIG9uIHRoZSBzY3JlZW4sIHRha2luZwogKiBpbnRvIGFjY291bnQgdGhlIHNpemUgb2YgYSB0YWIuCiAqIFVzZSBhIGRlZmluZSB0byBtYWtlIGl0IGZhc3QsIHRoaXMgaXMgdXNlZCB2ZXJ5IG9mdGVuISEhCiAqIEFsc28gc2VlIGdldHZjb2woKSBiZWxvdy4KICovCgojZGVmaW5lIFJFVF9XSU5fQlVGX0NIQVJUQUJTSVpFKHdwLCBidWYsIHAsIGNvbCkgXAogICAgaWYgKCoocCkgPT0gVEFCICYmICghKHdwKS0+d19wX2xpc3QgfHwgbGNzX3RhYjEpKSBcCiAgICB7IFwKCWludCB0czsgXAoJdHMgPSAoYnVmKS0+Yl9wX3RzOyBcCglyZXR1cm4gKGludCkodHMgLSAoY29sICUgdHMpKTsgXAogICAgfSBcCiAgICBlbHNlIFwKCXJldHVybiBwdHIyY2VsbHMocCk7CgojaWYgZGVmaW5lZChGRUFUX1ZSRVBMQUNFKSB8fCBkZWZpbmVkKEZFQVRfRVhfRVhUUkEpIHx8IGRlZmluZWQoRkVBVF9HVUkpIFwKCXx8IGRlZmluZWQoRkVBVF9WSVJUVUFMRURJVCkgfHwgZGVmaW5lZChQUk9UTykKICAgIGludApjaGFydGFic2l6ZShwLCBjb2wpCiAgICBjaGFyX3UJKnA7CiAgICBjb2xucl9UCWNvbDsKewogICAgUkVUX1dJTl9CVUZfQ0hBUlRBQlNJWkUoY3Vyd2luLCBjdXJidWYsIHAsIGNvbCkKfQojZW5kaWYKCiNpZmRlZiBGRUFUX0xJTkVCUkVBSwogICAgc3RhdGljIGludAp3aW5fY2hhcnRhYnNpemUod3AsIHAsIGNvbCkKICAgIHdpbl9UCSp3cDsKICAgIGNoYXJfdQkqcDsKICAgIGNvbG5yX1QJY29sOwp7CiAgICBSRVRfV0lOX0JVRl9DSEFSVEFCU0laRSh3cCwgd3AtPndfYnVmZmVyLCBwLCBjb2wpCn0KI2VuZGlmCgovKgogKiBSZXR1cm4gdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoZSBzdHJpbmcgJ3MnIHdpbGwgdGFrZSBvbiB0aGUgc2NyZWVuLAogKiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIGEgdGFiLgogKi8KICAgIGludApsaW5ldGFic2l6ZShzKQogICAgY2hhcl91CSpzOwp7CiAgICByZXR1cm4gbGluZXRhYnNpemVfY29sKDAsIHMpOwp9CgovKgogKiBMaWtlIGxpbmV0YWJzaXplKCksIGJ1dCBzdGFydGluZyBhdCBjb2x1bW4gInN0YXJ0Y29sIi4KICovCiAgICBpbnQKbGluZXRhYnNpemVfY29sKHN0YXJ0Y29sLCBzKQogICAgaW50CQlzdGFydGNvbDsKICAgIGNoYXJfdQkqczsKewogICAgY29sbnJfVAljb2wgPSBzdGFydGNvbDsKCiAgICB3aGlsZSAoKnMgIT0gTlVMKQoJY29sICs9IGxicl9jaGFydGFic2l6ZV9hZHYoJnMsIGNvbCk7CiAgICByZXR1cm4gKGludCljb2w7Cn0KCi8qCiAqIExpa2UgbGluZXRhYnNpemUoKSwgYnV0IGZvciBhIGdpdmVuIHdpbmRvdyBpbnN0ZWFkIG9mIHRoZSBjdXJyZW50IG9uZS4KICovCiAgICBpbnQKd2luX2xpbmV0YWJzaXplKHdwLCBwLCBsZW4pCiAgICB3aW5fVAkqd3A7CiAgICBjaGFyX3UJKnA7CiAgICBjb2xucl9UCWxlbjsKewogICAgY29sbnJfVAljb2wgPSAwOwogICAgY2hhcl91CSpzOwoKICAgIGZvciAocyA9IHA7ICpzICE9IE5VTCAmJiAobGVuID09IE1BWENPTCB8fCBzIDwgcCArIGxlbik7IG1iX3B0cl9hZHYocykpCgljb2wgKz0gd2luX2xicl9jaGFydGFic2l6ZSh3cCwgcywgY29sLCBOVUxMKTsKICAgIHJldHVybiAoaW50KWNvbDsKfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgJ2MnIGlzIGEgbm9ybWFsIGlkZW50aWZpZXIgY2hhcmFjdGVyOgogKiBMZXR0ZXJzIGFuZCBjaGFyYWN0ZXJzIGZyb20gdGhlICdpc2lkZW50JyBvcHRpb24uCiAqLwogICAgaW50CnZpbV9pc0lEYyhjKQogICAgaW50IGM7CnsKICAgIHJldHVybiAoYyA+IDAgJiYgYyA8IDB4MTAwICYmIChjaGFydGFiW2NdICYgQ1RfSURfQ0hBUikpOwp9CgovKgogKiByZXR1cm4gVFJVRSBpZiAnYycgaXMgYSBrZXl3b3JkIGNoYXJhY3RlcjogTGV0dGVycyBhbmQgY2hhcmFjdGVycyBmcm9tCiAqICdpc2tleXdvcmQnIG9wdGlvbiBmb3IgY3VycmVudCBidWZmZXIuCiAqIEZvciBtdWx0aS1ieXRlIGNoYXJhY3RlcnMgbWJfZ2V0X2NsYXNzKCkgaXMgdXNlZCAoYnVpbHRpbiBydWxlcykuCiAqLwogICAgaW50CnZpbV9pc3dvcmRjKGMpCiAgICBpbnQgYzsKewojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGMgPj0gMHgxMDApCiAgICB7CglpZiAoZW5jX2RiY3MgIT0gMCkKCSAgICByZXR1cm4gZGJjc19jbGFzcygodW5zaWduZWQpYyA+PiA4LCAodW5zaWduZWQpKGMgJiAweGZmKSkgPj0gMjsKCWlmIChlbmNfdXRmOCkKCSAgICByZXR1cm4gdXRmX2NsYXNzKGMpID49IDI7CiAgICB9CiNlbmRpZgogICAgcmV0dXJuIChjID4gMCAmJiBjIDwgMHgxMDAgJiYgR0VUX0NIQVJUQUIoY3VyYnVmLCBjKSAhPSAwKTsKfQoKLyoKICogSnVzdCBsaWtlIHZpbV9pc3dvcmRjKCkgYnV0IHVzZXMgYSBwb2ludGVyIHRvIHRoZSAobXVsdGktYnl0ZSkgY2hhcmFjdGVyLgogKi8KICAgIGludAp2aW1faXN3b3JkcChwKQogICAgY2hhcl91ICpwOwp7CiNpZmRlZiBGRUFUX01CWVRFCiAgICBpZiAoaGFzX21ieXRlICYmIE1CX0JZVEUyTEVOKCpwKSA+IDEpCglyZXR1cm4gbWJfZ2V0X2NsYXNzKHApID49IDI7CiNlbmRpZgogICAgcmV0dXJuIEdFVF9DSEFSVEFCKGN1cmJ1ZiwgKnApICE9IDA7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfU1lOX0hMKSB8fCBkZWZpbmVkKFBST1RPKQogICAgaW50CnZpbV9pc3dvcmRjX2J1ZihwLCBidWYpCiAgICBjaGFyX3UJKnA7CiAgICBidWZfVAkqYnVmOwp7CiMgaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGhhc19tYnl0ZSAmJiBNQl9CWVRFMkxFTigqcCkgPiAxKQoJcmV0dXJuIG1iX2dldF9jbGFzcyhwKSA+PSAyOwojIGVuZGlmCiAgICByZXR1cm4gKEdFVF9DSEFSVEFCKGJ1ZiwgKnApICE9IDApOwp9CiNlbmRpZgoKLyoKICogcmV0dXJuIFRSVUUgaWYgJ2MnIGlzIGEgdmFsaWQgZmlsZS1uYW1lIGNoYXJhY3RlcgogKiBBc3N1bWUgY2hhcmFjdGVycyBhYm92ZSAweDEwMCBhcmUgdmFsaWQgKG11bHRpLWJ5dGUpLgogKi8KICAgIGludAp2aW1faXNmaWxlYyhjKQogICAgaW50CWM7CnsKICAgIHJldHVybiAoYyA+PSAweDEwMCB8fCAoYyA+IDAgJiYgKGNoYXJ0YWJbY10gJiBDVF9GTkFNRV9DSEFSKSkpOwp9CgovKgogKiByZXR1cm4gVFJVRSBpZiAnYycgaXMgYSB2YWxpZCBmaWxlLW5hbWUgY2hhcmFjdGVyIG9yIGEgd2lsZGNhcmQgY2hhcmFjdGVyCiAqIEFzc3VtZSBjaGFyYWN0ZXJzIGFib3ZlIDB4MTAwIGFyZSB2YWxpZCAobXVsdGktYnl0ZSkuCiAqIEV4cGxpY2l0bHkgaW50ZXJwcmV0ICddJyBhcyBhIHdpbGRjYXJkIGNoYXJhY3RlciBhcyBtY2hfaGFzX3dpbGRjYXJkKCJdIikKICogcmV0dXJucyBmYWxzZS4KICovCiAgICBpbnQKdmltX2lzZmlsZWNfb3Jfd2MoYykKICAgIGludCBjOwp7CiAgICBjaGFyX3UgYnVmWzJdOwoKICAgIGJ1ZlswXSA9IChjaGFyX3UpYzsKICAgIGJ1ZlsxXSA9IE5VTDsKICAgIHJldHVybiB2aW1faXNmaWxlYyhjKSB8fCBjID09ICddJyB8fCBtY2hfaGFzX3dpbGRjYXJkKGJ1Zik7Cn0KCi8qCiAqIHJldHVybiBUUlVFIGlmICdjJyBpcyBhIHByaW50YWJsZSBjaGFyYWN0ZXIKICogQXNzdW1lIGNoYXJhY3RlcnMgYWJvdmUgMHgxMDAgYXJlIHByaW50YWJsZSAobXVsdGktYnl0ZSksIGV4Y2VwdCBmb3IKICogVW5pY29kZS4KICovCiAgICBpbnQKdmltX2lzcHJpbnRjKGMpCiAgICBpbnQgYzsKewojaWZkZWYgRkVBVF9NQllURQogICAgaWYgKGVuY191dGY4ICYmIGMgPj0gMHgxMDApCglyZXR1cm4gdXRmX3ByaW50YWJsZShjKTsKI2VuZGlmCiAgICByZXR1cm4gKGMgPj0gMHgxMDAgfHwgKGMgPiAwICYmIChjaGFydGFiW2NdICYgQ1RfUFJJTlRfQ0hBUikpKTsKfQoKLyoKICogU3RyaWN0IHZlcnNpb24gb2YgdmltX2lzcHJpbnRjKGMpLCBkb24ndCByZXR1cm4gVFJVRSBpZiAiYyIgaXMgdGhlIGhlYWQKICogYnl0ZSBvZiBhIGRvdWJsZS1ieXRlIGNoYXJhY3Rlci4KICovCiAgICBpbnQKdmltX2lzcHJpbnRjX3N0cmljdChjKQogICAgaW50CWM7CnsKI2lmZGVmIEZFQVRfTUJZVEUKICAgIGlmIChlbmNfZGJjcyAhPSAwICYmIGMgPCAweDEwMCAmJiBNQl9CWVRFMkxFTihjKSA+IDEpCglyZXR1cm4gRkFMU0U7CiAgICBpZiAoZW5jX3V0ZjggJiYgYyA+PSAweDEwMCkKCXJldHVybiB1dGZfcHJpbnRhYmxlKGMpOwojZW5kaWYKICAgIHJldHVybiAoYyA+PSAweDEwMCB8fCAoYyA+IDAgJiYgKGNoYXJ0YWJbY10gJiBDVF9QUklOVF9DSEFSKSkpOwp9CgovKgogKiBsaWtlIGNoYXJ0YWJzaXplKCksIGJ1dCBhbHNvIGNoZWNrIGZvciBsaW5lIGJyZWFrcyBvbiB0aGUgc2NyZWVuCiAqLwogICAgaW50Cmxicl9jaGFydGFic2l6ZShzLCBjb2wpCiAgICB1bnNpZ25lZCBjaGFyCSpzOwogICAgY29sbnJfVAkJY29sOwp7CiNpZmRlZiBGRUFUX0xJTkVCUkVBSwogICAgaWYgKCFjdXJ3aW4tPndfcF9sYnIgJiYgKnBfc2JyID09IE5VTCkKICAgIHsKI2VuZGlmCiNpZmRlZiBGRUFUX01CWVRFCglpZiAoY3Vyd2luLT53X3Bfd3JhcCkKCSAgICByZXR1cm4gd2luX25vbGJyX2NoYXJ0YWJzaXplKGN1cndpbiwgcywgY29sLCBOVUxMKTsKI2VuZGlmCglSRVRfV0lOX0JVRl9DSEFSVEFCU0laRShjdXJ3aW4sIGN1cmJ1ZiwgcywgY29sKQojaWZkZWYgRkVBVF9MSU5FQlJFQUsKICAgIH0KICAgIHJldHVybiB3aW5fbGJyX2NoYXJ0YWJzaXplKGN1cndpbiwgcywgY29sLCBOVUxMKTsKI2VuZGlmCn0KCi8qCiAqIENhbGwgbGJyX2NoYXJ0YWJzaXplKCkgYW5kIGFkdmFuY2UgdGhlIHBvaW50ZXIuCiAqLwogICAgaW50Cmxicl9jaGFydGFic2l6ZV9hZHYocywgY29sKQogICAgY2hhcl91CSoqczsKICAgIGNvbG5yX1QJY29sOwp7CiAgICBpbnQJCXJldHZhbDsKCiAgICByZXR2YWwgPSBsYnJfY2hhcnRhYnNpemUoKnMsIGNvbCk7CiAgICBtYl9wdHJfYWR2KCpzKTsKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB2ZXJ5IG9mdGVuLCBrZWVwIGl0IGZhc3QhISEhCiAqCiAqIElmICJoZWFkcCIgbm90IE5VTEwsIHNldCAqaGVhZHAgdG8gdGhlIHNpemUgb2Ygd2hhdCB3ZSBmb3IgJ3Nob3dicmVhaycKICogc3RyaW5nIGF0IHN0YXJ0IG9mIGxpbmUuICBXYXJuaW5nOiAqaGVhZHAgaXMgb25seSBzZXQgaWYgaXQncyBhIG5vbi16ZXJvCiAqIHZhbHVlLCBpbml0IHRvIDAgYmVmb3JlIGNhbGxpbmcuCiAqLwogICAgaW50Cndpbl9sYnJfY2hhcnRhYnNpemUod3AsIHMsIGNvbCwgaGVhZHApCiAgICB3aW5fVAkqd3A7CiAgICBjaGFyX3UJKnM7CiAgICBjb2xucl9UCWNvbDsKICAgIGludAkJKmhlYWRwIFVOVVNFRDsKewojaWZkZWYgRkVBVF9MSU5FQlJFQUsKICAgIGludAkJYzsKICAgIGludAkJc2l6ZTsKICAgIGNvbG5yX1QJY29sMjsKICAgIGNvbG5yX1QJY29sbWF4OwogICAgaW50CQlhZGRlZDsKIyBpZmRlZiBGRUFUX01CWVRFCiAgICBpbnQJCW1iX2FkZGVkID0gMDsKIyBlbHNlCiMgIGRlZmluZSBtYl9hZGRlZCAwCiMgZW5kaWYKICAgIGludAkJbnVtYmVyZXh0cmE7CiAgICBjaGFyX3UJKnBzOwogICAgaW50CQl0YWJfY29yciA9ICgqcyA9PSBUQUIpOwogICAgaW50CQluOwoKICAgIC8qCiAgICAgKiBObyAnbGluZWJyZWFrJyBhbmQgJ3Nob3dicmVhayc6IHJldHVybiBxdWlja2x5LgogICAgICovCiAgICBpZiAoIXdwLT53X3BfbGJyICYmICpwX3NiciA9PSBOVUwpCiNlbmRpZgogICAgewojaWZkZWYgRkVBVF9NQllURQoJaWYgKHdwLT53X3Bfd3JhcCkKCSAgICByZXR1cm4gd2luX25vbGJyX2NoYXJ0YWJzaXplKHdwLCBzLCBjb2wsIGhlYWRwKTsKI2VuZGlmCglSRVRfV0lOX0JVRl9DSEFSVEFCU0laRSh3cCwgd3AtPndfYnVmZmVyLCBzLCBjb2wpCiAgICB9CgojaWZkZWYgRkVBVF9MSU5FQlJFQUsKICAgIC8qCiAgICAgKiBGaXJzdCBnZXQgbm9ybWFsIHNpemUsIHdpdGhvdXQgJ2xpbmVicmVhaycKICAgICAqLwogICAgc2l6ZSA9IHdpbl9jaGFydGFic2l6ZSh3cCwgcywgY29sKTsKICAgIGMgPSAqczsKCiAgICAvKgogICAgICogSWYgJ2xpbmVicmVhaycgc2V0IGNoZWNrIGF0IGEgYmxhbmsgYmVmb3JlIGEgbm9uLWJsYW5rIGlmIHRoZSBsaW5lCiAgICAgKiBuZWVkcyBhIGJyZWFrIGhlcmUKICAgICAqLwogICAgaWYgKHdwLT53X3BfbGJyCgkgICAgJiYgdmltX2lzYnJlYWsoYykKCSAgICAmJiAhdmltX2lzYnJlYWsoc1sxXSkKCSAgICAmJiAhd3AtPndfcF9saXN0CgkgICAgJiYgd3AtPndfcF93cmFwCiMgaWZkZWYgRkVBVF9WRVJUU1BMSVQKCSAgICAmJiB3cC0+d193aWR0aCAhPSAwCiMgZW5kaWYKICAgICAgICkKICAgIHsKCS8qCgkgKiBDb3VudCBhbGwgY2hhcmFjdGVycyBmcm9tIGZpcnN0IG5vbi1ibGFuayBhZnRlciBhIGJsYW5rIHVwIHRvIG5leHQKCSAqIG5vbi1ibGFuayBhZnRlciBhIGJsYW5rLgoJICovCgludW1iZXJleHRyYSA9IHdpbl9jb2xfb2ZmKHdwKTsKCWNvbDIgPSBjb2w7Cgljb2xtYXggPSAoY29sbnJfVCkoV19XSURUSCh3cCkgLSBudW1iZXJleHRyYSk7CglpZiAoY29sID49IGNvbG1heCkKCXsKCSAgICBuID0gY29sbWF4ICsgd2luX2NvbF9vZmYyKHdwKTsKCSAgICBpZiAobiA+IDApCgkJY29sbWF4ICs9ICgoKGNvbCAtIGNvbG1heCkgLyBuKSArIDEpICogbjsKCX0KCglmb3IgKDs7KQoJewoJICAgIHBzID0gczsKCSAgICBtYl9wdHJfYWR2KHMpOwoJICAgIGMgPSAqczsKCSAgICBpZiAoIShjICE9IE5VTAoJCSAgICAmJiAodmltX2lzYnJlYWsoYykKCQkJfHwgKCF2aW1faXNicmVhayhjKQoJCQkgICAgJiYgKGNvbDIgPT0gY29sIHx8ICF2aW1faXNicmVhaygqcHMpKSkpKSkKCQlicmVhazsKCgkgICAgY29sMiArPSB3aW5fY2hhcnRhYnNpemUod3AsIHMsIGNvbDIpOwoJICAgIGlmIChjb2wyID49IGNvbG1heCkJCS8qIGRvZXNuJ3QgZml0ICovCgkgICAgewoJCXNpemUgPSBjb2xtYXggLSBjb2w7CgkJdGFiX2NvcnIgPSBGQUxTRTsKCQlicmVhazsKCSAgICB9Cgl9CiAgICB9CiMgaWZkZWYgRkVBVF9NQllURQogICAgZWxzZSBpZiAoaGFzX21ieXRlICYmIHNpemUgPT0gMiAmJiBNQl9CWVRFMkxFTigqcykgPiAxCgkJCQkgICAgJiYgd3AtPndfcF93cmFwICYmIGluX3dpbl9ib3JkZXIod3AsIGNvbCkpCiAgICB7CgkrK3NpemU7CQkvKiBDb3VudCB0aGUgIj4iIGluIHRoZSBsYXN0IGNvbHVtbi4gKi8KCW1iX2FkZGVkID0gMTsKICAgIH0KIyBlbmRpZgoKICAgIC8qCiAgICAgKiBNYXkgaGF2ZSB0byBhZGQgc29tZXRoaW5nIGZvciAnc2hvd2JyZWFrJyBzdHJpbmcgYXQgc3RhcnQgb2YgbGluZQogICAgICogU2V0ICpoZWFkcCB0byB0aGUgc2l6ZSBvZiB3aGF0IHdlIGFkZC4KICAgICAqLwogICAgYWRkZWQgPSAwOwogICAgaWYgKCpwX3NiciAhPSBOVUwgJiYgd3AtPndfcF93cmFwICYmIGNvbCAhPSAwKQogICAgewoJbnVtYmVyZXh0cmEgPSB3aW5fY29sX29mZih3cCk7Cgljb2wgKz0gbnVtYmVyZXh0cmEgKyBtYl9hZGRlZDsKCWlmIChjb2wgPj0gKGNvbG5yX1QpV19XSURUSCh3cCkpCgl7CgkgICAgY29sIC09IFdfV0lEVEgod3ApOwoJICAgIG51bWJlcmV4dHJhID0gV19XSURUSCh3cCkgLSAobnVtYmVyZXh0cmEgLSB3aW5fY29sX29mZjIod3ApKTsKCSAgICBpZiAobnVtYmVyZXh0cmEgPiAwKQoJCWNvbCA9IGNvbCAlIG51bWJlcmV4dHJhOwoJfQoJaWYgKGNvbCA9PSAwIHx8IGNvbCArIHNpemUgPiAoY29sbnJfVClXX1dJRFRIKHdwKSkKCXsKCSAgICBhZGRlZCA9IHZpbV9zdHJzaXplKHBfc2JyKTsKCSAgICBpZiAodGFiX2NvcnIpCgkJc2l6ZSArPSAoYWRkZWQgLyB3cC0+d19idWZmZXItPmJfcF90cykgKiB3cC0+d19idWZmZXItPmJfcF90czsKCSAgICBlbHNlCgkJc2l6ZSArPSBhZGRlZDsKCSAgICBpZiAoY29sICE9IDApCgkJYWRkZWQgPSAwOwoJfQogICAgfQogICAgaWYgKGhlYWRwICE9IE5VTEwpCgkqaGVhZHAgPSBhZGRlZCArIG1iX2FkZGVkOwogICAgcmV0dXJuIHNpemU7CiNlbmRpZgp9CgojaWYgZGVmaW5lZChGRUFUX01CWVRFKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBMaWtlIHdpbl9sYnJfY2hhcnRhYnNpemUoKSwgZXhjZXB0IHRoYXQgd2Uga25vdyAnbGluZWJyZWFrJyBpcyBvZmYgYW5kCiAqICd3cmFwJyBpcyBvbi4gIFRoaXMgbWVhbnMgd2UgbmVlZCB0byBjaGVjayBmb3IgYSBkb3VibGUtYnl0ZSBjaGFyYWN0ZXIgdGhhdAogKiBkb2Vzbid0IGZpdCBhdCB0aGUgZW5kIG9mIHRoZSBzY3JlZW4gbGluZS4KICovCiAgICBzdGF0aWMgaW50Cndpbl9ub2xicl9jaGFydGFic2l6ZSh3cCwgcywgY29sLCBoZWFkcCkKICAgIHdpbl9UCSp3cDsKICAgIGNoYXJfdQkqczsKICAgIGNvbG5yX1QJY29sOwogICAgaW50CQkqaGVhZHA7CnsKICAgIGludAkJbjsKCiAgICBpZiAoKnMgPT0gVEFCICYmICghd3AtPndfcF9saXN0IHx8IGxjc190YWIxKSkKICAgIHsKCW4gPSB3cC0+d19idWZmZXItPmJfcF90czsKCXJldHVybiAoaW50KShuIC0gKGNvbCAlIG4pKTsKICAgIH0KICAgIG4gPSBwdHIyY2VsbHMocyk7CiAgICAvKiBBZGQgb25lIGNlbGwgZm9yIGEgZG91YmxlLXdpZHRoIGNoYXJhY3RlciBpbiB0aGUgbGFzdCBjb2x1bW4gb2YgdGhlCiAgICAgKiB3aW5kb3csIGRpc3BsYXllZCB3aXRoIGEgIj4iLiAqLwogICAgaWYgKG4gPT0gMiAmJiBNQl9CWVRFMkxFTigqcykgPiAxICYmIGluX3dpbl9ib3JkZXIod3AsIGNvbCkpCiAgICB7CglpZiAoaGVhZHAgIT0gTlVMTCkKCSAgICAqaGVhZHAgPSAxOwoJcmV0dXJuIDM7CiAgICB9CiAgICByZXR1cm4gbjsKfQoKLyoKICogUmV0dXJuIFRSVUUgaWYgdmlydHVhbCBjb2x1bW4gInZjb2wiIGlzIGluIHRoZSByaWdodG1vc3QgY29sdW1uIG9mIHdpbmRvdwogKiAid3AiLgogKi8KICAgIGludAppbl93aW5fYm9yZGVyKHdwLCB2Y29sKQogICAgd2luX1QJKndwOwogICAgY29sbnJfVAl2Y29sOwp7CiAgICBpbnQJCXdpZHRoMTsJCS8qIHdpZHRoIG9mIGZpcnN0IGxpbmUgKGFmdGVyIGxpbmUgbnVtYmVyKSAqLwogICAgaW50CQl3aWR0aDI7CQkvKiB3aWR0aCBvZiBmdXJ0aGVyIGxpbmVzICovCgojaWZkZWYgRkVBVF9WRVJUU1BMSVQKICAgIGlmICh3cC0+d193aWR0aCA9PSAwKQkvKiB0aGVyZSBpcyBubyBib3JkZXIgKi8KCXJldHVybiBGQUxTRTsKI2VuZGlmCiAgICB3aWR0aDEgPSBXX1dJRFRIKHdwKSAtIHdpbl9jb2xfb2ZmKHdwKTsKICAgIGlmICgoaW50KXZjb2wgPCB3aWR0aDEgLSAxKQoJcmV0dXJuIEZBTFNFOwogICAgaWYgKChpbnQpdmNvbCA9PSB3aWR0aDEgLSAxKQoJcmV0dXJuIFRSVUU7CiAgICB3aWR0aDIgPSB3aWR0aDEgKyB3aW5fY29sX29mZjIod3ApOwogICAgaWYgKHdpZHRoMiA8PSAwKQoJcmV0dXJuIEZBTFNFOwogICAgcmV0dXJuICgodmNvbCAtIHdpZHRoMSkgJSB3aWR0aDIgPT0gd2lkdGgyIC0gMSk7Cn0KI2VuZGlmIC8qIEZFQVRfTUJZVEUgKi8KCi8qCiAqIEdldCB2aXJ0dWFsIGNvbHVtbiBudW1iZXIgb2YgcG9zLgogKiAgc3RhcnQ6IG9uIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiB0aGlzIGNoYXJhY3RlciAoVEFCLCBjdHJsKQogKiBjdXJzb3I6IHdoZXJlIHRoZSBjdXJzb3IgaXMgb24gdGhpcyBjaGFyYWN0ZXIgKGZpcnN0IGNoYXIsIGV4Y2VwdCBmb3IgVEFCKQogKiAgICBlbmQ6IG9uIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoaXMgY2hhcmFjdGVyIChUQUIsIGN0cmwpCiAqCiAqIFRoaXMgaXMgdXNlZCB2ZXJ5IG9mdGVuLCBrZWVwIGl0IGZhc3QhCiAqLwogICAgdm9pZApnZXR2Y29sKHdwLCBwb3MsIHN0YXJ0LCBjdXJzb3IsIGVuZCkKICAgIHdpbl9UCSp3cDsKICAgIHBvc19UCSpwb3M7CiAgICBjb2xucl9UCSpzdGFydDsKICAgIGNvbG5yX1QJKmN1cnNvcjsKICAgIGNvbG5yX1QJKmVuZDsKewogICAgY29sbnJfVAl2Y29sOwogICAgY2hhcl91CSpwdHI7CQkvKiBwb2ludHMgdG8gY3VycmVudCBjaGFyICovCiAgICBjaGFyX3UJKnBvc3B0cjsJLyogcG9pbnRzIHRvIGNoYXIgYXQgcG9zLT5jb2wgKi8KICAgIGludAkJaW5jcjsKICAgIGludAkJaGVhZDsKICAgIGludAkJdHMgPSB3cC0+d19idWZmZXItPmJfcF90czsKICAgIGludAkJYzsKCiAgICB2Y29sID0gMDsKICAgIHB0ciA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBwb3MtPmxudW0sIEZBTFNFKTsKICAgIGlmIChwb3MtPmNvbCA9PSBNQVhDT0wpCglwb3NwdHIgPSBOVUxMOyAgLyogY29udGludWUgdW50aWwgdGhlIE5VTCAqLwogICAgZWxzZQoJcG9zcHRyID0gcHRyICsgcG9zLT5jb2w7CgogICAgLyoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB2ZXJ5IG9mdGVuLCBkbyBzb21lIHNwZWVkIG9wdGltaXphdGlvbnMuCiAgICAgKiBXaGVuICdsaXN0JywgJ2xpbmVicmVhaycgYW5kICdzaG93YnJlYWsnIGFyZSBub3Qgc2V0IHVzZSBhIHNpbXBsZSBsb29wLgogICAgICogQWxzbyB1c2UgdGhpcyB3aGVuICdsaXN0JyBpcyBzZXQgYnV0IHRhYnMgdGFrZSB0aGVpciBub3JtYWwgc2l6ZS4KICAgICAqLwogICAgaWYgKCghd3AtPndfcF9saXN0IHx8IGxjc190YWIxICE9IE5VTCkKI2lmZGVmIEZFQVRfTElORUJSRUFLCgkgICAgJiYgIXdwLT53X3BfbGJyICYmICpwX3NiciA9PSBOVUwKI2VuZGlmCiAgICAgICApCiAgICB7CiNpZm5kZWYgRkVBVF9NQllURQoJaGVhZCA9IDA7CiNlbmRpZgoJZm9yICg7OykKCXsKI2lmZGVmIEZFQVRfTUJZVEUKCSAgICBoZWFkID0gMDsKI2VuZGlmCgkgICAgYyA9ICpwdHI7CgkgICAgLyogbWFrZSBzdXJlIHdlIGRvbid0IGdvIHBhc3QgdGhlIGVuZCBvZiB0aGUgbGluZSAqLwoJICAgIGlmIChjID09IE5VTCkKCSAgICB7CgkJaW5jciA9IDE7CS8qIE5VTCBhdCBlbmQgb2YgbGluZSBvbmx5IHRha2VzIG9uZSBjb2x1bW4gKi8KCQlicmVhazsKCSAgICB9CgkgICAgLyogQSB0YWIgZ2V0cyBleHBhbmRlZCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiAqLwoJICAgIGlmIChjID09IFRBQikKCQlpbmNyID0gdHMgLSAodmNvbCAlIHRzKTsKCSAgICBlbHNlCgkgICAgewojaWZkZWYgRkVBVF9NQllURQoJCWlmIChoYXNfbWJ5dGUpCgkJewoJCSAgICAvKiBGb3IgdXRmLTgsIGlmIHRoZSBieXRlIGlzID49IDB4ODAsIG5lZWQgdG8gbG9vayBhdAoJCSAgICAgKiBmdXJ0aGVyIGJ5dGVzIHRvIGZpbmQgdGhlIGNlbGwgd2lkdGguICovCgkJICAgIGlmIChlbmNfdXRmOCAmJiBjID49IDB4ODApCgkJCWluY3IgPSB1dGZfcHRyMmNlbGxzKHB0cik7CgkJICAgIGVsc2UKCQkJaW5jciA9IENIQVJTSVpFKGMpOwoKCQkgICAgLyogSWYgYSBkb3VibGUtY2VsbCBjaGFyIGRvZXNuJ3QgZml0IGF0IHRoZSBlbmQgb2YgYSBsaW5lCgkJICAgICAqIGl0IHdyYXBzIHRvIHRoZSBuZXh0IGxpbmUsIGl0J3MgbGlrZSB0aGlzIGNoYXIgaXMgdGhyZWUKCQkgICAgICogY2VsbHMgd2lkZS4gKi8KCQkgICAgaWYgKGluY3IgPT0gMiAmJiB3cC0+d19wX3dyYXAgJiYgTUJfQllURTJMRU4oKnB0cikgPiAxCgkJCSAgICAmJiBpbl93aW5fYm9yZGVyKHdwLCB2Y29sKSkKCQkgICAgewoJCQkrK2luY3I7CgkJCWhlYWQgPSAxOwoJCSAgICB9CgkJfQoJCWVsc2UKI2VuZGlmCgkJICAgIGluY3IgPSBDSEFSU0laRShjKTsKCSAgICB9CgoJICAgIGlmIChwb3NwdHIgIT0gTlVMTCAmJiBwdHIgPj0gcG9zcHRyKSAvKiBjaGFyYWN0ZXIgYXQgcG9zLT5jb2wgKi8KCQlicmVhazsKCgkgICAgdmNvbCArPSBpbmNyOwoJICAgIG1iX3B0cl9hZHYocHRyKTsKCX0KICAgIH0KICAgIGVsc2UKICAgIHsKCWZvciAoOzspCgl7CgkgICAgLyogQSB0YWIgZ2V0cyBleHBhbmRlZCwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IGNvbHVtbiAqLwoJICAgIGhlYWQgPSAwOwoJICAgIGluY3IgPSB3aW5fbGJyX2NoYXJ0YWJzaXplKHdwLCBwdHIsIHZjb2wsICZoZWFkKTsKCSAgICAvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgZ28gcGFzdCB0aGUgZW5kIG9mIHRoZSBsaW5lICovCgkgICAgaWYgKCpwdHIgPT0gTlVMKQoJICAgIHsKCQlpbmNyID0gMTsJLyogTlVMIGF0IGVuZCBvZiBsaW5lIG9ubHkgdGFrZXMgb25lIGNvbHVtbiAqLwoJCWJyZWFrOwoJICAgIH0KCgkgICAgaWYgKHBvc3B0ciAhPSBOVUxMICYmIHB0ciA+PSBwb3NwdHIpIC8qIGNoYXJhY3RlciBhdCBwb3MtPmNvbCAqLwoJCWJyZWFrOwoKCSAgICB2Y29sICs9IGluY3I7CgkgICAgbWJfcHRyX2FkdihwdHIpOwoJfQogICAgfQogICAgaWYgKHN0YXJ0ICE9IE5VTEwpCgkqc3RhcnQgPSB2Y29sICsgaGVhZDsKICAgIGlmIChlbmQgIT0gTlVMTCkKCSplbmQgPSB2Y29sICsgaW5jciAtIDE7CiAgICBpZiAoY3Vyc29yICE9IE5VTEwpCiAgICB7CglpZiAoKnB0ciA9PSBUQUIKCQkmJiAoU3RhdGUgJiBOT1JNQUwpCgkJJiYgIXdwLT53X3BfbGlzdAoJCSYmICF2aXJ0dWFsX2FjdGl2ZSgpCiNpZmRlZiBGRUFUX1ZJU1VBTAoJCSYmICEoVklzdWFsX2FjdGl2ZQoJCQkJICAgJiYgKCpwX3NlbCA9PSAnZScgfHwgbHRvcmVxKCpwb3MsIFZJc3VhbCkpKQojZW5kaWYKCQkpCgkgICAgKmN1cnNvciA9IHZjb2wgKyBpbmNyIC0gMTsJICAgIC8qIGN1cnNvciBhdCBlbmQgKi8KCWVsc2UKCSAgICAqY3Vyc29yID0gdmNvbCArIGhlYWQ7CSAgICAvKiBjdXJzb3IgYXQgc3RhcnQgKi8KICAgIH0KfQoKLyoKICogR2V0IHZpcnR1YWwgY3Vyc29yIGNvbHVtbiBpbiB0aGUgY3VycmVudCB3aW5kb3csIHByZXRlbmRpbmcgJ2xpc3QnIGlzIG9mZi4KICovCiAgICBjb2xucl9UCmdldHZjb2xfbm9saXN0KHBvc3ApCiAgICBwb3NfVAkqcG9zcDsKewogICAgaW50CQlsaXN0X3NhdmUgPSBjdXJ3aW4tPndfcF9saXN0OwogICAgY29sbnJfVAl2Y29sOwoKICAgIGN1cndpbi0+d19wX2xpc3QgPSBGQUxTRTsKICAgIGdldHZjb2woY3Vyd2luLCBwb3NwLCBOVUxMLCAmdmNvbCwgTlVMTCk7CiAgICBjdXJ3aW4tPndfcF9saXN0ID0gbGlzdF9zYXZlOwogICAgcmV0dXJuIHZjb2w7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfVklSVFVBTEVESVQpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIEdldCB2aXJ0dWFsIGNvbHVtbiBpbiB2aXJ0dWFsIG1vZGUuCiAqLwogICAgdm9pZApnZXR2dmNvbCh3cCwgcG9zLCBzdGFydCwgY3Vyc29yLCBlbmQpCiAgICB3aW5fVAkqd3A7CiAgICBwb3NfVAkqcG9zOwogICAgY29sbnJfVAkqc3RhcnQ7CiAgICBjb2xucl9UCSpjdXJzb3I7CiAgICBjb2xucl9UCSplbmQ7CnsKICAgIGNvbG5yX1QJY29sOwogICAgY29sbnJfVAljb2xhZGQ7CiAgICBjb2xucl9UCWVuZGFkZDsKIyBpZmRlZiBGRUFUX01CWVRFCiAgICBjaGFyX3UJKnB0cjsKIyBlbmRpZgoKICAgIGlmICh2aXJ0dWFsX2FjdGl2ZSgpKQogICAgewoJLyogRm9yIHZpcnR1YWwgbW9kZSwgb25seSB3YW50IG9uZSB2YWx1ZSAqLwoJZ2V0dmNvbCh3cCwgcG9zLCAmY29sLCBOVUxMLCBOVUxMKTsKCgljb2xhZGQgPSBwb3MtPmNvbGFkZDsKCWVuZGFkZCA9IDA7CiMgaWZkZWYgRkVBVF9NQllURQoJLyogQ2Fubm90IHB1dCB0aGUgY3Vyc29yIG9uIHBhcnQgb2YgYSB3aWRlIGNoYXJhY3Rlci4gKi8KCXB0ciA9IG1sX2dldF9idWYod3AtPndfYnVmZmVyLCBwb3MtPmxudW0sIEZBTFNFKTsKCWlmIChwb3MtPmNvbCA8IChjb2xucl9UKVNUUkxFTihwdHIpKQoJewoJICAgIGludCBjID0gKCptYl9wdHIyY2hhcikocHRyICsgcG9zLT5jb2wpOwoKCSAgICBpZiAoYyAhPSBUQUIgJiYgdmltX2lzcHJpbnRjKGMpKQoJICAgIHsKCQllbmRhZGQgPSAoY29sbnJfVCkoY2hhcjJjZWxscyhjKSAtIDEpOwoJCWlmIChjb2xhZGQgPiBlbmRhZGQpCS8qIHBhc3QgZW5kIG9mIGxpbmUgKi8KCQkgICAgZW5kYWRkID0gMDsKCQllbHNlCgkJICAgIGNvbGFkZCA9IDA7CgkgICAgfQoJfQojIGVuZGlmCgljb2wgKz0gY29sYWRkOwoJaWYgKHN0YXJ0ICE9IE5VTEwpCgkgICAgKnN0YXJ0ID0gY29sOwoJaWYgKGN1cnNvciAhPSBOVUxMKQoJICAgICpjdXJzb3IgPSBjb2w7CglpZiAoZW5kICE9IE5VTEwpCgkgICAgKmVuZCA9IGNvbCArIGVuZGFkZDsKICAgIH0KICAgIGVsc2UKCWdldHZjb2wod3AsIHBvcywgc3RhcnQsIGN1cnNvciwgZW5kKTsKfQojZW5kaWYKCiNpZiBkZWZpbmVkKEZFQVRfVklTVUFMKSB8fCBkZWZpbmVkKFBST1RPKQovKgogKiBHZXQgdGhlIGxlZnRtb3N0IGFuZCByaWdodG1vc3QgdmlydHVhbCBjb2x1bW4gb2YgcG9zMSBhbmQgcG9zMi4KICogVXNlZCBmb3IgVmlzdWFsIGJsb2NrIG1vZGUuCiAqLwogICAgdm9pZApnZXR2Y29scyh3cCwgcG9zMSwgcG9zMiwgbGVmdCwgcmlnaHQpCiAgICB3aW5fVAkqd3A7CiAgICBwb3NfVAkqcG9zMSwgKnBvczI7CiAgICBjb2xucl9UCSpsZWZ0LCAqcmlnaHQ7CnsKICAgIGNvbG5yX1QJZnJvbTEsIGZyb20yLCB0bzEsIHRvMjsKCiAgICBpZiAobHRwKHBvczEsIHBvczIpKQogICAgewoJZ2V0dnZjb2wod3AsIHBvczEsICZmcm9tMSwgTlVMTCwgJnRvMSk7CglnZXR2dmNvbCh3cCwgcG9zMiwgJmZyb20yLCBOVUxMLCAmdG8yKTsKICAgIH0KICAgIGVsc2UKICAgIHsKCWdldHZ2Y29sKHdwLCBwb3MyLCAmZnJvbTEsIE5VTEwsICZ0bzEpOwoJZ2V0dnZjb2wod3AsIHBvczEsICZmcm9tMiwgTlVMTCwgJnRvMik7CiAgICB9CiAgICBpZiAoZnJvbTIgPCBmcm9tMSkKCSpsZWZ0ID0gZnJvbTI7CiAgICBlbHNlCgkqbGVmdCA9IGZyb20xOwogICAgaWYgKHRvMiA+IHRvMSkKICAgIHsKCWlmICgqcF9zZWwgPT0gJ2UnICYmIGZyb20yIC0gMSA+PSB0bzEpCgkgICAgKnJpZ2h0ID0gZnJvbTIgLSAxOwoJZWxzZQoJICAgICpyaWdodCA9IHRvMjsKICAgIH0KICAgIGVsc2UKCSpyaWdodCA9IHRvMTsKfQojZW5kaWYKCi8qCiAqIHNraXB3aGl0ZTogc2tpcCBvdmVyICcgJyBhbmQgJ1x0Jy4KICovCiAgICBjaGFyX3UgKgpza2lwd2hpdGUocSkKICAgIGNoYXJfdQkqcTsKewogICAgY2hhcl91CSpwID0gcTsKCiAgICB3aGlsZSAodmltX2lzd2hpdGUoKnApKSAvKiBza2lwIHRvIG5leHQgbm9uLXdoaXRlICovCgkrK3A7CiAgICByZXR1cm4gcDsKfQoKLyoKICogc2tpcCBvdmVyIGRpZ2l0cwogKi8KICAgIGNoYXJfdSAqCnNraXBkaWdpdHMocSkKICAgIGNoYXJfdQkqcTsKewogICAgY2hhcl91CSpwID0gcTsKCiAgICB3aGlsZSAoVklNX0lTRElHSVQoKnApKQkvKiBza2lwIHRvIG5leHQgbm9uLWRpZ2l0ICovCgkrK3A7CiAgICByZXR1cm4gcDsKfQoKI2lmIGRlZmluZWQoRkVBVF9TWU5fSEwpIHx8IGRlZmluZWQoRkVBVF9TUEVMTCkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogc2tpcCBvdmVyIGRpZ2l0cyBhbmQgaGV4IGNoYXJhY3RlcnMKICovCiAgICBjaGFyX3UgKgpza2lwaGV4KHEpCiAgICBjaGFyX3UJKnE7CnsKICAgIGNoYXJfdQkqcCA9IHE7CgogICAgd2hpbGUgKHZpbV9pc3hkaWdpdCgqcCkpCS8qIHNraXAgdG8gbmV4dCBub24tZGlnaXQgKi8KCSsrcDsKICAgIHJldHVybiBwOwp9CiNlbmRpZgoKI2lmIGRlZmluZWQoRkVBVF9FWF9FWFRSQSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogc2tpcCB0byBkaWdpdCAob3IgTlVMIGFmdGVyIHRoZSBzdHJpbmcpCiAqLwogICAgY2hhcl91ICoKc2tpcHRvZGlnaXQocSkKICAgIGNoYXJfdQkqcTsKewogICAgY2hhcl91CSpwID0gcTsKCiAgICB3aGlsZSAoKnAgIT0gTlVMICYmICFWSU1fSVNESUdJVCgqcCkpCS8qIHNraXAgdG8gbmV4dCBkaWdpdCAqLwoJKytwOwogICAgcmV0dXJuIHA7Cn0KCi8qCiAqIHNraXAgdG8gaGV4IGNoYXJhY3RlciAob3IgTlVMIGFmdGVyIHRoZSBzdHJpbmcpCiAqLwogICAgY2hhcl91ICoKc2tpcHRvaGV4KHEpCiAgICBjaGFyX3UJKnE7CnsKICAgIGNoYXJfdQkqcCA9IHE7CgogICAgd2hpbGUgKCpwICE9IE5VTCAmJiAhdmltX2lzeGRpZ2l0KCpwKSkJLyogc2tpcCB0byBuZXh0IGRpZ2l0ICovCgkrK3A7CiAgICByZXR1cm4gcDsKfQojZW5kaWYKCi8qCiAqIFZhcmlhbnQgb2YgaXNkaWdpdCgpIHRoYXQgY2FuIGhhbmRsZSBjaGFyYWN0ZXJzID4gMHgxMDAuCiAqIFdlIGRvbid0IHVzZSBpc2RpZ2l0KCkgaGVyZSwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgYWxzbyBjb25zaWRlcnMKICogc3VwZXJzY3JpcHQgMSB0byBiZSBhIGRpZ2l0LgogKiBVc2UgdGhlIFZJTV9JU0RJR0lUKCkgbWFjcm8gZm9yIHNpbXBsZSBhcmd1bWVudHMuCiAqLwogICAgaW50CnZpbV9pc2RpZ2l0KGMpCiAgICBpbnQJCWM7CnsKICAgIHJldHVybiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpOwp9CgovKgogKiBWYXJpYW50IG9mIGlzeGRpZ2l0KCkgdGhhdCBjYW4gaGFuZGxlIGNoYXJhY3RlcnMgPiAweDEwMC4KICogV2UgZG9uJ3QgdXNlIGlzeGRpZ2l0KCkgaGVyZSwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgYWxzbyBjb25zaWRlcnMKICogc3VwZXJzY3JpcHQgMSB0byBiZSBhIGRpZ2l0LgogKi8KICAgIGludAp2aW1faXN4ZGlnaXQoYykKICAgIGludAkJYzsKewogICAgcmV0dXJuIChjID49ICcwJyAmJiBjIDw9ICc5JykKCXx8IChjID49ICdhJyAmJiBjIDw9ICdmJykKCXx8IChjID49ICdBJyAmJiBjIDw9ICdGJyk7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfTUJZVEUpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFZpbSdzIG93biBjaGFyYWN0ZXIgY2xhc3MgZnVuY3Rpb25zLiAgVGhlc2UgZXhpc3QgYmVjYXVzZSBtYW55IGxpYnJhcnkKICogaXNsb3dlcigpL3RvdXBwZXIoKSBldGMuIGRvIG5vdCB3b3JrIHByb3Blcmx5OiB0aGV5IGNyYXNoIHdoZW4gdXNlZCB3aXRoCiAqIGludmFsaWQgdmFsdWVzIG9yIGNhbid0IGhhbmRsZSBsYXRpbjEgd2hlbiB0aGUgbG9jYWxlIGlzIEMuCiAqIFNwZWVkIGlzIG1vc3QgaW1wb3J0YW50IGhlcmUuCiAqLwojZGVmaW5lIExBVElOMUxPV0VSICdsJwojZGVmaW5lIExBVElOMVVQUEVSICdVJwoKLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF0lXydhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ent8fX4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgoaKjpKWmp6ipqqusra6vsLGys7S1tre4ubq7vL2+v8DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW19jZ2tvc3d7f4OHi4+Tl5ufo6err7O3u7/Dx8vP09fb3+Pn6+/z9/v8gKi8Kc3RhdGljIGNoYXJfdSBsYXRpbjFmbGFnc1syNTddID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUgICAgICBsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVIFVVVVVVVVVsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGwgbGxsbGxsbGwiOwpzdGF0aWMgY2hhcl91IGxhdGluMXVwcGVyWzI1N10gPSAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIVwiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXFxdXl9gQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVp7fH1+f4CBgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrO0tba3uLm6u7y9vr/AwcLDxMXGx8jJysvMzc7P0NHS09TV1tfY2drb3N3e38DBwsPExcbHyMnKy8zNzs/Q0dLT1NXW99jZ2tvc3d7/IjsKc3RhdGljIGNoYXJfdSBsYXRpbjFsb3dlclsyNTddID0gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFcIiMkJSYnKCkqKywtLi8wMTIzNDU2Nzg5Ojs8PT4/QGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6W1xcXV5fYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fn+AgYKDhIWGh4iJiouMjY6PkJGSk5SVlpeYmZqbnJ2en6ChoqOkpaanqKmqq6ytrq+wsbKztLW2t7i5uru8vb6/4OHi4+Tl5ufo6err7O3u7/Dx8vP09fbX+Pn6+/z9/t/g4eLj5OXm5+jp6uvs7e7v8PHy8/T19vf4+fr7/P3+/yI7CgogICAgaW50CnZpbV9pc2xvd2VyKGMpCiAgICBpbnQJICAgIGM7CnsKICAgIGlmIChjIDw9ICdAJykKCXJldHVybiBGQUxTRTsKICAgIGlmIChjID49IDB4ODApCiAgICB7CglpZiAoZW5jX3V0ZjgpCgkgICAgcmV0dXJuIHV0Zl9pc2xvd2VyKGMpOwoJaWYgKGMgPj0gMHgxMDApCgl7CiNpZmRlZiBIQVZFX0lTV0xPV0VSCgkgICAgaWYgKGhhc19tYnl0ZSkKCQlyZXR1cm4gaXN3bG93ZXIoYyk7CiNlbmRpZgoJICAgIC8qIGlzbG93ZXIoKSBjYW4ndCBoYW5kbGUgdGhlc2UgY2hhcnMgYW5kIG1heSBjcmFzaCAqLwoJICAgIHJldHVybiBGQUxTRTsKCX0KCWlmIChlbmNfbGF0aW4xbGlrZSkKCSAgICByZXR1cm4gKGxhdGluMWZsYWdzW2NdICYgTEFUSU4xTE9XRVIpID09IExBVElOMUxPV0VSOwogICAgfQogICAgcmV0dXJuIGlzbG93ZXIoYyk7Cn0KCiAgICBpbnQKdmltX2lzdXBwZXIoYykKICAgIGludAkgICAgYzsKewogICAgaWYgKGMgPD0gJ0AnKQoJcmV0dXJuIEZBTFNFOwogICAgaWYgKGMgPj0gMHg4MCkKICAgIHsKCWlmIChlbmNfdXRmOCkKCSAgICByZXR1cm4gdXRmX2lzdXBwZXIoYyk7CglpZiAoYyA+PSAweDEwMCkKCXsKI2lmZGVmIEhBVkVfSVNXVVBQRVIKCSAgICBpZiAoaGFzX21ieXRlKQoJCXJldHVybiBpc3d1cHBlcihjKTsKI2VuZGlmCgkgICAgLyogaXNsb3dlcigpIGNhbid0IGhhbmRsZSB0aGVzZSBjaGFycyBhbmQgbWF5IGNyYXNoICovCgkgICAgcmV0dXJuIEZBTFNFOwoJfQoJaWYgKGVuY19sYXRpbjFsaWtlKQoJICAgIHJldHVybiAobGF0aW4xZmxhZ3NbY10gJiBMQVRJTjFVUFBFUikgPT0gTEFUSU4xVVBQRVI7CiAgICB9CiAgICByZXR1cm4gaXN1cHBlcihjKTsKfQoKICAgIGludAp2aW1fdG91cHBlcihjKQogICAgaW50CSAgICBjOwp7CiAgICBpZiAoYyA8PSAnQCcpCglyZXR1cm4gYzsKICAgIGlmIChjID49IDB4ODApCiAgICB7CglpZiAoZW5jX3V0ZjgpCgkgICAgcmV0dXJuIHV0Zl90b3VwcGVyKGMpOwoJaWYgKGMgPj0gMHgxMDApCgl7CiNpZmRlZiBIQVZFX1RPV1VQUEVSCgkgICAgaWYgKGhhc19tYnl0ZSkKCQlyZXR1cm4gdG93dXBwZXIoYyk7CiNlbmRpZgoJICAgIC8qIHRvdXBwZXIoKSBjYW4ndCBoYW5kbGUgdGhlc2UgY2hhcnMgYW5kIG1heSBjcmFzaCAqLwoJICAgIHJldHVybiBjOwoJfQoJaWYgKGVuY19sYXRpbjFsaWtlKQoJICAgIHJldHVybiBsYXRpbjF1cHBlcltjXTsKICAgIH0KICAgIHJldHVybiBUT1VQUEVSX0xPQyhjKTsKfQoKICAgIGludAp2aW1fdG9sb3dlcihjKQogICAgaW50CSAgICBjOwp7CiAgICBpZiAoYyA8PSAnQCcpCglyZXR1cm4gYzsKICAgIGlmIChjID49IDB4ODApCiAgICB7CglpZiAoZW5jX3V0ZjgpCgkgICAgcmV0dXJuIHV0Zl90b2xvd2VyKGMpOwoJaWYgKGMgPj0gMHgxMDApCgl7CiNpZmRlZiBIQVZFX1RPV0xPV0VSCgkgICAgaWYgKGhhc19tYnl0ZSkKCQlyZXR1cm4gdG93bG93ZXIoYyk7CiNlbmRpZgoJICAgIC8qIHRvbG93ZXIoKSBjYW4ndCBoYW5kbGUgdGhlc2UgY2hhcnMgYW5kIG1heSBjcmFzaCAqLwoJICAgIHJldHVybiBjOwoJfQoJaWYgKGVuY19sYXRpbjFsaWtlKQoJICAgIHJldHVybiBsYXRpbjFsb3dlcltjXTsKICAgIH0KICAgIHJldHVybiBUT0xPV0VSX0xPQyhjKTsKfQojZW5kaWYKCi8qCiAqIHNraXB0b3doaXRlOiBza2lwIG92ZXIgdGV4dCB1bnRpbCAnICcgb3IgJ1x0JyBvciBOVUwuCiAqLwogICAgY2hhcl91ICoKc2tpcHRvd2hpdGUocCkKICAgIGNoYXJfdQkqcDsKewogICAgd2hpbGUgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnICYmICpwICE9IE5VTCkKCSsrcDsKICAgIHJldHVybiBwOwp9CgojaWYgZGVmaW5lZChGRUFUX0xJU1RDTURTKSB8fCBkZWZpbmVkKEZFQVRfU0lHTlMpIHx8IGRlZmluZWQoRkVBVF9TTklGRikgXAoJfHwgZGVmaW5lZChQUk9UTykKLyoKICogc2tpcHRvd2hpdGVfZXNjOiBMaWtlIHNraXB0b3doaXRlKCksIGJ1dCBhbHNvIHNraXAgZXNjYXBlZCBjaGFycwogKi8KICAgIGNoYXJfdSAqCnNraXB0b3doaXRlX2VzYyhwKQogICAgY2hhcl91CSpwOwp7CiAgICB3aGlsZSAoKnAgIT0gJyAnICYmICpwICE9ICdcdCcgJiYgKnAgIT0gTlVMKQogICAgewoJaWYgKCgqcCA9PSAnXFwnIHx8ICpwID09IEN0cmxfVikgJiYgKihwICsgMSkgIT0gTlVMKQoJICAgICsrcDsKCSsrcDsKICAgIH0KICAgIHJldHVybiBwOwp9CiNlbmRpZgoKLyoKICogR2V0ZGlnaXRzOiBHZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZyBhbmQgc2tpcCBvdmVyIGl0LgogKiBOb3RlOiB0aGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgY2hhcl91IHBvaW50ZXIhCiAqLwogICAgbG9uZwpnZXRkaWdpdHMocHApCiAgICBjaGFyX3UgKipwcDsKewogICAgY2hhcl91CSpwOwogICAgbG9uZwlyZXR2YWw7CgogICAgcCA9ICpwcDsKICAgIHJldHZhbCA9IGF0b2woKGNoYXIgKilwKTsKICAgIGlmICgqcCA9PSAnLScpCQkvKiBza2lwIG5lZ2F0aXZlIHNpZ24gKi8KCSsrcDsKICAgIHAgPSBza2lwZGlnaXRzKHApOwkJLyogc2tpcCB0byBuZXh0IG5vbi1kaWdpdCAqLwogICAgKnBwID0gcDsKICAgIHJldHVybiByZXR2YWw7Cn0KCi8qCiAqIFJldHVybiBUUlVFIGlmICJsYnVmIiBpcyBlbXB0eSBvciBvbmx5IGNvbnRhaW5zIGJsYW5rcy4KICovCiAgICBpbnQKdmltX2lzYmxhbmtsaW5lKGxidWYpCiAgICBjaGFyX3UJKmxidWY7CnsKICAgIGNoYXJfdQkqcDsKCiAgICBwID0gc2tpcHdoaXRlKGxidWYpOwogICAgcmV0dXJuICgqcCA9PSBOVUwgfHwgKnAgPT0gJ1xyJyB8fCAqcCA9PSAnXG4nKTsKfQoKLyoKICogQ29udmVydCBhIHN0cmluZyBpbnRvIGEgbG9uZyBhbmQvb3IgdW5zaWduZWQgbG9uZywgdGFraW5nIGNhcmUgb2YKICogaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMuICBBY2NlcHRzIGEgJy0nIHNpZ24uCiAqIElmICJoZXhwIiBpcyBub3QgTlVMTCwgcmV0dXJucyBhIGZsYWcgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgdGhlIG51bWJlcjoKICogIDAJICAgIGRlY2ltYWwKICogICcwJwkgICAgb2N0YWwKICogICdYJwkgICAgaGV4CiAqICAneCcJICAgIGhleAogKiBJZiAibGVuIiBpcyBub3QgTlVMTCwgdGhlIGxlbmd0aCBvZiB0aGUgbnVtYmVyIGluIGNoYXJhY3RlcnMgaXMgcmV0dXJuZWQuCiAqIElmICJucHRyIiBpcyBub3QgTlVMTCwgdGhlIHNpZ25lZCByZXN1bHQgaXMgcmV0dXJuZWQgaW4gaXQuCiAqIElmICJ1bnB0ciIgaXMgbm90IE5VTEwsIHRoZSB1bnNpZ25lZCByZXN1bHQgaXMgcmV0dXJuZWQgaW4gaXQuCiAqIElmICJkb29jdCIgaXMgbm9uLXplcm8gcmVjb2duaXplIG9jdGFsIG51bWJlcnMsIHdoZW4gPiAxIGFsd2F5cyBhc3N1bWUKICogb2N0YWwgbnVtYmVyLgogKiBJZiAiZG9oZXgiIGlzIG5vbi16ZXJvIHJlY29nbml6ZSBoZXggbnVtYmVycywgd2hlbiA+IDEgYWx3YXlzIGFzc3VtZQogKiBoZXggbnVtYmVyLgogKi8KICAgIHZvaWQKdmltX3N0cjJucihzdGFydCwgaGV4cCwgbGVuLCBkb29jdCwgZG9oZXgsIG5wdHIsIHVucHRyKQogICAgY2hhcl91CQkqc3RhcnQ7CiAgICBpbnQJCQkqaGV4cDsJICAgIC8qIHJldHVybjogdHlwZSBvZiBudW1iZXIgMCA9IGRlY2ltYWwsICd4JwoJCQkJICAgICAgIG9yICdYJyBpcyBoZXgsICcwJyA9IG9jdGFsICovCiAgICBpbnQJCQkqbGVuOwkgICAgLyogcmV0dXJuOiBkZXRlY3RlZCBsZW5ndGggb2YgbnVtYmVyICovCiAgICBpbnQJCQlkb29jdDsJICAgIC8qIHJlY29nbml6ZSBvY3RhbCBudW1iZXIgKi8KICAgIGludAkJCWRvaGV4OwkgICAgLyogcmVjb2duaXplIGhleCBudW1iZXIgKi8KICAgIGxvbmcJCSpucHRyOwkgICAgLyogcmV0dXJuOiBzaWduZWQgcmVzdWx0ICovCiAgICB1bnNpZ25lZCBsb25nCSp1bnB0cjsJICAgIC8qIHJldHVybjogdW5zaWduZWQgcmVzdWx0ICovCnsKICAgIGNoYXJfdQkgICAgKnB0ciA9IHN0YXJ0OwogICAgaW50CQkgICAgaGV4ID0gMDsJCS8qIGRlZmF1bHQgaXMgZGVjaW1hbCAqLwogICAgaW50CQkgICAgbmVnYXRpdmUgPSBGQUxTRTsKICAgIHVuc2lnbmVkIGxvbmcgICB1biA9IDA7CiAgICBpbnQJCSAgICBuOwoKICAgIGlmIChwdHJbMF0gPT0gJy0nKQogICAgewoJbmVnYXRpdmUgPSBUUlVFOwoJKytwdHI7CiAgICB9CgogICAgLyogUmVjb2duaXplIGhleCBhbmQgb2N0YWwuICovCiAgICBpZiAocHRyWzBdID09ICcwJyAmJiBwdHJbMV0gIT0gJzgnICYmIHB0clsxXSAhPSAnOScpCiAgICB7CgloZXggPSBwdHJbMV07CglpZiAoZG9oZXggJiYgKGhleCA9PSAnWCcgfHwgaGV4ID09ICd4JykgJiYgdmltX2lzeGRpZ2l0KHB0clsyXSkpCgkgICAgcHRyICs9IDI7CQkJLyogaGV4YWRlY2ltYWwgKi8KCWVsc2UKCXsKCSAgICBoZXggPSAwOwkJCS8qIGRlZmF1bHQgaXMgZGVjaW1hbCAqLwoJICAgIGlmIChkb29jdCkKCSAgICB7CgkJLyogRG9uJ3QgaW50ZXJwcmV0ICIwIiwgIjA4IiBvciAiMDEyOSIgYXMgb2N0YWwuICovCgkJZm9yIChuID0gMTsgVklNX0lTRElHSVQocHRyW25dKTsgKytuKQoJCXsKCQkgICAgaWYgKHB0cltuXSA+ICc3JykKCQkgICAgewoJCQloZXggPSAwOwkvKiBjYW4ndCBiZSBvY3RhbCAqLwoJCQlicmVhazsKCQkgICAgfQoJCSAgICBpZiAocHRyW25dID4gJzAnKQoJCQloZXggPSAnMCc7CS8qIGFzc3VtZSBvY3RhbCAqLwoJCX0KCSAgICB9Cgl9CiAgICB9CgogICAgLyoKICAgICAqIERvIHRoZSBzdHJpbmctdG8tbnVtZXJpYyBjb252ZXJzaW9uICJtYW51YWxseSIgdG8gYXZvaWQgc3NjYW5mIHF1aXJrcy4KICAgICAqLwogICAgaWYgKGhleCA9PSAnMCcgfHwgZG9vY3QgPiAxKQogICAgewoJLyogb2N0YWwgKi8KCXdoaWxlICgnMCcgPD0gKnB0ciAmJiAqcHRyIDw9ICc3JykKCXsKCSAgICB1biA9IDggKiB1biArICh1bnNpZ25lZCBsb25nKSgqcHRyIC0gJzAnKTsKCSAgICArK3B0cjsKCX0KICAgIH0KICAgIGVsc2UgaWYgKGhleCAhPSAwIHx8IGRvaGV4ID4gMSkKICAgIHsKCS8qIGhleCAqLwoJd2hpbGUgKHZpbV9pc3hkaWdpdCgqcHRyKSkKCXsKCSAgICB1biA9IDE2ICogdW4gKyAodW5zaWduZWQgbG9uZyloZXgybnIoKnB0cik7CgkgICAgKytwdHI7Cgl9CiAgICB9CiAgICBlbHNlCiAgICB7CgkvKiBkZWNpbWFsICovCgl3aGlsZSAoVklNX0lTRElHSVQoKnB0cikpCgl7CgkgICAgdW4gPSAxMCAqIHVuICsgKHVuc2lnbmVkIGxvbmcpKCpwdHIgLSAnMCcpOwoJICAgICsrcHRyOwoJfQogICAgfQoKICAgIGlmIChoZXhwICE9IE5VTEwpCgkqaGV4cCA9IGhleDsKICAgIGlmIChsZW4gIT0gTlVMTCkKCSpsZW4gPSAoaW50KShwdHIgLSBzdGFydCk7CiAgICBpZiAobnB0ciAhPSBOVUxMKQogICAgewoJaWYgKG5lZ2F0aXZlKSAgIC8qIGFjY291bnQgZm9yIGxlYWRpbmcgJy0nIGZvciBkZWNpbWFsIG51bWJlcnMgKi8KCSAgICAqbnB0ciA9IC0obG9uZyl1bjsKCWVsc2UKCSAgICAqbnB0ciA9IChsb25nKXVuOwogICAgfQogICAgaWYgKHVucHRyICE9IE5VTEwpCgkqdW5wdHIgPSB1bjsKfQoKLyoKICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBhIHNpbmdsZSBoZXggY2hhcmFjdGVyLgogKiBPbmx5IHZhbGlkIHdoZW4gdGhlIGFyZ3VtZW50IGlzICcwJyAtICc5JywgJ0EnIC0gJ0YnIG9yICdhJyAtICdmJy4KICovCiAgICBpbnQKaGV4Mm5yKGMpCiAgICBpbnQJCWM7CnsKICAgIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKCXJldHVybiBjIC0gJ2EnICsgMTA7CiAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnRicpCglyZXR1cm4gYyAtICdBJyArIDEwOwogICAgcmV0dXJuIGMgLSAnMCc7Cn0KCiNpZiBkZWZpbmVkKEZFQVRfVEVSTVJFU1BPTlNFKSBcCgl8fCAoZGVmaW5lZChGRUFUX0dVSV9HVEspICYmIGRlZmluZWQoRkVBVF9XSU5ET1dTKSkgfHwgZGVmaW5lZChQUk9UTykKLyoKICogQ29udmVydCB0d28gaGV4IGNoYXJhY3RlcnMgdG8gYSBieXRlLgogKiBSZXR1cm4gLTEgaWYgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGlzIG5vdCBoZXguCiAqLwogICAgaW50CmhleGhleDJucihwKQogICAgY2hhcl91CSpwOwp7CiAgICBpZiAoIXZpbV9pc3hkaWdpdChwWzBdKSB8fCAhdmltX2lzeGRpZ2l0KHBbMV0pKQoJcmV0dXJuIC0xOwogICAgcmV0dXJuIChoZXgybnIocFswXSkgPDwgNCkgKyBoZXgybnIocFsxXSk7Cn0KI2VuZGlmCgovKgogKiBSZXR1cm4gVFJVRSBpZiAic3RyIiBzdGFydHMgd2l0aCBhIGJhY2tzbGFzaCB0aGF0IHNob3VsZCBiZSByZW1vdmVkLgogKiBGb3IgTVMtRE9TLCBXSU4zMiBhbmQgT1MvMiB0aGlzIGlzIG9ubHkgZG9uZSB3aGVuIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlCiAqIGJhY2tzbGFzaCBpcyBub3QgYSBub3JtYWwgZmlsZSBuYW1lIGNoYXJhY3Rlci4KICogJyQnIGlzIGEgdmFsaWQgZmlsZSBuYW1lIGNoYXJhY3Rlciwgd2UgZG9uJ3QgcmVtb3ZlIHRoZSBiYWNrc2xhc2ggYmVmb3JlCiAqIGl0LiAgVGhpcyBtZWFucyBpdCBpcyBub3QgcG9zc2libGUgdG8gdXNlIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIGFmdGVyIGEKICogYmFja3NsYXNoLiAgIkM6XCRWSU1cZG9jIiBpcyB0YWtlbiBsaXRlcmFsbHksIG9ubHkgIiRWSU1cZG9jIiB3b3Jrcy4KICogQWx0aG91Z2ggIlwgbmFtZSIgaXMgdmFsaWQsIHRoZSBiYWNrc2xhc2ggaW4gIlByb2dyYW1cIGZpbGVzIiBtdXN0IGJlCiAqIHJlbW92ZWQuICBBc3N1bWUgYSBmaWxlIG5hbWUgZG9lc24ndCBzdGFydCB3aXRoIGEgc3BhY2UuCiAqIEZvciBtdWx0aS1ieXRlIG5hbWVzLCBuZXZlciByZW1vdmUgYSBiYWNrc2xhc2ggYmVmb3JlIGEgbm9uLWFzY2lpCiAqIGNoYXJhY3RlciwgYXNzdW1lIHRoYXQgYWxsIG11bHRpLWJ5dGUgY2hhcmFjdGVycyBhcmUgdmFsaWQgZmlsZSBuYW1lCiAqIGNoYXJhY3RlcnMuCiAqLwogICAgaW50CnJlbV9iYWNrc2xhc2goc3RyKQogICAgY2hhcl91ICAqc3RyOwp7CiNpZmRlZiBCQUNLU0xBU0hfSU5fRklMRU5BTUUKICAgIHJldHVybiAoc3RyWzBdID09ICdcXCcKIyBpZmRlZiBGRUFUX01CWVRFCgkgICAgJiYgc3RyWzFdIDwgMHg4MAojIGVuZGlmCgkgICAgJiYgKHN0clsxXSA9PSAnICcKCQl8fCAoc3RyWzFdICE9IE5VTAoJCSAgICAmJiBzdHJbMV0gIT0gJyonCgkJICAgICYmIHN0clsxXSAhPSAnPycKCQkgICAgJiYgIXZpbV9pc2ZpbGVjKHN0clsxXSkpKSk7CiNlbHNlCiAgICByZXR1cm4gKHN0clswXSA9PSAnXFwnICYmIHN0clsxXSAhPSBOVUwpOwojZW5kaWYKfQoKLyoKICogSGFsdmUgdGhlIG51bWJlciBvZiBiYWNrc2xhc2hlcyBpbiBhIGZpbGUgbmFtZSBhcmd1bWVudC4KICogRm9yIE1TLURPUyB3ZSBvbmx5IGRvIHRoaXMgaWYgdGhlIGNoYXJhY3RlciBhZnRlciB0aGUgYmFja3NsYXNoCiAqIGlzIG5vdCBhIG5vcm1hbCBmaWxlIGNoYXJhY3Rlci4KICovCiAgICB2b2lkCmJhY2tzbGFzaF9oYWx2ZShwKQogICAgY2hhcl91CSpwOwp7CiAgICBmb3IgKCA7ICpwOyArK3ApCglpZiAocmVtX2JhY2tzbGFzaChwKSkKCSAgICBTVFJNT1ZFKHAsIHAgKyAxKTsKfQoKLyoKICogYmFja3NsYXNoX2hhbHZlKCkgcGx1cyBzYXZlIHRoZSByZXN1bHQgaW4gYWxsb2NhdGVkIG1lbW9yeS4KICovCiAgICBjaGFyX3UgKgpiYWNrc2xhc2hfaGFsdmVfc2F2ZShwKQogICAgY2hhcl91CSpwOwp7CiAgICBjaGFyX3UJKnJlczsKCiAgICByZXMgPSB2aW1fc3Ryc2F2ZShwKTsKICAgIGlmIChyZXMgPT0gTlVMTCkKCXJldHVybiBwOwogICAgYmFja3NsYXNoX2hhbHZlKHJlcyk7CiAgICByZXR1cm4gcmVzOwp9CgojaWYgKGRlZmluZWQoRUJDRElDKSAmJiBkZWZpbmVkKEZFQVRfUE9TVFNDUklQVCkpIHx8IGRlZmluZWQoUFJPVE8pCi8qCiAqIFRhYmxlIGZvciBFQkNESUMgdG8gQVNDSUkgY29udmVyc2lvbiB1bmFzaGFtZWRseSB0YWtlbiBmcm9tIHh4ZC5jIQogKiBUaGUgZmlyc3QgNjQgZW50cmllcyBoYXZlIGJlZW4gYWRkZWQgdG8gbWFwIGNvbnRyb2wgY2hhcmFjdGVycyBkZWZpbmVkIGluCiAqIGFzY2lpLmgKICovCnN0YXRpYyBjaGFyX3UgZWJjZGljMmFzY2lpX3RhYlsyNTZdID0KewogICAgMDAwMCwgMDAwMSwgMDAwMiwgMDAwMywgMDAwNCwgMDAxMSwgMDAwNiwgMDE3NywKICAgIDAwMTAsIDAwMTEsIDAwMTIsIDAwMTMsIDAwMTQsIDAwMTUsIDAwMTYsIDAwMTcsCiAgICAwMDIwLCAwMDIxLCAwMDIyLCAwMDIzLCAwMDI0LCAwMDEyLCAwMDEwLCAwMDI3LAogICAgMDAzMCwgMDAzMSwgMDAzMiwgMDAzMywgMDAzMywgMDAzNSwgMDAzNiwgMDAzNywKICAgIDAwNDAsIDAwNDEsIDAwNDIsIDAwNDMsIDAwNDQsIDAwNDUsIDAwNDYsIDAwNDcsCiAgICAwMDUwLCAwMDUxLCAwMDUyLCAwMDUzLCAwMDU0LCAwMDU1LCAwMDU2LCAwMDU3LAogICAgMDA2MCwgMDA2MSwgMDA2MiwgMDA2MywgMDA2NCwgMDA2NSwgMDA2NiwgMDA2NywKICAgIDAwNzAsIDAwNzEsIDAwNzIsIDAwNzMsIDAwNzQsIDAwNzUsIDAwNzYsIDAwNzcsCiAgICAwMDQwLCAwMjQwLCAwMjQxLCAwMjQyLCAwMjQzLCAwMjQ0LCAwMjQ1LCAwMjQ2LAogICAgMDI0NywgMDI1MCwgMDMyNSwgMDA1NiwgMDA3NCwgMDA1MCwgMDA1MywgMDE3NCwKICAgIDAwNDYsIDAyNTEsIDAyNTIsIDAyNTMsIDAyNTQsIDAyNTUsIDAyNTYsIDAyNTcsCiAgICAwMjYwLCAwMjYxLCAwMDQxLCAwMDQ0LCAwMDUyLCAwMDUxLCAwMDczLCAwMTc2LAogICAgMDA1NSwgMDA1NywgMDI2MiwgMDI2MywgMDI2NCwgMDI2NSwgMDI2NiwgMDI2NywKICAgIDAyNzAsIDAyNzEsIDAzMTMsIDAwNTQsIDAwNDUsIDAxMzcsIDAwNzYsIDAwNzcsCiAgICAwMjcyLCAwMjczLCAwMjc0LCAwMjc1LCAwMjc2LCAwMjc3LCAwMzAwLCAwMzAxLAogICAgMDMwMiwgMDE0MCwgMDA3MiwgMDA0MywgMDEwMCwgMDA0NywgMDA3NSwgMDA0MiwKICAgIDAzMDMsIDAxNDEsIDAxNDIsIDAxNDMsIDAxNDQsIDAxNDUsIDAxNDYsIDAxNDcsCiAgICAwMTUwLCAwMTUxLCAwMzA0LCAwMzA1LCAwMzA2LCAwMzA3LCAwMzEwLCAwMzExLAogICAgMDMxMiwgMDE1MiwgMDE1MywgMDE1NCwgMDE1NSwgMDE1NiwgMDE1NywgMDE2MCwKICAgIDAxNjEsIDAxNjIsIDAxMzYsIDAzMTQsIDAzMTUsIDAzMTYsIDAzMTcsIDAzMjAsCiAgICAwMzIxLCAwMzQ1LCAwMTYzLCAwMTY0LCAwMTY1LCAwMTY2LCAwMTY3LCAwMTcwLAogICAgMDE3MSwgMDE3MiwgMDMyMiwgMDMyMywgMDMyNCwgMDEzMywgMDMyNiwgMDMyNywKICAgIDAzMzAsIDAzMzEsIDAzMzIsIDAzMzMsIDAzMzQsIDAzMzUsIDAzMzYsIDAzMzcsCiAgICAwMzQwLCAwMzQxLCAwMzQyLCAwMzQzLCAwMzQ0LCAwMTM1LCAwMzQ2LCAwMzQ3LAogICAgMDE3MywgMDEwMSwgMDEwMiwgMDEwMywgMDEwNCwgMDEwNSwgMDEwNiwgMDEwNywKICAgIDAxMTAsIDAxMTEsIDAzNTAsIDAzNTEsIDAzNTIsIDAzNTMsIDAzNTQsIDAzNTUsCiAgICAwMTc1LCAwMTEyLCAwMTEzLCAwMTE0LCAwMTE1LCAwMTE2LCAwMTE3LCAwMTIwLAogICAgMDEyMSwgMDEyMiwgMDM1NiwgMDM1NywgMDM2MCwgMDM2MSwgMDM2MiwgMDM2MywKICAgIDAxMzQsIDAyMzcsIDAxMjMsIDAxMjQsIDAxMjUsIDAxMjYsIDAxMjcsIDAxMzAsCiAgICAwMTMxLCAwMTMyLCAwMzY0LCAwMzY1LCAwMzY2LCAwMzY3LCAwMzcwLCAwMzcxLAogICAgMDA2MCwgMDA2MSwgMDA2MiwgMDA2MywgMDA2NCwgMDA2NSwgMDA2NiwgMDA2NywKICAgIDAwNzAsIDAwNzEsIDAzNzIsIDAzNzMsIDAzNzQsIDAzNzUsIDAzNzYsIDAzNzcKfTsKCi8qCiAqIENvbnZlcnQgYSBidWZmZXIgd29ydGggb2YgY2hhcmFjdGVycyBmcm9tIEVCQ0RJQyB0byBBU0NJSS4gIE9ubHkgdXNlZnVsIGlmCiAqIHdhbnRpbmcgNy1iaXQgQVNDSUkgY2hhcmFjdGVycyBvdXQgdGhlIG90aGVyIGVuZC4KICovCiAgICB2b2lkCmViY2RpYzJhc2NpaShidWZmZXIsIGxlbikKICAgIGNoYXJfdQkqYnVmZmVyOwogICAgaW50CQlsZW47CnsKICAgIGludAkJaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCglidWZmZXJbaV0gPSBlYmNkaWMyYXNjaWlfdGFiW2J1ZmZlcltpXV07Cn0KI2VuZGlmCg==