LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnRzIHB0aHJlYWRzIHVzZSBXaW5lJ3Mgb3duIHRocmVhZGluZyBpbnN0ZWFkLi4uCiAqCiAqIENvcHlyaWdodCAxOTk5IE92ZSBL5XZlbgogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2RlZmluZSBfR05VX1NPVVJDRSAvKiB3ZSBtYXkgbmVlZCB0byBvdmVycmlkZSBzb21lIEdOVSBleHRlbnNpb25zICovCgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJ0aHJlYWQuaCIKCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChfX0dMSUJDX18pCiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCiNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCiMgZGVmaW5lIFBSRUZJWCAiXyIKI2Vsc2UKIyBkZWZpbmUgUFJFRklYCiNlbmRpZgoKI2RlZmluZSBQU1RSKHN0cikgUFJFRklYICNzdHIKCi8qIGFkYXB0IGFzIG5lY2Vzc2FyeSAoYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIGlzIHVzZWQgaW4gZ2xpYmMgc291cmNlcykgKi8KI2RlZmluZSBzdHJvbmdfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnNldCAiIFBTVFIoYWxpYXMpICIsIiBQU1RSKG9yaWcpKQoKLyogc3Ryb25nX2FsaWFzIGRvZXMgbm90IHdvcmsgb24gZXh0ZXJuYWwgc3ltYm9scyAoLm8gZm9ybWF0IGxpbWl0YXRpb24/KSwKICogc28gZm9yIHRob3NlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgcG9nbyBzdGljayAqLwojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19QSUNfXykKLyogRklYTUU6IFBJQyAqLwojZGVmaW5lIGp1bXBfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnR5cGUgIiBQU1RSKGFsaWFzKSAiLEBmdW5jdGlvblxuIiBcCiAgICAgUFNUUihhbGlhcykgIjpcbiIgXAogICAgICJcdGptcCAiIFBTVFIob3JpZykpCiNlbmRpZgoKLyogZ2V0IG5lY2Vzc2FyeSBsaWJjIHN5bWJvbHMgKi8KI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAxKSAmJiBkZWZpbmVkKEhBVkVfX19MSUJDX0ZPUkspCiNkZWZpbmUgTElCQ19GT1JLIF9fbGliY19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIF9fZm9yawojZGVmaW5lIEFMSUFTX0ZPUksKI2Vsc2UKI2RlZmluZSBMSUJDX0ZPUksgX19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIGZvcmsKI2VuZGlmCmV4dGVybiBwaWRfdCBMSUJDX0ZPUksodm9pZCk7CgojZGVmaW5lIExJQkNfU0lHQUNUSU9OIF9fc2lnYWN0aW9uCgovKiBOT1RFOiBUaGlzIGlzIGEgdHJ1bHkgZXh0cmVtZWx5IGluY3JlZGlibHkgdWdseSBoYWNrIQogKiBCdXQgaXQgZG9lcyBzZWVtIHRvIHdvcmsuLi4gKi8KCi8qIGFzc3VtZSB0aGF0IHB0aHJlYWRfbXV0ZXhfdCBoYXMgcm9vbSBmb3IgYXQgbGVhc3Qgb25lIHBvaW50ZXIsCiAqIGFuZCBob3BlIHRoYXQgdGhlIHVzZXJzIG9mIHB0aHJlYWRfbXV0ZXhfdCBjb25zaWRlcnMgaXQgb3BhcXVlCiAqIChuZXZlciBjaGVja3Mgd2hhdCdzIGluIGl0KSAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3Q7Cn0gKndpbmVfbXV0ZXg7Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCnR5cGVkZWYgY29uc3Qgdm9pZCAqa2V5X2RhdGE7CgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewp9CgppbnQgX19wdGhyZWFkX29uY2UocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpCnsKICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICBMT05HIG9uY2Vfbm93ID0gKihMT05HICopJnRoZV9vbmNlOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKFBWT0lEKilvbmNlX2NvbnRyb2wsIChQVk9JRCkob25jZV9ub3crMSksIChQVk9JRClvbmNlX25vdykgPT0gKFBWT0lEKW9uY2Vfbm93KQogICAgKCppbml0X3JvdXRpbmUpKCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9vbmNlLCBwdGhyZWFkX29uY2UpOwoKdm9pZCBfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKHZvaWQpCnsKICAvKiBGSVhNRTogdGhpcyBpcyBzdXBwb3NlZCB0byBiZSBwcmVwYXJhdGlvbiBmb3IgZXhlYygpICovCiAgaWYgKFN5c3RlbUhlYXApIFBfT1VUUFVUKCJmaXhtZTpwdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucFxuIik7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9raWxsX290aGVyX3RocmVhZHNfbnAsIHB0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKTsKCi8qKioqKiBhdGZvcmsgKioqKiovCgojZGVmaW5lIE1BWF9BVEZPUksgOCAgLyogbGliYyBkb2Vzbid0IG5lZWQgdGhhdCBtYW55IGFueXdheSAqLwoKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gYXRmb3JrX3NlY3Rpb24gPSBDUklUSUNBTF9TRUNUSU9OX0lOSVQ7CnR5cGVkZWYgdm9pZCAoKmF0Zm9ya19oYW5kbGVyKSgpOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3ByZXBhcmVbTUFYX0FURk9SS107CnN0YXRpYyBhdGZvcmtfaGFuZGxlciBhdGZvcmtfcGFyZW50W01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX2NoaWxkW01BWF9BVEZPUktdOwpzdGF0aWMgaW50IGF0Zm9ya19jb3VudDsKCmludCBfX3B0aHJlYWRfYXRmb3JrKHZvaWQgKCpwcmVwYXJlKSh2b2lkKSwKCQkgICAgIHZvaWQgKCpwYXJlbnQpKHZvaWQpLAoJCSAgICAgdm9pZCAoKmNoaWxkKSh2b2lkKSkKewogICAgaWYgKFN5c3RlbUhlYXApIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIGFzc2VydCggYXRmb3JrX2NvdW50IDwgTUFYX0FURk9SSyApOwogICAgYXRmb3JrX3ByZXBhcmVbYXRmb3JrX2NvdW50XSA9IHByZXBhcmU7CiAgICBhdGZvcmtfcGFyZW50W2F0Zm9ya19jb3VudF0gPSBwYXJlbnQ7CiAgICBhdGZvcmtfY2hpbGRbYXRmb3JrX2NvdW50XSA9IGNoaWxkOwogICAgYXRmb3JrX2NvdW50Kys7CiAgICBpZiAoU3lzdGVtSGVhcCkgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9hdGZvcmssIHB0aHJlYWRfYXRmb3JrKTsKCnBpZF90IFBUSFJFQURfRk9SSyh2b2lkKQp7CiAgICBwaWRfdCBwaWQ7CiAgICBpbnQgaTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICAvKiBwcmVwYXJlIGhhbmRsZXJzIGFyZSBjYWxsZWQgaW4gcmV2ZXJzZSBpbnNlcnRpb24gb3JkZXIgKi8KICAgIGZvciAoaSA9IGF0Zm9ya19jb3VudCAtIDE7IGkgPj0gMDsgaS0tKSBhdGZvcmtfcHJlcGFyZVtpXSgpOwogICAgaWYgKCEocGlkID0gTElCQ19GT1JLKCkpKQogICAgewogICAgICAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgYXRmb3JrX2NoaWxkW2ldKCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGF0Zm9ya19jb3VudDsgaSsrKSBhdGZvcmtfcGFyZW50W2ldKCk7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oICZhdGZvcmtfc2VjdGlvbiApOwogICAgfQogICAgcmV0dXJuIHBpZDsKfQojaWZkZWYgQUxJQVNfRk9SSwpzdHJvbmdfYWxpYXMoUFRIUkVBRF9GT1JLLCBmb3JrKTsKI2VuZGlmCgovKioqKiogTVVURVhFUyAqKioqKi8KCmludCBfX3B0aHJlYWRfbXV0ZXhfaW5pdChwdGhyZWFkX211dGV4X3QgKm11dGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwdGhyZWFkX211dGV4YXR0cl90ICptdXRleGF0dHIpCnsKICAvKiBnbGliYyBoYXMgYSB0ZW5kZW5jeSB0byBpbml0aWFsaXplIG11dGV4ZXMgdmVyeSBvZnRlbiwgZXZlbgogICAgIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhleSBhcmUgbm90IHJlYWxseSB1c2VkIGxhdGVyIG9uLgoKICAgICBBcyBmb3IgdXMsIGluaXRpYWxpemluZyBhIG11dGV4IGlzIHZlcnkgZXhwZW5zaXZlLCB3ZSBwb3N0cG9uZQogICAgIHRoZSByZWFsIGluaXRpYWxpemF0aW9uIHVudGlsIHRoZSB0aW1lIHRoZSBtdXRleCBpcyBmaXJzdCB1c2VkLiAqLwoKICAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCA9IE5VTEw7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9pbml0LCBwdGhyZWFkX211dGV4X2luaXQpOwoKc3RhdGljIHZvaWQgbXV0ZXhfcmVhbF9pbml0KCBwdGhyZWFkX211dGV4X3QgKm11dGV4ICkKewogIENSSVRJQ0FMX1NFQ1RJT04gKmNyaXRzZWN0ID0gSGVhcEFsbG9jKFN5c3RlbUhlYXAsIDAsIHNpemVvZihDUklUSUNBTF9TRUNUSU9OKSk7CiAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbihjcml0c2VjdCk7CgogIGlmIChJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSgoUFZPSUQqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKFN5c3RlbUhlYXAsIDAsIGNyaXRzZWN0KTsKICB9Cn0KCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFTeXN0ZW1IZWFwKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgRW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfbG9jaywgcHRocmVhZF9tdXRleF9sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFTeXN0ZW1IZWFwKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSAKICAgIG11dGV4X3JlYWxfaW5pdCggbXV0ZXggKTsKCiAgaWYgKCFUcnlFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdHJ5bG9jaywgcHRocmVhZF9tdXRleF90cnlsb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoISgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KSByZXR1cm4gMDsKICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF91bmxvY2ssIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveShwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgaWYgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkgewojaWYgMCAvKiB0aGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBsaWJjNiB0aGF0IG1ha2VzIHRoaXMgYSBiYWQgaWRlYSAqLwogICAgcmV0dXJuIEVCVVNZOwojZWxzZQogICAgd2hpbGUgKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0LT5SZWN1cnNpb25Db3VudCkKICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwojZW5kaWYKICB9CiAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKICBIZWFwRnJlZShTeXN0ZW1IZWFwLCAwLCAoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9kZXN0cm95LCBwdGhyZWFkX211dGV4X2Rlc3Ryb3kpOwoKCi8qKioqKiBNVVRFWCBBVFRSSUJVVEVTICoqKioqLwovKiBqdXN0IGR1bW1pZXMsIHNpbmNlIGNyaXRpY2FsIHNlY3Rpb25zIGFyZSBhbHdheXMgcmVjdXJzaXZlICovCgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9pbml0KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9pbml0LCBwdGhyZWFkX211dGV4YXR0cl9pbml0KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfbXV0ZXhhdHRyX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0a2luZF9ucChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnApOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQga2luZCkKewogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUpOwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfZ2V0dHlwZShwdGhyZWFkX211dGV4YXR0cl90ICphdHRyLCBpbnQgKmtpbmQpCnsKICAqa2luZCA9IFBUSFJFQURfTVVURVhfUkVDVVJTSVZFX05QOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUsIHB0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUpOwoKCi8qKioqKiBUSFJFQUQtU1BFQ0lGSUMgVkFSSUFCTEVTIChLRVlTKSAqKioqKi8KCmludCBfX3B0aHJlYWRfa2V5X2NyZWF0ZShwdGhyZWFkX2tleV90ICprZXksIHZvaWQgKCpkZXN0cl9mdW5jdGlvbikodm9pZCAqKSkKewogIHN0YXRpYyBMT05HIGtleWNudCA9IEZJUlNUX0tFWTsKICAqa2V5ID0gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgma2V5Y250LCAxKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9jcmVhdGUsIHB0aHJlYWRfa2V5X2NyZWF0ZSk7CgppbnQgX19wdGhyZWFkX2tleV9kZWxldGUocHRocmVhZF9rZXlfdCBrZXkpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2tleV9kZWxldGUsIHB0aHJlYWRfa2V5X2RlbGV0ZSk7CgppbnQgX19wdGhyZWFkX3NldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5LCBjb25zdCB2b2lkICpwb2ludGVyKQp7CiAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSB7CiAgICB0ZWItPnB0aHJlYWRfZGF0YSA9IGNhbGxvYyhNQVhfS0VZUyxzaXplb2Yoa2V5X2RhdGEpKTsKICB9CiAgKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSA9IHBvaW50ZXI7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9zZXRzcGVjaWZpYywgcHRocmVhZF9zZXRzcGVjaWZpYyk7Cgp2b2lkICpfX3B0aHJlYWRfZ2V0c3BlY2lmaWMocHRocmVhZF9rZXlfdCBrZXkpCnsKICBURUIgKnRlYiA9IE50Q3VycmVudFRlYigpOwogIGlmICghdGViKSByZXR1cm4gTlVMTDsKICBpZiAoIXRlYi0+cHRocmVhZF9kYXRhKSByZXR1cm4gTlVMTDsKICByZXR1cm4gKHZvaWQgKikoKChrZXlfZGF0YSopKHRlYi0+cHRocmVhZF9kYXRhKSlba2V5XSk7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9nZXRzcGVjaWZpYywgcHRocmVhZF9nZXRzcGVjaWZpYyk7CgoKLyoqKioqICJFWENFUFRJT04iIEZSQU1FUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2goc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lID0gcm91dGluZTsKICAoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcgPSBhcmc7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3Aoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgaWYgKGV4ZWN1dGUpICgqKCgod2luZV9jbGVhbnVwKWJ1ZmZlciktPnJvdXRpbmUpKSgoKHdpbmVfY2xlYW51cClidWZmZXIpLT5hcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcHVzaF9kZWZlcihzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgdm9pZCAoKnJvdXRpbmUpKHZvaWQgKiksIHZvaWQgKmFyZykKewogIF9wdGhyZWFkX2NsZWFudXBfcHVzaChidWZmZXIsIHJvdXRpbmUsIGFyZyk7Cn0KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wb3BfcmVzdG9yZShzdHJ1Y3QgX3B0aHJlYWRfY2xlYW51cF9idWZmZXIgKmJ1ZmZlciwgaW50IGV4ZWN1dGUpCnsKICBfcHRocmVhZF9jbGVhbnVwX3BvcChidWZmZXIsIGV4ZWN1dGUpOwp9CgoKLyoqKioqIENPTkRJVElPTlMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCmludCBwdGhyZWFkX2NvbmRfaW5pdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgY29uc3QgcHRocmVhZF9jb25kYXR0cl90ICpjb25kX2F0dHIpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2luaXRcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX2Rlc3Ryb3kocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Rlc3Ryb3lcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3NpZ25hbChwdGhyZWFkX2NvbmRfdCAqY29uZCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfc2lnbmFsXG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9icm9hZGNhc3QocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX2Jyb2FkY2FzdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCkKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX2NvbmRfd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfdGltZWR3YWl0KHB0aHJlYWRfY29uZF90ICpjb25kLCBwdGhyZWFkX211dGV4X3QgKm11dGV4LCBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKmFic3RpbWUpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3RpbWVkd2FpdFxuIik7CiAgcmV0dXJuIDA7Cn0KCi8qKioqIENPTkRJVElPTiBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kYXR0cl9pbml0KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kYXR0cl9kZXN0cm95KHB0aHJlYWRfY29uZGF0dHJfdCAqYXR0cikKewogIHJldHVybiAwOwp9CgojaWYgKF9fR0xJQkNfXyA9PSAyKSAmJiAoX19HTElCQ19NSU5PUl9fID49IDIpCi8qKioqKiBSRUFELVdSSVRFIExPQ0tTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgX19wdGhyZWFkX3J3bG9ja19pbml0KHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaywgY29uc3QgcHRocmVhZF9yd2xvY2thdHRyX3QgKnJ3bG9ja19hdHRyKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfcndsb2NrX2luaXRcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9yd2xvY2tfZGVzdHJveVxuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveSwgcHRocmVhZF9yd2xvY2tfZGVzdHJveSk7CgppbnQgX19wdGhyZWFkX3J3bG9ja19yZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfcndsb2NrX3JkbG9ja1xuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrLCBwdGhyZWFkX3J3bG9ja19yZGxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX3J3bG9ja190cnlyZGxvY2tcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXJkbG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5cmRsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3dybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF93cmxvY2tfcmRsb2NrXG4iKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja193cmxvY2ssIHB0aHJlYWRfcndsb2NrX3dybG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnl3cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfcndsb2NrX3RyeXdybG9ja1xuIik7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrLCBwdGhyZWFkX3J3bG9ja190cnl3cmxvY2spOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfdW5sb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIFBfT1VUUFVUKCJGSVhNRTpwdGhyZWFkX3J3bG9ja191bmxvY2tcbiIpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3VubG9jaywgcHRocmVhZF9yd2xvY2tfdW5sb2NrKTsKCi8qKioqIFJFQUQtV1JJVEUgTE9DSyBBVFRSSUJVVEVTICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9yd2xvY2thdHRyX2luaXQocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja2F0dHJfZGVzdHJveSwgcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3kpOwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9nZXRraW5kX25wKGNvbnN0IHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyLCBpbnQgKnByZWYpCnsKICAqcHJlZiA9IDA7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfc2V0a2luZF9ucChwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50IHByZWYpCnsKICByZXR1cm4gMDsKfQojZW5kaWYgLyogZ2xpYmMgMi4yICovCgovKioqKiogTUlTQyAqKioqKi8KCnB0aHJlYWRfdCBwdGhyZWFkX3NlbGYodm9pZCkKewogIHJldHVybiAocHRocmVhZF90KUdldEN1cnJlbnRUaHJlYWRJZCgpOwp9CgppbnQgcHRocmVhZF9lcXVhbChwdGhyZWFkX3QgdGhyZWFkMSwgcHRocmVhZF90IHRocmVhZDIpCnsKICByZXR1cm4gKERXT1JEKXRocmVhZDEgPT0gKERXT1JEKXRocmVhZDI7Cn0KCnZvaWQgcHRocmVhZF9leGl0KHZvaWQgKnJldHZhbCkKewogIC8qIEZJWE1FOiBwdGhyZWFkIGNsZWFudXAgKi8KICBFeGl0VGhyZWFkKChEV09SRClyZXR2YWwpOwp9CgppbnQgcHRocmVhZF9zZXRjYW5jZWx0eXBlKGludCB0eXBlLCBpbnQgKm9sZHR5cGUpCnsKICBpZiAob2xkdHlwZSkgKm9sZHR5cGUgPSBQVEhSRUFEX0NBTkNFTF9BU1lOQ0hST05PVVM7CiAgcmV0dXJuIDA7Cn0KCi8qKioqKiBBTlRJLU9WRVJSSURFUyAqKioqKi8KLyogcHRocmVhZHMgdHJpZXMgdG8gb3ZlcnJpZGUgdGhlc2UsIHBvaW50IHRoZW0gYmFjayB0byBsaWJjICovCgojaWZkZWYganVtcF9hbGlhcwpqdW1wX2FsaWFzKExJQkNfU0lHQUNUSU9OLCBzaWdhY3Rpb24pOwojZWxzZQppbnQgc2lnYWN0aW9uKGludCBzaWdudW0sIGNvbnN0IHN0cnVjdCBzaWdhY3Rpb24gKmFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KQp7CiAgcmV0dXJuIExJQkNfU0lHQUNUSU9OKHNpZ251bSwgYWN0LCBvbGRhY3QpOwp9CiNlbmRpZgoKI2VuZGlmIC8qIF9fR0xJQkNfXyAqLwo=