LyoKICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICogQ29weXJpZ2h0IDE5OTggSnVzdGluIEJyYWRmb3JkCiAqIENvcHlyaWdodCAxOTk5IEZyYW5jaXMgQmVhdWRldAogKiBDb3B5cmlnaHQgMTk5OSBTeWx2YWluIFN0LUdlcm1haW4KICogQ29weXJpZ2h0IDIwMDIgTWFyY3VzIE1laXNzbmVyCiAqIENvcHlyaWdodCAyMDAzIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqIENvcHlyaWdodCAyMDA0IE1pa2UgSGVhcm4sIFJvYiBTaGVhcm1hbiwgQ29kZVdlYXZlcnMgSW5jCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX09MRV9DT01QT0JKX0gKI2RlZmluZSBfX1dJTkVfT0xFX0NPTVBPQkpfSAoKLyogQWxsIHByaXZhdGUgcHJvdG90eXBlIGZ1bmN0aW9ucyB1c2VkIGJ5IE9MRSB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgaGVhZGVyIGZpbGUgKi8KCiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5lL2xpc3QuaCIKCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInd0eXBlcy5oIgojaW5jbHVkZSAiZGNvbS5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW50ZXJubC5oIgoKc3RydWN0IGFwYXJ0bWVudDsKdHlwZWRlZiBzdHJ1Y3QgYXBhcnRtZW50IEFQQVJUTUVOVDsKCmV4dGVybiBjb25zdCBDTFNJRCBDTFNJRF9QU0ZhY3RvcnlCdWZmZXI7CmV4dGVybiBjb25zdCBDTFNJRCBDTFNJRF9EZk1hcnNoYWw7CgovKiBUaHJlYWQtc2FmZXR5IEFubm90YXRpb24gTGVnZW5kOgogKgogKiBSTyAgICAtIFRoZSB2YWx1ZSBpcyByZWFkIG9ubHkuIEl0IG5ldmVyIGNoYW5nZXMgYWZ0ZXIgY3JlYXRpb24sIHNvIG5vCiAqICAgICAgICAgbG9ja2luZyBpcyByZXF1aXJlZC4KICogTE9DSyAgLSBUaGUgdmFsdWUgaXMgd3JpdHRlbiB0byBvbmx5IHVzaW5nIEludGVybG9ja2VkKiBmdW5jdGlvbnMuCiAqIENTICAgIC0gVGhlIHZhbHVlIGlzIHJlYWQgb3Igd3JpdHRlbiB0byBpbnNpZGUgYSBjcml0aWNhbCBzZWN0aW9uLgogKiAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyAiQ1MiIGlzIHRoZSBzcGVjaWZpYyBjcml0aWNhbCBzZXRpb24gdGhhdAogKiAgICAgICAgIG11c3QgYmUgdXNlZC4KICogTVVURVggLSBUaGUgdmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIHRvIHdpdGggYSBtdXRleCBoZWxkLgogKiAgICAgICAgIFRoZSBpZGVudGlmaWVyIGZvbGxvd2luZyAiTVVURVgiIGlzIHRoZSBzcGVjaWZpYyBtdXRleCB0aGF0CiAqICAgICAgICAgbXVzdCBiZSB1c2VkLgogKi8KCnR5cGVkZWYgZW51bSBpZnN0dWJfc3RhdGUKewogICAgU1RVQlNUQVRFX05PUk1BTF9NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfTk9STUFMX1VOTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX1RBQkxFX1dFQUtfTUFSU0hBTEVELAogICAgU1RVQlNUQVRFX1RBQkxFX1dFQUtfVU5NQVJTSEFMRUQsCiAgICBTVFVCU1RBVEVfVEFCTEVfU1RST05HLAp9IFNUVUJfU1RBVEU7CgovKiBhbiBpbnRlcmZhY2Ugc3R1YiAqLwpzdHJ1Y3QgaWZzdHViICAgCnsKICAgIHN0cnVjdCBsaXN0ICAgICAgIGVudHJ5OyAgICAgIC8qIGVudHJ5IGluIHN0dWJfbWFuYWdlci0+aWZzdHVicyBsaXN0IChDUyBzdHViX21hbmFnZXItPmxvY2spICovCiAgICBJUnBjU3R1YkJ1ZmZlciAgICpzdHViYnVmZmVyOyAvKiBSTyAqLwogICAgSUlEICAgICAgICAgICAgICAgaWlkOyAgICAgICAgLyogUk8gKi8KICAgIElQSUQgICAgICAgICAgICAgIGlwaWQ7ICAgICAgIC8qIFJPICovCiAgICBJVW5rbm93biAgICAgICAgICppZmFjZTsgICAgICAvKiBSTyAqLwogICAgTVNITEZMQUdTICAgICAgICAgZmxhZ3M7ICAgICAgLyogc28gd2UgY2FuIGVuZm9yY2UgcHJvY2Vzcy1sb2NhbCBtYXJzaGFsbGluZyBydWxlcyAoUk8pICovCiAgICBJUnBjQ2hhbm5lbEJ1ZmZlcipjaGFuOyAgICAgICAvKiBjaGFubmVsIHBhc3NlZCB0byBJUnBjU3R1YkJ1ZmZlcjo6SW52b2tlIChSTykgKi8KfTsKCgovKiBzdHViIG1hbmFnZXJzIGhvbGQgcmVmcyBvbiB0aGUgb2JqZWN0IGFuZCBlYWNoIGludGVyZmFjZSBzdHViICovCnN0cnVjdCBzdHViX21hbmFnZXIKewogICAgc3RydWN0IGxpc3QgICAgICAgZW50cnk7ICAgICAgLyogZW50cnkgaW4gYXBhcnRtZW50IHN0dWJtZ3IgbGlzdCAoQ1MgYXB0LT5jcykgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgIGlmc3R1YnM7ICAgIC8qIGxpc3Qgb2YgYWN0aXZlIGlmc3R1YnMgZm9yIHRoZSBvYmplY3QgKENTIGxvY2spICovCiAgICBDUklUSUNBTF9TRUNUSU9OICBsb2NrOwogICAgQVBBUlRNRU5UICAgICAgICAqYXB0OyAgICAgICAgLyogb3duaW5nIGFwdCAoUk8pICovCgogICAgVUxPTkcgICAgICAgICAgICAgZXh0cmVmczsgICAgLyogbnVtYmVyIG9mICdleHRlcm5hbCcgcmVmZXJlbmNlcyAoQ1MgbG9jaykgKi8KICAgIFVMT05HICAgICAgICAgICAgIHJlZnM7ICAgICAgIC8qIGludGVybmFsIHJlZmVyZW5jZSBjb3VudCAoQ1MgYXB0LT5jcykgKi8KICAgIE9JRCAgICAgICAgICAgICAgIG9pZDsgICAgICAgIC8qIGFwYXJ0bWVudC1zY29wZWQgdW5pcXVlIGlkZW50aWZpZXIgKFJPKSAqLwogICAgSVVua25vd24gICAgICAgICAqb2JqZWN0OyAgICAgLyogdGhlIG9iamVjdCB3ZSBhcmUgbWFuYWdpbmcgdGhlIHN0dWIgZm9yIChSTykgKi8KICAgIFVMT05HICAgICAgICAgICAgIG5leHRfaXBpZDsgIC8qIGN1cnJlbnRseSB1bnVzZWQgKExPQ0spICovCgogICAgLyogV2UgbmVlZCB0byBrZWVwIGEgY291bnQgb2YgdGhlIG91dHN0YW5kaW5nIG1hcnNoYWxzLCBzbyB3ZSBjYW4gZW5mb3JjZSB0aGUKICAgICAqIG1hcnNoYWxsaW5nIHJ1bGVzIChpZSwgeW91IGNhbiBvbmx5IHVubWFyc2hhbCBub3JtYWwgbWFyc2hhbHMgb25jZSkuIE5vdGUKICAgICAqIHRoYXQgdGhlc2UgY291bnRzIGRvIE5PVCBpbmNsdWRlIHVubWFyc2hhbGxlZCBpbnRlcmZhY2VzLCBvbmNlIGEgc3RyZWFtIGlzCiAgICAgKiB1bm1hcnNoYWxsZWQgYW5kIGEgcHJveHkgc2V0IHVwLCB0aGlzIGNvdW50IGlzIGRlY3JlbWVudGVkLgogICAgICovCgogICAgVUxPTkcgICAgICAgICAgICAgbm9ybV9yZWZzOyAgLyogcmVmY291bnQgb2Ygbm9ybWFsIG1hcnNoYWxzIChDUyBsb2NrKSAqLwp9OwoKLyogaW1wb3J0ZWQgaW50ZXJmYWNlIHByb3h5ICovCnN0cnVjdCBpZnByb3h5CnsKICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgLyogZW50cnkgaW4gcHJveHlfbWFuYWdlciBsaXN0IChDUyBwYXJlbnQtPmNzKSAqLwogIHN0cnVjdCBwcm94eV9tYW5hZ2VyICpwYXJlbnQ7IC8qIG93bmluZyBwcm94eV9tYW5hZ2VyIChSTykgKi8KICBMUFZPSUQgaWZhY2U7ICAgICAgICAgICAgLyogaW50ZXJmYWNlIHBvaW50ZXIgKFJPKSAqLwogIFNURE9CSlJFRiBzdGRvYmpyZWY7ICAgICAvKiBtYXJzaGFsIGRhdGEgdGhhdCByZXByZXNlbnRzIHRoaXMgb2JqZWN0IChSTykgKi8KICBJSUQgaWlkOyAgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIElEIChSTykgKi8KICBMUFJQQ1BST1hZQlVGRkVSIHByb3h5OyAgLyogaW50ZXJmYWNlIHByb3h5IChSTykgKi8KICBEV09SRCByZWZzOyAgICAgICAgICAgICAgLyogaW1wb3J0ZWQgKHB1YmxpYykgcmVmZXJlbmNlcyAoTVVURVggcGFyZW50LT5yZW1vdGluZ19tdXRleCkgKi8KICBJUnBjQ2hhbm5lbEJ1ZmZlciAqY2hhbjsgLyogY2hhbm5lbCB0byBvYmplY3QgKENTIHBhcmVudC0+Y3MpICovCn07CgovKiBpbXBvcnRlZCBvYmplY3QgLyBwcm94eSBtYW5hZ2VyICovCnN0cnVjdCBwcm94eV9tYW5hZ2VyCnsKICBjb25zdCBJTXVsdGlRSVZ0YmwgKmxwVnRibDsKICBjb25zdCBJTWFyc2hhbFZ0YmwgKmxwVnRibE1hcnNoYWw7CiAgc3RydWN0IGFwYXJ0bWVudCAqcGFyZW50OyAvKiBvd25pbmcgYXBhcnRtZW50IChSTykgKi8KICBzdHJ1Y3QgbGlzdCBlbnRyeTsgICAgICAgIC8qIGVudHJ5IGluIGFwYXJ0bWVudCAoQ1MgcGFyZW50LT5jcykgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBleHBvcnRlZCBJRCAoUk8pICovCiAgT0lEIG9pZDsgICAgICAgICAgICAgICAgICAvKiBvYmplY3QgSUQgKFJPKSAqLwogIHN0cnVjdCBsaXN0IGludGVyZmFjZXM7ICAgLyogaW1wb3J0ZWQgaW50ZXJmYWNlcyAoQ1MgY3MpICovCiAgTE9ORyByZWZzOyAgICAgICAgICAgICAgICAvKiBwcm94eSByZWZlcmVuY2UgY291bnQgKExPQ0spICovCiAgQ1JJVElDQUxfU0VDVElPTiBjczsgICAgICAvKiB0aHJlYWQgc2FmZXR5IGZvciB0aGlzIG9iamVjdCBhbmQgY2hpbGRyZW4gKi8KICBVTE9ORyBzb3JmbGFnczsgICAgICAgICAgIC8qIFNURE9CSlJFRiBmbGFncyAoUk8pICovCiAgSVJlbVVua25vd24gKnJlbXVuazsgICAgICAvKiBwcm94eSB0byBJUmVtVW5rbm93biB1c2VkIGZvciBsaWZlY3ljbGUgbWFuYWdlbWVudCAoQ1MgY3MpICovCiAgSEFORExFIHJlbW90aW5nX211dGV4OyAgICAvKiBtdXRleCB1c2VkIGZvciBzeW5jaHJvbml6aW5nIGFjY2VzcyB0byBJUmVtVW5rbm93biAqLwogIE1TSENUWCBkZXN0X2NvbnRleHQ7ICAgICAgLyogY29udGV4dCB1c2VkIGZvciBhY3RpdmF0aW5nIG9wdGltaXNhdGlvbnMgKExPQ0spICovCiAgdm9pZCAqZGVzdF9jb250ZXh0X2RhdGE7ICAvKiByZXNlcnZlZCBjb250ZXh0IHZhbHVlIChMT0NLKSAqLwp9OwoKLyogdGhpcyBuZWVkcyB0byBiZWNvbWUgYSBDT00gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyBJUmVtVW5rbm93biAqLwpzdHJ1Y3QgYXBhcnRtZW50CnsKICBzdHJ1Y3QgbGlzdCBlbnRyeTsKCiAgTE9ORyAgcmVmczsgICAgICAgICAgICAgIC8qIHJlZmNvdW50IG9mIHRoZSBhcGFydG1lbnQgKExPQ0spICovCiAgQk9PTCBtdWx0aV90aHJlYWRlZDsgICAgIC8qIG11bHRpLXRocmVhZGVkIG9yIHNpbmdsZS10aHJlYWRlZCBhcGFydG1lbnQ/IChSTykgKi8KICBEV09SRCB0aWQ7ICAgICAgICAgICAgICAgLyogdGhyZWFkIGlkIChSTykgKi8KICBPWElEIG94aWQ7ICAgICAgICAgICAgICAgLyogb2JqZWN0IGV4cG9ydGVyIElEIChSTykgKi8KICBMT05HIGlwaWRjOyAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIHBvaW50ZXIgSUQgY291bnRlciwgc3RhcnRzIGF0IDEgKExPQ0spICovCiAgSFdORCB3aW47ICAgICAgICAgICAgICAgIC8qIG1lc3NhZ2Ugd2luZG93IChMT0NLKSAqLwogIENSSVRJQ0FMX1NFQ1RJT04gY3M7ICAgICAvKiB0aHJlYWQgc2FmZXR5ICovCiAgTFBNRVNTQUdFRklMVEVSIGZpbHRlcjsgIC8qIG1lc3NhZ2UgZmlsdGVyIChDUyBjcykgKi8KICBzdHJ1Y3QgbGlzdCBwcm94aWVzOyAgICAgLyogaW1wb3J0ZWQgb2JqZWN0cyAoQ1MgY3MpICovCiAgc3RydWN0IGxpc3Qgc3R1Ym1ncnM7ICAgIC8qIHN0dWIgbWFuYWdlcnMgZm9yIGV4cG9ydGVkIG9iamVjdHMgKENTIGNzKSAqLwogIEJPT0wgcmVtdW5rX2V4cG9ydGVkOyAgICAvKiBoYXMgdGhlIElSZW1Vbmtub3duIGludGVyZmFjZSBmb3IgdGhpcyBhcGFydG1lbnQgYmVlbiBjcmVhdGVkIHlldD8gKENTIGNzKSAqLwogIExPTkcgcmVtb3Rpbmdfc3RhcnRlZDsgICAvKiBoYXMgdGhlIFJQQyBzeXN0ZW0gYmVlbiBzdGFydGVkIGZvciB0aGlzIGFwYXJ0bWVudD8gKExPQ0spICovCgogIC8qIEZJWE1FOiBPSUQncyBzaG91bGQgYmUgZ2l2ZW4gb3V0IGJ5IFJQQ1NTICovCiAgT0lEIG9pZGM7ICAgICAgICAgICAgICAgIC8qIG9iamVjdCBJRCBjb3VudGVyLCBzdGFydHMgYXQgMSwgemVybyBpcyBpbnZhbGlkIE9JRCAoQ1MgY3MpICovCn07CgovKiB0aGlzIGlzIHdoYXQgaXMgc3RvcmVkIGluIFRFQi0+UmVzZXJ2ZWRGb3JPbGUgKi8Kc3RydWN0IG9sZXRscwp7CiAgICBzdHJ1Y3QgYXBhcnRtZW50ICphcHQ7CiAgICBJRXJyb3JJbmZvICAgICAgICplcnJvcmluZm87ICAgLyogc2VlIGVycm9yaW5mby5jICovCiAgICBJVW5rbm93biAgICAgICAgICpzdGF0ZTsgICAgICAgLyogc2VlIENvU2V0U3RhdGUgKi8KICAgIERXT1JEICAgICAgICAgICAgaW5pdHM7ICAgICAgICAvKiBudW1iZXIgb2YgdGltZXMgQ29Jbml0aWFsaXplRXggY2FsbGVkICovCn07CgoKLyogR2xvYmFsIEludGVyZmFjZSBUYWJsZSBGdW5jdGlvbnMgKi8KCmV4dGVybiB2b2lkKiBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9Db25zdHJ1Y3Qodm9pZCk7CmV4dGVybiB2b2lkICBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9EZXN0cm95KHZvaWQqIHNlbGYpOwpleHRlcm4gSFJFU1VMVCBTdGRHbG9iYWxJbnRlcmZhY2VUYWJsZV9HZXRGYWN0b3J5KExQVk9JRCAqcHB2KTsKZXh0ZXJuIHZvaWQqIFN0ZEdsb2JhbEludGVyZmFjZVRhYmxlSW5zdGFuY2U7CgovKiBGSVhNRTogdGhlc2Ugc2hvdWxkbid0IGJlIG5lZWRlZCwgZXhjZXB0IGZvciAxNi1iaXQgZnVuY3Rpb25zICovCmV4dGVybiBIUkVTVUxUIFdJTkVfU3RyaW5nRnJvbUNMU0lEKGNvbnN0IENMU0lEICppZCxMUFNUUiBpZHN0cik7CgpIUkVTVUxUIENPTV9PcGVuS2V5Rm9yQ0xTSUQoUkVGQ0xTSUQgY2xzaWQsIExQQ1dTVFIga2V5bmFtZSwgUkVHU0FNIGFjY2VzcywgSEtFWSAqa2V5KTsKSFJFU1VMVCBNQVJTSEFMX0dldFN0YW5kYXJkTWFyc2hhbENGKExQVk9JRCAqcHB2KTsKCi8qIFN0dWIgTWFuYWdlciAqLwoKVUxPTkcgc3R1Yl9tYW5hZ2VyX2ludF9hZGRyZWYoc3RydWN0IHN0dWJfbWFuYWdlciAqVGhpcyk7ClVMT05HIHN0dWJfbWFuYWdlcl9pbnRfcmVsZWFzZShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpUaGlzKTsKc3RydWN0IHN0dWJfbWFuYWdlciAqbmV3X3N0dWJfbWFuYWdlcihBUEFSVE1FTlQgKmFwdCwgSVVua25vd24gKm9iamVjdCk7ClVMT05HIHN0dWJfbWFuYWdlcl9leHRfYWRkcmVmKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIFVMT05HIHJlZnMpOwpVTE9ORyBzdHViX21hbmFnZXJfZXh0X3JlbGVhc2Uoc3RydWN0IHN0dWJfbWFuYWdlciAqbSwgVUxPTkcgcmVmcyk7CnN0cnVjdCBpZnN0dWIgKnN0dWJfbWFuYWdlcl9uZXdfaWZzdHViKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIElScGNTdHViQnVmZmVyICpzYiwgSVVua25vd24gKmlwdHIsIFJFRklJRCBpaWQsIE1TSExGTEFHUyBmbGFncyk7CnN0cnVjdCBpZnN0dWIgKnN0dWJfbWFuYWdlcl9maW5kX2lmc3R1YihzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBSRUZJSUQgaWlkLCBNU0hMRkxBR1MgZmxhZ3MpOwpzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICpnZXRfc3R1Yl9tYW5hZ2VyKEFQQVJUTUVOVCAqYXB0LCBPSUQgb2lkKTsKc3RydWN0IHN0dWJfbWFuYWdlciAqZ2V0X3N0dWJfbWFuYWdlcl9mcm9tX29iamVjdChBUEFSVE1FTlQgKmFwdCwgdm9pZCAqb2JqZWN0KTsKQk9PTCBzdHViX21hbmFnZXJfbm90aWZ5X3VubWFyc2hhbChzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBjb25zdCBJUElEICppcGlkKTsKQk9PTCBzdHViX21hbmFnZXJfaXNfdGFibGVfbWFyc2hhbGVkKHN0cnVjdCBzdHViX21hbmFnZXIgKm0sIGNvbnN0IElQSUQgKmlwaWQpOwp2b2lkIHN0dWJfbWFuYWdlcl9yZWxlYXNlX21hcnNoYWxfZGF0YShzdHJ1Y3Qgc3R1Yl9tYW5hZ2VyICptLCBVTE9ORyByZWZzLCBjb25zdCBJUElEICppcGlkKTsKSFJFU1VMVCBpcGlkX3RvX3N0dWJfbWFuYWdlcihjb25zdCBJUElEICppcGlkLCBBUEFSVE1FTlQgKipzdHViX2FwdCwgc3RydWN0IHN0dWJfbWFuYWdlciAqKnN0dWJtZ3JfcmV0KTsKSFJFU1VMVCBpcGlkX2dldF9kaXNwYXRjaF9wYXJhbXMoY29uc3QgSVBJRCAqaXBpZCwgQVBBUlRNRU5UICoqc3R1Yl9hcHQsIElScGNTdHViQnVmZmVyICoqc3R1YiwgSVJwY0NoYW5uZWxCdWZmZXIgKipjaGFuKTsKSFJFU1VMVCBzdGFydF9hcGFydG1lbnRfcmVtb3RlX3Vua25vd24odm9pZCk7CgpIUkVTVUxUIG1hcnNoYWxfb2JqZWN0KEFQQVJUTUVOVCAqYXB0LCBTVERPQkpSRUYgKnN0ZG9ianJlZiwgUkVGSUlEIHJpaWQsIElVbmtub3duICpvYmosIE1TSExGTEFHUyBtc2hsZmxhZ3MpOwoKLyogUlBDIEJhY2tlbmQgKi8KCnN0cnVjdCBkaXNwYXRjaF9wYXJhbXM7Cgp2b2lkICAgIFJQQ19TdGFydFJlbW90aW5nKHN0cnVjdCBhcGFydG1lbnQgKmFwdCk7CkhSRVNVTFQgUlBDX0NyZWF0ZUNsaWVudENoYW5uZWwoY29uc3QgT1hJRCAqb3hpZCwgY29uc3QgSVBJRCAqaXBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBkZXN0X2NvbnRleHQsIHZvaWQgKmRlc3RfY29udGV4dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElScGNDaGFubmVsQnVmZmVyICoqY2hhbik7CkhSRVNVTFQgUlBDX0NyZWF0ZVNlcnZlckNoYW5uZWwoSVJwY0NoYW5uZWxCdWZmZXIgKipjaGFuKTsKdm9pZCAgICBSUENfRXhlY3V0ZUNhbGwoc3RydWN0IGRpc3BhdGNoX3BhcmFtcyAqcGFyYW1zKTsKSFJFU1VMVCBSUENfUmVnaXN0ZXJJbnRlcmZhY2UoUkVGSUlEIHJpaWQpOwp2b2lkICAgIFJQQ19VbnJlZ2lzdGVySW50ZXJmYWNlKFJFRklJRCByaWlkKTsKdm9pZCAgICBSUENfU3RhcnRMb2NhbFNlcnZlcihSRUZDTFNJRCBjbHNpZCwgSVN0cmVhbSAqc3RyZWFtKTsKSFJFU1VMVCBSUENfR2V0TG9jYWxDbGFzc09iamVjdChSRUZDTFNJRCByY2xzaWQsIFJFRklJRCBpaWQsIExQVk9JRCAqcHB2KTsKCi8qIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZSB0aGUgUnVubmluZyBPYmplY3QgVGFibGUgKi8KSFJFU1VMVCBXSU5BUEkgUnVubmluZ09iamVjdFRhYmxlSW1wbF9Jbml0aWFsaXplKHZvaWQpOwoKLyogVGhpcyBmdW5jdGlvbiB1bmluaXRpYWxpemUgdGhlIFJ1bm5pbmcgT2JqZWN0IFRhYmxlICovCkhSRVNVTFQgV0lOQVBJIFJ1bm5pbmdPYmplY3RUYWJsZUltcGxfVW5Jbml0aWFsaXplKHZvaWQpOwoKLyogVGhpcyBmdW5jdGlvbiBkZWNvbXBvc2VzIGEgU3RyaW5nIHBhdGggdG8gYSBTdHJpbmcgVGFibGUgY29udGFpbmluZyBhbGwgdGhlIGVsZW1lbnRzICgiXCIgb3IgInN1YkRpcmVjdG9yeSIgb3IgIkRpcmVjdG9yeSIgb3IgIkZpbGVOYW1lIikgb2YgdGhlIHBhdGggKi8KaW50IEZpbGVNb25pa2VySW1wbF9EZWNvbXBvc2VQYXRoKExQQ09MRVNUUiBzdHIsIExQT0xFU1RSKiogc3RyaW5nVGFibGUpOwoKCi8qIEFwYXJ0bWVudCBGdW5jdGlvbnMgKi8KCkFQQVJUTUVOVCAqYXBhcnRtZW50X2ZpbmRmcm9tb3hpZChPWElEIG94aWQsIEJPT0wgcmVmKTsKQVBBUlRNRU5UICphcGFydG1lbnRfZmluZGZyb210aWQoRFdPUkQgdGlkKTsKRFdPUkQgYXBhcnRtZW50X2FkZHJlZihzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwpEV09SRCBhcGFydG1lbnRfcmVsZWFzZShzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwpIUkVTVUxUIGFwYXJ0bWVudF9kaXNjb25uZWN0cHJveGllcyhzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwp2b2lkIGFwYXJ0bWVudF9kaXNjb25uZWN0b2JqZWN0KHN0cnVjdCBhcGFydG1lbnQgKmFwdCwgdm9pZCAqb2JqZWN0KTsKc3RhdGljIGlubGluZSBIUkVTVUxUIGFwYXJ0bWVudF9nZXRveGlkKHN0cnVjdCBhcGFydG1lbnQgKmFwdCwgT1hJRCAqb3hpZCkKewogICAgKm94aWQgPSBhcHQtPm94aWQ7CiAgICByZXR1cm4gU19PSzsKfQpIUkVTVUxUIGFwYXJ0bWVudF9jcmVhdGV3aW5kb3dpZm5lZWRlZChzdHJ1Y3QgYXBhcnRtZW50ICphcHQpOwpIV05EIGFwYXJ0bWVudF9nZXR3aW5kb3coc3RydWN0IGFwYXJ0bWVudCAqYXB0KTsKdm9pZCBhcGFydG1lbnRfam9pbm10YSh2b2lkKTsKCgovKiBEQ09NIG1lc3NhZ2VzIHVzZWQgYnkgdGhlIGFwYXJ0bWVudCB3aW5kb3cgKG5vdCBjb21wYXRpYmxlIHdpdGggbmF0aXZlKSAqLwojZGVmaW5lIERNX0VYRUNVVEVSUEMgICAoV01fVVNFUiArIDApIC8qIFdQQVJBTSA9IDAsIExQQVJBTSA9IChzdHJ1Y3QgZGlzcGF0Y2hfcGFyYW1zICopICovCgovKgogKiBQZXItdGhyZWFkIHZhbHVlcyBhcmUgc3RvcmVkIGluIHRoZSBURUIgb24gb2Zmc2V0IDB4RjgwLAogKiBzZWUgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL21zai8xMDk5L2J1Z3NsYXllci9idWdzbGF5ZXIxMDk5Lmh0bQogKi8KCi8qIHdpbGwgY3JlYXRlIGlmIG5lY2Vzc2FyeSAqLwpzdGF0aWMgaW5saW5lIHN0cnVjdCBvbGV0bHMgKkNPTV9DdXJyZW50SW5mbyh2b2lkKQp7CiAgICBpZiAoIU50Q3VycmVudFRlYigpLT5SZXNlcnZlZEZvck9sZSkKICAgICAgICBOdEN1cnJlbnRUZWIoKS0+UmVzZXJ2ZWRGb3JPbGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKHN0cnVjdCBvbGV0bHMpKTsKCiAgICByZXR1cm4gTnRDdXJyZW50VGViKCktPlJlc2VydmVkRm9yT2xlOwp9CgpzdGF0aWMgaW5saW5lIEFQQVJUTUVOVCogQ09NX0N1cnJlbnRBcHQodm9pZCkKeyAgCiAgICByZXR1cm4gQ09NX0N1cnJlbnRJbmZvKCktPmFwdDsKfQoKI2RlZmluZSBJQ09NX1RISVNfTVVMVEkoaW1wbCxmaWVsZCxpZmFjZSkgaW1wbCogY29uc3QgVGhpcz0oaW1wbCopKChjaGFyKikoaWZhY2UpIC0gb2Zmc2V0b2YoaW1wbCxmaWVsZCkpCgovKiBoZWxwZXJzIGZvciBkZWJ1Z2dpbmcgKi8KIyBkZWZpbmUgREVCVUdfU0VUX0NSSVRTRUNfTkFNRShjcywgbmFtZSkgKGNzKS0+RGVidWdJbmZvLT5TcGFyZVswXSA9IChEV09SRF9QVFIpKF9fRklMRV9fICI6ICIgbmFtZSkKIyBkZWZpbmUgREVCVUdfQ0xFQVJfQ1JJVFNFQ19OQU1FKGNzKSAoY3MpLT5EZWJ1Z0luZm8tPlNwYXJlWzBdID0gMAoKZXh0ZXJuIEhJTlNUQU5DRSBPTEUzMl9oSW5zdGFuY2U7IC8qIEZJWE1FOiBtYWtlIHN0YXRpYyAqLwoKI2RlZmluZSBDSEFSU19JTl9HVUlEIDM5IC8qIGluY2x1ZGluZyBOVUxMICovCgovKiBFeHBvcnRlZCBub24taW50ZXJmYWNlIERhdGEgQWR2aXNlIEhvbGRlciBmdW5jdGlvbnMgKi8KSFJFU1VMVCBEYXRhQWR2aXNlSG9sZGVyX09uQ29ubmVjdChJRGF0YUFkdmlzZUhvbGRlciAqaWZhY2UsIElEYXRhT2JqZWN0ICpwRGVsZWdhdGUpOwp2b2lkIERhdGFBZHZpc2VIb2xkZXJfT25EaXNjb25uZWN0KElEYXRhQWR2aXNlSG9sZGVyICppZmFjZSk7CgojZW5kaWYgLyogX19XSU5FX09MRV9DT01QT0JKX0ggKi8K