LyoKICAgIFNETCAtIFNpbXBsZSBEaXJlY3RNZWRpYSBMYXllcgogICAgQ29weXJpZ2h0IChDKSAxOTk3LTIwMTIgU2FtIExhbnRpbmdhCgogICAgVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgICBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgICBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgICBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgIDAyMTEwLTEzMDEgIFVTQQoKICAgIFNhbSBMYW50aW5nYQogICAgc2xvdWtlbkBsaWJzZGwub3JnCiovCiNpbmNsdWRlICJTRExfY29uZmlnLmgiCgovKgogKiBSTEUgZW5jb2RpbmcgZm9yIHNvZnR3YXJlIGNvbG9ya2V5IGFuZCBhbHBoYS1jaGFubmVsIGFjY2VsZXJhdGlvbgogKgogKiBPcmlnaW5hbCB2ZXJzaW9uIGJ5IFNhbSBMYW50aW5nYQogKgogKiBNYXR0aWFzIEVuZ2RlZ+VyZCAoWW9yaWNrKTogUmV3cml0ZS4gTmV3IGVuY29kaW5nIGZvcm1hdCwgZW5jb2RlciBhbmQKICogZGVjb2Rlci4gQWRkZWQgcGVyLXN1cmZhY2UgYWxwaGEgYmxpdHRlci4gQWRkZWQgcGVyLXBpeGVsIGFscGhhCiAqIGZvcm1hdCwgZW5jb2RlciBhbmQgYmxpdHRlci4KICoKICogTWFueSB0aGFua3MgdG8gWGFyayBhbmQgam9obnMgZm9yIGhpbnRzLCBiZW5jaG1hcmtzIGFuZCB1c2VmdWwgY29tbWVudHMKICogbGVhZGluZyB0byB0aGlzIGNvZGUuCiAqCiAqIFdlbGNvbWUgdG8gTWFjcm8gTWF5aGVtLgogKi8KCi8qCiAqIFRoZSBlbmNvZGluZyB0cmFuc2xhdGVzIHRoZSBpbWFnZSBkYXRhIHRvIGEgc3RyZWFtIG9mIHNlZ21lbnRzIG9mIHRoZSBmb3JtCiAqCiAqIDxza2lwPiA8cnVuPiA8ZGF0YT4KICoKICogd2hlcmUgPHNraXA+IGlzIHRoZSBudW1iZXIgb2YgdHJhbnNwYXJlbnQgcGl4ZWxzIHRvIHNraXAsCiAqICAgICAgIDxydW4+ICBpcyB0aGUgbnVtYmVyIG9mIG9wYXF1ZSBwaXhlbHMgdG8gYmxpdCwKICogYW5kICAgPGRhdGE+IGFyZSB0aGUgcGl4ZWxzIHRoZW1zZWx2ZXMuCiAqCiAqIFRoaXMgYmFzaWMgc3RydWN0dXJlIGlzIHVzZWQgYm90aCBmb3IgY29sb3JrZXllZCBzdXJmYWNlcywgdXNlZCBmb3Igc2ltcGxlCiAqIGJpbmFyeSB0cmFuc3BhcmVuY3kgYW5kIGZvciBwZXItc3VyZmFjZSBhbHBoYSBibGVuZGluZywgYW5kIGZvciBzdXJmYWNlcwogKiB3aXRoIHBlci1waXhlbCBhbHBoYS4gVGhlIGRldGFpbHMgZGlmZmVyLCBob3dldmVyOgogKgogKiBFbmNvZGluZyBvZiBjb2xvcmtleWVkIHN1cmZhY2VzOgogKgogKiAgIEVuY29kZWQgcGl4ZWxzIGFsd2F5cyBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgdGFyZ2V0IHN1cmZhY2UuCiAqICAgPHNraXA+IGFuZCA8cnVuPiBhcmUgdW5zaWduZWQgOCBiaXQgaW50ZWdlcnMsIGV4Y2VwdCBmb3IgMzIgYml0IGRlcHRoCiAqICAgd2hlcmUgdGhleSBhcmUgMTYgYml0LiBUaGlzIG1ha2VzIHRoZSBwaXhlbCBkYXRhIGFsaWduZWQgYXQgYWxsIHRpbWVzLgogKiAgIFNlZ21lbnRzIG5ldmVyIHdyYXAgYXJvdW5kIGZyb20gb25lIHNjYW4gbGluZSB0byB0aGUgbmV4dC4KICoKICogICBUaGUgZW5kIG9mIHRoZSBzZXF1ZW5jZSBpcyBtYXJrZWQgYnkgYSB6ZXJvIDxza2lwPiw8cnVuPiBwYWlyIGF0IHRoZSAqCiAqICAgYmVnaW5uaW5nIG9mIGEgbGluZS4KICoKICogRW5jb2Rpbmcgb2Ygc3VyZmFjZXMgd2l0aCBwZXItcGl4ZWwgYWxwaGE6CiAqCiAqICAgVGhlIHNlcXVlbmNlIGJlZ2lucyB3aXRoIGEgc3RydWN0IFJMRURlc3RGb3JtYXQgZGVzY3JpYmluZyB0aGUgdGFyZ2V0CiAqICAgcGl4ZWwgZm9ybWF0LCB0byBwcm92aWRlIHJlbGlhYmxlIHVuLWVuY29kaW5nLgogKgogKiAgIEVhY2ggc2NhbiBsaW5lIGlzIGVuY29kZWQgdHdpY2U6IEZpcnN0IGFsbCBjb21wbGV0ZWx5IG9wYXF1ZSBwaXhlbHMsCiAqICAgZW5jb2RlZCBpbiB0aGUgdGFyZ2V0IGZvcm1hdCBhcyBkZXNjcmliZWQgYWJvdmUsIGFuZCB0aGVuIGFsbAogKiAgIHBhcnRpYWxseSB0cmFuc3BhcmVudCAodHJhbnNsdWNlbnQpIHBpeGVscyAod2hlcmUgMSA8PSBhbHBoYSA8PSAyNTQpLAogKiAgIGluIHRoZSBmb2xsb3dpbmcgMzItYml0IGZvcm1hdDoKICoKICogICBGb3IgMzItYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCBidXQgd2l0aAogKiAgIHRoZSBhbHBoYSB2YWx1ZSBvY2N1cHlpbmcgdGhlIGhpZ2hlc3QgOCBiaXRzLiBUaGUgPHNraXA+IGFuZCA8cnVuPgogKiAgIGNvdW50cyBhcmUgMTYgYml0LgogKiAKICogICBGb3IgMTYtYml0IHRhcmdldHMsIGVhY2ggcGl4ZWwgaGFzIHRoZSB0YXJnZXQgUkdCIGZvcm1hdCwgYnV0IHdpdGgKICogICB0aGUgbWlkZGxlIGNvbXBvbmVudCAodXN1YWxseSBncmVlbikgc2hpZnRlZCAxNiBzdGVwcyB0byB0aGUgbGVmdCwKICogICBhbmQgdGhlIGhvbGUgZmlsbGVkIHdpdGggdGhlIDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG9mIHRoZSBhbHBoYSB2YWx1ZS4KICogICBpLmUuIGlmIHRoZSB0YXJnZXQgaGFzIHRoZSBmb3JtYXQgICAgICAgICBycnJycmdnZ2dnZ2JiYmJiLAogKiAgIHRoZSBlbmNvZGVkIHBpeGVsIHdpbGwgYmUgMDAwMDBnZ2dnZ2cwMDAwMHJycnJyMGFhYWFhYmJiYmIuCiAqICAgVGhlIDxza2lwPiBhbmQgPHJ1bj4gY291bnRzIGFyZSA4IGJpdCBmb3IgdGhlIG9wYXF1ZSBsaW5lcywgMTYgYml0CiAqICAgZm9yIHRoZSB0cmFuc2x1Y2VudCBsaW5lcy4gVHdvIHBhZGRpbmcgYnl0ZXMgbWF5IGJlIGluc2VydGVkCiAqICAgYmVmb3JlIGVhY2ggdHJhbnNsdWNlbnQgbGluZSB0byBrZWVwIHRoZW0gMzItYml0IGFsaWduZWQuCiAqCiAqICAgVGhlIGVuZCBvZiB0aGUgc2VxdWVuY2UgaXMgbWFya2VkIGJ5IGEgemVybyA8c2tpcD4sPHJ1bj4gcGFpciBhdCB0aGUKICogICBiZWdpbm5pbmcgb2YgYW4gb3BhcXVlIGxpbmUuCiAqLwoKI2luY2x1ZGUgIlNETF92aWRlby5oIgojaW5jbHVkZSAiU0RMX3N5c3ZpZGVvLmgiCiNpbmNsdWRlICJTRExfYmxpdC5oIgojaW5jbHVkZSAiU0RMX1JMRWFjY2VsX2MuaCIKCi8qIEZvcmNlIE1NWCB0byAwOyB0aGlzIGJsb3dzIHVwIG9uIGFsbW9zdCBldmVyeSBtYWpvciBjb21waWxlciBub3cuIC0tcnlhbi4gKi8KI2lmIDAgJiYgZGVmaW5lZChfX0dOVUNfXykgJiYgKGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX194ODZfNjRfXykpICYmIFNETF9BU1NFTUJMWV9ST1VUSU5FUwojZGVmaW5lIE1NWF9BU01CTElUCiNlbmRpZgoKI2lmZGVmIE1NWF9BU01CTElUCiNpbmNsdWRlICJtbXguaCIKI2luY2x1ZGUgIlNETF9jcHVpbmZvLmgiCiNlbmRpZgoKI2lmbmRlZiBNQVgKI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSA/IChhKSA6IChiKSkKI2VuZGlmCiNpZm5kZWYgTUlOCiNkZWZpbmUgTUlOKGEsIGIpICgoYSkgPCAoYikgPyAoYSkgOiAoYikpCiNlbmRpZgoKI2RlZmluZSBQSVhFTF9DT1BZKHRvLCBmcm9tLCBsZW4sIGJwcCkJCQlcCmRvIHsJCQkJCQkJXAogICAgaWYoYnBwID09IDQpIHsJCQkJCVwKCVNETF9tZW1jcHk0KHRvLCBmcm9tLCAoc2l6ZV90KShsZW4pKTsJCVwKICAgIH0gZWxzZSB7CQkJCQkJXAoJU0RMX21lbWNweSh0bywgZnJvbSwgKHNpemVfdCkobGVuKSAqIChicHApKTsJXAogICAgfQkJCQkJCQlcCn0gd2hpbGUoMCkKCi8qCiAqIFZhcmlvdXMgY29sb3JrZXkgYmxpdCBtZXRob2RzLCBmb3Igb3BhcXVlIGFuZCBwZXItc3VyZmFjZSBhbHBoYQogKi8KCiNkZWZpbmUgT1BBUVVFX0JMSVQodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgUElYRUxfQ09QWSh0bywgZnJvbSwgbGVuZ3RoLCBicHApCgojaWZkZWYgTU1YX0FTTUJMSVQKCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OE1NWCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCiAgICBkbyB7CQkJCQkJCVwKCVVpbnQzMiAqc3JjcCA9IChVaW50MzIgKikoZnJvbSk7CQkJXAoJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKSh0byk7CQkJCVwKICAgICAgICBpbnQgaSA9IDB4MDBGRjAwRkY7CQkJCQlcCiAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tMyk7CQkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTMsIG1tMyk7CQkJCVwKICAgICAgICBpID0gMHhGRjAwMDAwMDsJCQkJCQlcCiAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tNyk7CQkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTcsIG1tNyk7CQkJCVwKICAgICAgICBpID0gYWxwaGEgfCBhbHBoYSA8PCAxNjsJCQkJXAogICAgICAgIG1vdmRfbTJyKCooJmkpLCBtbTQpOwkJCQkJXAogICAgICAgIHB1bnBja2xkcV9yMnIobW00LCBtbTQpOwkJCQlcCglwY21wZXFkX3IycihtbTUsbW01KTsgLyogc2V0IG1tNSB0byAiMSIgKi8JCVwKCXB4b3JfcjJyKG1tNywgbW01KTsgLyogbWFrZSBjbGVhciBhbHBoYSBtYXNrICovCQlcCiAgICAgICAgaSA9IGxlbmd0aDsJCQkJCQlcCglpZihpICYgMSkgewkJCQkJCVwKICAgICAgICAgIG1vdmRfbTJyKCgqc3JjcCksIG1tMSk7IC8qIHNyYyAtPiBtbTEgKi8JCVwKICAgICAgICAgIHB1bnBja2xid19yMnIobW0xLCBtbTEpOwkJCQlcCiAgICAgICAgICBwYW5kX3IycihtbTMsIG1tMSk7CQkJCQlcCgkgIG1vdmRfbTJyKCgqZHN0cCksIG1tMik7IC8qIGRzdCAtPiBtbTIgKi8JCVwKICAgICAgICAgIHB1bnBja2xid19yMnIobW0yLCBtbTIpOwkJCQlcCiAgICAgICAgICBwYW5kX3IycihtbTMsIG1tMik7CQkJCQlcCgkgIHBzdWJ3X3IycihtbTIsIG1tMSk7CQkJCQlcCgkgIHBtdWxsd19yMnIobW00LCBtbTEpOwkJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW0xKTsJCQkJCVwKCSAgcGFkZHdfcjJyKG1tMSwgbW0yKTsJCQkJCVwKCSAgcGFuZF9yMnIobW0zLCBtbTIpOwkJCQkJXAoJICBwYWNrdXN3Yl9yMnIobW0yLCBtbTIpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0yKTsgLyogMDAwMDBSR0IgLT4gbW0yICovCQlcCgkgIG1vdmRfcjJtKG1tMiwgKmRzdHApOwkJCQkJXAoJICArK3NyY3A7CQkJCQkJXAoJICArK2RzdHA7CQkJCQkJXAoJICBpLS07CQkJCQkJCVwKCX0JCQkJCQkJXAoJZm9yKDsgaSA+IDA7IC0taSkgewkJCQkJXAogICAgICAgICAgbW92cV9tMnIoKCpzcmNwKSwgbW0wKTsJCQkJXAoJICBtb3ZxX3IycihtbTAsIG1tMSk7CQkJCQlcCiAgICAgICAgICBwdW5wY2tsYndfcjJyKG1tMCwgbW0wKTsJCQkJXAoJICBtb3ZxX20ycigoKmRzdHApLCBtbTIpOwkJCQlcCgkgIHB1bnBja2hid19yMnIobW0xLCBtbTEpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMiwgbW02KTsJCQkJCVwKICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0wKTsJCQkJCVwKICAgICAgICAgIHB1bnBja2xid19yMnIobW0yLCBtbTIpOwkJCQlcCgkgIHBhbmRfcjJyKG1tMywgbW0xKTsJCQkJCVwKCSAgcHVucGNraGJ3X3IycihtbTYsIG1tNik7CQkJCVwKICAgICAgICAgIHBhbmRfcjJyKG1tMywgbW0yKTsJCQkJCVwKCSAgcHN1YndfcjJyKG1tMiwgbW0wKTsJCQkJCVwKCSAgcG11bGx3X3IycihtbTQsIG1tMCk7CQkJCQlcCgkgIHBhbmRfcjJyKG1tMywgbW02KTsJCQkJCVwKCSAgcHN1YndfcjJyKG1tNiwgbW0xKTsJCQkJCVwKCSAgcG11bGx3X3IycihtbTQsIG1tMSk7CQkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTApOwkJCQkJXAoJICBwYWRkd19yMnIobW0wLCBtbTIpOwkJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW0xKTsJCQkJCVwKCSAgcGFkZHdfcjJyKG1tMSwgbW02KTsJCQkJCVwKCSAgcGFuZF9yMnIobW0zLCBtbTIpOwkJCQkJXAoJICBwYW5kX3IycihtbTMsIG1tNik7CQkJCQlcCgkgIHBhY2t1c3diX3IycihtbTIsIG1tMik7CQkJCVwKCSAgcGFja3Vzd2JfcjJyKG1tNiwgbW02KTsJCQkJXAoJICBwc3JscV9pMnIoMzIsIG1tMik7CQkJCQlcCgkgIHBzbGxxX2kycigzMiwgbW02KTsJCQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMik7CQkJCQlcCgkgIHBhbmRfcjJyKG1tNSwgbW0yKTsgLyogMDAwMDBSR0IgLT4gbW0yICovCQlcCiAgICAgICAgIG1vdnFfcjJtKG1tMiwgKmRzdHApOwkJCQkJXAoJICBzcmNwICs9IDI7CQkJCQkJXAoJICBkc3RwICs9IDI7CQkJCQkJXAoJICBpLS07CQkJCQkJCVwKCX0JCQkJCQkJXAoJZW1tcygpOwkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NjVNTVgodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgZG8gewkJCQkJCVwKICAgICAgICBpbnQgaSwgbiA9IDA7CQkJCQlcCglVaW50MTYgKnNyY3AgPSAoVWludDE2ICopKGZyb20pOwkJXAoJVWludDE2ICpkc3RwID0gKFVpbnQxNiAqKSh0byk7CQkJXAogICAgICAgIFVpbnQzMiBBTFBIQSA9IDB4RjgwMDsJCQkJXAoJbW92ZF9tMnIoKigmQUxQSEEpLCBtbTEpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tMSwgbW0xKTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTEsIG1tMSk7CQkJXAoJQUxQSEEgPSAweDA3RTA7CQkJCQlcCgltb3ZkX20ycigqKCZBTFBIQSksIG1tNCk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNCwgbW00KTsJCQlcCglBTFBIQSA9IDB4MDAxRjsJCQkJCVwKCW1vdmRfbTJyKCooJkFMUEhBKSwgbW03KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW03LCBtbTcpOwkJCVwKCWFscGhhICY9IH4oMSsyKzQpOwkJCQlcCiAgICAgICAgaSA9IChVaW50MzIpYWxwaGEgfCAoVWludDMyKWFscGhhIDw8IDE2OwlcCiAgICAgICAgbW92ZF9tMnIoKigmaSksIG1tMCk7CQkJCVwKICAgICAgICBwdW5wY2tsZHFfcjJyKG1tMCwgbW0wKTsJCQlcCiAgICAgICAgQUxQSEEgPSBhbHBoYSA+PiAzOwkJCQlcCiAgICAgICAgaSA9ICgoaW50KShsZW5ndGgpICYgMyk7CQkJXAoJZm9yKDsgaSA+IDA7IC0taSkgewkJCQlcCgkgICAgVWludDMyIHMgPSAqc3JjcCsrOwkJCQlcCgkgICAgVWludDMyIGQgPSAqZHN0cDsJCQkJXAoJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwN2UwZjgxZjsJCVwKCSAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCgkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCgkgICAgZCAmPSAweDA3ZTBmODFmOwkJCQlcCgkgICAgKmRzdHArKyA9IGQgfCBkID4+IDE2OwkJCVwKCSAgICBuKys7CQkJCQlcCgl9CQkJCQkJXAoJaSA9IChpbnQpKGxlbmd0aCkgLSBuOwkJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKCSAgbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsJCQlcCgkgIG1vdnFfbTJyKCgqc3JjcCksIG1tMik7CQkJXAoJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW0xICwgbW01KTsJCQkJXAoJICBwc3JscV9pMnIoMTEsIG1tNSk7CQkJCVwKCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tMSAsIG1tNik7CQkJCVwKCSAgcHNybHFfaTJyKDExLCBtbTYpOwkJCQlcCgkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAoJICBwc2xscV9pMnIoMTEsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW0xLCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tNCwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCAsIG1tNSk7CQkJCVwKCSAgcHNybHFfaTJyKDUsIG1tNSk7CQkJCVwKCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCAsIG1tNik7CQkJCVwKCSAgcHNybHFfaTJyKDUsIG1tNik7CQkJCVwKCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAoJICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAoJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCgkgIHBzbGxxX2kycig1LCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCwgbW02KTsJCQkJXAoJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKCSAgcG9yX3IycihtbTcsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCgkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTcgLCBtbTUpOwkJCQlcCiAgICAgICAgICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW03ICwgbW02KTsJCQkJXAoJICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCgkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCgkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW03LCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMSwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNCwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMm0obW0zLCAqZHN0cCk7CQkJCVwKCSAgc3JjcCArPSA0OwkJCQkJXAoJICBkc3RwICs9IDQ7CQkJCQlcCgkgIGkgLT0gMzsJCQkJCVwKCX0JCQkJCQlcCgllbW1zKCk7CQkJCQkJXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1TU1YKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKICAgIGRvIHsJCQkJCQlcCiAgICAgICAgaW50IGksIG4gPSAwOwkJCQkJXAoJVWludDE2ICpzcmNwID0gKFVpbnQxNiAqKShmcm9tKTsJCVwKCVVpbnQxNiAqZHN0cCA9IChVaW50MTYgKikodG8pOwkJCVwKICAgICAgICBVaW50MzIgQUxQSEEgPSAweDdDMDA7CQkJCVwKCW1vdmRfbTJyKCooJkFMUEhBKSwgbW0xKTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTEsIG1tMSk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW0xLCBtbTEpOwkJCVwKCUFMUEhBID0gMHgwM0UwOwkJCQkJXAogICAgICAgIG1vdmRfbTJyKCooJkFMUEhBKSwgbW00KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTQsIG1tNCk7CQkJXAogICAgICAgIHB1bnBja2x3ZF9yMnIobW00LCBtbTQpOwkJCVwKCUFMUEhBID0gMHgwMDFGOwkJCQkJXAoJbW92ZF9tMnIoKigmQUxQSEEpLCBtbTcpOwkJCVwKICAgICAgICBwdW5wY2tsd2RfcjJyKG1tNywgbW03KTsJCQlcCiAgICAgICAgcHVucGNrbHdkX3IycihtbTcsIG1tNyk7CQkJXAoJYWxwaGEgJj0gfigxKzIrNCk7CQkJCVwKICAgICAgICBpID0gKFVpbnQzMilhbHBoYSB8IChVaW50MzIpYWxwaGEgPDwgMTY7CVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0wKTsJCQkJXAogICAgICAgIHB1bnBja2xkcV9yMnIobW0wLCBtbTApOwkJCVwKICAgICAgICBpID0gKChpbnQpKGxlbmd0aCkgJiAzKTsJCQkJXAogICAgICAgIEFMUEhBID0gYWxwaGEgPj4gMzsJCQkJXAoJZm9yKDsgaSA+IDA7IC0taSkgewkJCQlcCgkgICAgVWludDMyIHMgPSAqc3JjcCsrOwkJCQlcCgkgICAgVWludDMyIGQgPSAqZHN0cDsJCQkJXAoJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKCSAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCgkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCgkgICAgZCAmPSAweDAzZTA3YzFmOwkJCQlcCgkgICAgKmRzdHArKyA9IGQgfCBkID4+IDE2OwkJCVwKCSAgICBuKys7CQkJCQlcCgl9CQkJCQkJXAoJaSA9IChpbnQpKGxlbmd0aCkgLSBuOwkJCQlcCglmb3IoOyBpID4gMDsgLS1pKSB7CQkJCVwKCSAgbW92cV9tMnIoKCpkc3RwKSwgbW0zKTsJCQlcCgkgIG1vdnFfbTJyKCgqc3JjcCksIG1tMik7CQkJXAoJICBtb3ZxX3IycihtbTIsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW0xICwgbW01KTsJCQkJXAoJICBwc3JscV9pMnIoMTAsIG1tNSk7CQkJCVwKCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tMSAsIG1tNik7CQkJCVwKCSAgcHNybHFfaTJyKDEwLCBtbTYpOwkJCQlcCgkgIHBzdWJ3X3IycihtbTYsIG1tNSk7CQkJCVwKCSAgcG11bGx3X3IycihtbTAsIG1tNSk7CQkJCVwKCSAgcHNybHdfaTJyKDgsIG1tNSk7CQkJCVwKCSAgcGFkZHdfcjJyKG1tNSwgbW02KTsJCQkJXAoJICBwc2xscV9pMnIoMTAsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW0xLCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tNCwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNywgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMnIobW0yLCBtbTUpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCAsIG1tNSk7CQkJCVwKCSAgcHNybHFfaTJyKDUsIG1tNSk7CQkJCVwKCSAgbW92cV9yMnIobW0zLCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCAsIG1tNik7CQkJCVwKCSAgcHNybHFfaTJyKDUsIG1tNik7CQkJCVwKCSAgcHN1YndfcjJyKG1tNiwgbW01KTsJCQkJXAoJICBwbXVsbHdfcjJyKG1tMCwgbW01KTsJCQkJXAoJICBwc3Jsd19pMnIoOCwgbW01KTsJCQkJXAoJICBwYWRkd19yMnIobW01LCBtbTYpOwkJCQlcCgkgIHBzbGxxX2kycig1LCBtbTYpOwkJCQlcCgkgIHBhbmRfcjJyKG1tNCwgbW02KTsJCQkJXAoJICBtb3ZxX3IycihtbTEsIG1tNSk7CQkJCVwKCSAgcG9yX3IycihtbTcsIG1tNSk7CQkJCVwKCSAgcGFuZF9yMnIobW01LCBtbTMpOwkJCQlcCgkgIHBvcl9yMnIobW02LCBtbTMpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMiwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTcgLCBtbTUpOwkJCQlcCiAgICAgICAgICBtb3ZxX3IycihtbTMsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW03ICwgbW02KTsJCQkJXAoJICBwc3Vid19yMnIobW02LCBtbTUpOwkJCQlcCgkgIHBtdWxsd19yMnIobW0wLCBtbTUpOwkJCQlcCgkgIHBzcmx3X2kycig4LCBtbTUpOwkJCQlcCgkgIHBhZGR3X3IycihtbTUsIG1tNik7CQkJCVwKCSAgcGFuZF9yMnIobW03LCBtbTYpOwkJCQlcCgkgIG1vdnFfcjJyKG1tMSwgbW01KTsJCQkJXAoJICBwb3JfcjJyKG1tNCwgbW01KTsJCQkJXAoJICBwYW5kX3IycihtbTUsIG1tMyk7CQkJCVwKCSAgcG9yX3IycihtbTYsIG1tMyk7CQkJCVwKCSAgbW92cV9yMm0obW0zLCAqZHN0cCk7CQkJCVwKCSAgc3JjcCArPSA0OwkJCQkJXAoJICBkc3RwICs9IDQ7CQkJCQlcCgkgIGkgLT0gMzsJCQkJCVwKCX0JCQkJCQlcCgllbW1zKCk7CQkJCQkJXAogICAgfSB3aGlsZSgwKQoKI2VuZGlmCgovKgogKiBGb3IgMzJicHAgcGl4ZWxzIG9uIHRoZSBmb3JtIDB4MDBycmdnYmI6CiAqIElmIHdlIHRyZWF0IHRoZSBtaWRkbGUgY29tcG9uZW50IHNlcGFyYXRlbHksIHdlIGNhbiBwcm9jZXNzIHRoZSB0d28KICogcmVtYWluaW5nIGluIHBhcmFsbGVsLiBUaGlzIGlzIHNhZmUgdG8gZG8gYmVjYXVzZSBvZiB0aGUgZ2FwIHRvIHRoZSBsZWZ0CiAqIG9mIGVhY2ggY29tcG9uZW50LCBzbyB0aGUgYml0cyBmcm9tIHRoZSBtdWx0aXBsaWNhdGlvbiBkb24ndCBjb2xsaWRlLgogKiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhbnkgUkdCIHBlcm11dGF0aW9uIG9mIGNvdXJzZS4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQkJXAogICAgZG8gewkJCQkJCQlcCiAgICAgICAgaW50IGk7CQkJCQkJCVwKCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKShmcm9tKTsJCQkJXAoJVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsJCQkJXAoJZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQkJXAoJICAgIFVpbnQzMiBzID0gKnNyYysrOwkJCQkJXAoJICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJCVwKCSAgICBVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7CQkJCVwKCSAgICBVaW50MzIgZDEgPSBkICYgMHhmZjAwZmY7CQkJCVwKCSAgICBkMSA9IChkMSArICgoczEgLSBkMSkgKiBhbHBoYSA+PiA4KSkgJiAweGZmMDBmZjsJXAoJICAgIHMgJj0gMHhmZjAwOwkJCQkJXAoJICAgIGQgJj0gMHhmZjAwOwkJCQkJXAoJICAgIGQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOwkJXAoJICAgICpkc3QrKyA9IGQxIHwgZDsJCQkJCVwKCX0JCQkJCQkJXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwIHBpeGVscyB3ZSBjYW4gZ28gYSBzdGVwIGZ1cnRoZXI6IHB1dCB0aGUgbWlkZGxlIGNvbXBvbmVudAogKiBpbiB0aGUgaGlnaCAxNiBiaXRzIG9mIGEgMzIgYml0IHdvcmQsIGFuZCBwcm9jZXNzIGFsbCB0aHJlZSBSR0IKICogY29tcG9uZW50cyBhdCB0aGUgc2FtZSB0aW1lLiBTaW5jZSB0aGUgc21hbGxlc3QgZ2FwIGlzIGhlcmUganVzdAogKiA1IGJpdHMsIHdlIGhhdmUgdG8gc2NhbGUgYWxwaGEgZG93biB0byA1IGJpdHMgYXMgd2VsbC4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDE2XzU2NSh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQlcCiAgICBkbyB7CQkJCQkJXAogICAgICAgIGludCBpOwkJCQkJCVwKCVVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsJCQlcCglVaW50MTYgKmRzdCA9IChVaW50MTYgKikodG8pOwkJCVwKCVVpbnQzMiBBTFBIQSA9IGFscGhhID4+IDM7CQkJXAoJZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQlcCgkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCVwKCSAgICBVaW50MzIgZCA9ICpkc3Q7CQkJCVwKCSAgICBzID0gKHMgfCBzIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCgkgICAgZCA9IChkIHwgZCA8PCAxNikgJiAweDA3ZTBmODFmOwkJXAoJICAgIGQgKz0gKHMgLSBkKSAqIEFMUEhBID4+IDU7CQkJXAoJICAgIGQgJj0gMHgwN2UwZjgxZjsJCQkJXAoJICAgICpkc3QrKyA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCgl9CQkJCQkJXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTU1KHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKICAgIGRvIHsJCQkJCQlcCiAgICAgICAgaW50IGk7CQkJCQkJXAoJVWludDE2ICpzcmMgPSAoVWludDE2ICopKGZyb20pOwkJCVwKCVVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7CQkJXAoJVWludDMyIEFMUEhBID0gYWxwaGEgPj4gMzsJCQlcCglmb3IoaSA9IDA7IGkgPCAoaW50KShsZW5ndGgpOyBpKyspIHsJCVwKCSAgICBVaW50MzIgcyA9ICpzcmMrKzsJCQkJXAoJICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJXAoJICAgIHMgPSAocyB8IHMgPDwgMTYpICYgMHgwM2UwN2MxZjsJCVwKCSAgICBkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDNlMDdjMWY7CQlcCgkgICAgZCArPSAocyAtIGQpICogQUxQSEEgPj4gNTsJCQlcCgkgICAgZCAmPSAweDAzZTA3YzFmOwkJCQlcCgkgICAgKmRzdCsrID0gKFVpbnQxNikoZCB8IGQgPj4gMTYpOwkJCVwKCX0JCQkJCQlcCiAgICB9IHdoaWxlKDApCgovKgogKiBUaGUgZ2VuZXJhbCBzbG93IGNhdGNoLWFsbCBmdW5jdGlvbiwgZm9yIHJlbWFpbmluZyBkZXB0aHMgYW5kIGZvcm1hdHMKICovCiNkZWZpbmUgQUxQSEFfQkxJVF9BTlkodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJCQlcCiAgICBkbyB7CQkJCQkJCQlcCiAgICAgICAgaW50IGk7CQkJCQkJCQlcCglVaW50OCAqc3JjID0gZnJvbTsJCQkJCQlcCglVaW50OCAqZHN0ID0gdG87CQkJCQkJXAoJZm9yKGkgPSAwOyBpIDwgKGludCkobGVuZ3RoKTsgaSsrKSB7CQkJCVwKCSAgICBVaW50MzIgcywgZDsJCQkJCQlcCgkgICAgdW5zaWduZWQgcnMsIGdzLCBicywgcmQsIGdkLCBiZDsJCQkJXAoJICAgIHN3aXRjaChicHApIHsJCQkJCQlcCgkgICAgY2FzZSAyOgkJCQkJCQlcCgkJcyA9ICooVWludDE2ICopc3JjOwkJCQkJXAoJCWQgPSAqKFVpbnQxNiAqKWRzdDsJCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIGNhc2UgMzoJCQkJCQkJXAoJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4pIHsJCQlcCgkJICAgIHMgPSAoc3JjWzBdIDw8IDE2KSB8IChzcmNbMV0gPDwgOCkgfCBzcmNbMl07CVwKCQkgICAgZCA9IChkc3RbMF0gPDwgMTYpIHwgKGRzdFsxXSA8PCA4KSB8IGRzdFsyXTsJXAoJCX0gZWxzZSB7CQkJCQkJXAoJCSAgICBzID0gKHNyY1syXSA8PCAxNikgfCAoc3JjWzFdIDw8IDgpIHwgc3JjWzBdOwlcCgkJICAgIGQgPSAoZHN0WzJdIDw8IDE2KSB8IChkc3RbMV0gPDwgOCkgfCBkc3RbMF07CVwKCQl9CQkJCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIGNhc2UgNDoJCQkJCQkJXAoJCXMgPSAqKFVpbnQzMiAqKXNyYzsJCQkJCVwKCQlkID0gKihVaW50MzIgKilkc3Q7CQkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCSAgICB9CQkJCQkJCQlcCgkgICAgUkdCX0ZST01fUElYRUwocywgZm10LCBycywgZ3MsIGJzKTsJCQkJXAoJICAgIFJHQl9GUk9NX1BJWEVMKGQsIGZtdCwgcmQsIGdkLCBiZCk7CQkJCVwKCSAgICByZCArPSAocnMgLSByZCkgKiBhbHBoYSA+PiA4OwkJCQlcCgkgICAgZ2QgKz0gKGdzIC0gZ2QpICogYWxwaGEgPj4gODsJCQkJXAoJICAgIGJkICs9IChicyAtIGJkKSAqIGFscGhhID4+IDg7CQkJCVwKCSAgICBQSVhFTF9GUk9NX1JHQihkLCBmbXQsIHJkLCBnZCwgYmQpOwkJCQlcCgkgICAgc3dpdGNoKGJwcCkgewkJCQkJCVwKCSAgICBjYXNlIDI6CQkJCQkJCVwKCQkqKFVpbnQxNiAqKWRzdCA9IChVaW50MTYpZDsJCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIGNhc2UgMzoJCQkJCQkJXAoJCWlmKFNETF9CWVRFT1JERVIgPT0gU0RMX0JJR19FTkRJQU4pIHsJCQlcCgkJICAgIGRzdFswXSA9IChVaW50OCkoZCA+PiAxNik7CQkJCQlcCgkJICAgIGRzdFsxXSA9IChVaW50OCkoZCA+PiA4KTsJCQkJCVwKCQkgICAgZHN0WzJdID0gKFVpbnQ4KShkKTsJCQkJCQlcCgkJfSBlbHNlIHsJCQkJCQlcCgkJICAgIGRzdFswXSA9IChVaW50OClkOwkJCQkJCVwKCQkgICAgZHN0WzFdID0gKFVpbnQ4KShkID4+IDgpOwkJCQkJXAoJCSAgICBkc3RbMl0gPSAoVWludDgpKGQgPj4gMTYpOwkJCQkJXAoJCX0JCQkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgY2FzZSA0OgkJCQkJCQlcCgkJKihVaW50MzIgKilkc3QgPSBkOwkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkgICAgfQkJCQkJCQkJXAoJICAgIHNyYyArPSBicHA7CQkJCQkJCVwKCSAgICBkc3QgKz0gYnBwOwkJCQkJCQlcCgl9CQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojaWZkZWYgTU1YX0FTTUJMSVQKCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81ME1NWCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQkJXAogICAgZG8gewkJCQkJCQkJXAoJVWludDMyICpzcmNwID0gKFVpbnQzMiAqKShmcm9tKTsJCQkJXAoJVWludDMyICpkc3RwID0gKFVpbnQzMiAqKSh0byk7CQkJCQlcCiAgICAgICAgaW50IGkgPSAweDAwZmVmZWZlOwkJCQkJCVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW00KTsJCQkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTQsIG1tNCk7CQkJCQlcCiAgICAgICAgaSA9IDB4MDAwMTAxMDE7CQkJCQkJCVwKICAgICAgICBtb3ZkX20ycigqKCZpKSwgbW0zKTsJCQkJCQlcCiAgICAgICAgcHVucGNrbGRxX3IycihtbTMsIG1tMyk7CQkJCQlcCiAgICAgICAgaSA9IChpbnQpKGxlbmd0aCk7CQkJCQkJXAogICAgICAgIGlmKCBpICYgMSApIHsJCQkJCQkJXAoJICBVaW50MzIgcyA9ICpzcmNwKys7CQkJCQkJXAoJICBVaW50MzIgZCA9ICpkc3RwOwkJCQkJCVwKCSAgKmRzdHArKyA9ICgoKHMgJiAweDAwZmVmZWZlKSArIChkICYgMHgwMGZlZmVmZSkpID4+IDEpCVwKCQkgICAgICsgKHMgJiBkICYgMHgwMDAxMDEwMSk7CQkJCVwKCSAgaS0tOwkJCQkJCQkJXAoJfQkJCQkJCQkJXAoJZm9yKDsgaSA+IDA7IC0taSkgewkJCQkJCVwKCSAgICBtb3ZxX20ycigoKmRzdHApLCBtbTIpOyAvKiBkc3QgLT4gbW0yICovCQkJXAoJICAgIG1vdnFfcjJyKG1tMiwgbW02KTsJLyogZHN0IC0+IG1tNiAqLwkJCVwKCSAgICBtb3ZxX20ycigoKnNyY3ApLCBtbTEpOyAvKiBzcmMgLT4gbW0xICovCQkJXAoJICAgIG1vdnFfcjJyKG1tMSwgbW01KTsJLyogc3JjIC0+IG1tNSAqLwkJCVwKCSAgICBwYW5kX3IycihtbTQsIG1tNik7CS8qIGRzdCAmIDB4MDBmZWZlZmUgLT4gbW02ICovCQlcCgkgICAgcGFuZF9yMnIobW00LCBtbTUpOyAvKiBzcmMgJiAweDAwZmVmZWZlIC0+IG1tNSAqLwkJXAoJICAgIHBhZGRkX3IycihtbTYsIG1tNSk7IC8qIChkc3QgJiAweDAwZmVmZWZlKSArIChkc3QgJiAweDAwZmVmZWZlKSAtPiBtbTUgKi8JXAoJICAgIHBzcmxkX2kycigxLCBtbTUpOwkJCQkJCVwKCSAgICBwYW5kX3IycihtbTEsIG1tMik7CS8qIHMgJiBkIC0+IG1tMiAqLwkJCVwKCSAgICBwYW5kX3IycihtbTMsIG1tMik7CS8qIHMgJiBkICYgMHgwMDAxMDEwMSAtPiBtbTIgKi8JCVwKCSAgICBwYWRkZF9yMnIobW01LCBtbTIpOwkJCQkJXAoJICAgIG1vdnFfcjJtKG1tMiwgKCpkc3RwKSk7CQkJCQlcCgkgICAgZHN0cCArPSAyOwkJCQkJCQlcCgkgICAgc3JjcCArPSAyOwkJCQkJCQlcCgkgICAgaS0tOwkJCQkJCQlcCgl9CQkJCQkJCQlcCgllbW1zKCk7CQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZW5kaWYKICAgIAovKgogKiBTcGVjaWFsIGNhc2U6IDUwJSBhbHBoYSAoYWxwaGE9MTI4KQogKiBUaGlzIGlzIHRyZWF0ZWQgc3BlY2lhbGx5IGJlY2F1c2UgaXQgY2FuIGJlIG9wdGltaXplZCB2ZXJ5IHdlbGwsIGFuZAogKiBzaW5jZSBpdCBpcyBnb29kIGZvciBtYW55IGNhc2VzIG9mIHNlbWktdHJhbnNsdWNlbmN5LgogKiBUaGUgdGhlb3J5IGlzIHRvIGRvIGFsbCB0aHJlZSBjb21wb25lbnRzIGF0IHRoZSBzYW1lIHRpbWU6CiAqIEZpcnN0IHplcm8gdGhlIGxvd2VzdCBiaXQgb2YgZWFjaCBjb21wb25lbnQsIHdoaWNoIGdpdmVzIHVzIHJvb20gdG8KICogYWRkIHRoZW0uIFRoZW4gc2hpZnQgcmlnaHQgYW5kIGFkZCB0aGUgc3VtIG9mIHRoZSBsb3dlc3QgYml0cy4KICovCiNkZWZpbmUgQUxQSEFfQkxJVDMyXzg4OF81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhKQkJXAogICAgZG8gewkJCQkJCQkJXAogICAgICAgIGludCBpOwkJCQkJCQkJXAoJVWludDMyICpzcmMgPSAoVWludDMyICopKGZyb20pOwkJCQkJXAoJVWludDMyICpkc3QgPSAoVWludDMyICopKHRvKTsJCQkJCVwKCWZvcihpID0gMDsgaSA8IChpbnQpKGxlbmd0aCk7IGkrKykgewkJCQlcCgkgICAgVWludDMyIHMgPSAqc3JjKys7CQkJCQkJXAoJICAgIFVpbnQzMiBkID0gKmRzdDsJCQkJCQlcCgkgICAgKmRzdCsrID0gKCgocyAmIDB4MDBmZWZlZmUpICsgKGQgJiAweDAwZmVmZWZlKSkgPj4gMSkJXAoJCSAgICAgKyAocyAmIGQgJiAweDAwMDEwMTAxKTsJCQkJXAoJfQkJCQkJCQkJXAogICAgfSB3aGlsZSgwKQoKLyoKICogRm9yIDE2YnBwLCB3ZSBjYW4gYWN0dWFsbHkgYmxlbmQgdHdvIHBpeGVscyBpbiBwYXJhbGxlbCwgaWYgd2UgdGFrZQogKiBjYXJlIHRvIHNoaWZ0IGJlZm9yZSB3ZSBhZGQsIG5vdCBhZnRlci4KICovCgovKiBoZWxwZXI6IGJsZW5kIGEgc2luZ2xlIDE2IGJpdCBwaXhlbCBhdCA1MCUgKi8KI2RlZmluZSBCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKQkJCVwKICAgIGRvIHsJCQkJCQlcCglVaW50MzIgcyA9ICpzcmMrKzsJCQkJXAoJVWludDMyIGQgPSAqZHN0OwkJCQlcCgkqZHN0KysgPSAoVWludDE2KSgoKChzICYgbWFzaykgKyAoZCAmIG1hc2spKSA+PiAxKSArCVwKCSAgICAgICAgICAgICAgICAgIChzICYgZCAmICh+bWFzayAmIDB4ZmZmZikpKTsJCVwKICAgIH0gd2hpbGUoMCkKCi8qIGJhc2ljIDE2YnBwIGJsZW5kZXIuIG1hc2sgaXMgdGhlIHBpeGVscyB0byBrZWVwIHdoZW4gYWRkaW5nLiAqLwojZGVmaW5lIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCBtYXNrKQkJXAogICAgZG8gewkJCQkJCQkJXAoJdW5zaWduZWQgbiA9IChsZW5ndGgpOwkJCQkJCVwKCVVpbnQxNiAqc3JjID0gKFVpbnQxNiAqKShmcm9tKTsJCQkJCVwKCVVpbnQxNiAqZHN0ID0gKFVpbnQxNiAqKSh0byk7CQkJCQlcCglpZigoKHVpbnRwdHJfdClzcmMgXiAodWludHB0cl90KWRzdCkgJiAzKSB7CQkJXAoJICAgIC8qIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gbm90IGluIHBoYXNlLCBibGl0IG9uZSBieSBvbmUgKi8JXAoJICAgIHdoaWxlKG4tLSkJCQkJCQkJXAoJCUJMRU5EMTZfNTAoZHN0LCBzcmMsIG1hc2spOwkJCQlcCgl9IGVsc2UgewkJCQkJCQlcCgkgICAgaWYoKHVpbnRwdHJfdClzcmMgJiAzKSB7CQkJCQlcCgkJLyogZmlyc3Qgb2RkIHBpeGVsICovCQkJCQlcCgkJQkxFTkQxNl81MChkc3QsIHNyYywgbWFzayk7CQkJCVwKCQluLS07CQkJCQkJCVwKCSAgICB9CQkJCQkJCQlcCgkgICAgZm9yKDsgbiA+IDE7IG4gLT0gMikgewkJCQkJXAoJCVVpbnQzMiBzID0gKihVaW50MzIgKilzcmM7CQkJCVwKCQlVaW50MzIgZCA9ICooVWludDMyICopZHN0OwkJCQlcCgkJKihVaW50MzIgKilkc3QgPSAoKHMgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKQlcCgkJICAgICAgICAgICAgICAgKyAoKGQgJiAobWFzayB8IG1hc2sgPDwgMTYpKSA+PiAxKQlcCgkJICAgICAgICAgICAgICAgKyAocyAmIGQgJiAofihtYXNrIHwgbWFzayA8PCAxNikpKTsJXAoJCXNyYyArPSAyOwkJCQkJCVwKCQlkc3QgKz0gMjsJCQkJCQlcCgkgICAgfQkJCQkJCQkJXAoJICAgIGlmKG4pCQkJCQkJCVwKCQlCTEVORDE2XzUwKGRzdCwgc3JjLCBtYXNrKTsgLyogbGFzdCBvZGQgcGl4ZWwgKi8JXAoJfQkJCQkJCQkJXAogICAgfSB3aGlsZSgwKQoKI2RlZmluZSBBTFBIQV9CTElUMTZfNTY1XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEpCVwKICAgIEFMUEhBX0JMSVQxNl81MCh0bywgZnJvbSwgbGVuZ3RoLCBicHAsIGFscGhhLCAweGY3ZGUpCgojZGVmaW5lIEFMUEhBX0JMSVQxNl81NTVfNTAodG8sIGZyb20sIGxlbmd0aCwgYnBwLCBhbHBoYSkJXAogICAgQUxQSEFfQkxJVDE2XzUwKHRvLCBmcm9tLCBsZW5ndGgsIGJwcCwgYWxwaGEsIDB4ZmJkZSkKCiNpZmRlZiBNTVhfQVNNQkxJVAoKI2RlZmluZSBDSE9PU0VfQkxJVChibGl0dGVyLCBhbHBoYSwgZm10KQkJCQlcCiAgICBkbyB7CQkJCQkJCQlcCiAgICAgICAgaWYoYWxwaGEgPT0gMjU1KSB7CQkJCQkJXAoJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAoJICAgIGNhc2UgMTogYmxpdHRlcigxLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKCSAgICBjYXNlIDI6IGJsaXR0ZXIoMiwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgY2FzZSAzOiBibGl0dGVyKDMsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAoJICAgIGNhc2UgNDogYmxpdHRlcig0LCBVaW50MTYsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgfQkJCQkJCQkJXAoJfSBlbHNlIHsJCQkJCQkJXAoJICAgIHN3aXRjaChmbXQtPkJ5dGVzUGVyUGl4ZWwpIHsJCQkJXAoJICAgIGNhc2UgMToJCQkJCQkJXAoJCS8qIE5vIDhicHAgYWxwaGEgYmxpdHRpbmcgKi8JCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkJCQkJCQkJCVwKCSAgICBjYXNlIDI6CQkJCQkJCVwKCQlzd2l0Y2goZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSB7CQlcCgkJY2FzZSAweGZmZmY6CQkJCQkJXAoJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDdlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwN2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDA3ZTApIHsJCQlcCgkJCWlmKGFscGhhID09IDEyOCkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NV81MCk7CVwKCQkJZWxzZSB7CQkJCQkJXAoJCQkgICAgaWYoU0RMX0hhc01NWCgpKQkJCQlcCgkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTY1TU1YKTsJXAoJCQkgICAgZWxzZQkJCQkJXAoJCQkJYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU2NSk7CVwKCQkJfQkJCQkJCVwKCQkgICAgfSBlbHNlCQkJCQkJXAoJCQlnb3RvIGdlbmVyYWwxNjsJCQkJCVwKCQkgICAgYnJlYWs7CQkJCQkJXAoJCQkJCQkJCQlcCgkJY2FzZSAweDdmZmY6CQkJCQkJXAoJCSAgICBpZihmbXQtPkdtYXNrID09IDB4MDNlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Um1hc2sgPT0gMHgwM2UwCQkJCVwKCQkgICAgICAgfHwgZm10LT5CbWFzayA9PSAweDAzZTApIHsJCQlcCgkJCWlmKGFscGhhID09IDEyOCkJCQkJXAoJCQkgICAgYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NV81MCk7CVwKCQkJZWxzZSB7CQkJCQkJXAoJCQkgICAgaWYoU0RMX0hhc01NWCgpKQkJCQlcCgkJCQlibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUMTZfNTU1TU1YKTsJXAoJCQkgICAgZWxzZQkJCQkJXAoJCQkJYmxpdHRlcigyLCBVaW50OCwgQUxQSEFfQkxJVDE2XzU1NSk7CVwKCQkJfQkJCQkJCVwKCQkJYnJlYWs7CQkJCQkJXAoJCSAgICB9CQkJCQkJCVwKCQkgICAgLyogZmFsbHRocm91Z2ggKi8JCQkJCVwKCQkJCQkJCQkJXAoJCWRlZmF1bHQ6CQkJCQkJXAoJCWdlbmVyYWwxNjoJCQkJCQlcCgkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCgkJfQkJCQkJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCQkJCQkJCQkJXAoJICAgIGNhc2UgMzoJCQkJCQkJXAoJCWJsaXR0ZXIoMywgVWludDgsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCQkJCQkJCQkJXAoJICAgIGNhc2UgNDoJCQkJCQkJXAoJCWlmKChmbXQtPlJtYXNrIHwgZm10LT5HbWFzayB8IGZtdC0+Qm1hc2spID09IDB4MDBmZmZmZmYJXAoJCSAgICYmIChmbXQtPkdtYXNrID09IDB4ZmYwMCB8fCBmbXQtPlJtYXNrID09IDB4ZmYwMAlcCgkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHhmZjAwKSkgewkJCVwKCQkgICAgaWYoYWxwaGEgPT0gMTI4KQkJCQkJXAoJCSAgICB7CQkJCQkJCVwKCQkJaWYoU0RMX0hhc01NWCgpKQkJCQlcCgkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OF81ME1NWCk7XAoJCQllbHNlCQkJCQkJXAoJCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApO1wKCQkgICAgfQkJCQkJCQlcCgkJICAgIGVsc2UJCQkJCQlcCgkJICAgIHsJCQkJCQkJXAoJCQlpZihTRExfSGFzTU1YKCkpCQkJCVwKCQkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4TU1YKTtcCgkJCWVsc2UJCQkJCQlcCgkJCQlibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVDMyXzg4OCk7CVwKCQkgICAgfQkJCQkJCQlcCgkJfSBlbHNlCQkJCQkJCVwKCQkgICAgYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVRfQU5ZKTsJCQlcCgkJYnJlYWs7CQkJCQkJCVwKCSAgICB9CQkJCQkJCQlcCgl9CQkJCQkJCQlcCiAgICB9IHdoaWxlKDApCgojZWxzZQoJCiNkZWZpbmUgQ0hPT1NFX0JMSVQoYmxpdHRlciwgYWxwaGEsIGZtdCkJCQkJXAogICAgZG8gewkJCQkJCQkJXAogICAgICAgIGlmKGFscGhhID09IDI1NSkgewkJCQkJCVwKCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKCSAgICBjYXNlIDE6IGJsaXR0ZXIoMSwgVWludDgsIE9QQVFVRV9CTElUKTsgYnJlYWs7CQlcCgkgICAgY2FzZSAyOiBibGl0dGVyKDIsIFVpbnQ4LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAoJICAgIGNhc2UgMzogYmxpdHRlcigzLCBVaW50OCwgT1BBUVVFX0JMSVQpOyBicmVhazsJCVwKCSAgICBjYXNlIDQ6IGJsaXR0ZXIoNCwgVWludDE2LCBPUEFRVUVfQkxJVCk7IGJyZWFrOwkJXAoJICAgIH0JCQkJCQkJCVwKCX0gZWxzZSB7CQkJCQkJCVwKCSAgICBzd2l0Y2goZm10LT5CeXRlc1BlclBpeGVsKSB7CQkJCVwKCSAgICBjYXNlIDE6CQkJCQkJCVwKCQkvKiBObyA4YnBwIGFscGhhIGJsaXR0aW5nICovCQkJCVwKCQlicmVhazsJCQkJCQkJXAoJCQkJCQkJCQlcCgkgICAgY2FzZSAyOgkJCQkJCQlcCgkJc3dpdGNoKGZtdC0+Um1hc2sgfCBmbXQtPkdtYXNrIHwgZm10LT5CbWFzaykgewkJXAoJCWNhc2UgMHhmZmZmOgkJCQkJCVwKCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDA3ZTAJCQkJXAoJCSAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDdlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwN2UwKSB7CQkJXAoJCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjVfNTApOwlcCgkJCWVsc2UgewkJCQkJCVwKCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NjUpOwlcCgkJCX0JCQkJCQlcCgkJICAgIH0gZWxzZQkJCQkJCVwKCQkJZ290byBnZW5lcmFsMTY7CQkJCQlcCgkJICAgIGJyZWFrOwkJCQkJCVwKCQkJCQkJCQkJXAoJCWNhc2UgMHg3ZmZmOgkJCQkJCVwKCQkgICAgaWYoZm10LT5HbWFzayA9PSAweDAzZTAJCQkJXAoJCSAgICAgICB8fCBmbXQtPlJtYXNrID09IDB4MDNlMAkJCQlcCgkJICAgICAgIHx8IGZtdC0+Qm1hc2sgPT0gMHgwM2UwKSB7CQkJXAoJCQlpZihhbHBoYSA9PSAxMjgpCQkJCVwKCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTVfNTApOwlcCgkJCWVsc2UgewkJCQkJCVwKCQkJICAgIGJsaXR0ZXIoMiwgVWludDgsIEFMUEhBX0JMSVQxNl81NTUpOwlcCgkJCX0JCQkJCQlcCgkJCWJyZWFrOwkJCQkJCVwKCQkgICAgfQkJCQkJCQlcCgkJICAgIC8qIGZhbGx0aHJvdWdoICovCQkJCQlcCgkJCQkJCQkJCVwKCQlkZWZhdWx0OgkJCQkJCVwKCQlnZW5lcmFsMTY6CQkJCQkJXAoJCSAgICBibGl0dGVyKDIsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7CQkJXAoJCX0JCQkJCQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkJCQkJCQkJCVwKCSAgICBjYXNlIDM6CQkJCQkJCVwKCQlibGl0dGVyKDMsIFVpbnQ4LCBBTFBIQV9CTElUX0FOWSk7CQkJXAoJCWJyZWFrOwkJCQkJCQlcCgkJCQkJCQkJCVwKCSAgICBjYXNlIDQ6CQkJCQkJCVwKCQlpZigoZm10LT5SbWFzayB8IGZtdC0+R21hc2sgfCBmbXQtPkJtYXNrKSA9PSAweDAwZmZmZmZmCVwKCQkgICAmJiAoZm10LT5HbWFzayA9PSAweGZmMDAgfHwgZm10LT5SbWFzayA9PSAweGZmMDAJXAoJCSAgICAgICB8fCBmbXQtPkJtYXNrID09IDB4ZmYwMCkpIHsJCQlcCgkJICAgIGlmKGFscGhhID09IDEyOCkJCQkJCVwKCQkJYmxpdHRlcig0LCBVaW50MTYsIEFMUEhBX0JMSVQzMl84ODhfNTApOwlcCgkJICAgIGVsc2UJCQkJCQlcCgkJCWJsaXR0ZXIoNCwgVWludDE2LCBBTFBIQV9CTElUMzJfODg4KTsJCVwKCQl9IGVsc2UJCQkJCQkJXAoJCSAgICBibGl0dGVyKDQsIFVpbnQxNiwgQUxQSEFfQkxJVF9BTlkpOwkJCVwKCQlicmVhazsJCQkJCQkJXAoJICAgIH0JCQkJCQkJCVwKCX0JCQkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCiNlbmRpZgoKLyoKICogVGhpcyB0YWtlcyBjYXJlIG9mIHRoZSBjYXNlIHdoZW4gdGhlIHN1cmZhY2UgaXMgY2xpcHBlZCBvbiB0aGUgbGVmdCBhbmQvb3IKICogcmlnaHQuIFRvcCBjbGlwcGluZyBoYXMgYWxyZWFkeSBiZWVuIHRha2VuIGNhcmUgb2YuCiAqLwpzdGF0aWMgdm9pZCBSTEVDbGlwQmxpdChpbnQgdywgVWludDggKnNyY2J1ZiwgU0RMX1N1cmZhY2UgKmRzdCwKCQkJVWludDggKmRzdGJ1ZiwgU0RMX1JlY3QgKnNyY3JlY3QsIHVuc2lnbmVkIGFscGhhKQp7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmZtdCA9IGRzdC0+Zm9ybWF0OwoKI2RlZmluZSBSTEVDTElQQkxJVChicHAsIFR5cGUsIGRvX2JsaXQpCQkJCQkgICBcCiAgICBkbyB7CQkJCQkJCQkgICBcCglpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsJCQkJCSAgIFwKCWludCBvZnMgPSAwOwkJCQkJCQkgICBcCglpbnQgbGVmdCA9IHNyY3JlY3QtPng7CQkJCQkJICAgXAoJaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7CQkJCQkgICBcCglkc3RidWYgLT0gbGVmdCAqIGJwcDsJCQkJCQkgICBcCglmb3IoOzspIHsJCQkJCQkJICAgXAoJICAgIGludCBydW47CQkJCQkJCSAgIFwKCSAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOwkJCQkJICAgXAoJICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07CQkJCQkgICBcCgkgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7CQkJCQkgICBcCgkgICAgaWYocnVuKSB7CQkJCQkJCSAgIFwKCQkvKiBjbGlwIHRvIGxlZnQgYW5kIHJpZ2h0IGJvcmRlcnMgKi8JCQkgICBcCgkJaWYob2ZzIDwgcmlnaHQpIHsJCQkJCSAgIFwKCQkgICAgaW50IHN0YXJ0ID0gMDsJCQkJCSAgIFwKCQkgICAgaW50IGxlbiA9IHJ1bjsJCQkJCSAgIFwKCQkgICAgaW50IHN0YXJ0Y29sOwkJCQkJICAgXAoJCSAgICBpZihsZWZ0IC0gb2ZzID4gMCkgewkJCQkgICBcCgkJCXN0YXJ0ID0gbGVmdCAtIG9mczsJCQkJICAgXAoJCQlsZW4gLT0gc3RhcnQ7CQkJCQkgICBcCgkJCWlmKGxlbiA8PSAwKQkJCQkJICAgXAoJCQkgICAgZ290byBub2NvcHkgIyMgYnBwICMjIGRvX2JsaXQ7CQkgICBcCgkJICAgIH0JCQkJCQkJICAgXAoJCSAgICBzdGFydGNvbCA9IG9mcyArIHN0YXJ0OwkJCQkgICBcCgkJICAgIGlmKGxlbiA+IHJpZ2h0IC0gc3RhcnRjb2wpCQkJCSAgIFwKCQkJbGVuID0gcmlnaHQgLSBzdGFydGNvbDsJCQkJICAgXAoJCSAgICBkb19ibGl0KGRzdGJ1ZiArIHN0YXJ0Y29sICogYnBwLCBzcmNidWYgKyBzdGFydCAqIGJwcCwgXAoJCQkgICAgbGVuLCBicHAsIGFscGhhKTsJCQkJICAgXAoJCX0JCQkJCQkJICAgXAoJICAgIG5vY29weSAjIyBicHAgIyMgZG9fYmxpdDoJCQkJCSAgIFwKCQlzcmNidWYgKz0gcnVuICogYnBwOwkJCQkJICAgXAoJCW9mcyArPSBydW47CQkJCQkJICAgXAoJICAgIH0gZWxzZSBpZighb2ZzKQkJCQkJCSAgIFwKCQlicmVhazsJCQkJCQkJICAgXAoJICAgIGlmKG9mcyA9PSB3KSB7CQkJCQkJICAgXAoJCW9mcyA9IDA7CQkJCQkJICAgXAoJCWRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkJICAgXAoJCWlmKCEtLWxpbmVjb3VudCkJCQkJCSAgIFwKCQkgICAgYnJlYWs7CQkJCQkJICAgXAoJICAgIH0JCQkJCQkJCSAgIFwKCX0JCQkJCQkJCSAgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBDSE9PU0VfQkxJVChSTEVDTElQQkxJVCwgYWxwaGEsIGZtdCk7CgojdW5kZWYgUkxFQ0xJUEJMSVQKCn0KCgovKiBibGl0IGEgY29sb3JrZXllZCBSTEUgc3VyZmFjZSAqLwppbnQgU0RMX1JMRUJsaXQoU0RMX1N1cmZhY2UgKnNyYywgU0RMX1JlY3QgKnNyY3JlY3QsCgkJU0RMX1N1cmZhY2UgKmRzdCwgU0RMX1JlY3QgKmRzdHJlY3QpCnsKCVVpbnQ4ICpkc3RidWY7CglVaW50OCAqc3JjYnVmOwoJaW50IHgsIHk7CglpbnQgdyA9IHNyYy0+dzsKCXVuc2lnbmVkIGFscGhhOwoKCS8qIExvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwoJaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKCQlpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCApIHsKCQkJcmV0dXJuKC0xKTsKCQl9Cgl9CgoJLyogU2V0IHVwIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHBvaW50ZXJzICovCgl4ID0gZHN0cmVjdC0+eDsKCXkgPSBkc3RyZWN0LT55OwoJZHN0YnVmID0gKFVpbnQ4ICopZHN0LT5waXhlbHMKCSAgICAgICAgICsgeSAqIGRzdC0+cGl0Y2ggKyB4ICogc3JjLT5mb3JtYXQtPkJ5dGVzUGVyUGl4ZWw7CglzcmNidWYgPSAoVWludDggKilzcmMtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGE7CgoJewoJICAgIC8qIHNraXAgbGluZXMgYXQgdGhlIHRvcCBpZiBuZWNjZXNzYXJ5ICovCgkgICAgaW50IHZza2lwID0gc3JjcmVjdC0+eTsKCSAgICBpbnQgb2ZzID0gMDsKCSAgICBpZih2c2tpcCkgewoKI2RlZmluZSBSTEVTS0lQKGJwcCwgVHlwZSkJCQlcCgkJZm9yKDs7KSB7CQkJXAoJCSAgICBpbnQgcnVuOwkJCVwKCQkgICAgb2ZzICs9ICooVHlwZSAqKXNyY2J1ZjsJXAoJCSAgICBydW4gPSAoKFR5cGUgKilzcmNidWYpWzFdOwlcCgkJICAgIHNyY2J1ZiArPSBzaXplb2YoVHlwZSkgKiAyOwlcCgkJICAgIGlmKHJ1bikgewkJCVwKCQkJc3JjYnVmICs9IHJ1biAqIGJwcDsJXAoJCQlvZnMgKz0gcnVuOwkJXAoJCSAgICB9IGVsc2UgaWYoIW9mcykJCVwKCQkJZ290byBkb25lOwkJXAoJCSAgICBpZihvZnMgPT0gdykgewkJXAoJCQlvZnMgPSAwOwkJXAoJCQlpZighLS12c2tpcCkJCVwKCQkJICAgIGJyZWFrOwkJXAoJCSAgICB9CQkJCVwKCQl9CgoJCXN3aXRjaChzcmMtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbCkgewoJCWNhc2UgMTogUkxFU0tJUCgxLCBVaW50OCk7IGJyZWFrOwoJCWNhc2UgMjogUkxFU0tJUCgyLCBVaW50OCk7IGJyZWFrOwoJCWNhc2UgMzogUkxFU0tJUCgzLCBVaW50OCk7IGJyZWFrOwoJCWNhc2UgNDogUkxFU0tJUCg0LCBVaW50MTYpOyBicmVhazsKCQl9CgojdW5kZWYgUkxFU0tJUAoKCSAgICB9Cgl9CgoJYWxwaGEgPSAoc3JjLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBCgkgICAgICAgID8gc3JjLT5mb3JtYXQtPmFscGhhIDogMjU1OwoJLyogaWYgbGVmdCBvciByaWdodCBlZGdlIGNsaXBwaW5nIG5lZWRlZCwgY2FsbCBjbGlwIGJsaXQgKi8KCWlmICggc3JjcmVjdC0+eCB8fCBzcmNyZWN0LT53ICE9IHNyYy0+dyApIHsKCSAgICBSTEVDbGlwQmxpdCh3LCBzcmNidWYsIGRzdCwgZHN0YnVmLCBzcmNyZWN0LCBhbHBoYSk7Cgl9IGVsc2UgewoJICAgIFNETF9QaXhlbEZvcm1hdCAqZm10ID0gc3JjLT5mb3JtYXQ7CgojZGVmaW5lIFJMRUJMSVQoYnBwLCBUeXBlLCBkb19ibGl0KQkJCQkJICAgICAgXAoJICAgIGRvIHsJCQkJCQkJICAgICAgXAoJCWludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkgICAgICBcCgkJaW50IG9mcyA9IDA7CQkJCQkJICAgICAgXAoJCWZvcig7OykgewkJCQkJCSAgICAgIFwKCQkgICAgdW5zaWduZWQgcnVuOwkJCQkJICAgICAgXAoJCSAgICBvZnMgKz0gKihUeXBlICopc3JjYnVmOwkJCQkgICAgICBcCgkJICAgIHJ1biA9ICgoVHlwZSAqKXNyY2J1ZilbMV07CQkJCSAgICAgIFwKCQkgICAgc3JjYnVmICs9IDIgKiBzaXplb2YoVHlwZSk7CQkJCSAgICAgIFwKCQkgICAgaWYocnVuKSB7CQkJCQkJICAgICAgXAoJCQlkb19ibGl0KGRzdGJ1ZiArIG9mcyAqIGJwcCwgc3JjYnVmLCBydW4sIGJwcCwgYWxwaGEpOyBcCgkJCXNyY2J1ZiArPSBydW4gKiBicHA7CQkJCSAgICAgIFwKCQkJb2ZzICs9IHJ1bjsJCQkJCSAgICAgIFwKCQkgICAgfSBlbHNlIGlmKCFvZnMpCQkJCQkgICAgICBcCgkJCWJyZWFrOwkJCQkJCSAgICAgIFwKCQkgICAgaWYob2ZzID09IHcpIHsJCQkJCSAgICAgIFwKCQkJb2ZzID0gMDsJCQkJCSAgICAgIFwKCQkJZHN0YnVmICs9IGRzdC0+cGl0Y2g7CQkJCSAgICAgIFwKCQkJaWYoIS0tbGluZWNvdW50KQkJCQkgICAgICBcCgkJCSAgICBicmVhazsJCQkJCSAgICAgIFwKCQkgICAgfQkJCQkJCQkgICAgICBcCgkJfQkJCQkJCQkgICAgICBcCgkgICAgfSB3aGlsZSgwKQoKCSAgICBDSE9PU0VfQkxJVChSTEVCTElULCBhbHBoYSwgZm10KTsKCiN1bmRlZiBSTEVCTElUCgl9Cgpkb25lOgoJLyogVW5sb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KCWlmICggU0RMX01VU1RMT0NLKGRzdCkgKSB7CgkJU0RMX1VubG9ja1N1cmZhY2UoZHN0KTsKCX0KCXJldHVybigwKTsKfQoKI3VuZGVmIE9QQVFVRV9CTElUCgovKgogKiBQZXItcGl4ZWwgYmxpdHRpbmcgbWFjcm9zIGZvciB0cmFuc2x1Y2VudCBwaXhlbHM6CiAqIFRoZXNlIHVzZSB0aGUgc2FtZSB0ZWNobmlxdWVzIGFzIHRoZSBwZXItc3VyZmFjZSBibGl0dGluZyBtYWNyb3MKICovCgovKgogKiBGb3IgMzJicHAgcGl4ZWxzLCB3ZSBoYXZlIG1hZGUgc3VyZSB0aGUgYWxwaGEgaXMgc3RvcmVkIGluIHRoZSB0b3AKICogOCBiaXRzLCBzbyBwcm9jZWVkIGFzIHVzdWFsCiAqLwojZGVmaW5lIEJMSVRfVFJBTlNMXzg4OChzcmMsIGRzdCkJCQkJXAogICAgZG8gewkJCQkJCQlcCiAgICAgICAgVWludDMyIHMgPSBzcmM7CQkJCQkJXAoJVWludDMyIGQgPSBkc3Q7CQkJCQkJXAoJdW5zaWduZWQgYWxwaGEgPSBzID4+IDI0OwkJCQlcCglVaW50MzIgczEgPSBzICYgMHhmZjAwZmY7CQkJCVwKCVVpbnQzMiBkMSA9IGQgJiAweGZmMDBmZjsJCQkJXAoJZDEgPSAoZDEgKyAoKHMxIC0gZDEpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwZmY7CVwKCXMgJj0gMHhmZjAwOwkJCQkJCVwKCWQgJj0gMHhmZjAwOwkJCQkJCVwKCWQgPSAoZCArICgocyAtIGQpICogYWxwaGEgPj4gOCkpICYgMHhmZjAwOwkJXAoJZHN0ID0gZDEgfCBkOwkJCQkJCVwKICAgIH0gd2hpbGUoMCkKCi8qCiAqIEZvciAxNmJwcCBwaXhlbHMsIHdlIGhhdmUgc3RvcmVkIHRoZSA1IG1vc3Qgc2lnbmlmaWNhbnQgYWxwaGEgYml0cyBpbgogKiBiaXRzIDUtMTAuIEFzIGJlZm9yZSwgd2UgY2FuIHByb2Nlc3MgYWxsIDMgUkdCIGNvbXBvbmVudHMgYXQgdGhlIHNhbWUgdGltZS4KICovCiNkZWZpbmUgQkxJVF9UUkFOU0xfNTY1KHNyYywgZHN0KQkJXAogICAgZG8gewkJCQkJXAoJVWludDMyIHMgPSBzcmM7CQkJCVwKCVVpbnQzMiBkID0gZHN0OwkJCQlcCgl1bnNpZ25lZCBhbHBoYSA9IChzICYgMHgzZTApID4+IDU7CVwKCXMgJj0gMHgwN2UwZjgxZjsJCQlcCglkID0gKGQgfCBkIDw8IDE2KSAmIDB4MDdlMGY4MWY7CQlcCglkICs9IChzIC0gZCkgKiBhbHBoYSA+PiA1OwkJXAoJZCAmPSAweDA3ZTBmODFmOwkJCVwKCWRzdCA9IChVaW50MTYpKGQgfCBkID4+IDE2KTsJCQlcCiAgICB9IHdoaWxlKDApCgojZGVmaW5lIEJMSVRfVFJBTlNMXzU1NShzcmMsIGRzdCkJCVwKICAgIGRvIHsJCQkJCVwKCVVpbnQzMiBzID0gc3JjOwkJCQlcCglVaW50MzIgZCA9IGRzdDsJCQkJXAoJdW5zaWduZWQgYWxwaGEgPSAocyAmIDB4M2UwKSA+PiA1OwlcCglzICY9IDB4MDNlMDdjMWY7CQkJXAoJZCA9IChkIHwgZCA8PCAxNikgJiAweDAzZTA3YzFmOwkJXAoJZCArPSAocyAtIGQpICogYWxwaGEgPj4gNTsJCVwKCWQgJj0gMHgwM2UwN2MxZjsJCQlcCglkc3QgPSAoVWludDE2KShkIHwgZCA+PiAxNik7CQkJXAogICAgfSB3aGlsZSgwKQoKLyogdXNlZCB0byBzYXZlIHRoZSBkZXN0aW5hdGlvbiBmb3JtYXQgaW4gdGhlIGVuY29kaW5nLiBEZXNpZ25lZCB0byBiZQogICBtYWNyby1jb21wYXRpYmxlIHdpdGggU0RMX1BpeGVsRm9ybWF0IGJ1dCB3aXRob3V0IHRoZSB1bm5lZWRlZCBmaWVsZHMgKi8KdHlwZWRlZiBzdHJ1Y3QgewoJVWludDggIEJ5dGVzUGVyUGl4ZWw7CglVaW50OCAgUmxvc3M7CglVaW50OCAgR2xvc3M7CglVaW50OCAgQmxvc3M7CglVaW50OCAgUnNoaWZ0OwoJVWludDggIEdzaGlmdDsKCVVpbnQ4ICBCc2hpZnQ7CglVaW50OCAgQXNoaWZ0OwoJVWludDMyIFJtYXNrOwoJVWludDMyIEdtYXNrOwoJVWludDMyIEJtYXNrOwoJVWludDMyIEFtYXNrOwp9IFJMRURlc3RGb3JtYXQ7CgovKiBibGl0IGEgcGl4ZWwtYWxwaGEgUkxFIHN1cmZhY2UgY2xpcHBlZCBhdCB0aGUgcmlnaHQgYW5kL29yIGxlZnQgZWRnZXMgKi8Kc3RhdGljIHZvaWQgUkxFQWxwaGFDbGlwQmxpdChpbnQgdywgVWludDggKnNyY2J1ZiwgU0RMX1N1cmZhY2UgKmRzdCwKCQkJICAgICBVaW50OCAqZHN0YnVmLCBTRExfUmVjdCAqc3JjcmVjdCkKewogICAgU0RMX1BpeGVsRm9ybWF0ICpkZiA9IGRzdC0+Zm9ybWF0OwogICAgLyoKICAgICAqIGNsaXBwZWQgYmxpdHRlcjogUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCiAgICAgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZSBtYWNybwogICAgICogdG8gYmxlbmQgb25lIHBpeGVsLgogICAgICovCiNkZWZpbmUgUkxFQUxQSEFDTElQQkxJVChQdHlwZSwgQ3R5cGUsIGRvX2JsZW5kKQkJCSAgXAogICAgZG8gewkJCQkJCQkJICBcCglpbnQgbGluZWNvdW50ID0gc3JjcmVjdC0+aDsJCQkJCSAgXAoJaW50IGxlZnQgPSBzcmNyZWN0LT54OwkJCQkJCSAgXAoJaW50IHJpZ2h0ID0gbGVmdCArIHNyY3JlY3QtPnc7CQkJCQkgIFwKCWRzdGJ1ZiAtPSBsZWZ0ICogc2l6ZW9mKFB0eXBlKTsJCQkJCSAgXAoJZG8gewkJCQkJCQkJICBcCgkgICAgaW50IG9mcyA9IDA7CQkJCQkJICBcCgkgICAgLyogYmxpdCBvcGFxdWUgcGl4ZWxzIG9uIG9uZSBsaW5lICovCQkJICBcCgkgICAgZG8gewkJCQkJCQkgIFwKCQl1bnNpZ25lZCBydW47CQkJCQkJICBcCgkJb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOwkJCQkgIFwKCQlydW4gPSAoKEN0eXBlICopc3JjYnVmKVsxXTsJCQkJICBcCgkJc3JjYnVmICs9IDIgKiBzaXplb2YoQ3R5cGUpOwkJCQkgIFwKCQlpZihydW4pIHsJCQkJCQkgIFwKCQkgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovCQkgIFwKCQkgICAgaW50IGNvZnMgPSBvZnM7CQkJCQkgIFwKCQkgICAgaW50IGNydW4gPSBydW47CQkJCQkgIFwKCQkgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7CQkJCSAgXAoJCQljcnVuIC09IGxlZnQgLSBjb2ZzOwkJCQkgIFwKCQkJY29mcyA9IGxlZnQ7CQkJCQkgIFwKCQkgICAgfQkJCQkJCQkgIFwKCQkgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykJCQkJICBcCgkJCWNydW4gPSByaWdodCAtIGNvZnM7CQkJCSAgXAoJCSAgICBpZihjcnVuID4gMCkJCQkJCSAgXAoJCQlQSVhFTF9DT1BZKGRzdGJ1ZiArIGNvZnMgKiBzaXplb2YoUHR5cGUpLAkgIFwKCQkJCSAgIHNyY2J1ZiArIChjb2ZzIC0gb2ZzKSAqIHNpemVvZihQdHlwZSksIFwKCQkJCSAgICh1bnNpZ25lZCljcnVuLCBzaXplb2YoUHR5cGUpKTsJICBcCgkJICAgIHNyY2J1ZiArPSBydW4gKiBzaXplb2YoUHR5cGUpOwkJCSAgXAoJCSAgICBvZnMgKz0gcnVuOwkJCQkJCSAgXAoJCX0gZWxzZSBpZighb2ZzKQkJCQkJCSAgXAoJCSAgICByZXR1cm47CQkJCQkJICBcCgkgICAgfSB3aGlsZShvZnMgPCB3KTsJCQkJCQkgIFwKCSAgICAvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCQkJCSAgXAoJICAgIGlmKHNpemVvZihQdHlwZSkgPT0gMikJCQkJCSAgXAoJCXNyY2J1ZiArPSAodWludHB0cl90KXNyY2J1ZiAmIDI7CQkJICBcCgkgICAgLyogYmxpdCB0cmFuc2x1Y2VudCBwaXhlbHMgb24gdGhlIHNhbWUgbGluZSAqLwkJICBcCgkgICAgb2ZzID0gMDsJCQkJCQkJICBcCgkgICAgZG8gewkJCQkJCQkgIFwKCQl1bnNpZ25lZCBydW47CQkJCQkJICBcCgkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsJCQkJICBcCgkJcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOwkJCQkgIFwKCQlzcmNidWYgKz0gNDsJCQkJCQkgIFwKCQlpZihydW4pIHsJCQkJCQkgIFwKCQkgICAgLyogY2xpcCB0byBsZWZ0IGFuZCByaWdodCBib3JkZXJzICovCQkgIFwKCQkgICAgaW50IGNvZnMgPSBvZnM7CQkJCQkgIFwKCQkgICAgaW50IGNydW4gPSBydW47CQkJCQkgIFwKCQkgICAgaWYobGVmdCAtIGNvZnMgPiAwKSB7CQkJCSAgXAoJCQljcnVuIC09IGxlZnQgLSBjb2ZzOwkJCQkgIFwKCQkJY29mcyA9IGxlZnQ7CQkJCQkgIFwKCQkgICAgfQkJCQkJCQkgIFwKCQkgICAgaWYoY3J1biA+IHJpZ2h0IC0gY29mcykJCQkJICBcCgkJCWNydW4gPSByaWdodCAtIGNvZnM7CQkJCSAgXAoJCSAgICBpZihjcnVuID4gMCkgewkJCQkJICBcCgkJCVB0eXBlICpkc3QgPSAoUHR5cGUgKilkc3RidWYgKyBjb2ZzOwkJICBcCgkJCVVpbnQzMiAqc3JjID0gKFVpbnQzMiAqKXNyY2J1ZiArIChjb2ZzIC0gb2ZzKTsJICBcCgkJCWludCBpOwkJCQkJCSAgXAoJCQlmb3IoaSA9IDA7IGkgPCBjcnVuOyBpKyspCQkJICBcCgkJCSAgICBkb19ibGVuZChzcmNbaV0sIGRzdFtpXSk7CQkJICBcCgkJICAgIH0JCQkJCQkJICBcCgkJICAgIHNyY2J1ZiArPSBydW4gKiA0OwkJCQkJICBcCgkJICAgIG9mcyArPSBydW47CQkJCQkJICBcCgkJfQkJCQkJCQkgIFwKCSAgICB9IHdoaWxlKG9mcyA8IHcpOwkJCQkJCSAgXAoJICAgIGRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkJICBcCgl9IHdoaWxlKC0tbGluZWNvdW50KTsJCQkJCQkgIFwKICAgIH0gd2hpbGUoMCkKCiAgICBzd2l0Y2goZGYtPkJ5dGVzUGVyUGl4ZWwpIHsKICAgIGNhc2UgMjoKCWlmKGRmLT5HbWFzayA9PSAweDA3ZTAgfHwgZGYtPlJtYXNrID09IDB4MDdlMAoJICAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKCSAgICBSTEVBTFBIQUNMSVBCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU2NSk7CgllbHNlCgkgICAgUkxFQUxQSEFDTElQQkxJVChVaW50MTYsIFVpbnQ4LCBCTElUX1RSQU5TTF81NTUpOwoJYnJlYWs7CiAgICBjYXNlIDQ6CglSTEVBTFBIQUNMSVBCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwoJYnJlYWs7CiAgICB9Cn0KCi8qIGJsaXQgYSBwaXhlbC1hbHBoYSBSTEUgc3VyZmFjZSAqLwppbnQgU0RMX1JMRUFscGhhQmxpdChTRExfU3VyZmFjZSAqc3JjLCBTRExfUmVjdCAqc3JjcmVjdCwKCQkgICAgIFNETF9TdXJmYWNlICpkc3QsIFNETF9SZWN0ICpkc3RyZWN0KQp7CiAgICBpbnQgeCwgeTsKICAgIGludCB3ID0gc3JjLT53OwogICAgVWludDggKnNyY2J1ZiwgKmRzdGJ1ZjsKICAgIFNETF9QaXhlbEZvcm1hdCAqZGYgPSBkc3QtPmZvcm1hdDsKCiAgICAvKiBMb2NrIHRoZSBkZXN0aW5hdGlvbiBpZiBuZWNlc3NhcnkgKi8KICAgIGlmICggU0RMX01VU1RMT0NLKGRzdCkgKSB7CglpZiAoIFNETF9Mb2NrU3VyZmFjZShkc3QpIDwgMCApIHsKCSAgICByZXR1cm4gLTE7Cgl9CiAgICB9CgogICAgeCA9IGRzdHJlY3QtPng7CiAgICB5ID0gZHN0cmVjdC0+eTsKICAgIGRzdGJ1ZiA9IChVaW50OCAqKWRzdC0+cGl4ZWxzCgkgICAgICsgeSAqIGRzdC0+cGl0Y2ggKyB4ICogZGYtPkJ5dGVzUGVyUGl4ZWw7CiAgICBzcmNidWYgPSAoVWludDggKilzcmMtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgKyBzaXplb2YoUkxFRGVzdEZvcm1hdCk7CgogICAgewoJLyogc2tpcCBsaW5lcyBhdCB0aGUgdG9wIGlmIG5lY2Vzc2FyeSAqLwoJaW50IHZza2lwID0gc3JjcmVjdC0+eTsKCWlmKHZza2lwKSB7CgkgICAgaW50IG9mczsKCSAgICBpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSAyKSB7CgkJLyogdGhlIDE2LzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwoJCWRvIHsKCQkgICAgLyogc2tpcCBvcGFxdWUgbGluZSAqLwoJCSAgICBvZnMgPSAwOwoJCSAgICBkbyB7CgkJCWludCBydW47CgkJCW9mcyArPSBzcmNidWZbMF07CgkJCXJ1biA9IHNyY2J1ZlsxXTsKCQkJc3JjYnVmICs9IDI7CgkJCWlmKHJ1bikgewoJCQkgICAgc3JjYnVmICs9IDIgKiBydW47CgkJCSAgICBvZnMgKz0gcnVuOwoJCQl9IGVsc2UgaWYoIW9mcykKCQkJICAgIGdvdG8gZG9uZTsKCQkgICAgfSB3aGlsZShvZnMgPCB3KTsKCgkJICAgIC8qIHNraXAgcGFkZGluZyAqLwoJCSAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOwoKCQkgICAgLyogc2tpcCB0cmFuc2x1Y2VudCBsaW5lICovCgkJICAgIG9mcyA9IDA7CgkJICAgIGRvIHsKCQkJaW50IHJ1bjsKCQkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKCQkJcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOwoJCQlzcmNidWYgKz0gNCAqIChydW4gKyAxKTsKCQkJb2ZzICs9IHJ1bjsKCQkgICAgfSB3aGlsZShvZnMgPCB3KTsKCQl9IHdoaWxlKC0tdnNraXApOwoJICAgIH0gZWxzZSB7CgkJLyogdGhlIDMyLzMyIGludGVybGVhdmVkIGZvcm1hdCAqLwoJCXZza2lwIDw8PSAxOwkvKiBvcGFxdWUgYW5kIHRyYW5zbHVjZW50IGhhdmUgc2FtZSBmb3JtYXQgKi8KCQlkbyB7CgkJICAgIG9mcyA9IDA7CgkJICAgIGRvIHsKCQkJaW50IHJ1bjsKCQkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKCQkJcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOwoJCQlzcmNidWYgKz0gNDsKCQkJaWYocnVuKSB7CgkJCSAgICBzcmNidWYgKz0gNCAqIHJ1bjsKCQkJICAgIG9mcyArPSBydW47CgkJCX0gZWxzZSBpZighb2ZzKQoJCQkgICAgZ290byBkb25lOwoJCSAgICB9IHdoaWxlKG9mcyA8IHcpOwoJCX0gd2hpbGUoLS12c2tpcCk7CgkgICAgfQoJfQogICAgfQoKICAgIC8qIGlmIGxlZnQgb3IgcmlnaHQgZWRnZSBjbGlwcGluZyBuZWVkZWQsIGNhbGwgY2xpcCBibGl0ICovCiAgICBpZihzcmNyZWN0LT54IHx8IHNyY3JlY3QtPncgIT0gc3JjLT53KSB7CglSTEVBbHBoYUNsaXBCbGl0KHcsIHNyY2J1ZiwgZHN0LCBkc3RidWYsIHNyY3JlY3QpOwogICAgfSBlbHNlIHsKCgkvKgoJICogbm9uLWNsaXBwZWQgYmxpdHRlci4gUHR5cGUgaXMgdGhlIGRlc3RpbmF0aW9uIHBpeGVsIHR5cGUsCgkgKiBDdHlwZSB0aGUgdHJhbnNsdWNlbnQgY291bnQgdHlwZSwgYW5kIGRvX2JsZW5kIHRoZQoJICogbWFjcm8gdG8gYmxlbmQgb25lIHBpeGVsLgoJICovCiNkZWZpbmUgUkxFQUxQSEFCTElUKFB0eXBlLCBDdHlwZSwgZG9fYmxlbmQpCQkJCSBcCglkbyB7CQkJCQkJCQkgXAoJICAgIGludCBsaW5lY291bnQgPSBzcmNyZWN0LT5oOwkJCQkJIFwKCSAgICBkbyB7CQkJCQkJCSBcCgkJaW50IG9mcyA9IDA7CQkJCQkJIFwKCQkvKiBibGl0IG9wYXF1ZSBwaXhlbHMgb24gb25lIGxpbmUgKi8JCQkgXAoJCWRvIHsJCQkJCQkJIFwKCQkgICAgdW5zaWduZWQgcnVuOwkJCQkJIFwKCQkgICAgb2ZzICs9ICgoQ3R5cGUgKilzcmNidWYpWzBdOwkJCSBcCgkJICAgIHJ1biA9ICgoQ3R5cGUgKilzcmNidWYpWzFdOwkJCQkgXAoJCSAgICBzcmNidWYgKz0gMiAqIHNpemVvZihDdHlwZSk7CQkJIFwKCQkgICAgaWYocnVuKSB7CQkJCQkJIFwKCQkJUElYRUxfQ09QWShkc3RidWYgKyBvZnMgKiBzaXplb2YoUHR5cGUpLCBzcmNidWYsIFwKCQkJCSAgIHJ1biwgc2l6ZW9mKFB0eXBlKSk7CQkJIFwKCQkJc3JjYnVmICs9IHJ1biAqIHNpemVvZihQdHlwZSk7CQkJIFwKCQkJb2ZzICs9IHJ1bjsJCQkJCSBcCgkJICAgIH0gZWxzZSBpZighb2ZzKQkJCQkJIFwKCQkJZ290byBkb25lOwkJCQkJIFwKCQl9IHdoaWxlKG9mcyA8IHcpOwkJCQkJIFwKCQkvKiBza2lwIHBhZGRpbmcgaWYgbmVjZXNzYXJ5ICovCQkJCSBcCgkJaWYoc2l6ZW9mKFB0eXBlKSA9PSAyKQkJCQkJIFwKCQkgICAgc3JjYnVmICs9ICh1aW50cHRyX3Qpc3JjYnVmICYgMjsJCSAJIFwKCQkvKiBibGl0IHRyYW5zbHVjZW50IHBpeGVscyBvbiB0aGUgc2FtZSBsaW5lICovCQkgXAoJCW9mcyA9IDA7CQkJCQkJIFwKCQlkbyB7CQkJCQkJCSBcCgkJICAgIHVuc2lnbmVkIHJ1bjsJCQkJCSBcCgkJICAgIG9mcyArPSAoKFVpbnQxNiAqKXNyY2J1ZilbMF07CQkJIFwKCQkgICAgcnVuID0gKChVaW50MTYgKilzcmNidWYpWzFdOwkJCSBcCgkJICAgIHNyY2J1ZiArPSA0OwkJCQkJIFwKCQkgICAgaWYocnVuKSB7CQkJCQkJIFwKCQkJUHR5cGUgKmRzdCA9IChQdHlwZSAqKWRzdGJ1ZiArIG9mczsJCSBcCgkJCXVuc2lnbmVkIGk7CQkJCQkgXAoJCQlmb3IoaSA9IDA7IGkgPCBydW47IGkrKykgewkJCSBcCgkJCSAgICBVaW50MzIgc3JjID0gKihVaW50MzIgKilzcmNidWY7CQkgXAoJCQkgICAgZG9fYmxlbmQoc3JjLCAqZHN0KTsJCQkgXAoJCQkgICAgc3JjYnVmICs9IDQ7CQkJCSBcCgkJCSAgICBkc3QrKzsJCQkJCSBcCgkJCX0JCQkJCQkgXAoJCQlvZnMgKz0gcnVuOwkJCQkJIFwKCQkgICAgfQkJCQkJCQkgXAoJCX0gd2hpbGUob2ZzIDwgdyk7CQkJCQkgXAoJCWRzdGJ1ZiArPSBkc3QtPnBpdGNoOwkJCQkJIFwKCSAgICB9IHdoaWxlKC0tbGluZWNvdW50KTsJCQkJCSBcCgl9IHdoaWxlKDApCgoJc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7CgljYXNlIDI6CgkgICAgaWYoZGYtPkdtYXNrID09IDB4MDdlMCB8fCBkZi0+Um1hc2sgPT0gMHgwN2UwCgkgICAgICAgfHwgZGYtPkJtYXNrID09IDB4MDdlMCkKCQlSTEVBTFBIQUJMSVQoVWludDE2LCBVaW50OCwgQkxJVF9UUkFOU0xfNTY1KTsKCSAgICBlbHNlCgkJUkxFQUxQSEFCTElUKFVpbnQxNiwgVWludDgsIEJMSVRfVFJBTlNMXzU1NSk7CgkgICAgYnJlYWs7CgljYXNlIDQ6CgkgICAgUkxFQUxQSEFCTElUKFVpbnQzMiwgVWludDE2LCBCTElUX1RSQU5TTF84ODgpOwoJICAgIGJyZWFrOwoJfQogICAgfQoKIGRvbmU6CiAgICAvKiBVbmxvY2sgdGhlIGRlc3RpbmF0aW9uIGlmIG5lY2Vzc2FyeSAqLwogICAgaWYgKCBTRExfTVVTVExPQ0soZHN0KSApIHsKCVNETF9VbmxvY2tTdXJmYWNlKGRzdCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyoKICogQXV4aWxpYXJ5IGZ1bmN0aW9uczoKICogVGhlIGVuY29kaW5nIGZ1bmN0aW9ucyB0YWtlIDMyYnBwIHJnYiArIGEsIGFuZAogKiByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQgdG8gdGhlIGRlc3RpbmF0aW9uLgogKiBUaGUgZGVjb2RpbmcgZnVuY3Rpb25zIGNvcHkgdG8gMzJicHAgcmdiICsgYSwgYW5kCiAqIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBmcm9tIHRoZSBzb3VyY2UuCiAqIFRoZXNlIGFyZSBvbmx5IHVzZWQgaW4gdGhlIGVuY29kZXIgYW5kIHVuLVJMRSBjb2RlIGFuZCBhcmUgdGhlcmVmb3JlIG5vdAogKiBoaWdobHkgb3B0aW1pc2VkLgogKi8KCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMTZicHAgcmdiLCBsb3NpbmcgYWxwaGEgKi8Kc3RhdGljIGludCBjb3B5X29wYXF1ZV8xNih2b2lkICpkc3QsIFVpbnQzMiAqc3JjLCBpbnQgbiwKCQkJICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MTYgKmQgPSBkc3Q7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGI7CglSR0JfRlJPTV9QSVhFTCgqc3JjLCBzZm10LCByLCBnLCBiKTsKCVBJWEVMX0ZST01fUkdCKCpkLCBkZm10LCByLCBnLCBiKTsKCXNyYysrOwoJZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgovKiBkZWNvZGUgb3BhcXVlIHBpeGVscyBmcm9tIDE2YnBwIHRvIDMyYnBwIHJnYiArIGEgKi8Kc3RhdGljIGludCB1bmNvcHlfb3BhcXVlXzE2KFVpbnQzMiAqZHN0LCB2b2lkICpzcmMsIGludCBuLAoJCQkgICAgUkxFRGVzdEZvcm1hdCAqc2ZtdCwgU0RMX1BpeGVsRm9ybWF0ICpkZm10KQp7CiAgICBpbnQgaTsKICAgIFVpbnQxNiAqcyA9IHNyYzsKICAgIHVuc2lnbmVkIGFscGhhID0gZGZtdC0+QW1hc2sgPyAyNTUgOiAwOwogICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Cgl1bnNpZ25lZCByLCBnLCBiOwoJUkdCX0ZST01fUElYRUwoKnMsIHNmbXQsIHIsIGcsIGIpOwoJUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGFscGhhKTsKCXMrKzsKCWRzdCsrOwogICAgfQogICAgcmV0dXJuIG4gKiAyOwp9CgoKCi8qIGVuY29kZSAzMmJwcCByZ2IgKyBhIGludG8gMzJicHAgRzBSQUIgZm9ybWF0IGZvciBibGl0dGluZyBpbnRvIDU2NSAqLwpzdGF0aWMgaW50IGNvcHlfdHJhbnNsXzU2NSh2b2lkICpkc3QsIFVpbnQzMiAqc3JjLCBpbnQgbiwKCQkJICAgU0RMX1BpeGVsRm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Cgl1bnNpZ25lZCByLCBnLCBiLCBhOwoJVWludDE2IHBpeDsKCVJHQkFfRlJPTV84ODg4KCpzcmMsIHNmbXQsIHIsIGcsIGIsIGEpOwoJUElYRUxfRlJPTV9SR0IocGl4LCBkZm10LCByLCBnLCBiKTsKCSpkID0gKChwaXggJiAweDdlMCkgPDwgMTYpIHwgKHBpeCAmIDB4ZjgxZikgfCAoKGEgPDwgMikgJiAweDdlMCk7CglzcmMrKzsKCWQrKzsKICAgIH0KICAgIHJldHVybiBuICogNDsKfQoKLyogZW5jb2RlIDMyYnBwIHJnYiArIGEgaW50byAzMmJwcCBHMFJBQiBmb3JtYXQgZm9yIGJsaXR0aW5nIGludG8gNTU1ICovCnN0YXRpYyBpbnQgY29weV90cmFuc2xfNTU1KHZvaWQgKmRzdCwgVWludDMyICpzcmMsIGludCBuLAoJCQkgICBTRExfUGl4ZWxGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKmQgPSBkc3Q7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGIsIGE7CglVaW50MTYgcGl4OwoJUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CglQSVhFTF9GUk9NX1JHQihwaXgsIGRmbXQsIHIsIGcsIGIpOwoJKmQgPSAoKHBpeCAmIDB4M2UwKSA8PCAxNikgfCAocGl4ICYgMHhmYzFmKSB8ICgoYSA8PCAyKSAmIDB4M2UwKTsKCXNyYysrOwoJZCsrOwogICAgfQogICAgcmV0dXJuIG4gKiA0Owp9CgovKiBkZWNvZGUgdHJhbnNsdWNlbnQgcGl4ZWxzIGZyb20gMzJicHAgR09SQUIgdG8gMzJicHAgcmdiICsgYSAqLwpzdGF0aWMgaW50IHVuY29weV90cmFuc2xfMTYoVWludDMyICpkc3QsIHZvaWQgKnNyYywgaW50IG4sCgkJCSAgICBSTEVEZXN0Rm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpzID0gc3JjOwogICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Cgl1bnNpZ25lZCByLCBnLCBiLCBhOwoJVWludDMyIHBpeCA9ICpzKys7CglhID0gKHBpeCAmIDB4M2UwKSA+PiAyOwoJcGl4ID0gKHBpeCAmIH4weDNlMCkgfCBwaXggPj4gMTY7CglSR0JfRlJPTV9QSVhFTChwaXgsIHNmbXQsIHIsIGcsIGIpOwoJUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwoJZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGVuY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50IGNvcHlfMzIodm9pZCAqZHN0LCBVaW50MzIgKnNyYywgaW50IG4sCgkJICAgU0RMX1BpeGVsRm9ybWF0ICpzZm10LCBTRExfUGl4ZWxGb3JtYXQgKmRmbXQpCnsKICAgIGludCBpOwogICAgVWludDMyICpkID0gZHN0OwogICAgZm9yKGkgPSAwOyBpIDwgbjsgaSsrKSB7Cgl1bnNpZ25lZCByLCBnLCBiLCBhOwoJVWludDMyIHBpeGVsOwoJUkdCQV9GUk9NXzg4ODgoKnNyYywgc2ZtdCwgciwgZywgYiwgYSk7CglQSVhFTF9GUk9NX1JHQihwaXhlbCwgZGZtdCwgciwgZywgYik7CgkqZCsrID0gcGl4ZWwgfCBhIDw8IDI0OwoJc3JjKys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCi8qIGRlY29kZSAzMmJwcCByZ2JhIGludG8gMzJicHAgcmdiYSwga2VlcGluZyBhbHBoYSAoZHVhbCBwdXJwb3NlKSAqLwpzdGF0aWMgaW50IHVuY29weV8zMihVaW50MzIgKmRzdCwgdm9pZCAqc3JjLCBpbnQgbiwKCQkgICAgIFJMRURlc3RGb3JtYXQgKnNmbXQsIFNETF9QaXhlbEZvcm1hdCAqZGZtdCkKewogICAgaW50IGk7CiAgICBVaW50MzIgKnMgPSBzcmM7CiAgICBmb3IoaSA9IDA7IGkgPCBuOyBpKyspIHsKCXVuc2lnbmVkIHIsIGcsIGIsIGE7CglVaW50MzIgcGl4ZWwgPSAqcysrOwoJUkdCX0ZST01fUElYRUwocGl4ZWwsIHNmbXQsIHIsIGcsIGIpOwoJYSA9IHBpeGVsID4+IDI0OwoJUElYRUxfRlJPTV9SR0JBKCpkc3QsIGRmbXQsIHIsIGcsIGIsIGEpOwoJZHN0Kys7CiAgICB9CiAgICByZXR1cm4gbiAqIDQ7Cn0KCiNkZWZpbmUgSVNPUEFRVUUocGl4ZWwsIGZtdCkgKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSA9PSAyNTUpCgojZGVmaW5lIElTVFJBTlNMKHBpeGVsLCBmbXQpCVwKICAgICgodW5zaWduZWQpKCgoKHBpeGVsKSAmIGZtdC0+QW1hc2spID4+IGZtdC0+QXNoaWZ0KSAtIDFVKSA8IDI1NFUpCgovKiBjb252ZXJ0IHN1cmZhY2UgdG8gYmUgcXVpY2tseSBhbHBoYS1ibGl0dGFibGUgb250byBkZXN0LCBpZiBwb3NzaWJsZSAqLwpzdGF0aWMgaW50IFJMRUFscGhhU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKewogICAgU0RMX1N1cmZhY2UgKmRlc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKmRmOwogICAgaW50IG1heHNpemUgPSAwOwogICAgaW50IG1heF9vcGFxdWVfcnVuOwogICAgaW50IG1heF90cmFuc2xfcnVuID0gNjU1MzU7CiAgICB1bnNpZ25lZCBtYXNrc3VtOwogICAgVWludDggKnJsZWJ1ZiwgKmRzdDsKICAgIGludCAoKmNvcHlfb3BhcXVlKSh2b2lkICosIFVpbnQzMiAqLCBpbnQsCgkJICAgICAgIFNETF9QaXhlbEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgKCpjb3B5X3RyYW5zbCkodm9pZCAqLCBVaW50MzIgKiwgaW50LAoJCSAgICAgICBTRExfUGl4ZWxGb3JtYXQgKiwgU0RMX1BpeGVsRm9ybWF0ICopOwoKICAgIGRlc3QgPSBzdXJmYWNlLT5tYXAtPmRzdDsKICAgIGlmKCFkZXN0KQoJcmV0dXJuIC0xOwogICAgZGYgPSBkZXN0LT5mb3JtYXQ7CiAgICBpZihzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCAhPSAzMikKCXJldHVybiAtMTsJCS8qIG9ubHkgMzJicHAgc291cmNlIHN1cHBvcnRlZCAqLwoKICAgIC8qIGZpbmQgb3V0IHdoZXRoZXIgdGhlIGRlc3RpbmF0aW9uIGlzIG9uZSB3ZSBzdXBwb3J0LAogICAgICAgYW5kIGRldGVybWluZSB0aGUgbWF4IHNpemUgb2YgdGhlIGVuY29kZWQgcmVzdWx0ICovCiAgICBtYXNrc3VtID0gZGYtPlJtYXNrIHwgZGYtPkdtYXNrIHwgZGYtPkJtYXNrOwogICAgc3dpdGNoKGRmLT5CeXRlc1BlclBpeGVsKSB7CiAgICBjYXNlIDI6CgkvKiAxNmJwcDogb25seSBzdXBwb3J0IDU2NSBhbmQgNTU1IGZvcm1hdHMgKi8KCXN3aXRjaChtYXNrc3VtKSB7CgljYXNlIDB4ZmZmZjoKCSAgICBpZihkZi0+R21hc2sgPT0gMHgwN2UwCgkgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDdlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwN2UwKSB7CgkJY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKCQljb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU2NTsKCSAgICB9IGVsc2UKCQlyZXR1cm4gLTE7CgkgICAgYnJlYWs7CgljYXNlIDB4N2ZmZjoKCSAgICBpZihkZi0+R21hc2sgPT0gMHgwM2UwCgkgICAgICAgfHwgZGYtPlJtYXNrID09IDB4MDNlMCB8fCBkZi0+Qm1hc2sgPT0gMHgwM2UwKSB7CgkJY29weV9vcGFxdWUgPSBjb3B5X29wYXF1ZV8xNjsKCQljb3B5X3RyYW5zbCA9IGNvcHlfdHJhbnNsXzU1NTsKCSAgICB9IGVsc2UKCQlyZXR1cm4gLTE7CgkgICAgYnJlYWs7CglkZWZhdWx0OgoJICAgIHJldHVybiAtMTsKCX0KCW1heF9vcGFxdWVfcnVuID0gMjU1OwkvKiBydW5zIHN0b3JlZCBhcyBieXRlcyAqLwoKCS8qIHdvcnN0IGNhc2UgaXMgYWx0ZXJuYXRpbmcgb3BhcXVlIGFuZCB0cmFuc2x1Y2VudCBwaXhlbHMsCgkgICB3aXRoIHJvb20gZm9yIGFsaWdubWVudCBwYWRkaW5nIGJldHdlZW4gbGluZXMgKi8KCW1heHNpemUgPSBzdXJmYWNlLT5oICogKDIgKyAoNCArIDIpICogKHN1cmZhY2UtPncgKyAxKSkgKyAyOwoJYnJlYWs7CiAgICBjYXNlIDQ6CglpZihtYXNrc3VtICE9IDB4MDBmZmZmZmYpCgkgICAgcmV0dXJuIC0xOwkJLyogcmVxdWlyZXMgdW51c2VkIGhpZ2ggYnl0ZSAqLwoJY29weV9vcGFxdWUgPSBjb3B5XzMyOwoJY29weV90cmFuc2wgPSBjb3B5XzMyOwoJbWF4X29wYXF1ZV9ydW4gPSAyNTU7CS8qIHJ1bnMgc3RvcmVkIGFzIHNob3J0IGludHMgKi8KCgkvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNsdWNlbnQgcGl4ZWxzICovCgltYXhzaXplID0gc3VyZmFjZS0+aCAqIDIgKiA0ICogKHN1cmZhY2UtPncgKyAxKSArIDQ7CglicmVhazsKICAgIGRlZmF1bHQ6CglyZXR1cm4gLTE7CQkvKiBhbnl0aGluZyBlbHNlIHVuc3VwcG9ydGVkIHJpZ2h0IG5vdyAqLwogICAgfQoKICAgIG1heHNpemUgKz0gc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwogICAgcmxlYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYyhtYXhzaXplKTsKICAgIGlmKCFybGVidWYpIHsKCVNETF9PdXRPZk1lbW9yeSgpOwoJcmV0dXJuIC0xOwogICAgfQogICAgewoJLyogc2F2ZSB0aGUgZGVzdGluYXRpb24gZm9ybWF0IHNvIHdlIGNhbiB1bmRvIHRoZSBlbmNvZGluZyBsYXRlciAqLwoJUkxFRGVzdEZvcm1hdCAqciA9IChSTEVEZXN0Rm9ybWF0ICopcmxlYnVmOwoJci0+Qnl0ZXNQZXJQaXhlbCA9IGRmLT5CeXRlc1BlclBpeGVsOwoJci0+Umxvc3MgPSBkZi0+Umxvc3M7CglyLT5HbG9zcyA9IGRmLT5HbG9zczsKCXItPkJsb3NzID0gZGYtPkJsb3NzOwoJci0+UnNoaWZ0ID0gZGYtPlJzaGlmdDsKCXItPkdzaGlmdCA9IGRmLT5Hc2hpZnQ7CglyLT5Cc2hpZnQgPSBkZi0+QnNoaWZ0OwoJci0+QXNoaWZ0ID0gZGYtPkFzaGlmdDsKCXItPlJtYXNrID0gZGYtPlJtYXNrOwoJci0+R21hc2sgPSBkZi0+R21hc2s7CglyLT5CbWFzayA9IGRmLT5CbWFzazsKCXItPkFtYXNrID0gZGYtPkFtYXNrOwogICAgfQogICAgZHN0ID0gcmxlYnVmICsgc2l6ZW9mKFJMRURlc3RGb3JtYXQpOwoKICAgIC8qIERvIHRoZSBhY3R1YWwgZW5jb2RpbmcgKi8KICAgIHsKCWludCB4LCB5OwoJaW50IGggPSBzdXJmYWNlLT5oLCB3ID0gc3VyZmFjZS0+dzsKCVNETF9QaXhlbEZvcm1hdCAqc2YgPSBzdXJmYWNlLT5mb3JtYXQ7CglVaW50MzIgKnNyYyA9IChVaW50MzIgKilzdXJmYWNlLT5waXhlbHM7CglVaW50OCAqbGFzdGxpbmUgPSBkc3Q7CS8qIGVuZCBvZiBsYXN0IG5vbi1ibGFuayBsaW5lICovCgoJLyogb3BhcXVlIGNvdW50cyBhcmUgOCBvciAxNiBiaXRzLCBkZXBlbmRpbmcgb24gdGFyZ2V0IGRlcHRoICovCiNkZWZpbmUgQUREX09QQVFVRV9DT1VOVFMobiwgbSkJCQlcCglpZihkZi0+Qnl0ZXNQZXJQaXhlbCA9PSA0KSB7CQlcCgkgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsJCVwKCSAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOwkJXAoJICAgIGRzdCArPSA0OwkJCQlcCgl9IGVsc2UgewkJCQlcCgkgICAgZHN0WzBdID0gbjsJCQkJXAoJICAgIGRzdFsxXSA9IG07CQkJCVwKCSAgICBkc3QgKz0gMjsJCQkJXAoJfQoKCS8qIHRyYW5zbHVjZW50IGNvdW50cyBhcmUgYWx3YXlzIDE2IGJpdCAqLwojZGVmaW5lIEFERF9UUkFOU0xfQ09VTlRTKG4sIG0pCQlcCgkoKChVaW50MTYgKilkc3QpWzBdID0gbiwgKChVaW50MTYgKilkc3QpWzFdID0gbSwgZHN0ICs9IDQpCgoJZm9yKHkgPSAwOyB5IDwgaDsgeSsrKSB7CgkgICAgaW50IHJ1bnN0YXJ0LCBza2lwc3RhcnQ7CgkgICAgaW50IGJsYW5rbGluZSA9IDA7CgkgICAgLyogRmlyc3QgZW5jb2RlIGFsbCBvcGFxdWUgcGl4ZWxzIG9mIGEgc2NhbiBsaW5lICovCgkgICAgeCA9IDA7CgkgICAgZG8gewoJCWludCBydW4sIHNraXAsIGxlbjsKCQlza2lwc3RhcnQgPSB4OwoJCXdoaWxlKHggPCB3ICYmICFJU09QQVFVRShzcmNbeF0sIHNmKSkKCQkgICAgeCsrOwoJCXJ1bnN0YXJ0ID0geDsKCQl3aGlsZSh4IDwgdyAmJiBJU09QQVFVRShzcmNbeF0sIHNmKSkKCQkgICAgeCsrOwoJCXNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKCQlpZihza2lwID09IHcpCgkJICAgIGJsYW5rbGluZSA9IDE7CgkJcnVuID0geCAtIHJ1bnN0YXJ0OwoJCXdoaWxlKHNraXAgPiBtYXhfb3BhcXVlX3J1bikgewoJCSAgICBBRERfT1BBUVVFX0NPVU5UUyhtYXhfb3BhcXVlX3J1biwgMCk7CgkJICAgIHNraXAgLT0gbWF4X29wYXF1ZV9ydW47CgkJfQoJCWxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKCQlBRERfT1BBUVVFX0NPVU5UUyhza2lwLCBsZW4pOwoJCWRzdCArPSBjb3B5X29wYXF1ZShkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CgkJcnVuc3RhcnQgKz0gbGVuOwoJCXJ1biAtPSBsZW47CgkJd2hpbGUocnVuKSB7CgkJICAgIGxlbiA9IE1JTihydW4sIG1heF9vcGFxdWVfcnVuKTsKCQkgICAgQUREX09QQVFVRV9DT1VOVFMoMCwgbGVuKTsKCQkgICAgZHN0ICs9IGNvcHlfb3BhcXVlKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKCQkgICAgcnVuc3RhcnQgKz0gbGVuOwoJCSAgICBydW4gLT0gbGVuOwoJCX0KCSAgICB9IHdoaWxlKHggPCB3KTsKCgkgICAgLyogTWFrZSBzdXJlIHRoZSBuZXh0IG91dHB1dCBhZGRyZXNzIGlzIDMyLWJpdCBhbGlnbmVkICovCgkgICAgZHN0ICs9ICh1aW50cHRyX3QpZHN0ICYgMjsKCgkgICAgLyogTmV4dCwgZW5jb2RlIGFsbCB0cmFuc2x1Y2VudCBwaXhlbHMgb2YgdGhlIHNhbWUgc2NhbiBsaW5lICovCgkgICAgeCA9IDA7CgkgICAgZG8gewoJCWludCBydW4sIHNraXAsIGxlbjsKCQlza2lwc3RhcnQgPSB4OwoJCXdoaWxlKHggPCB3ICYmICFJU1RSQU5TTChzcmNbeF0sIHNmKSkKCQkgICAgeCsrOwoJCXJ1bnN0YXJ0ID0geDsKCQl3aGlsZSh4IDwgdyAmJiBJU1RSQU5TTChzcmNbeF0sIHNmKSkKCQkgICAgeCsrOwoJCXNraXAgPSBydW5zdGFydCAtIHNraXBzdGFydDsKCQlibGFua2xpbmUgJj0gKHNraXAgPT0gdyk7CgkJcnVuID0geCAtIHJ1bnN0YXJ0OwoJCXdoaWxlKHNraXAgPiBtYXhfdHJhbnNsX3J1bikgewoJCSAgICBBRERfVFJBTlNMX0NPVU5UUyhtYXhfdHJhbnNsX3J1biwgMCk7CgkJICAgIHNraXAgLT0gbWF4X3RyYW5zbF9ydW47CgkJfQoJCWxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKCQlBRERfVFJBTlNMX0NPVU5UUyhza2lwLCBsZW4pOwoJCWRzdCArPSBjb3B5X3RyYW5zbChkc3QsIHNyYyArIHJ1bnN0YXJ0LCBsZW4sIHNmLCBkZik7CgkJcnVuc3RhcnQgKz0gbGVuOwoJCXJ1biAtPSBsZW47CgkJd2hpbGUocnVuKSB7CgkJICAgIGxlbiA9IE1JTihydW4sIG1heF90cmFuc2xfcnVuKTsKCQkgICAgQUREX1RSQU5TTF9DT1VOVFMoMCwgbGVuKTsKCQkgICAgZHN0ICs9IGNvcHlfdHJhbnNsKGRzdCwgc3JjICsgcnVuc3RhcnQsIGxlbiwgc2YsIGRmKTsKCQkgICAgcnVuc3RhcnQgKz0gbGVuOwoJCSAgICBydW4gLT0gbGVuOwoJCX0KCQlpZighYmxhbmtsaW5lKQoJCSAgICBsYXN0bGluZSA9IGRzdDsKCSAgICB9IHdoaWxlKHggPCB3KTsKCgkgICAgc3JjICs9IHN1cmZhY2UtPnBpdGNoID4+IDI7Cgl9Cglkc3QgPSBsYXN0bGluZTsJCS8qIGJhY2sgdXAgcGFzdCB0cmFpbGluZyBibGFuayBsaW5lcyAqLwoJQUREX09QQVFVRV9DT1VOVFMoMCwgMCk7CiAgICB9CgojdW5kZWYgQUREX09QQVFVRV9DT1VOVFMKI3VuZGVmIEFERF9UUkFOU0xfQ09VTlRTCgogICAgLyogTm93IHRoYXQgd2UgaGF2ZSBpdCBlbmNvZGVkLCByZWxlYXNlIHRoZSBvcmlnaW5hbCBwaXhlbHMgKi8KICAgIGlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9QUkVBTExPQykgIT0gU0RMX1BSRUFMTE9DCiAgICAgICAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfSFdTVVJGQUNFKSAhPSBTRExfSFdTVVJGQUNFKSB7CglTRExfZnJlZSggc3VyZmFjZS0+cGl4ZWxzICk7CglzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwogICAgfQoKICAgIC8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KICAgIHsKCVVpbnQ4ICpwID0gU0RMX3JlYWxsb2MocmxlYnVmLCBkc3QgLSBybGVidWYpOwoJaWYoIXApCgkgICAgcCA9IHJsZWJ1ZjsKCXN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgPSBwOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgVWludDMyIGdldHBpeF84KFVpbnQ4ICpzcmNidWYpCnsKICAgIHJldHVybiAqc3JjYnVmOwp9CgpzdGF0aWMgVWludDMyIGdldHBpeF8xNihVaW50OCAqc3JjYnVmKQp7CiAgICByZXR1cm4gKihVaW50MTYgKilzcmNidWY7Cn0KCnN0YXRpYyBVaW50MzIgZ2V0cGl4XzI0KFVpbnQ4ICpzcmNidWYpCnsKI2lmIFNETF9CWVRFT1JERVIgPT0gU0RMX0xJTF9FTkRJQU4KICAgIHJldHVybiBzcmNidWZbMF0gKyAoc3JjYnVmWzFdIDw8IDgpICsgKHNyY2J1ZlsyXSA8PCAxNik7CiNlbHNlCiAgICByZXR1cm4gKHNyY2J1ZlswXSA8PCAxNikgKyAoc3JjYnVmWzFdIDw8IDgpICsgc3JjYnVmWzJdOwojZW5kaWYKfQoKc3RhdGljIFVpbnQzMiBnZXRwaXhfMzIoVWludDggKnNyY2J1ZikKewogICAgcmV0dXJuICooVWludDMyICopc3JjYnVmOwp9Cgp0eXBlZGVmIFVpbnQzMiAoKmdldHBpeF9mdW5jKShVaW50OCAqKTsKCnN0YXRpYyBnZXRwaXhfZnVuYyBnZXRwaXhlc1s0XSA9IHsKICAgIGdldHBpeF84LCBnZXRwaXhfMTYsIGdldHBpeF8yNCwgZ2V0cGl4XzMyCn07CgpzdGF0aWMgaW50IFJMRUNvbG9ya2V5U3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKewogICAgICAgIFVpbnQ4ICpybGVidWYsICpkc3Q7CglpbnQgbWF4bjsKCWludCB5OwoJVWludDggKnNyY2J1ZiwgKmxhc3RsaW5lOwoJaW50IG1heHNpemUgPSAwOwoJaW50IGJwcCA9IHN1cmZhY2UtPmZvcm1hdC0+Qnl0ZXNQZXJQaXhlbDsKCWdldHBpeF9mdW5jIGdldHBpeDsKCVVpbnQzMiBja2V5LCByZ2JtYXNrOwoJaW50IHcsIGg7CgoJLyogY2FsY3VsYXRlIHRoZSB3b3JzdCBjYXNlIHNpemUgZm9yIHRoZSBjb21wcmVzc2VkIHN1cmZhY2UgKi8KCXN3aXRjaChicHApIHsKCWNhc2UgMToKCSAgICAvKiB3b3JzdCBjYXNlIGlzIGFsdGVybmF0aW5nIG9wYXF1ZSBhbmQgdHJhbnNwYXJlbnQgcGl4ZWxzLAoJICAgICAgIHN0YXJ0aW5nIHdpdGggYW4gb3BhcXVlIHBpeGVsICovCgkgICAgbWF4c2l6ZSA9IHN1cmZhY2UtPmggKiAzICogKHN1cmZhY2UtPncgLyAyICsgMSkgKyAyOwoJICAgIGJyZWFrOwoJY2FzZSAyOgoJY2FzZSAzOgoJICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCAyNTUgcGl4ZWxzIHdpZGUgKi8KCSAgICBtYXhzaXplID0gc3VyZmFjZS0+aCAqICgyICogKHN1cmZhY2UtPncgLyAyNTUgKyAxKQoJCQkJICAgICsgc3VyZmFjZS0+dyAqIGJwcCkgKyAyOwoJICAgIGJyZWFrOwoJY2FzZSA0OgoJICAgIC8qIHdvcnN0IGNhc2UgaXMgc29saWQgcnVucywgYXQgbW9zdCA2NTUzNSBwaXhlbHMgd2lkZSAqLwoJICAgIG1heHNpemUgPSBzdXJmYWNlLT5oICogKDQgKiAoc3VyZmFjZS0+dyAvIDY1NTM1ICsgMSkKCQkJCSAgICArIHN1cmZhY2UtPncgKiA0KSArIDQ7CgkgICAgYnJlYWs7Cgl9CgoJcmxlYnVmID0gKFVpbnQ4ICopU0RMX21hbGxvYyhtYXhzaXplKTsKCWlmICggcmxlYnVmID09IE5VTEwgKSB7CgkJU0RMX091dE9mTWVtb3J5KCk7CgkJcmV0dXJuKC0xKTsKCX0KCgkvKiBTZXQgdXAgdGhlIGNvbnZlcnNpb24gKi8KCXNyY2J1ZiA9IChVaW50OCAqKXN1cmZhY2UtPnBpeGVsczsKCW1heG4gPSBicHAgPT0gNCA/IDY1NTM1IDogMjU1OwoJZHN0ID0gcmxlYnVmOwoJcmdibWFzayA9IH5zdXJmYWNlLT5mb3JtYXQtPkFtYXNrOwoJY2tleSA9IHN1cmZhY2UtPmZvcm1hdC0+Y29sb3JrZXkgJiByZ2JtYXNrOwoJbGFzdGxpbmUgPSBkc3Q7CglnZXRwaXggPSBnZXRwaXhlc1ticHAgLSAxXTsKCXcgPSBzdXJmYWNlLT53OwoJaCA9IHN1cmZhY2UtPmg7CgojZGVmaW5lIEFERF9DT1VOVFMobiwgbSkJCQlcCglpZihicHAgPT0gNCkgewkJCQlcCgkgICAgKChVaW50MTYgKilkc3QpWzBdID0gbjsJCVwKCSAgICAoKFVpbnQxNiAqKWRzdClbMV0gPSBtOwkJXAoJICAgIGRzdCArPSA0OwkJCQlcCgl9IGVsc2UgewkJCQlcCgkgICAgZHN0WzBdID0gbjsJCQkJXAoJICAgIGRzdFsxXSA9IG07CQkJCVwKCSAgICBkc3QgKz0gMjsJCQkJXAoJfQoKCWZvcih5ID0gMDsgeSA8IGg7IHkrKykgewoJICAgIGludCB4ID0gMDsKCSAgICBpbnQgYmxhbmtsaW5lID0gMDsKCSAgICBkbyB7CgkJaW50IHJ1biwgc2tpcCwgbGVuOwoJCWludCBydW5zdGFydDsKCQlpbnQgc2tpcHN0YXJ0ID0geDsKCgkJLyogZmluZCBydW4gb2YgdHJhbnNwYXJlbnQsIHRoZW4gb3BhcXVlIHBpeGVscyAqLwoJCXdoaWxlKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSA9PSBja2V5KQoJCSAgICB4Kys7CgkJcnVuc3RhcnQgPSB4OwoJCXdoaWxlKHggPCB3ICYmIChnZXRwaXgoc3JjYnVmICsgeCAqIGJwcCkgJiByZ2JtYXNrKSAhPSBja2V5KQoJCSAgICB4Kys7CgkJc2tpcCA9IHJ1bnN0YXJ0IC0gc2tpcHN0YXJ0OwoJCWlmKHNraXAgPT0gdykKCQkgICAgYmxhbmtsaW5lID0gMTsKCQlydW4gPSB4IC0gcnVuc3RhcnQ7CgoJCS8qIGVuY29kZSBzZWdtZW50ICovCgkJd2hpbGUoc2tpcCA+IG1heG4pIHsKCQkgICAgQUREX0NPVU5UUyhtYXhuLCAwKTsKCQkgICAgc2tpcCAtPSBtYXhuOwoJCX0KCQlsZW4gPSBNSU4ocnVuLCBtYXhuKTsKCQlBRERfQ09VTlRTKHNraXAsIGxlbik7CgkJU0RMX21lbWNweShkc3QsIHNyY2J1ZiArIHJ1bnN0YXJ0ICogYnBwLCBsZW4gKiBicHApOwoJCWRzdCArPSBsZW4gKiBicHA7CgkJcnVuIC09IGxlbjsKCQlydW5zdGFydCArPSBsZW47CgkJd2hpbGUocnVuKSB7CgkJICAgIGxlbiA9IE1JTihydW4sIG1heG4pOwoJCSAgICBBRERfQ09VTlRTKDAsIGxlbik7CgkJICAgIFNETF9tZW1jcHkoZHN0LCBzcmNidWYgKyBydW5zdGFydCAqIGJwcCwgbGVuICogYnBwKTsKCQkgICAgZHN0ICs9IGxlbiAqIGJwcDsKCQkgICAgcnVuc3RhcnQgKz0gbGVuOwoJCSAgICBydW4gLT0gbGVuOwoJCX0KCQlpZighYmxhbmtsaW5lKQoJCSAgICBsYXN0bGluZSA9IGRzdDsKCSAgICB9IHdoaWxlKHggPCB3KTsKCgkgICAgc3JjYnVmICs9IHN1cmZhY2UtPnBpdGNoOwoJfQoJZHN0ID0gbGFzdGxpbmU7CQkvKiBiYWNrIHVwIGJhc3QgdHJhaWxpbmcgYmxhbmsgbGluZXMgKi8KCUFERF9DT1VOVFMoMCwgMCk7CgojdW5kZWYgQUREX0NPVU5UUwoKCS8qIE5vdyB0aGF0IHdlIGhhdmUgaXQgZW5jb2RlZCwgcmVsZWFzZSB0aGUgb3JpZ2luYWwgcGl4ZWxzICovCglpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpICE9IFNETF9QUkVBTExPQwoJICAgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgewoJICAgIFNETF9mcmVlKCBzdXJmYWNlLT5waXhlbHMgKTsKCSAgICBzdXJmYWNlLT5waXhlbHMgPSBOVUxMOwoJfQoKCS8qIHJlYWxsb2MgdGhlIGJ1ZmZlciB0byByZWxlYXNlIHVudXNlZCBtZW1vcnkgKi8KCXsKCSAgICAvKiBJZiByZWFsbG9jIHJldHVybnMgTlVMTCwgdGhlIG9yaWdpbmFsIGJsb2NrIGlzIGxlZnQgaW50YWN0ICovCgkgICAgVWludDggKnAgPSBTRExfcmVhbGxvYyhybGVidWYsIGRzdCAtIHJsZWJ1Zik7CgkgICAgaWYoIXApCgkJcCA9IHJsZWJ1ZjsKCSAgICBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhID0gcDsKCX0KCglyZXR1cm4oMCk7Cn0KCmludCBTRExfUkxFU3VyZmFjZShTRExfU3VyZmFjZSAqc3VyZmFjZSkKewoJaW50IHJldGNvZGU7CgoJLyogQ2xlYXIgYW55IHByZXZpb3VzIFJMRSBjb252ZXJzaW9uICovCglpZiAoIChzdXJmYWNlLT5mbGFncyAmIFNETF9STEVBQ0NFTCkgPT0gU0RMX1JMRUFDQ0VMICkgewoJCVNETF9VblJMRVN1cmZhY2Uoc3VyZmFjZSwgMSk7Cgl9CgoJLyogV2UgZG9uJ3Qgc3VwcG9ydCBSTEUgZW5jb2Rpbmcgb2YgYml0bWFwcyAqLwoJaWYgKCBzdXJmYWNlLT5mb3JtYXQtPkJpdHNQZXJQaXhlbCA8IDggKSB7CgkJcmV0dXJuKC0xKTsKCX0KCgkvKiBMb2NrIHRoZSBzdXJmYWNlIGlmIGl0J3MgaW4gaGFyZHdhcmUgKi8KCWlmICggU0RMX01VU1RMT0NLKHN1cmZhY2UpICkgewoJCWlmICggU0RMX0xvY2tTdXJmYWNlKHN1cmZhY2UpIDwgMCApIHsKCQkJcmV0dXJuKC0xKTsKCQl9Cgl9CgoJLyogRW5jb2RlICovCglpZigoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfU1JDQ09MT1JLRVkpID09IFNETF9TUkNDT0xPUktFWSkgewoJICAgIHJldGNvZGUgPSBSTEVDb2xvcmtleVN1cmZhY2Uoc3VyZmFjZSk7Cgl9IGVsc2UgewoJICAgIGlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNBTFBIQSkgPT0gU0RMX1NSQ0FMUEhBCgkgICAgICAgJiYgc3VyZmFjZS0+Zm9ybWF0LT5BbWFzayAhPSAwKQoJCXJldGNvZGUgPSBSTEVBbHBoYVN1cmZhY2Uoc3VyZmFjZSk7CgkgICAgZWxzZQoJCXJldGNvZGUgPSAtMTsJLyogbm8gUkxFIGZvciBwZXItc3VyZmFjZSBhbHBoYSBzYW5zIGNrZXkgKi8KCX0KCgkvKiBVbmxvY2sgdGhlIHN1cmZhY2UgaWYgaXQncyBpbiBoYXJkd2FyZSAqLwoJaWYgKCBTRExfTVVTVExPQ0soc3VyZmFjZSkgKSB7CgkJU0RMX1VubG9ja1N1cmZhY2Uoc3VyZmFjZSk7Cgl9CgoJaWYocmV0Y29kZSA8IDApCgkgICAgcmV0dXJuIC0xOwoKCS8qIFRoZSBzdXJmYWNlIGlzIG5vdyBhY2NlbGVyYXRlZCAqLwoJc3VyZmFjZS0+ZmxhZ3MgfD0gU0RMX1JMRUFDQ0VMOwoKCXJldHVybigwKTsKfQoKLyoKICogVW4tUkxFIGEgc3VyZmFjZSB3aXRoIHBpeGVsIGFscGhhCiAqIFRoaXMgbWF5IG5vdCBnaXZlIGJhY2sgZXhhY3RseSB0aGUgaW1hZ2UgYmVmb3JlIFJMRS1lbmNvZGluZzsgYWxsCiAqIGNvbXBsZXRlbHkgdHJhbnNwYXJlbnQgcGl4ZWxzIHdpbGwgYmUgbG9zdCwgYW5kIGNvbG91ciBhbmQgYWxwaGEgZGVwdGgKICogbWF5IGhhdmUgYmVlbiByZWR1Y2VkICh3aGVuIGVuY29kaW5nIGZvciAxNmJwcCB0YXJnZXRzKS4KICovCnN0YXRpYyBTRExfYm9vbCBVblJMRUFscGhhKFNETF9TdXJmYWNlICpzdXJmYWNlKQp7CiAgICBVaW50OCAqc3JjYnVmOwogICAgVWludDMyICpkc3Q7CiAgICBTRExfUGl4ZWxGb3JtYXQgKnNmID0gc3VyZmFjZS0+Zm9ybWF0OwogICAgUkxFRGVzdEZvcm1hdCAqZGYgPSBzdXJmYWNlLT5tYXAtPnN3X2RhdGEtPmF1eF9kYXRhOwogICAgaW50ICgqdW5jb3B5X29wYXF1ZSkoVWludDMyICosIHZvaWQgKiwgaW50LAoJCQkgUkxFRGVzdEZvcm1hdCAqLCBTRExfUGl4ZWxGb3JtYXQgKik7CiAgICBpbnQgKCp1bmNvcHlfdHJhbnNsKShVaW50MzIgKiwgdm9pZCAqLCBpbnQsCgkJCSBSTEVEZXN0Rm9ybWF0ICosIFNETF9QaXhlbEZvcm1hdCAqKTsKICAgIGludCB3ID0gc3VyZmFjZS0+dzsKICAgIGludCBicHAgPSBkZi0+Qnl0ZXNQZXJQaXhlbDsKCiAgICBpZihicHAgPT0gMikgewoJdW5jb3B5X29wYXF1ZSA9IHVuY29weV9vcGFxdWVfMTY7Cgl1bmNvcHlfdHJhbnNsID0gdW5jb3B5X3RyYW5zbF8xNjsKICAgIH0gZWxzZSB7Cgl1bmNvcHlfb3BhcXVlID0gdW5jb3B5X3RyYW5zbCA9IHVuY29weV8zMjsKICAgIH0KCiAgICBzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CiAgICBpZiAoICFzdXJmYWNlLT5waXhlbHMgKSB7CiAgICAgICAgcmV0dXJuKFNETF9GQUxTRSk7CiAgICB9CiAgICAvKiBmaWxsIGJhY2tncm91bmQgd2l0aCB0cmFuc3BhcmVudCBwaXhlbHMgKi8KICAgIFNETF9tZW1zZXQoc3VyZmFjZS0+cGl4ZWxzLCAwLCBzdXJmYWNlLT5oICogc3VyZmFjZS0+cGl0Y2gpOwoKICAgIGRzdCA9IHN1cmZhY2UtPnBpeGVsczsKICAgIHNyY2J1ZiA9IChVaW50OCAqKShkZiArIDEpOwogICAgZm9yKDs7KSB7CgkvKiBjb3B5IG9wYXF1ZSBwaXhlbHMgKi8KCWludCBvZnMgPSAwOwoJZG8gewoJICAgIHVuc2lnbmVkIHJ1bjsKCSAgICBpZihicHAgPT0gMikgewoJCW9mcyArPSBzcmNidWZbMF07CgkJcnVuID0gc3JjYnVmWzFdOwoJCXNyY2J1ZiArPSAyOwoJICAgIH0gZWxzZSB7CgkJb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKCQlydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CgkJc3JjYnVmICs9IDQ7CgkgICAgfQoJICAgIGlmKHJ1bikgewoJCXNyY2J1ZiArPSB1bmNvcHlfb3BhcXVlKGRzdCArIG9mcywgc3JjYnVmLCBydW4sIGRmLCBzZik7CgkJb2ZzICs9IHJ1bjsKCSAgICB9IGVsc2UgaWYoIW9mcykKCQlyZXR1cm4oU0RMX1RSVUUpOwoJfSB3aGlsZShvZnMgPCB3KTsKCgkvKiBza2lwIHBhZGRpbmcgaWYgbmVlZGVkICovCglpZihicHAgPT0gMikKCSAgICBzcmNidWYgKz0gKHVpbnRwdHJfdClzcmNidWYgJiAyOwoJCgkvKiBjb3B5IHRyYW5zbHVjZW50IHBpeGVscyAqLwoJb2ZzID0gMDsKCWRvIHsKCSAgICB1bnNpZ25lZCBydW47CgkgICAgb2ZzICs9ICgoVWludDE2ICopc3JjYnVmKVswXTsKCSAgICBydW4gPSAoKFVpbnQxNiAqKXNyY2J1ZilbMV07CgkgICAgc3JjYnVmICs9IDQ7CgkgICAgaWYocnVuKSB7CgkJc3JjYnVmICs9IHVuY29weV90cmFuc2woZHN0ICsgb2ZzLCBzcmNidWYsIHJ1biwgZGYsIHNmKTsKCQlvZnMgKz0gcnVuOwoJICAgIH0KCX0gd2hpbGUob2ZzIDwgdyk7Cglkc3QgKz0gc3VyZmFjZS0+cGl0Y2ggPj4gMjsKICAgIH0KICAgIC8qIE1ha2UgdGhlIGNvbXBpbGVyIGhhcHB5ICovCiAgICByZXR1cm4oU0RMX1RSVUUpOwp9Cgp2b2lkIFNETF9VblJMRVN1cmZhY2UoU0RMX1N1cmZhY2UgKnN1cmZhY2UsIGludCByZWNvZGUpCnsKICAgIGlmICggKHN1cmZhY2UtPmZsYWdzICYgU0RMX1JMRUFDQ0VMKSA9PSBTRExfUkxFQUNDRUwgKSB7CglzdXJmYWNlLT5mbGFncyAmPSB+U0RMX1JMRUFDQ0VMOwoKCWlmKHJlY29kZSAmJiAoc3VyZmFjZS0+ZmxhZ3MgJiBTRExfUFJFQUxMT0MpICE9IFNETF9QUkVBTExPQwoJICAgJiYgKHN1cmZhY2UtPmZsYWdzICYgU0RMX0hXU1VSRkFDRSkgIT0gU0RMX0hXU1VSRkFDRSkgewoJICAgIGlmKChzdXJmYWNlLT5mbGFncyAmIFNETF9TUkNDT0xPUktFWSkgPT0gU0RMX1NSQ0NPTE9SS0VZKSB7CgkJU0RMX1JlY3QgZnVsbDsKCQl1bnNpZ25lZCBhbHBoYV9mbGFnOwoKCQkvKiByZS1jcmVhdGUgdGhlIG9yaWdpbmFsIHN1cmZhY2UgKi8KCQlzdXJmYWNlLT5waXhlbHMgPSBTRExfbWFsbG9jKHN1cmZhY2UtPmggKiBzdXJmYWNlLT5waXRjaCk7CgkJaWYgKCAhc3VyZmFjZS0+cGl4ZWxzICkgewoJCQkvKiBPaCBjcmFwLi4uICovCgkJCXN1cmZhY2UtPmZsYWdzIHw9IFNETF9STEVBQ0NFTDsKCQkJcmV0dXJuOwoJCX0KCgkJLyogZmlsbCBpdCB3aXRoIHRoZSBiYWNrZ3JvdW5kIGNvbG91ciAqLwoJCVNETF9GaWxsUmVjdChzdXJmYWNlLCBOVUxMLCBzdXJmYWNlLT5mb3JtYXQtPmNvbG9ya2V5KTsKCgkJLyogbm93IHJlbmRlciB0aGUgZW5jb2RlZCBzdXJmYWNlICovCgkJZnVsbC54ID0gZnVsbC55ID0gMDsKCQlmdWxsLncgPSBzdXJmYWNlLT53OwoJCWZ1bGwuaCA9IHN1cmZhY2UtPmg7CgkJYWxwaGFfZmxhZyA9IHN1cmZhY2UtPmZsYWdzICYgU0RMX1NSQ0FMUEhBOwoJCXN1cmZhY2UtPmZsYWdzICY9IH5TRExfU1JDQUxQSEE7IC8qIG9wYXF1ZSBibGl0ICovCgkJU0RMX1JMRUJsaXQoc3VyZmFjZSwgJmZ1bGwsIHN1cmZhY2UsICZmdWxsKTsKCQlzdXJmYWNlLT5mbGFncyB8PSBhbHBoYV9mbGFnOwoJICAgIH0gZWxzZSB7CgkJaWYgKCAhVW5STEVBbHBoYShzdXJmYWNlKSApIHsKCQkgICAgLyogT2ggY3JhcC4uLiAqLwoJCSAgICBzdXJmYWNlLT5mbGFncyB8PSBTRExfUkxFQUNDRUw7CgkJICAgIHJldHVybjsKCQl9CgkgICAgfQoJfQoKCWlmICggc3VyZmFjZS0+bWFwICYmIHN1cmZhY2UtPm1hcC0+c3dfZGF0YS0+YXV4X2RhdGEgKSB7CgkgICAgU0RMX2ZyZWUoc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSk7CgkgICAgc3VyZmFjZS0+bWFwLT5zd19kYXRhLT5hdXhfZGF0YSA9IE5VTEw7Cgl9CiAgICB9Cn0KCgo=