LyogbW9kaWZpZWQgYnkgTWFydGluIEhlZGVuZmFsayA8bWhlQHN0YWNrZW4ua3RoLnNlPiBmb3IgdXNlIGluIEN1cmwKICogbGFzdCBtb2RpZmllZCAyMDAwLTA5LTE4CiAqLwoKLyoKICogQ29weXJpZ2h0IChjKSAxOTk4LCAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgogKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4gCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIAogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgCiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAKICogYXJlIG1ldDogCiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAogKgogKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCAKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSAKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4gCiAqCiAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEluc3RpdHV0ZSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSAKICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIAogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBJTlNUSVRVVEUgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgCiAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIAogKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBJTlNUSVRVVEUgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSAKICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIAogKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgCiAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIAogKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIAogKiBTVUNIIERBTUFHRS4gCiAqLwoKLyogJElkJCAqLwoKI2lmbmRlZiBfX3NlY3VyaXR5X2hfXwojZGVmaW5lIF9fc2VjdXJpdHlfaF9fCgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlICJ1cmxkYXRhLmgiICAvKiBmb3Igc3RydWN0IGNvbm5lY3RkYXRhICogKi8KCnN0cnVjdCBzZWNfY2xpZW50X21lY2ggewogICAgY2hhciAqbmFtZTsKICAgIHNpemVfdCBzaXplOwogICAgaW50ICgqaW5pdCkodm9pZCAqKTsKICAgIGludCAoKmF1dGgpKHZvaWQgKiwgc3RydWN0IGNvbm5lY3RkYXRhICopOwogICAgdm9pZCAoKmVuZCkodm9pZCAqKTsKICAgIGludCAoKmNoZWNrX3Byb3QpKHZvaWQgKiwgaW50KTsKICAgIGludCAoKm92ZXJoZWFkKSh2b2lkICosIGludCwgaW50KTsKICAgIGludCAoKmVuY29kZSkodm9pZCAqLCB2b2lkKiwgaW50LCBpbnQsIHZvaWQqKiwgc3RydWN0IGNvbm5lY3RkYXRhICopOwogICAgaW50ICgqZGVjb2RlKSh2b2lkICosIHZvaWQqLCBpbnQsIGludCwgc3RydWN0IGNvbm5lY3RkYXRhICopOwp9OwoKc3RydWN0IHNlY19zZXJ2ZXJfbWVjaCB7CiAgICBjaGFyICpuYW1lOwogICAgc2l6ZV90IHNpemU7CiAgICBpbnQgKCppbml0KSh2b2lkICopOwogICAgdm9pZCAoKmVuZCkodm9pZCAqKTsKICAgIGludCAoKmNoZWNrX3Byb3QpKHZvaWQgKiwgaW50KTsKICAgIGludCAoKm92ZXJoZWFkKSh2b2lkICosIGludCwgaW50KTsKICAgIGludCAoKmVuY29kZSkodm9pZCAqLCB2b2lkKiwgaW50LCBpbnQsIHZvaWQqKik7CiAgICBpbnQgKCpkZWNvZGUpKHZvaWQgKiwgdm9pZCosIGludCwgaW50KTsKCiAgICBpbnQgKCphdXRoKSh2b2lkICopOwogICAgaW50ICgqYWRhdCkodm9pZCAqLCB2b2lkKiwgc2l6ZV90KTsKICAgIHNpemVfdCAoKnBic3opKHZvaWQgKiwgc2l6ZV90KTsKICAgIGludCAoKmNjYykodm9pZCopOwogICAgaW50ICgqdXNlcm9rKSh2b2lkKiwgY2hhciopOwp9OwoKI2RlZmluZSBBVVRIX09LCQkwCiNkZWZpbmUgQVVUSF9DT05USU5VRQkxCiNkZWZpbmUgQVVUSF9FUlJPUgkyCgojaWZkZWYgRlRQX1NFUlZFUgpleHRlcm4gc3RydWN0IHNlY19zZXJ2ZXJfbWVjaCBrcmI0X3NlcnZlcl9tZWNoLCBnc3Nfc2VydmVyX21lY2g7CiNlbHNlCmV4dGVybiBzdHJ1Y3Qgc2VjX2NsaWVudF9tZWNoIGtyYjRfY2xpZW50X21lY2gsIGdzc19jbGllbnRfbWVjaDsKI2VuZGlmCgpleHRlcm4gaW50IHNlY19jb21wbGV0ZTsKCiNpZmRlZiBGVFBfU0VSVkVSCmV4dGVybiBjaGFyICpmdHBfY29tbWFuZDsKdm9pZCBuZXdfZnRwX2NvbW1hbmQoY2hhciopOwp2b2lkIGRlbGV0ZV9mdHBfY29tbWFuZCh2b2lkKTsKI2VuZGlmCgovKiAtLS0tICovCgoKaW50IHNlY19mZmx1c2ggKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqKTsKaW50IHNlY19mZmx1c2hfZmQoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQgZmQpOwppbnQgc2VjX2ZwcmludGYgKHN0cnVjdCBjb25uZWN0ZGF0YSAqLCBGSUxFICosIGNvbnN0IGNoYXIgKiwgLi4uKTsKaW50IHNlY19nZXRjIChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIEZJTEUgKik7CmludCBzZWNfcHV0YyAoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQsIEZJTEUgKik7CmludCBzZWNfcmVhZCAoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBpbnQsIHZvaWQgKiwgaW50KTsKaW50IHNlY19yZWFkX21zZyAoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBjaGFyICosIGludCk7CgppbnQgc2VjX3ZmcHJpbnRmKHN0cnVjdCBjb25uZWN0ZGF0YSAqLCBGSUxFICosIGNvbnN0IGNoYXIgKiwgdmFfbGlzdCk7CmludCBzZWNfZnByaW50ZjIoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uLCBGSUxFICpmLCBjb25zdCBjaGFyICpmbXQsIC4uLik7CmludCBzZWNfdmZwcmludGYyKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgRklMRSAqLCBjb25zdCBjaGFyICosIHZhX2xpc3QpOwppbnQgc2VjX3dyaXRlIChzdHJ1Y3QgY29ubmVjdGRhdGEgKmNvbm4sIGludCwgY2hhciAqLCBpbnQpOwoKI2lmZGVmIEZUUF9TRVJWRVIKdm9pZCBhZGF0IChjaGFyICopOwp2b2lkIGF1dGggKGNoYXIgKik7CnZvaWQgY2NjICh2b2lkKTsKdm9pZCBtZWMgKGNoYXIgKiwgZW51bSBwcm90ZWN0aW9uX2xldmVsKTsKdm9pZCBwYnN6IChpbnQpOwp2b2lkIHByb3QgKGNoYXIgKik7CnZvaWQgZGVsZXRlX2Z0cF9jb21tYW5kICh2b2lkKTsKdm9pZCBuZXdfZnRwX2NvbW1hbmQgKGNoYXIgKik7CmludCBzZWNfdXNlcm9rIChjaGFyICopOwppbnQgc2VjdXJlX2NvbW1hbmQgKHZvaWQpOwplbnVtIHByb3RlY3Rpb25fbGV2ZWwgZ2V0X2NvbW1hbmRfcHJvdCh2b2lkKTsKI2Vsc2UKdm9pZCBzZWNfZW5kIChzdHJ1Y3QgY29ubmVjdGRhdGEgKik7CmludCBzZWNfbG9naW4gKHN0cnVjdCBjb25uZWN0ZGF0YSAqKTsKdm9pZCBzZWNfcHJvdCAoaW50LCBjaGFyICoqKTsKaW50IHNlY19yZXF1ZXN0X3Byb3QgKHN0cnVjdCBjb25uZWN0ZGF0YSAqY29ubiwgY2hhciAqKTsKdm9pZCBzZWNfc2V0X3Byb3RlY3Rpb25fbGV2ZWwoc3RydWN0IGNvbm5lY3RkYXRhICpjb25uKTsKdm9pZCBzZWNfc3RhdHVzICh2b2lkKTsKCmVudW0gcHJvdGVjdGlvbl9sZXZlbCBzZXRfY29tbWFuZF9wcm90KHN0cnVjdCBjb25uZWN0ZGF0YSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIHByb3RlY3Rpb25fbGV2ZWwpOwoKI2VuZGlmCgojZW5kaWYgLyogX19zZWN1cml0eV9oX18gKi8gIAo=