Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBRdWFudGl6ZXIgb2JqZWN0cyBhbmQgZnVuY3Rpb25zCi8vCi8vIERlc2lnbiBhbmQgaW1wbGVtZW50YXRpb24gYnk6Ci8vIC0gSGVydukgRHJvbG9uIDxkcm9sb25AaW5mb25pZS5mcj4KLy8gLSBDYXJzdGVuIEtsZWluIChja2xlaW4wNUB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQpCi8vCi8vIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEZyZWVJbWFnZSAzCi8vCi8vIENPVkVSRUQgQ09ERSBJUyBQUk9WSURFRCBVTkRFUiBUSElTIExJQ0VOU0UgT04gQU4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWQovLyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUwovLyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLy8gT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQKLy8gQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVAovLyBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWQovLyBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMCi8vIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIKLy8gVEhJUyBESVNDTEFJTUVSLgovLwovLyBVc2UgYXQgeW91ciBvd24gcmlzayEKLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKLy8gCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiNpbmNsdWRlICJGcmVlSW1hZ2UuaCIKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8qKgogIFhpYW9saW4gV3UgY29sb3IgcXVhbnRpemF0aW9uIGFsZ29yaXRobQoqLwpjbGFzcyBXdVF1YW50aXplcgp7CnB1YmxpYzoKCnR5cGVkZWYgc3RydWN0IHRhZ0JveCB7CiAgICBpbnQgcjA7CQkJIC8vIG1pbiB2YWx1ZSwgZXhjbHVzaXZlCiAgICBpbnQgcjE7CQkJIC8vIG1heCB2YWx1ZSwgaW5jbHVzaXZlCiAgICBpbnQgZzA7ICAKICAgIGludCBnMTsgIAogICAgaW50IGIwOyAgCiAgICBpbnQgYjE7CiAgICBpbnQgdm9sOwp9IEJveDsKCnByb3RlY3RlZDoKICAgIGZsb2F0ICpnbTI7CglMT05HICp3dCwgKm1yLCAqbWcsICptYjsKCVdPUkQgKlFhZGQ7CgoJLy8gRElCIGRhdGEKCXVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7Cgl1bnNpZ25lZCBwaXRjaDsKCUZJQklUTUFQICptX2RpYjsKCnByb3RlY3RlZDoKICAgIHZvaWQgSGlzdDNEKExPTkcgKnZ3dCwgTE9ORyAqdm1yLCBMT05HICp2bWcsIExPTkcgKnZtYiwgZmxvYXQgKm0yLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKTsKCXZvaWQgTTNEKExPTkcgKnZ3dCwgTE9ORyAqdm1yLCBMT05HICp2bWcsIExPTkcgKnZtYiwgZmxvYXQgKm0yKTsKCUxPTkcgVm9sKEJveCAqY3ViZSwgTE9ORyAqbW10KTsKCUxPTkcgQm90dG9tKEJveCAqY3ViZSwgQllURSBkaXIsIExPTkcgKm1tdCk7CglMT05HIFRvcChCb3ggKmN1YmUsIEJZVEUgZGlyLCBpbnQgcG9zLCBMT05HICptbXQpOwoJZmxvYXQgVmFyKEJveCAqY3ViZSk7CglmbG9hdCBNYXhpbWl6ZShCb3ggKmN1YmUsIEJZVEUgZGlyLCBpbnQgZmlyc3QsIGludCBsYXN0ICwgaW50ICpjdXQsCgkJCQkgICBMT05HIHdob2xlX3IsIExPTkcgd2hvbGVfZywgTE9ORyB3aG9sZV9iLCBMT05HIHdob2xlX3cpOwoJYm9vbCBDdXQoQm94ICpzZXQxLCBCb3ggKnNldDIpOwoJdm9pZCBNYXJrKEJveCAqY3ViZSwgaW50IGxhYmVsLCBCWVRFICp0YWcpOwoKcHVibGljOgoJLy8gQ29uc3RydWN0b3IgLSBJbnB1dCBwYXJhbWV0ZXI6IERJQiAyNC1iaXQgdG8gYmUgcXVhbnRpemVkCiAgICBXdVF1YW50aXplcihGSUJJVE1BUCAqZGliKTsKCS8vIERlc3RydWN0b3IKCX5XdVF1YW50aXplcigpOwoJLy8gUXVhbnRpemVyIC0gUmV0dXJuIHZhbHVlOiBxdWFudGl6ZWQgOC1iaXQgKGNvbG9yIHBhbGV0dGUpIERJQgoJRklCSVRNQVAqIFF1YW50aXplKGludCBQYWxldHRlU2l6ZSwgaW50IFJlc2VydmVTaXplLCBSR0JRVUFEICpSZXNlcnZlUGFsZXR0ZSk7Cn07CgoKLyoqCiAgTkVVUVVBTlQgTmV1cmFsLU5ldCBxdWFudGl6YXRpb24gYWxnb3JpdGhtIGJ5IEFudGhvbnkgRGVra2VyCiovCgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvbnN0YW50IGRlZmluaXRpb25zCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8qKiBudW1iZXIgb2YgY29sb3VycyB1c2VkOiAKCWZvciAyNTYgY29sb3VycywgZml4ZWQgYXJyYXlzIG5lZWQgOGtiLCBwbHVzIHNwYWNlIGZvciB0aGUgaW1hZ2UKKi8KLy9zdGF0aWMgY29uc3QgaW50IG5ldHNpemUgPSAyNTY7CgovKipAbmFtZSBuZXR3b3JrIGRlZmluaXRpb25zICovCi8vQHsKLy9zdGF0aWMgY29uc3QgaW50IG1heG5ldHBvcyA9IChuZXRzaXplIC0gMSk7Ci8vLyBiaWFzIGZvciBjb2xvdXIgdmFsdWVzCnN0YXRpYyBjb25zdCBpbnQgbmV0Ymlhc3NoaWZ0ID0gNDsKLy8vIG5vLiBvZiBsZWFybmluZyBjeWNsZXMKc3RhdGljIGNvbnN0IGludCBuY3ljbGVzID0gMTAwOwovL0B9CgovKipAbmFtZSBkZWZzIGZvciBmcmVxIGFuZCBiaWFzICovCi8vQHsKLy8vIGJpYXMgZm9yIGZyYWN0aW9ucwpzdGF0aWMgY29uc3QgaW50IGludGJpYXNzaGlmdCA9IDE2OwpzdGF0aWMgY29uc3QgaW50IGludGJpYXMgPSAoKChpbnQpMSkgPDwgaW50Ymlhc3NoaWZ0KTsKLy8vIGdhbW1hID0gMTAyNApzdGF0aWMgY29uc3QgaW50IGdhbW1hc2hpZnQgPSAxMDsKLy8gc3RhdGljIGNvbnN0IGludCBnYW1tYSA9ICgoKGludCkxKSA8PCBnYW1tYXNoaWZ0KTsKLy8vIGJldGEgPSAxIC8gMTAyNApzdGF0aWMgY29uc3QgaW50IGJldGFzaGlmdCA9IDEwOwpzdGF0aWMgY29uc3QgaW50IGJldGEgPSAoaW50YmlhcyA+PiBiZXRhc2hpZnQpOwpzdGF0aWMgY29uc3QgaW50IGJldGFnYW1tYSA9IChpbnRiaWFzIDw8IChnYW1tYXNoaWZ0LWJldGFzaGlmdCkpOwovL0B9CgovKipAbmFtZSBkZWZzIGZvciBkZWNyZWFzaW5nIHJhZGl1cyBmYWN0b3IgKi8KLy9AewovLy8gZm9yIDI1NiBjb2xzLCByYWRpdXMgc3RhcnRzCi8vc3RhdGljIGNvbnN0IGludCBpbml0cmFkID0gKG5ldHNpemUgPj4gMyk7Ci8vLyBhdCAzMi4wIGJpYXNlZCBieSA2IGJpdHMKc3RhdGljIGNvbnN0IGludCByYWRpdXNiaWFzc2hpZnQgPSA2OwpzdGF0aWMgY29uc3QgaW50IHJhZGl1c2JpYXMgPSAoKChpbnQpMSkgPDwgcmFkaXVzYmlhc3NoaWZ0KTsKLy8vIGFuZCBkZWNyZWFzZXMgYnkgYSAKLy9zdGF0aWMgY29uc3QgaW50IGluaXRyYWRpdXMJPSAoaW5pdHJhZCAqIHJhZGl1c2JpYXMpOwovLyBmYWN0b3Igb2YgMS8zMCBlYWNoIGN5Y2xlCnN0YXRpYyBjb25zdCBpbnQgcmFkaXVzZGVjID0gMzA7Ci8vQH0KCi8qKkBuYW1lIGRlZnMgZm9yIGRlY3JlYXNpbmcgYWxwaGEgZmFjdG9yICovCi8vQHsKLy8vIGFscGhhIHN0YXJ0cyBhdCAxLjAKc3RhdGljIGNvbnN0IGludCBhbHBoYWJpYXNzaGlmdCA9IDEwOwpzdGF0aWMgY29uc3QgaW50IGluaXRhbHBoYSA9ICgoKGludCkxKSA8PCBhbHBoYWJpYXNzaGlmdCk7Ci8vQH0KCi8qKkBuYW1lIHJhZGJpYXMgYW5kIGFscGhhcmFkYmlhcyB1c2VkIGZvciByYWRwb3dlciBjYWxjdWxhdGlvbiAqLwovL0B7CnN0YXRpYyBjb25zdCBpbnQgcmFkYmlhc3NoaWZ0ID0gODsKc3RhdGljIGNvbnN0IGludCByYWRiaWFzID0gKCgoaW50KTEpIDw8IHJhZGJpYXNzaGlmdCk7CnN0YXRpYyBjb25zdCBpbnQgYWxwaGFyYWRic2hpZnQgPSAoYWxwaGFiaWFzc2hpZnQrcmFkYmlhc3NoaWZ0KTsKc3RhdGljIGNvbnN0IGludCBhbHBoYXJhZGJpYXMgPSAoKChpbnQpMSkgPDwgYWxwaGFyYWRic2hpZnQpOwkKLy9AfQoKY2xhc3MgTk5RdWFudGl6ZXIKewpwcm90ZWN0ZWQ6CgkvKipAbmFtZSBpbWFnZSBwYXJhbWV0ZXJzICovCgkvL0B7CgkvLy8gcG9pbnRlciB0byBpbnB1dCBkaWIKCUZJQklUTUFQICpkaWJfcHRyOwoJLy8vIGltYWdlIHdpZHRoCglpbnQgaW1nX3dpZHRoOwoJLy8vIGltYWdlIGhlaWdodAoJaW50IGltZ19oZWlnaHQ7CgkvLy8gaW1hZ2UgbGluZSBsZW5ndGgKCWludCBpbWdfbGluZTsKCS8vQH0KCgkvKipAbmFtZSBuZXR3b3JrIHBhcmFtZXRlcnMgKi8KCS8vQHsKCglpbnQgbmV0c2l6ZSwgbWF4bmV0cG9zLCBpbml0cmFkLCBpbml0cmFkaXVzOwoKCS8vLyBCR1JjCgl0eXBlZGVmIGludCBwaXhlbFs0XTsKCS8vLyB0aGUgbmV0d29yayBpdHNlbGYKCXBpeGVsICpuZXR3b3JrOwoKCS8vLyBmb3IgbmV0d29yayBsb29rdXAgLSByZWFsbHkgMjU2CglpbnQgbmV0aW5kZXhbMjU2XTsKCgkvLy8gYmlhcyBhcnJheSBmb3IgbGVhcm5pbmcKCWludCAqYmlhczsKCS8vLyBmcmVxIGFycmF5IGZvciBsZWFybmluZwoJaW50ICpmcmVxOwoJLy8vIHJhZHBvd2VyIGZvciBwcmVjb21wdXRhdGlvbgoJaW50ICpyYWRwb3dlcjsKCS8vQH0KCnByb3RlY3RlZDoKCS8vLyBJbml0aWFsaXNlIG5ldHdvcmsgaW4gcmFuZ2UgKDAsMCwwKSB0byAoMjU1LDI1NSwyNTUpIGFuZCBzZXQgcGFyYW1ldGVycwoJdm9pZCBpbml0bmV0KCk7CQoKCS8vLyBVbmJpYXMgbmV0d29yayB0byBnaXZlIGJ5dGUgdmFsdWVzIDAuLjI1NSBhbmQgcmVjb3JkIHBvc2l0aW9uIGkgdG8gcHJlcGFyZSBmb3Igc29ydAoJdm9pZCB1bmJpYXNuZXQoKTsKCgkvLy8gSW5zZXJ0aW9uIHNvcnQgb2YgbmV0d29yayBhbmQgYnVpbGRpbmcgb2YgbmV0aW5kZXhbMC4uMjU1XSAodG8gZG8gYWZ0ZXIgdW5iaWFzKQoJdm9pZCBpbnhidWlsZCgpOwoKCS8vLyBTZWFyY2ggZm9yIEJHUiB2YWx1ZXMgMC4uMjU1IChhZnRlciBuZXQgaXMgdW5iaWFzZWQpIGFuZCByZXR1cm4gY29sb3VyIGluZGV4CglpbnQgaW54c2VhcmNoKGludCBiLCBpbnQgZywgaW50IHIpOwoKCS8vLyBTZWFyY2ggZm9yIGJpYXNlZCBCR1IgdmFsdWVzCglpbnQgY29udGVzdChpbnQgYiwgaW50IGcsIGludCByKTsKCQoJLy8vIE1vdmUgbmV1cm9uIGkgdG93YXJkcyBiaWFzZWQgKGIsZyxyKSBieSBmYWN0b3IgYWxwaGEKCXZvaWQgYWx0ZXJzaW5nbGUoaW50IGFscGhhLCBpbnQgaSwgaW50IGIsIGludCBnLCBpbnQgcik7CgoJLy8vIE1vdmUgYWRqYWNlbnQgbmV1cm9ucyBieSBwcmVjb21wdXRlZCBhbHBoYSooMS0oKGktaileMi9bcl1eMikpIGluIHJhZHBvd2VyW3xpLWp8XQoJdm9pZCBhbHRlcm5laWdoKGludCByYWQsIGludCBpLCBpbnQgYiwgaW50IGcsIGludCByKTsKCgkvKiogTWFpbiBMZWFybmluZyBMb29wCglAcGFyYW0gc2FtcGxpbmdfZmFjdG9yIHNhbXBsaW5nIGZhY3RvciBpbiBbMS4uMzBdCgkqLwoJdm9pZCBsZWFybihpbnQgc2FtcGxpbmdfZmFjdG9yKTsKCgkvLy8gR2V0IGEgcGl4ZWwgc2FtcGxlIGF0IHBvc2l0aW9uIHBvcy4gSGFuZGxlIDQtYnl0ZSBib3VuZGFyeSBhbGlnbm1lbnQuCgl2b2lkIGdldFNhbXBsZShsb25nIHBvcywgaW50ICpiLCBpbnQgKmcsIGludCAqcik7CgoKcHVibGljOgoJLy8vIENvbnN0cnVjdG9yCglOTlF1YW50aXplcihpbnQgUGFsZXR0ZVNpemUpOwoKCS8vLyBEZXN0cnVjdG9yCgl+Tk5RdWFudGl6ZXIoKTsKCgkvKiogUXVhbnRpemVyCglAcGFyYW0gZGliIGlucHV0IDI0LWJpdCBkaWIgdG8gYmUgcXVhbnRpemVkCglAcGFyYW0gc2FtcGxpbmcgYSBzYW1wbGluZyBmYWN0b3IgaW4gcmFuZ2UgMS4uMzAuIAoJMSA9PiBzbG93ZXIgKGJ1dCBiZXR0ZXIpLCAzMCA9PiBmYXN0ZXIuIERlZmF1bHQgdmFsdWUgaXMgMQoJQHJldHVybiByZXR1cm5zIHRoZSBxdWFudGl6ZWQgOC1iaXQgKGNvbG9yIHBhbGV0dGUpIERJQgoJKi8KCUZJQklUTUFQKiBRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlLCBpbnQgc2FtcGxpbmcgPSAxKTsKCn07CgovKioKICogTEZQUVVBTlQgLSBMb3NzbGVzcyBGYXN0IFBzZXVkby1RdWFudGl6YXRpb24gQWxnb3JpdGhtCiAqCiAqIFRoZSBMb3NzbGVzcyBGYXN0IFBzZXVkby1RdWFudGl6YXRpb24gYWxnb3JpdGhtIGlzIG5vIHJlYWwgcXVhbnRpemF0aW9uCiAqIGFsZ29yaXRobSwgc2luY2UgaXQgbWFrZXMgbm8gYXR0ZW1wdCB0byBjcmVhdGUgYSBwYWxldHRlLCB0aGF0IGlzIHN1aXRhYmxlCiAqIGZvciBhbGwgY29sb3JzIG9mIHRoZSAyNC1iaXQgc291cmNlIGltYWdlLiBIb3dldmVyLCBpdCBwcm92aWRlcyB2ZXJ5IGZhc3QKICogY29udmVyc2lvbnMgZnJvbSAyNC1iaXQgdG8gOC1iaXQgaW1hZ2VzLCBpZiB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGNvbG9ycwogKiBpbiB0aGUgc291cmNlIGltYWdlIGlzIG5vdCBncmVhdGVyIHRoYW4gdGhlIGRlc2lyZWQgcGFsZXR0ZSBzaXplLiBJZiB0aGUKICogbnVtYmVyIG9mIGNvbG9ycyBpbiB0aGUgc291cmNlIGltYWdlIGlzIGV4Y2VlZGVkLCB0aGUgUXVhbnRpemUgbWV0aG9kIG9mCiAqIHRoaXMgaW1wbGVtZW50YXRpb24gc3RvcHMgdGhlIHByb2Nlc3MgYW5kIHJldHVybnMgTlVMTC4KICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgdmVyeSBmYXN0IGhhc2ggbWFwIGltcGxlbWVudGF0aW9uIHRvIGNvbGxlY3QKICogdGhlIHNvdXJjZSBpbWFnZSdzIGNvbG9ycy4gSXQgdHVybmVkIG91dCB0aGF0IGEgY3VzdG9taXplZCBpbXBsZW1lbnRhdGlvbgogKiBvZiBhIGhhc2ggdGFibGUgd2l0aCBvcGVuIGFkZHJlc3NpbmcgKHVzaW5nIGxpbmVhciBwcm9iaW5nKSBwcm92aWRlcyB0aGUKICogYmVzdCBwZXJmb3JtYW5jZS4gVGhlIGhhc2ggdGFibGUgaGFzIDUxMiBlbnRyaWVzLCB3aGljaCBwcmV2ZW50cyB0aGUgbG9hZAogKiBmYWN0b3IgdG8gZXhjZWVkIDAuNSBhcyB3ZSBoYXZlIDI1NiBlbnRyaWVzIGF0IG1vc3QuIEVhY2ggZW50cnkgY29uc3VtZXMKICogNjQgYml0cywgc28gdGhlIHdob2xlIGhhc2ggdGFibGUgdGFrZXMgNEtCIG9mIG1lbW9yeS4KICoKICogRm9yIGxhcmdlIGltYWdlcywgdGhlIExGUFF1YW50aXplciBpcyB0eXBpY2FsbHkgdXAgdG8gdGhyZWUgdGltZXMgZmFzdGVyCiAqIHRoYW4gdGhlIFd1UXVhbnRpemVyLgogKi8KY2xhc3MgTEZQUXVhbnRpemVyIHsKcHVibGljOgoJLyoqIENvbnN0cnVjdG9yICovCglMRlBRdWFudGl6ZXIodW5zaWduZWQgUGFsZXR0ZVNpemUpOwoKCS8qKiBEZXN0cnVjdG9yICovCgl+TEZQUXVhbnRpemVyKCk7CgoJLyoqCgkgKiBRdWFudGl6ZXIKCSAqIEBwYXJhbSBkaWIgaW5wdXQgMjQtYml0IG9yIDMyLWJpdCBiaXRtYXAgdG8gYmUgcXVhbnRpemVkCgkgKiBAcmV0dXJuIHJldHVybnMgdGhlIHBzZXVkby1xdWFudGl6ZWQgOC1iaXQgYml0bWFwCgkgKi8KCUZJQklUTUFQKiBRdWFudGl6ZShGSUJJVE1BUCAqZGliLCBpbnQgUmVzZXJ2ZVNpemUsIFJHQlFVQUQgKlJlc2VydmVQYWxldHRlKTsKCnByb3RlY3RlZDoKCS8qKiBUaGUgbWF4aW11bSBzaXplIG9mIGEgcGFsZXR0ZS4gKi8KCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBNQVhfU0laRSA9IDI1NjsKCgkvKioKCSAqIFRoZSBzaXplIG9mIHRoZSBoYXNoIHRhYmxlLiBNdXN0IGJlIGEgcG93ZXIgb2YgMi4gQnkgc2l6aW5nIGl0CgkgKiBNQVhfU0laRSAqIDIsIHdlIGVuc3VyZSB0aGUgbG9hZCBmYWN0b3Igbm90IHRvIGV4Y2VlZCAwLjUgYXQgYW55CgkgKiB0aW1lLCBzaW5jZSB3ZSB3aWxsIGhhdmUgTUFYX1NJWkUgZW50cmllcyBhdCBtb3N0LgoJICovCglzdGF0aWMgY29uc3QgdW5zaWduZWQgTUFQX1NJWkUgPSBNQVhfU0laRSAqIDI7CgoJLyoqCgkgKiBXaXRoIG9wZW4gYWRkcmVzc2luZyB3ZSBuZWVkIGEgc3BlY2lhbCB2YWx1ZSBmb3IgZW1wdHkgYnVja2V0cy4KCSAqIEJvdGggZW50cnkuY29sb3IgYW5kIGVudHJ5LmluZGV4IGFyZSAweEZGRkZGRkZGIGZvciBhbiBlbXB0eQoJICogZW50cnkuCgkgKi8KCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBFTVBUWV9CVUNLRVQgPSAweEZGRkZGRkZGOwoKCS8qKgoJICogVGhpcyBzdHJ1Y3R1cmUgZGVmaW5lcyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZS4gV2UgdXNlCgkgKiBjb2xvciBhcyB0aGUgZW50cnkncyBrZXkuCgkgKi8KCXR5cGVkZWYgc3RydWN0IE1hcEVudHJ5IHsKCQl1bnNpZ25lZCBjb2xvcjsKCQl1bnNpZ25lZCBpbmRleDsKCX0gTWFwRW50cnk7CgoJLyoqIFRoZSBoYXNoIHRhYmxlLiAqLwoJTWFwRW50cnkgKm1fbWFwOwoKCS8qKgoJICogVGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCBwYWxldHRlLiBTaW5jZSB0aGUgcHJvdmlkZWQKCSAqIHJlc2VydmUgcGFsZXR0ZSBjb3VsZCBjb250YWluIGR1cGxpY2F0ZXMsIHRoaXMgaXMgbm90IG5lY2Vzc2FyaWx5CgkgKiB0aGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggdGFibGUuIEluaXRpYWxpemVkIHRvIHplcm8uCgkgKi8KCXVuc2lnbmVkIG1fc2l6ZTsKCgkvKioKCSAqIFRoZSBkZXNpcmVkIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgcGFsZXR0ZS4KCSAqIElmIG1fc2l6ZSBleGNlZWRzIHRoaXMgdmFsdWUsIHRoZSBwYWxldHRlIGlzIGZ1bGwgYW5kIHRoZQoJICogcXVhbnRpemF0aW9uIHByb2Nlc3MgaXMgc3RvcHBlZC4gSW5pdGlhbGl6ZWQgdG8gdGhlIGRlc2lyZWQKCSAqIHBhbGV0dGUgc2l6ZS4KCSAqLwoJdW5zaWduZWQgbV9saW1pdDsKCgkvKioKCSAqICBUaGUgcGFsZXR0ZSBpbmRleCB1c2VkIGZvciB0aGUgbmV4dCBjb2xvciBhZGRlZC4gSW5pdGlhbGl6ZWQgdG8KCSAqICB6ZXJvICh0aGUgcmVzZXJ2ZSBwYWxldHRlIGlzIHB1dCB0byB0aGUgZW5kIG9mIHRoZSBwYWxldHRlKS4KCSAqLwoJdW5zaWduZWQgbV9pbmRleDsKCgkvKioKCSAqIEVuc3VyZXMgdGhhdCBoYXNoIGNvZGVzIHRoYXQgZGlmZmVyIG9ubHkgYnkgY29uc3RhbnQgbXVsdGlwbGVzCgkgKiBhdCBlYWNoIGJpdCBwb3NpdGlvbiBoYXZlIGEgYm91bmRlZCBudW1iZXIgb2YgY29sbGlzaW9ucy4KCSAqIEBwYXJhbSBoIHRoZSBpbml0aWFsIChha2EgcmF3KSBoYXNoIGNvZGUKCSAqIEByZXR1cm4gdGhlIG1vZGlmaWVkIGhhc2ggY29kZQoJICovCglzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGhhc2godW5zaWduZWQgaCkgewoJCWggXj0gKGggPj4gMjApIF4gKGggPj4gMTIpOwoJCXJldHVybiBoIF4gKGggPj4gNykgXiAoaCA+PiA0KTsKCX0KCgkvKioKCSAqIFJldHVybnMgdGhlIHBhbGV0dGUgaW5kZXggb2YgdGhlIHNwZWNpZmllZCBjb2xvci4gVHJpZXMgdG8gcHV0IHRoZQoJICogY29sb3IgaW50byB0aGUgbWFwLCBpZiBpdCdzIG5vdCBhbHJlYWR5IHByZXNlbnQgaW4gdGhlIG1hcC4gSW4gdGhhdAoJICogY2FzZSwgYSBuZXcgaW5kZXggaXMgdXNlZCBmb3IgdGhlIGNvbG9yLiBSZXR1cm5zIC0xLCBpZiBhZGRpbmcgdGhlCgkgKiBjb2xvciB3b3VsZCBleGNlZWQgdGhlIGRlc2lyZWQgbWF4aW11bSBudW1iZXIgb2YgY29sb3JzIGluIHRoZQoJICogcGFsZXR0ZS4KCSAqIEBwYXJhbSBjb2xvciB0aGUgY29sb3IgdG8gZ2V0IHRoZSBpbmRleCBmcm9tCgkgKiBAcmV0dXJuIHRoZSBwYWxldHRlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgY29sb3Igb3IgLTEsIGlmIHRoZXJlCgkgKiBpcyBubyBzcGFjZSBsZWZ0IGluIHRoZSBwYWxldHRlCgkgKi8KCWludCBHZXRJbmRleEZvckNvbG9yKHVuc2lnbmVkIGNvbG9yKTsKCgkvKioKCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBvZiB0aGUgc3BlY2lmaWVkIHJlc2VydmUKCSAqIHBhbGV0dGUgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgcGFsZXR0ZS4KCSAqIEBwYXJhbSAqcGFsZXR0ZSBhIHBvaW50ZXIgdG8gdGhlIHJlc2VydmUgcGFsZXR0ZSB0byBjb3B5IGZyb20KCSAqIEBwYXJhbSBzaXplIHRoZSBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5CgkgKi8KCXZvaWQgQWRkUmVzZXJ2ZVBhbGV0dGUoY29uc3Qgdm9pZCAqcGFsZXR0ZSwgdW5zaWduZWQgc2l6ZSk7CgoJLyoqCgkgKiBDb3BpZXMgdGhlIG5ld2x5IGNyZWF0ZWQgcGFsZXR0ZSBpbnRvIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24KCSAqIHBhbGV0dHRlLiBBbHRob3VnaCB1bnVzZWQgcGFsZXR0ZSBlbnRyaWVzIGFyZSBub3Qgb3ZlcndyaXR0ZW4gaW4KCSAqIHRoZSBkZXN0aW5hdGlvbiBwYWxldHRlLCBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgc3BhY2UgZm9yIGF0CgkgKiBsZWFzdCAyNTYgZW50cmllcy4KCSAqIEBwYXJhbSBwYWxldHRlIGEgcG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gcGFsZXR0ZQoJICovCgl2b2lkIFdyaXRlUGFsZXR0ZSh2b2lkICpwYWxldHRlKTsKCn07Cg==