LyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCiNpZm5kZWYgQUdFTlRfSEFORExFUl9ICiNkZWZpbmUgQUdFTlRfSEFORExFUl9ICgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICAgICAgICAgICJDIiB7CiNlbmRpZgoKLyoqIEBmaWxlIGFnZW50X2hhbmRsZXIuaAogKgogKiAgQGFkZHRvZ3JvdXAgaGFuZGxlcgogKgogKiBAewogKi8KCnN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3M7CgovKgogKiBwZXIgbWliIGhhbmRsZXIgZmxhZ3MuCiAqIE5PVEU6IExvd2VyIGJpdHMgYXJlIHJlc2VydmVkIGZvciB0aGUgYWdlbnQgaGFuZGxlcidzIHVzZS4KICogICAgICAgVGhlIGhpZ2ggNCBiaXRzICgzMS0yOCkgYXJlIHJlc2VydmVkIGZvciB1c2UgYnkgdGhlIGhhbmRsZXIuCiAqLwojZGVmaW5lIE1JQl9IQU5ETEVSX0FVVE9fTkVYVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxCiNkZWZpbmUgTUlCX0hBTkRMRVJfQVVUT19ORVhUX09WRVJSSURFX09OQ0UgICAgIDB4MDAwMDAwMDIKI2RlZmluZSBNSUJfSEFORExFUl9JTlNUQU5DRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNAoKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT000ICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMDAwMAojZGVmaW5lIE1JQl9IQU5ETEVSX0NVU1RPTTMgICAgICAgICAgICAgICAgICAgICAweDIwMDAwMDAwCiNkZWZpbmUgTUlCX0hBTkRMRVJfQ1VTVE9NMiAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDAKI2RlZmluZSBNSUJfSEFORExFUl9DVVNUT00xICAgICAgICAgICAgICAgICAgICAgMHg4MDAwMDAwMAoKCi8qKiBAdHlwZWRlZiBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zIG5ldHNubXBfbWliX2hhbmRsZXIKICogVHlwZWRlZnMgdGhlIG5ldHNubXBfbWliX2hhbmRsZXJfcyBzdHJ1Y3QgaW50byAgbmV0c25tcF9taWJfaGFuZGxlciAqLwoKLyoqIEBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zCiAqICB0aGUgbWliIGhhbmRsZXIgc3RydWN0dXJlIHRvIGJlIHJlZ2lzdGVyZWQKICovCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyB7CiAgICAgICAgY2hhciAgICAgICAgICAgKmhhbmRsZXJfbmFtZTsKCS8qKiBmb3IgaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIHZvaWQgICAgICAgICAgICpteXZvaWQ7IAogICAgICAgIC8qKiBmb3IgYWdlbnRfaGFuZGxlcidzIGludGVybmFsIHVzZSAqLwogICAgICAgIGludCAgICAgICAgICAgICBmbGFnczsKCiAgICAgICAgLyoqIGlmIHlvdSBhZGQgbW9yZSBtZW1iZXJzLCB5b3UgcHJvYmFibHkgYWxzbyB3YW50IHRvIHVwZGF0ZSAqLwogICAgICAgIC8qKiBfY2xvbmVfaGFuZGxlciBpbiBhZ2VudF9oYW5kbGVyLmMuICovCgkKICAgICAgICBpbnQgICAgICAgICAgICAgKCphY2Nlc3NfbWV0aG9kKSAoc3RydWN0IG5ldHNubXBfbWliX2hhbmRsZXJfcyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mb19zICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBuZXRzbm1wX3JlcXVlc3RfaW5mb19zICopOwogICAgICAgIHZvaWQgKCpkYXRhX2ZyZWUpKHZvaWQgKm15dm9pZCk7IC8qKjwgZGF0YSBmcmVlIGhvb2sgZm9yIG15dm9pZCAqLwoKICAgICAgICBzdHJ1Y3QgbmV0c25tcF9taWJfaGFuZGxlcl9zICpuZXh0OwogICAgICAgIHN0cnVjdCBuZXRzbm1wX21pYl9oYW5kbGVyX3MgKnByZXY7Cn0gbmV0c25tcF9taWJfaGFuZGxlcjsKCi8qCiAqIHBlciByZWdpc3RyYXRpb24gZmxhZ3MKICovCiNkZWZpbmUgSEFORExFUl9DQU5fR0VUQU5ER0VUTkVYVCAgICAgMHgwMSAgICAgICAvKiBtdXN0IGJlIGFibGUgdG8gZG8gYm90aCAqLwojZGVmaW5lIEhBTkRMRVJfQ0FOX1NFVCAgICAgICAgICAgICAgIDB4MDIgICAgICAgICAgIC8qIGltcGxpZXMgY3JlYXRlLCB0b28gKi8KI2RlZmluZSBIQU5ETEVSX0NBTl9HRVRCVUxLICAgICAgICAgICAweDA0CiNkZWZpbmUgSEFORExFUl9DQU5fTk9UX0NSRUFURSAgICAgICAgMHgwOCAgICAgICAgIC8qIGF1dG8gc2V0IGlmICEgQ0FOX1NFVCAqLwojZGVmaW5lIEhBTkRMRVJfQ0FOX0JBQllfU1RFUCAgICAgICAgIDB4MTAKI2RlZmluZSBIQU5ETEVSX0NBTl9TVEFTSCAgICAgICAgICAgICAweDIwCgoKI2RlZmluZSBIQU5ETEVSX0NBTl9ST05MWSAgIChIQU5ETEVSX0NBTl9HRVRBTkRHRVRORVhUKQojZGVmaW5lIEhBTkRMRVJfQ0FOX1JXUklURSAgKEhBTkRMRVJfQ0FOX0dFVEFOREdFVE5FWFQgfCBIQU5ETEVSX0NBTl9TRVQpCiNkZWZpbmUgSEFORExFUl9DQU5fU0VUX09OTFkgKEhBTkRMRVJfQ0FOX1NFVCB8IEhBTkRMRVJfQ0FOX05PVF9DUkVBVEUpCiNkZWZpbmUgSEFORExFUl9DQU5fREVGQVVMVCAoSEFORExFUl9DQU5fUk9OTFkgfCBIQU5ETEVSX0NBTl9OT1RfQ1JFQVRFKQoKLyoqIEB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3MgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogKiBUeXBlZGVmcyB0aGUgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9zIHN0cnVjdCBpbnRvIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gICovCgovKiogQHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX3MKICogIFJvb3QgcmVnaXN0cmF0aW9uIGluZm8uCiAqICBUaGUgdmFyaWFibGVzIGhhbmRsZXJOYW1lLCBjb250ZXh0TmFtZSwgYW5kIHJvb3RvaWQgbmVlZCB0byBiZSBhbGxvY2F0ZWQKICogIG9uIHRoZSBoZWFwLCB3aGVuIHRoZSByZWdpc3RyYXRpb24gc3RydWN0dXJlIGlzIHVucmVnaXN0ZXJlZCB1c2luZwogKiAgdW5yZWdpc3Rlcl9taWJfY29udGV4dCgpIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGZyZWUgdGhlbS4KICovCnR5cGVkZWYgc3RydWN0IG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb25fcyB7CgoJLyoqIGZvciBtclRhYmxlIGxpc3RpbmdzLCBhbmQgb3RoZXIgdXNlcyAqLwogICAgICAgIGNoYXIgICAgICAgICAgICpoYW5kbGVyTmFtZTsKCS8qKiBOVUxMID0gZGVmYXVsdCBjb250ZXh0ICovCiAgICAgICAgY2hhciAgICAgICAgICAgKmNvbnRleHROYW1lOyAgICAKCiAgICAgICAgLyoqCiAgICAgICAgICogd2hlcmUgYXJlIHdlIHJlZ2lzdGVyZWQgYXQ/IAogICAgICAgICAqLwogICAgICAgIG9pZCAgICAgICAgICAgICpyb290b2lkOwogICAgICAgIHNpemVfdCAgICAgICAgICByb290b2lkX2xlbjsKCiAgICAgICAgLyoqCiAgICAgICAgICogaGFuZGxlciBkZXRhaWxzIAogICAgICAgICAqLwogICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXI7CiAgICAgICAgaW50ICAgICAgICAgICAgIG1vZGVzOwoKICAgICAgICAvKioKICAgICAgICAgKiBtb3JlIG9wdGlvbmFsIHN0dWZmIAogICAgICAgICAqLwogICAgICAgIGludCAgICAgICAgICAgICBwcmlvcml0eTsKICAgICAgICBpbnQgICAgICAgICAgICAgcmFuZ2Vfc3ViaWQ7CiAgICAgICAgb2lkICAgICAgICAgICAgIHJhbmdlX3Vib3VuZDsKICAgICAgICBpbnQgICAgICAgICAgICAgdGltZW91dDsKICAgICAgICBpbnQgICAgICAgICAgICAgZ2xvYmFsX2NhY2hlaWQ7CgogICAgICAgIC8qKgogICAgICAgICAqIHZvaWQgcHRyIGZvciByZWdpc3RlcmVlCiAgICAgICAgICovCiAgICAgICAgdm9pZCAqICAgICAgICAgIG15X3JlZ192b2lkOwoKfSBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uOwoKLyoKICogZnVuY3Rpb24gaGFuZGxlciBkZWZpbml0aW9ucyAKICovCgp0eXBlZGVmIGludCAoTmV0c25tcF9Ob2RlX0hhbmRsZXIpIChuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyLAogICAgLyoqIHBvaW50ZXIgdG8gcmVnaXN0cmF0aW9uIHN0cnVjdCAqLwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgIC8qKiBwb2ludGVyIHRvIGN1cnJlbnQgdHJhbnNhY3Rpb24gKi8KICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvLAogICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzKTsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2hhbmRsZXJfYXJnc19zIHsKICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyOwogICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKnJlZ2luZm87CiAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm87CiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3RzOwogICAgfSBuZXRzbm1wX2hhbmRsZXJfYXJnczsKCiAgICB0eXBlZGVmIHN0cnVjdCBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZV9zIHsKICAgICAgICBpbnQgICAgICAgICAgICAgdHJhbnNhY3Rpb25faWQ7CiAgICAgICAgbmV0c25tcF9taWJfaGFuZGxlciAqaGFuZGxlcjsKICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvOwogICAgICAgIG5ldHNubXBfYWdlbnRfcmVxdWVzdF9pbmZvICpyZXFpbmZvOwogICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0czsKICAgICAgICB2b2lkICAgICAgICAgICAqbG9jYWxpbmZvOwogICAgfSBuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZTsKCiAgICAvKgogICAgICogaGFuZGxlciBBUEkgZnVuY3Rpb25zIAogICAgICovCiAgICB2b2lkICAgICAgICAgICAgbmV0c25tcF9pbml0X2hhbmRsZXJfY29uZih2b2lkKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF91bnJlZ2lzdGVyX2hhbmRsZXIobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvKTsKICAgIGludCAgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfcmVnaXN0ZXJfaGFuZGxlcl9ub2NhbGxiYWNrKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9pbmplY3RfaGFuZGxlcihuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXIpOwogICAgaW50CiAgICAgICAgbmV0c25tcF9pbmplY3RfaGFuZGxlcl9iZWZvcmUobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpoYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJlZm9yZV93aGF0KTsKICAgIG5ldHNubXBfbWliX2hhbmRsZXIKICAgICAgICAqbmV0c25tcF9maW5kX2hhbmRsZXJfYnlfbmFtZShuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwogICAgdm9pZCAgICAgICAgICAKICAgICAgICAqbmV0c25tcF9maW5kX2hhbmRsZXJfZGF0YV9ieV9uYW1lKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZWdpbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2NhbGxfaGFuZGxlcnMobmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX2hhbmRsZXIobmV0c25tcF9taWJfaGFuZGxlciAqbmV4dF9oYW5kbGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVnaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpyZXFpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0cyk7CiAgICBpbnQgICAgICAgICAgICAgbmV0c25tcF9jYWxsX25leHRfaGFuZGxlcihuZXRzbm1wX21pYl9oYW5kbGVyICpjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlZ2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3RzKTsKICAgIGludCAgICAgICAgICAgICBuZXRzbm1wX2NhbGxfbmV4dF9oYW5kbGVyX29uZV9yZXF1ZXN0KG5ldHNubXBfbWliX2hhbmRsZXIgKmN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICpyZWdpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9hZ2VudF9yZXF1ZXN0X2luZm8gKnJlcWluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX3JlcXVlc3RfaW5mbyAqcmVxdWVzdHMpOwogICAgCiAgICBuZXRzbm1wX21pYl9oYW5kbGVyICpuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHNubXBfTm9kZV9IYW5kbGVyICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcl9hY2Nlc3NfbWV0aG9kKTsKICAgIG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKgogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9jcmVhdGUoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfbWliX2hhbmRsZXIgKmhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvaWQgKiByZWdfb2lkLCBzaXplX3QgcmVnX29pZF9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZXMpOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbiAqCiAgICBuZXRzbm1wX2NyZWF0ZV9oYW5kbGVyX3JlZ2lzdHJhdGlvbihjb25zdCBjaGFyICpuYW1lLCBOZXRzbm1wX05vZGVfSGFuZGxlcioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJfYWNjZXNzX21ldGhvZCwgb2lkICpyZWdfb2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlZ19vaWRfbGVuLCBpbnQgbW9kZXMpOwoKICAgIG5ldHNubXBfZGVsZWdhdGVkX2NhY2hlCiAgICAgICAgKm5ldHNubXBfY3JlYXRlX2RlbGVnYXRlZF9jYWNoZShuZXRzbm1wX21pYl9oYW5kbGVyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2FnZW50X3JlcXVlc3RfaW5mbyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2luZm8gKiwgdm9pZCAqKTsKICAgIHZvaWQgbmV0c25tcF9mcmVlX2RlbGVnYXRlZF9jYWNoZShuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZSAqZGNhY2hlKTsKICAgIG5ldHNubXBfZGVsZWdhdGVkX2NhY2hlCiAgICAgICAgKm5ldHNubXBfaGFuZGxlcl9jaGVja19jYWNoZShuZXRzbm1wX2RlbGVnYXRlZF9jYWNoZSAqZGNhY2hlKTsKICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX3JlZ2lzdGVyX2hhbmRsZXJfYnlfbmFtZShjb25zdCBjaGFyICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9taWJfaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICopOwoKICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX2NsZWFyX2hhbmRsZXJfbGlzdCh2b2lkKTsKCiAgICB2b2lkCiAgICAgICAgbmV0c25tcF9yZXF1ZXN0X2FkZF9saXN0X2RhdGEobmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kYXRhX2xpc3QgKm5vZGUpOwoKICAgIGludAogICAgICAgIG5ldHNubXBfcmVxdWVzdF9yZW1vdmVfbGlzdF9kYXRhKG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwoKICAgIHZvaWQgICAgKm5ldHNubXBfcmVxdWVzdF9nZXRfbGlzdF9kYXRhKG5ldHNubXBfcmVxdWVzdF9pbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlcXVlc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CgogICAgdm9pZAogICAgICAgICAgICAgIG5ldHNubXBfZnJlZV9yZXF1ZXN0X2RhdGFfc2V0KG5ldHNubXBfcmVxdWVzdF9pbmZvICpyZXF1ZXN0KTsKCiAgICB2b2lkCiAgICAgICAgICAgICBuZXRzbm1wX2ZyZWVfcmVxdWVzdF9kYXRhX3NldHMobmV0c25tcF9yZXF1ZXN0X2luZm8gKnJlcXVlc3QpOwoKICAgIHZvaWQgICAgICAgICAgICBuZXRzbm1wX2hhbmRsZXJfZnJlZShuZXRzbm1wX21pYl9oYW5kbGVyICopOwogICAgbmV0c25tcF9taWJfaGFuZGxlciAqbmV0c25tcF9oYW5kbGVyX2R1cChuZXRzbm1wX21pYl9oYW5kbGVyICopOwogICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbgogICAgICAgICpuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uX2R1cChuZXRzbm1wX2hhbmRsZXJfcmVnaXN0cmF0aW9uICopOwogICAgdm9pZCAgICAgICAgICAgCiAgICAgICAgbmV0c25tcF9oYW5kbGVyX3JlZ2lzdHJhdGlvbl9mcmVlKG5ldHNubXBfaGFuZGxlcl9yZWdpc3RyYXRpb24gKik7CgojZGVmaW5lIFJFUVVFU1RfSVNfREVMRUdBVEVEICAgICAxCiNkZWZpbmUgUkVRVUVTVF9JU19OT1RfREVMRUdBVEVEIDAKICAgIHZvaWQgICAgICAgICAgIAogICAgICAgIG5ldHNubXBfaGFuZGxlcl9tYXJrX3JlcXVlc3RzX2FzX2RlbGVnYXRlZChuZXRzbm1wX3JlcXVlc3RfaW5mbyAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQpOwogICAgdm9pZCAgICAgICAgICAgKm5ldHNubXBfaGFuZGxlcl9nZXRfcGFyZW50X2RhdGEobmV0c25tcF9yZXF1ZXN0X2luZm8gKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKik7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQUdFTlRfSEFORExFUl9IICovCi8qKiBAfSAqLwo=