LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCkRFRklORV9PTEVHVUlEKCBDTFNJRF9EZk1hcnNoYWwsIDB4MDAwMDAzMGIsIDAsIDAgKTsKREVGSU5FX09MRUdVSUQoIENMU0lEX1BTRmFjdG9yeUJ1ZmZlciwgMHgwMDAwMDMyMCwgMCwgMCApOwpERUZJTkVfT0xFR1VJRCggQ0xTSURfSW5Qcm9jRnJlZU1hcnNoYWxlciwgMHgwMDAwMDMzYSwgMCwgMCApOwoKLyogVGhyZWFkLXNhZmV0eSBBbm5vdGF0aW9uIExlZ2VuZDoKICoKICogUk8gICAgLSBUaGUgdmFsdWUgaXMgcmVhZCBvbmx5LiBJdCBuZXZlciBjaGFuZ2VzIGFmdGVyIGNyZWF0aW9uLCBzbyBubwogKiAgICAgICAgIGxvY2tpbmcgaXMgcmVxdWlyZWQuCiAqIExPQ0sgIC0gVGhlIHZhbHVlIGlzIHdyaXR0ZW4gdG8gb25seSB1c2luZyBJbnRlcmxvY2tlZCogZnVuY3Rpb25zLgogKiBDUyAgICAtIFRoZSB2YWx1ZSBpcyByZWFkIG9yIHdyaXR0ZW4gdG8gaW5zaWRlIGEgY3JpdGljYWwgc2VjdGlvbi4KICogICAgICAgICBUaGUgaWRlbnRpZmllciBmb2xsb3dpbmcgIkNTIiBpcyB0aGUgc3BlY2lmaWMgY3JpdGljYWwgc2V0aW9uIHRoYXQKICogICAgICAgICBtdXN0IGJlIHVzZWQuCiAqIE1VVEVYIC0gVGhlIHZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiB0byB3aXRoIGEgbXV0ZXggaGVsZC4KICogICAgICAgICBUaGUgaWRlbnRpZmllciBmb2xsb3dpbmcgIk1VVEVYIiBpcyB0aGUgc3BlY2lmaWMgbXV0ZXggdGhhdAogKiAgICAgICAgIG11c3QgYmUgdXNlZC4KICovCgp0eXBlZGVmIGVudW0gaWZzdHViX3N0YXRlCnsKICAgIFNUVUJTVEFURV9OT1JNQUxfTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX05PUk1BTF9VTk1BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9XRUFLX01BUlNIQUxFRCwKICAgIFNUVUJTVEFURV9UQUJMRV9XRUFLX1VOTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX1RBQkxFX1NUUk9ORywKfSBTVFVCX1NUQVRFOwoKLyogYW4gaW50ZXJmYWNlIHN0dWIgKi8Kc3RydWN0IGlmc3R1YiAgIAp7CiAgICBzdHJ1Y3QgbGlzdCAgICAgICBlbnRyeTsgICAgICAvKiBlbnRyeSBpbiBzdHViX21hbmFnZXItPmlmc3R1YnMgbGlzdCAoQ1Mgc3R1Yl9tYW5hZ2VyLT5sb2NrKSAqLwogICAgSVJwY1N0dWJCdWZmZXIgICAqc3R1YmJ1ZmZlcjsgLyogUk8gKi8KICAgIElJRCAgICAgICAgICAgICAgIGlpZDsgICAgICAgIC8qIFJPICovCiAgICBJUElEICAgICAgICAgICAgICBpcGlkOyAgICAgICAvKiBSTyAqLwogICAgSVVua25vd24gICAgICAgICAqaWZhY2U7ICAgICAgLyogUk8gKi8KICAgIE1TSExGTEFHUyAgICAgICAgIGZsYWdzOyAgICAgIC8qIHNvIHdlIGNhbiBlbmZvcmNlIHByb2Nlc3MtbG9jYWwgbWFyc2hhbGxpbmcgcnVsZXMgKFJPKSAqLwogICAgSVJwY0NoYW5uZWxCdWZmZXIqY2hhbjsgICAgICAgLyogY2hhbm5lbCBwYXNzZWQgdG8gSVJwY1N0dWJCdWZmZXI6Okludm9rZSAoUk8pICovCn07CgoKLyogc3R1YiBtYW5hZ2VycyBob2xkIHJlZnMgb24gdGhlIG9iamVjdCBhbmQgZWFjaCBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCBzdHVibWdyIGxpc3QgKENTIGFwdC0+Y3MpICovCiAgICBzdHJ1Y3QgbGlzdCAgICAgICBpZnN0dWJzOyAgICAvKiBsaXN0IG9mIGFjdGl2ZSBpZnN0dWJzIGZvciB0aGUgb2JqZWN0IChDUyBsb2NrKSAqLwogICAgQ1JJVElDQUxfU0VDVElPTiAgbG9jazsKICAgIEFQQVJUTUVOVCAgICAgICAgKmFwdDsgICAgICAgIC8qIG93bmluZyBhcHQgKFJPKSAqLwoKICAgIFVMT05HICAgICAgICAgICAgIGV4dHJlZnM7ICAgIC8qIG51bWJlciBvZiAnZXh0ZXJuYWwnIHJlZmVyZW5jZXMgKENTIGxvY2spICovCiAgICBVTE9ORyAgICAgICAgICAgICByZWZzOyAgICAgICAvKiBpbnRlcm5hbCByZWZlcmVuY2UgY291bnQgKENTIGFwdC0+Y3MpICovCiAgICBPSUQgICAgICAgICAgICAgICBvaWQ7ICAgICAgICAvKiBhcGFydG1lbnQtc2NvcGVkIHVuaXF1ZSBpZGVudGlmaWVyIChSTykgKi8KICAgIElVbmtub3duICAgICAgICAgKm9iamVjdDsgICAgIC8qIHRoZSBvYmplY3Qgd2UgYXJlIG1hbmFnaW5nIHRoZSBzdHViIGZvciAoUk8pICovCiAgICBVTE9ORyAgICAgICAgICAgICBuZXh0X2lwaWQ7ICAvKiBjdXJyZW50bHkgdW51c2VkIChMT0NLKSAqLwoKICAgIC8qIFdlIG5lZWQgdG8ga2VlcCBhIGNvdW50IG9mIHRoZSBvdXRzdGFuZGluZyBtYXJzaGFscywgc28gd2UgY2FuIGVuZm9yY2UgdGhlCiAgICAgKiBtYXJzaGFsbGluZyBydWxlcyAoaWUsIHlvdSBjYW4gb25seSB1bm1hcnNoYWwgbm9ybWFsIG1hcnNoYWxzIG9uY2UpLiBOb3RlCiAgICAgKiB0aGF0IHRoZXNlIGNvdW50cyBkbyBOT1QgaW5jbHVkZSB1bm1hcnNoYWxsZWQgaW50ZXJmYWNlcywgb25jZSBhIHN0cmVhbSBpcwogICAgICogdW5tYXJzaGFsbGVkIGFuZCBhIHByb3h5IHNldCB1cCwgdGhpcyBjb3VudCBpcyBkZWNyZW1lbnRlZC4KICAgICAqLwoKICAgIFVMT05HICAgICAgICAgICAgIG5vcm1fcmVmczsgIC8qIHJlZmNvdW50IG9mIG5vcm1hbCBtYXJzaGFscyAoQ1MgbG9jaykgKi8KfTsKCi8qIGltcG9ydGVkIGludGVyZmFjZSBwcm94eSAqLwpzdHJ1Y3QgaWZwcm94eQp7CiAgc3RydWN0IGxpc3QgZW50cnk7ICAgICAgIC8qIGVudHJ5IGluIHByb3h5X21hbmFnZXIgbGlzdCAoQ1MgcGFyZW50LT5jcykgKi8KICBzdHJ1Y3QgcHJveHlfbWFuYWdlciAqcGFyZW50OyAvKiBvd25pbmcgcHJveHlfbWFuYWdlciAoUk8pICovCiAgTFBWT0lEIGlmYWNlOyAgICAgICAgICAgIC8qIGludGVyZmFjZSBwb2ludGVyIChSTykgKi8KICBTVERPQkpSRUYgc3Rkb2JqcmVmOyAgICAgLyogbWFyc2hhbCBkYXRhIHRoYXQgcmVwcmVzZW50cyB0aGlzIG9iamVjdCAoUk8pICovCiAgSUlEIGlpZDsgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBJRCAoUk8pICovCiAgTFBSUENQUk9YWUJVRkZFUiBwcm94eTsgIC8qIGludGVyZmFjZSBwcm94eSAoUk8pICovCiAgRFdPUkQgcmVmczsgICAgICAgICAgICAgIC8qIGltcG9ydGVkIChwdWJsaWMpIHJlZmVyZW5jZXMgKE1VVEVYIHBhcmVudC0+cmVtb3RpbmdfbXV0ZXgpICovCiAgSVJwY0NoYW5uZWxCdWZmZXIgKmNoYW47IC8qIGNoYW5uZWwgdG8gb2JqZWN0IChDUyBwYXJlbnQtPmNzKSAqLwp9OwoKLyogaW1wb3J0ZWQgb2JqZWN0IC8gcHJveHkgbWFuYWdlciAqLwpzdHJ1Y3QgcHJveHlfbWFuYWdlcgp7CiAgY29uc3QgSU11bHRpUUlWdGJsICpscFZ0Ymw7CiAgY29uc3QgSU1hcnNoYWxWdGJsICpscFZ0YmxNYXJzaGFsOwogIHN0cnVjdCBhcGFydG1lbnQgKnBhcmVudDsgLyogb3duaW5nIGFwYXJ0bWVudCAoUk8pICovCiAgc3RydWN0IGxpc3QgZW50cnk7ICAgICAgICAvKiBlbnRyeSBpbiBhcGFydG1lbnQgKENTIHBhcmVudC0+Y3MpICovCiAgT1hJRCBveGlkOyAgICAgICAgICAgICAgICAvKiBvYmplY3QgZXhwb3J0ZWQgSUQgKFJPKSAqLwogIE9JRCBvaWQ7ICAgICAgICAgICAgICAgICAgLyogb2JqZWN0IElEIChSTykgKi8KICBzdHJ1Y3QgbGlzdCBpbnRlcmZhY2VzOyAgIC8qIGltcG9ydGVkIGludGVyZmFjZXMgKENTIGNzKSAqLwogIExPTkcgcmVmczsgICAgICAgICAgICAgICAgLyogcHJveHkgcmVmZXJlbmNlIGNvdW50IChMT0NLKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAgLyogdGhyZWFkIHNhZmV0eSBmb3IgdGhpcyBvYmplY3QgYW5kIGNoaWxkcmVuICovCiAgVUxPTkcgc29yZmxhZ3M7ICAgICAgICAgICAvKiBTVERPQkpSRUYgZmxhZ3MgKFJPKSAqLwogIElSZW1Vbmtub3duICpyZW11bms7ICAgICAgLyogcHJveHkgdG8gSVJlbVVua25vd24gdXNlZCBmb3IgbGlmZWN5Y2xlIG1hbmFnZW1lbnQgKENTIGNzKSAqLwogIEhBTkRMRSByZW1vdGluZ19tdXRleDsgICAgLyogbXV0ZXggdXNlZCBmb3Igc3luY2hyb25pemluZyBhY2Nlc3MgdG8gSVJlbVVua25vd24gKi8KICBNU0hDVFggZGVzdF9jb250ZXh0OyAgICAgIC8qIGNvbnRleHQgdXNlZCBmb3IgYWN0aXZhdGluZyBvcHRpbWlzYXRpb25zIChMT0NLKSAqLwogIHZvaWQgKmRlc3RfY29udGV4dF9kYXRhOyAgLyogcmVzZXJ2ZWQgY29udGV4dCB2YWx1ZSAoTE9DSykgKi8KfTsKCi8qIHRoaXMgbmVlZHMgdG8gYmVjb21lIGEgQ09NIG9iamVjdCB0aGF0IGltcGxlbWVudHMgSVJlbVVua25vd24gKi8Kc3RydWN0IGFwYXJ0bWVudAp7CiAgc3RydWN0IGxpc3QgZW50cnk7CgogIExPTkcgIHJlZnM7ICAgICAgICAgICAgICAvKiByZWZjb3VudCBvZiB0aGUgYXBhcnRtZW50IChMT0NLKSAqLwogIEJPT0wgbXVsdGlfdGhyZWFkZWQ7ICAgICAvKiBtdWx0aS10aHJlYWRlZCBvciBzaW5nbGUtdGhyZWFkZWQgYXBhcnRtZW50PyAoUk8pICovCiAgRFdPUkQgdGlkOyAgICAgICAgICAgICAgIC8qIHRocmVhZCBpZCAoUk8pICovCiAgT1hJRCBveGlkOyAgICAgICAgICAgICAgIC8qIG9iamVjdCBleHBvcnRlciBJRCAoUk8pICovCiAgTE9ORyBpcGlkYzsgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBwb2ludGVyIElEIGNvdW50ZXIsIHN0YXJ0cyBhdCAxIChMT0NLKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgc3RydWN0IGxpc3QgcHJveGllczsgICAgIC8qIGltcG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIHN0cnVjdCBsaXN0IHN0dWJtZ3JzOyAgICAvKiBzdHViIG1hbmFnZXJzIGZvciBleHBvcnRlZCBvYmplY3RzIChDUyBjcykgKi8KICBCT09MIHJlbXVua19leHBvcnRlZDsgICAgLyogaGFzIHRoZSBJUmVtVW5rbm93biBpbnRlcmZhY2UgZm9yIHRoaXMgYXBhcnRtZW50IGJlZW4gY3JlYXRlZCB5ZXQ/IChDUyBjcykgKi8KICBMT05HIHJlbW90aW5nX3N0YXJ0ZWQ7ICAgLyogaGFzIHRoZSBSUEMgc3lzdGVtIGJlZW4gc3RhcnRlZCBmb3IgdGhpcyBhcGFydG1lbnQ/IChMT0NLKSAqLwogIHN0cnVjdCBsaXN0IHBzY2xzaWRzOyAgICAvKiBsaXN0IG9mIHJlZ2lzdGVyZWQgUFMgQ0xTSURzIChDUyBjcykgKi8KCiAgLyogRklYTUU6IE9JRCdzIHNob3VsZCBiZSBnaXZlbiBvdXQgYnkgUlBDU1MgKi8KICBPSUQgb2lkYzsgICAgICAgICAgICAgICAgLyogb2JqZWN0IElEIGNvdW50ZXIsIHN0YXJ0cyBhdCAxLCB6ZXJvIGlzIGludmFsaWQgT0lEIChDUyBjcykgKi8KCiAgLyogU1RBLW9ubHkgZmllbGRzICovCiAgSFdORCB3aW47ICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2Ugd2luZG93IChMT0NLKSAqLwogIExQTUVTU0FHRUZJTFRFUiBmaWx0ZXI7ICAvKiBtZXNzYWdlIGZpbHRlciAoQ1MgY3MpICovCiAgQk9PTCBtYWluOyAgICAgICAgICAgICAgIC8qIGlzIHRoaXMgYSBtYWluLXRocmVhZGVkLWFwYXJ0bWVudD8gKFJPKSAqLwp9OwoKLyogdGhpcyBpcyB3aGF0IGlzIHN0b3JlZCBpbiBURUItPlJlc2VydmVkRm9yT2xlICovCnN0cnVjdCBvbGV0bHMKewogICAgc3RydWN0IGFwYXJ0bWVudCAqYXB0OwogICAgSUVycm9ySW5mbyAgICAgICAqZXJyb3JpbmZvOyAgIC8qIHNlZSBlcnJvcmluZm8uYyAqLwogICAgSVVua25vd24gICAgICAgICAqc3RhdGU7ICAgICAgIC8qIHNlZSBDb1NldFN0YXRlICovCiAgICBEV09SRCAgICAgICAgICAgIGluaXRzOyAgICAgICAgLyogbnVtYmVyIG9mIHRpbWVzIENvSW5pdGlhbGl6ZUV4IGNhbGxlZCAqLwp9OwoKCi8qIEdsb2JhbCBJbnRlcmZhY2UgVGFibGUgRnVuY3Rpb25zICovCgpleHRlcm4gdm9pZCogU3RkR2xvYmFsSW50ZXJmYWNlVGFibGVfQ29uc3RydWN0KHZvaWQpOwpleHRlcm4gSFJFU1VMVCBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9HZXRGYWN0b3J5KExQVk9JRCAqcHB2KTsKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlSW5zdGFuY2U7CgovKiBGSVhNRTogdGhlc2Ugc2hvdWxkbid0IGJlIG5lZWRlZCwgZXhjZXB0IGZvciAxNi1iaXQgZnVuY3Rpb25zICovCmV4dGVybiBIUkVTVUxUIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCxMUFNUUiBpZHN0cik7CgpIUkVTVUxUIENPTV9PcGVuS2V5Rm9yQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIExQQ1dTVFIga2V5bmFtZSwgUkVHU0FNIGFjY2VzcywgSEtFWSAqa2V5KTsKSFJFU1VMVCBDT01fT3BlbktleUZvckFwcElkRnJvbUNMU0lEKFJFRkNMU0lEIGNsc2lkLCBSRUdTQU0gYWNjZXNzLCBIS0VZICpzdWJrZXkpOwpIUkVTVUxUIE1BUlNIQUxfR2V0U3RhbmRhcmRNYXJzaGFsQ0YoTFBWT0lEICpwcHYpOwpIUkVTVUxUIEZUTWFyc2hhbENGX0NyZWF0ZShSRUZJSUQgcmlpZCwgTFBWT0lEICpwcHYpOwoKLyogU3R1YiBNYW5hZ2VyICovCgpVTE9ORyBzdHViX21hbmFnZXJfaW50X2FkZHJlZihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9yZWxlYXNlKHN0cnVjdCBzdHViX21hbmFnZXIgKlRoaXMpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpuZXdfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBJVW5rbm93biAqb2JqZWN0KTsKVUxPTkcgc3R1Yl9tYW5hZ2VyX2V4dF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzLCBCT09MIGxhc3RfdW5sb2NrX3JlbGVhc2VzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX25ld19pZnN0dWIoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgSVJwY1N0dWJCdWZmZXIgKnNiLCBJVW5rbm93biAqaXB0ciwgUkVGSUlEIGlpZCwgTVNITEZMQUdTIGZsYWdzKTsKc3RydWN0IGlmc3R1YiAqc3R1Yl9tYW5hZ2VyX2ZpbmRfaWZzdHViKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFJFRklJRCBpaWQsIE1TSExGTEFHUyBmbGFncyk7CnN0cnVjdCBzdHViX21hbmFnZXIgKmdldF9zdHViX21hbmFnZXIoQVBBUlRNRU5UICphcHQsIE9JRCBvaWQpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyX2Zyb21fb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCB2b2lkICpvYmplY3QpOwpCT09MIHN0dWJfbWFuYWdlcl9ub3RpZnlfdW5tYXJzaGFsKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwpCT09MIHN0dWJfbWFuYWdlcl9pc190YWJsZV9tYXJzaGFsZWQoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgY29uc3QgSVBJRCAqaXBpZCk7CnZvaWQgc3R1Yl9tYW5hZ2VyX3JlbGVhc2VfbWFyc2hhbF9kYXRhKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMsIGNvbnN0IElQSUQgKmlwaWQpOwpIUkVTVUxUIGlwaWRfdG9fc3R1Yl9tYW5hZ2VyKGNvbnN0IElQSUQgKmlwaWQsIEFQQVJUTUVOVCAqKnN0dWJfYXB0LCBzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICoqc3R1Ym1ncl9yZXQpOwpIUkVTVUxUIGlwaWRfZ2V0X2Rpc3BhdGNoX3BhcmFtcyhjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgSVJwY1N0dWJCdWZmZXIgKipzdHViLCBJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwpIUkVTVUxUIHN0YXJ0X2FwYXJ0bWVudF9yZW1vdGVfdW5rbm93bih2b2lkKTsKCkhSRVNVTFQgbWFyc2hhbF9vYmplY3QoQVBBUlRNRU5UICphcHQsIFNURE9CSlJFRiAqc3Rkb2JqcmVmLCBSRUZJSUQgcmlpZCwgSVVua25vd24gKm9iaiwgTVNITEZMQUdTIG1zaGxmbGFncyk7CgovKiBSUEMgQmFja2VuZCAqLwoKc3RydWN0IGRpc3BhdGNoX3BhcmFtczsKCnZvaWQgICAgUlBDX1N0YXJ0UmVtb3Rpbmcoc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKSFJFU1VMVCBSUENfQ3JlYXRlQ2xpZW50Q2hhbm5lbChjb25zdCBPWElEICpveGlkLCBjb25zdCBJUElEICppcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGRlc3RfY29udGV4dCwgdm9pZCAqZGVzdF9jb250ZXh0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJwY0NoYW5uZWxCdWZmZXIgKipjaGFuKTsKSFJFU1VMVCBSUENfQ3JlYXRlU2VydmVyQ2hhbm5lbChJUnBjQ2hhbm5lbEJ1ZmZlciAqKmNoYW4pOwp2b2lkICAgIFJQQ19FeGVjdXRlQ2FsbChzdHJ1Y3QgZGlzcGF0Y2hfcGFyYW1zICpwYXJhbXMpOwpIUkVTVUxUIFJQQ19SZWdpc3RlckludGVyZmFjZShSRUZJSUQgcmlpZCk7CnZvaWQgICAgUlBDX1VucmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwp2b2lkICAgIFJQQ19TdGFydExvY2FsU2VydmVyKFJFRkNMU0lEIGNsc2lkLCBJU3RyZWFtICpzdHJlYW0pOwpIUkVTVUxUIFJQQ19HZXRMb2NhbENsYXNzT2JqZWN0KFJFRkNMU0lEIHJjbHNpZCwgUkVGSUlEIGlpZCwgTFBWT0lEICpwcHYpOwoKLyogVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplIHRoZSBSdW5uaW5nIE9iamVjdCBUYWJsZSAqLwpIUkVTVUxUIFdJTkFQSSBSdW5uaW5nT2JqZWN0VGFibGVJbXBsX0luaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIHVuaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9VbkluaXRpYWxpemUodm9pZCk7CgovKiBUaGlzIGZ1bmN0aW9uIGRlY29tcG9zZXMgYSBTdHJpbmcgcGF0aCB0byBhIFN0cmluZyBUYWJsZSBjb250YWluaW5nIGFsbCB0aGUgZWxlbWVudHMgKCJcIiBvciAic3ViRGlyZWN0b3J5IiBvciAiRGlyZWN0b3J5IiBvciAiRmlsZU5hbWUiKSBvZiB0aGUgcGF0aCAqLwppbnQgRmlsZU1vbmlrZXJJbXBsX0RlY29tcG9zZVBhdGgoTFBDT0xFU1RSIHN0ciwgTFBPTEVTVFIqKiBzdHJpbmdUYWJsZSk7CgoKLyogQXBhcnRtZW50IEZ1bmN0aW9ucyAqLwoKQVBBUlRNRU5UICphcGFydG1lbnRfZmluZGZyb21veGlkKE9YSUQgb3hpZCwgQk9PTCByZWYpOwpBUEFSVE1FTlQgKmFwYXJ0bWVudF9maW5kZnJvbXRpZChEV09SRCB0aWQpOwpEV09SRCBhcGFydG1lbnRfYWRkcmVmKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkRXT1JEIGFwYXJ0bWVudF9yZWxlYXNlKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhSRVNVTFQgYXBhcnRtZW50X2Rpc2Nvbm5lY3Rwcm94aWVzKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CnZvaWQgYXBhcnRtZW50X2Rpc2Nvbm5lY3RvYmplY3Qoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCB2b2lkICpvYmplY3QpOwpzdGF0aWMgaW5saW5lIEhSRVNVTFQgYXBhcnRtZW50X2dldG94aWQoc3RydWN0IGFwYXJ0bWVudCAqYXB0LCBPWElEICpveGlkKQp7CiAgICAqb3hpZCA9IGFwdC0+b3hpZDsKICAgIHJldHVybiBTX09LOwp9CkhSRVNVTFQgYXBhcnRtZW50X2NyZWF0ZXdpbmRvd2lmbmVlZGVkKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhXTkQgYXBhcnRtZW50X2dldHdpbmRvdyhzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwp2b2lkIGFwYXJ0bWVudF9qb2lubXRhKHZvaWQpOwoKCi8qIERDT00gbWVzc2FnZXMgdXNlZCBieSB0aGUgYXBhcnRtZW50IHdpbmRvdyAobm90IGNvbXBhdGlibGUgd2l0aCBuYXRpdmUpICovCiNkZWZpbmUgRE1fRVhFQ1VURVJQQyAgIChXTV9VU0VSICsgMCkgLyogV1BBUkFNID0gMCwgTFBBUkFNID0gKHN0cnVjdCBkaXNwYXRjaF9wYXJhbXMgKikgKi8KI2RlZmluZSBETV9IT1NUT0JKRUNUICAgKFdNX1VTRVIgKyAxKSAvKiBXUEFSQU0gPSAwLCBMUEFSQU0gPSAoc3RydWN0IGhvc3Rfb2JqZWN0X3BhcmFtcyAqKSAqLwoKLyoKICogUGVyLXRocmVhZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgVEVCIG9uIG9mZnNldCAweEY4MCwKICogc2VlIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9tc2ovMTA5OS9idWdzbGF5ZXIvYnVnc2xheWVyMTA5OS5odG0KICovCgovKiB3aWxsIGNyZWF0ZSBpZiBuZWNlc3NhcnkgKi8Kc3RhdGljIGlubGluZSBzdHJ1Y3Qgb2xldGxzICpDT01fQ3VycmVudEluZm8odm9pZCkKewogICAgaWYgKCFOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGUpCiAgICAgICAgTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihzdHJ1Y3Qgb2xldGxzKSk7CgogICAgcmV0dXJuIE50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZTsKfQoKc3RhdGljIGlubGluZSBBUEFSVE1FTlQqIENPTV9DdXJyZW50QXB0KHZvaWQpCnsgIAogICAgcmV0dXJuIENPTV9DdXJyZW50SW5mbygpLT5hcHQ7Cn0KCiNkZWZpbmUgSUNPTV9USElTX01VTFRJKGltcGwsZmllbGQsaWZhY2UpIGltcGwqIGNvbnN0IFRoaXM9KGltcGwqKSgoY2hhciopKGlmYWNlKSAtIG9mZnNldG9mKGltcGwsZmllbGQpKQoKLyogaGVscGVycyBmb3IgZGVidWdnaW5nICovCiMgZGVmaW5lIERFQlVHX1NFVF9DUklUU0VDX05BTUUoY3MsIG5hbWUpIChjcyktPkRlYnVnSW5mby0+U3BhcmVbMF0gPSAoRFdPUkRfUFRSKShfX0ZJTEVfXyAiOiAiIG5hbWUpCiMgZGVmaW5lIERFQlVHX0NMRUFSX0NSSVRTRUNfTkFNRShjcykgKGNzKS0+RGVidWdJbmZvLT5TcGFyZVswXSA9IDAKCmV4dGVybiBISU5TVEFOQ0UgT0xFMzJfaEluc3RhbmNlOyAvKiBGSVhNRTogbWFrZSBzdGF0aWMgKi8KCiNkZWZpbmUgQ0hBUlNfSU5fR1VJRCAzOSAvKiBpbmNsdWRpbmcgTlVMTCAqLwoKLyogRXhwb3J0ZWQgbm9uLWludGVyZmFjZSBEYXRhIEFkdmlzZSBIb2xkZXIgZnVuY3Rpb25zICovCkhSRVNVTFQgRGF0YUFkdmlzZUhvbGRlcl9PbkNvbm5lY3QoSURhdGFBZHZpc2VIb2xkZXIgKmlmYWNlLCBJRGF0YU9iamVjdCAqcERlbGVnYXRlKTsKdm9pZCBEYXRhQWR2aXNlSG9sZGVyX09uRGlzY29ubmVjdChJRGF0YUFkdmlzZUhvbGRlciAqaWZhY2UpOwoKI2VuZGlmIC8qIF9fV0lORV9PTEVfQ09NUE9CSl9IICovCg==