LyogJFhGcmVlODYkICovIC8qIC0qLSBtb2RlOiBjOyBjLWJhc2ljLW9mZnNldDogMyAtKi0gKi8KLyoKICogQ29weXJpZ2h0IDIwMDAgR2FyZXRoIEh1Z2hlcwogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAogKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCiAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAogKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUgbmV4dAogKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCiAqIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCiAqIEdBUkVUSCBIVUdIRVMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSCiAqIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCiAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqLwoKLyoKICogQXV0aG9yczoKICoJR2FyZXRoIEh1Z2hlcyA8Z2FyZXRoQHZhbGludXguY29tPgogKglMZWlmIERlbGdhc3MgPGxkZWxnYXNzQHJldGluYWxidXJuLm5ldD4KICoJSm9z6SBGb25zZWNhIDxqX3JfZm9uc2VjYUB5YWhvby5jby51az4KICovCgojaW5jbHVkZSAiZ2xoZWFkZXIuaCIKI2luY2x1ZGUgIm10eXBlcy5oIgojaW5jbHVkZSAiaW1wb3J0cy5oIgojaW5jbHVkZSAibWFjcm9zLmgiCiNpbmNsdWRlICJjb2xvcm1hYy5oIgoKI2luY2x1ZGUgInN3cmFzdF9zZXR1cC9zd3Jhc3Rfc2V0dXAuaCIKI2luY2x1ZGUgInRubC90X2NvbnRleHQuaCIKCiNpbmNsdWRlICJtYWNoNjRfY29udGV4dC5oIgojaW5jbHVkZSAibWFjaDY0X3ZiLmgiCiNpbmNsdWRlICJtYWNoNjRfaW9jdGwuaCIKI2luY2x1ZGUgIm1hY2g2NF90cmlzLmgiCiNpbmNsdWRlICJtYWNoNjRfc3RhdGUuaCIKCgojZGVmaW5lIE1BQ0g2NF9URVgxX0JJVCAgICAgICAweDEKI2RlZmluZSBNQUNINjRfVEVYMF9CSVQgICAgICAgMHgyCiNkZWZpbmUgTUFDSDY0X1JHQkFfQklUICAgICAgIDB4NAojZGVmaW5lIE1BQ0g2NF9TUEVDX0JJVCAgICAgICAweDgKI2RlZmluZSBNQUNINjRfRk9HX0JJVCAgICAgICAgMHgxMAojZGVmaW5lIE1BQ0g2NF9YWVpXX0JJVCAgICAgICAweDIwCiNkZWZpbmUgTUFDSDY0X1BURVhfQklUICAgICAgIDB4NDAKI2RlZmluZSBNQUNINjRfTUFYX1NFVFVQICAgICAgMHg4MAoKc3RhdGljIHN0cnVjdCB7CiAgIHZvaWQgICAgICAgICAgICAgICAgKCplbWl0KSggR0xjb250ZXh0ICosIEdMdWludCwgR0x1aW50LCB2b2lkICosIEdMdWludCApOwogICB0bmxfaW50ZXJwX2Z1bmMJCWludGVycDsKICAgdG5sX2NvcHlfcHZfZnVuYwkgICAgICAgIGNvcHlfcHY7CiAgIEdMYm9vbGVhbiAgICAgICAgICAgKCpjaGVja190ZXhfc2l6ZXMpKCBHTGNvbnRleHQgKmN0eCApOwogICBHTHVpbnQgICAgICAgICAgICAgICB2ZXJ0ZXhfc2l6ZTsKICAgR0x1aW50ICAgICAgICAgICAgICAgdmVydGV4X2Zvcm1hdDsKfSBzZXR1cF90YWJbTUFDSDY0X01BWF9TRVRVUF07CgojZGVmaW5lIFRJTllfVkVSVEVYX0ZPUk1BVCAgICAgIDEKI2RlZmluZSBOT1RFWF9WRVJURVhfRk9STUFUICAgICAyCiNkZWZpbmUgVEVYMF9WRVJURVhfRk9STUFUICAgICAgMwojZGVmaW5lIFRFWDFfVkVSVEVYX0ZPUk1BVCAgICAgIDQKI2RlZmluZSBQUk9KX1RFWDFfVkVSVEVYX0ZPUk1BVCAwCiNkZWZpbmUgVEVYMl9WRVJURVhfRk9STUFUICAgICAgMAojZGVmaW5lIFRFWDNfVkVSVEVYX0ZPUk1BVCAgICAgIDAKI2RlZmluZSBQUk9KX1RFWDNfVkVSVEVYX0ZPUk1BVCAwCgojZGVmaW5lIERPX1hZWlcgKElORCAmIE1BQ0g2NF9YWVpXX0JJVCkKI2RlZmluZSBET19SR0JBIChJTkQgJiBNQUNINjRfUkdCQV9CSVQpCiNkZWZpbmUgRE9fU1BFQyAoSU5EICYgTUFDSDY0X1NQRUNfQklUKQojZGVmaW5lIERPX0ZPRyAgKElORCAmIE1BQ0g2NF9GT0dfQklUKQojZGVmaW5lIERPX1RFWDAgKElORCAmIE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBET19URVgxIChJTkQgJiBNQUNINjRfVEVYMV9CSVQpCiNkZWZpbmUgRE9fVEVYMiAwCiNkZWZpbmUgRE9fVEVYMyAwCiNkZWZpbmUgRE9fUFRFWCAoSU5EICYgTUFDSDY0X1BURVhfQklUKQoKI2RlZmluZSBWRVJURVggbWFjaDY0VmVydGV4CiNkZWZpbmUgTE9DQUxWQVJTIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVChjdHgpOwojZGVmaW5lIEdFVF9WSUVXUE9SVF9NQVQoKSBtbWVzYS0+aHdfdmlld3BvcnQKI2RlZmluZSBHRVRfVEVYU09VUkNFKG4pICBtbWVzYS0+dG11X3NvdXJjZVtuXQojZGVmaW5lIEdFVF9WRVJURVhfRk9STUFUKCkgbW1lc2EtPnZlcnRleF9mb3JtYXQKI2RlZmluZSBHRVRfVkVSVEVYX1NUT1JFKCkgbW1lc2EtPnZlcnRzCiNkZWZpbmUgR0VUX1ZFUlRFWF9TSVpFKCkgbW1lc2EtPnZlcnRleF9zaXplICogc2l6ZW9mKEdMdWludCkKCiNkZWZpbmUgSEFWRV9IV19WSUVXUE9SVCAgICAwCiNkZWZpbmUgSEFWRV9IV19ESVZJREUgICAgICAwCiNkZWZpbmUgSEFWRV9SR0JBX0NPTE9SICAgICAwCiNkZWZpbmUgSEFWRV9USU5ZX1ZFUlRJQ0VTICAxCiNkZWZpbmUgSEFWRV9OT1RFWF9WRVJUSUNFUyAxCiNkZWZpbmUgSEFWRV9URVgwX1ZFUlRJQ0VTICAxCiNkZWZpbmUgSEFWRV9URVgxX1ZFUlRJQ0VTICAxCiNkZWZpbmUgSEFWRV9URVgyX1ZFUlRJQ0VTICAwCiNkZWZpbmUgSEFWRV9URVgzX1ZFUlRJQ0VTICAwCiNkZWZpbmUgSEFWRV9QVEVYX1ZFUlRJQ0VTICAwCgojZGVmaW5lIFVOVklFV1BPUlRfVkFSUwkJCQkJCVwKICAgY29uc3QgR0xmbG9hdCBkeCA9IC0gKEdMZmxvYXQpbW1lc2EtPmRyYXdYIC0gU1VCUElYRUxfWDsJXAogICBjb25zdCBHTGZsb2F0IGR5ID0gKG1tZXNhLT5kcmlEcmF3YWJsZS0+aCArCQkJXAoJCSAgICAgICAoR0xmbG9hdCltbWVzYS0+ZHJhd1kgICsgU1VCUElYRUxfWSk7CVwKICAgY29uc3QgR0xmbG9hdCBzeiA9IDEuMCAvIG1tZXNhLT5kZXB0aF9zY2FsZQoKI2lmIE1BQ0g2NF9OQVRJVkVfVlRYRk1UCiAgIAojZGVmaW5lIFVOVklFV1BPUlRfWCh4KSAgICAoKEdMZmxvYXQpKHgpIC8gNC4wKSAgKyAgZHgKI2RlZmluZSBVTlZJRVdQT1JUX1koeSkgIC0gKChHTGZsb2F0KSh5KSAvIDQuMCkgICsgIGR5CiNkZWZpbmUgVU5WSUVXUE9SVF9aKHopICAgIChHTGZsb2F0KSgoeikgPj4gMTUpICAqICBzegoKI2Vsc2UKCiNkZWZpbmUgVU5WSUVXUE9SVF9YKHgpICAgIHggICsgIGR4OwojZGVmaW5lIFVOVklFV1BPUlRfWSh5KSAgLSB5ICArICBkeTsKI2RlZmluZSBVTlZJRVdQT1JUX1ooeikgICAgeiAgKiAgc3o7CgojZW5kaWYKCiNkZWZpbmUgUFRFWF9GQUxMQkFDSygpIEZBTExCQUNLKE1BQ0g2NF9DT05URVhUKGN0eCksIE1BQ0g2NF9GQUxMQkFDS19URVhUVVJFLCAxKQoKI2RlZmluZSBJTVBPUlRfRkxPQVRfQ09MT1JTIG1hY2g2NF9pbXBvcnRfZmxvYXRfY29sb3JzCiNkZWZpbmUgSU1QT1JUX0ZMT0FUX1NQRUNfQ09MT1JTIG1hY2g2NF9pbXBvcnRfZmxvYXRfc3BlY19jb2xvcnMKCiNkZWZpbmUgSU5URVJQX1ZFUlRFWCBzZXR1cF90YWJbbW1lc2EtPlNldHVwSW5kZXhdLmludGVycAojZGVmaW5lIENPUFlfUFZfVkVSVEVYIHNldHVwX3RhYlttbWVzYS0+U2V0dXBJbmRleF0uY29weV9wdgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2VuZXJhdGUgIHB2LWNvcHlpbmcgYW5kIHRyYW5zbGF0aW9uIGZ1bmN0aW9ucyAgICAgICAgICAgICAgKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKCiNkZWZpbmUgVEFHKHgpIG1hY2g2NF8jI3gKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmIuYyIKCiNlbHNlCgojZGVmaW5lIFRBRyh4KSBtYWNoNjRfIyN4CiNpbmNsdWRlICJ0bmxfZGQvdF9kZF92Yi5jIgoKI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgR2VuZXJhdGUgdmVydGV4IGVtaXQgYW5kIGludGVycCBmdW5jdGlvbnMgICAgICAgICAgICAgICAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaWYgTUFDSDY0X05BVElWRV9WVFhGTVQKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2cKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dncwojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2d0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dndDB0MQojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9QVEVYX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dncHQwCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfU1BFQ19CSVR8TUFDSDY0X1RFWDBfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dzdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVHxNQUNINjRfVEVYMF9CSVR8XAogICAgICAgICAgICAgTUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dzdDB0MQojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1NQRUNfQklUfE1BQ0g2NF9URVgwX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfUFRFWF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z3NwdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfU1BFQ19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2ZzCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2Z0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVR8TUFDSDY0X1RFWDBfQklUfFwKICAgICAgICAgICAgIE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dnZnQwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9URVgwX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfUFRFWF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2ZwdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2ZzdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmc3QwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1BURVhfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmc3B0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3QwCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3QwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfRk9HX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2YKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19mdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZnQwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dzCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2d0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ3QwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1NQRUNfQklUfE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dzdDAKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1NQRUNfQklUfE1BQ0g2NF9URVgwX0JJVHxNQUNINjRfVEVYMV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nc3QwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZgojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfU1BFQ19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZnMKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVR8TUFDSDY0X1RFWDBfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ2Z0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ2Z0MHQxCiNpbmNsdWRlICJtYWNoNjRfbmF0aXZlX3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZnN0MAojaW5jbHVkZSAibWFjaDY0X25hdGl2ZV92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfU1BFQ19CSVR8TUFDSDY0X1RFWDBfQklUfFwKICAgICAgICAgICAgIE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dmc3QwdDEKI2luY2x1ZGUgIm1hY2g2NF9uYXRpdmVfdmJ0bXAuaCIKCiNlbHNlCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dnCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dncwojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z3QwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9URVgwX0JJVHxNQUNINjRfVEVYMV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z3QwdDEKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9QVEVYX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dncHQwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z3N0MAojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfU1BFQ19CSVR8TUFDSDY0X1RFWDBfQklUfFwKICAgICAgICAgICAgIE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dnc3QwdDEKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1NQRUNfQklUfE1BQ0g2NF9URVgwX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfUFRFWF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z3NwdDAKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2YKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVR8TUFDSDY0X1NQRUNfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmcwojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2Z0MAojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVR8XAogICAgICAgICAgICAgTUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVR8XAogICAgICAgICAgICAgTUFDSDY0X1BURVhfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfd2dmcHQwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxcCiAgICAgICAgICAgICBNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2ZzdDAKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9YWVpXX0JJVHxNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVR8TUFDSDY0X1NQRUNfQklUfFwKICAgICAgICAgICAgIE1BQ0g2NF9URVgwX0JJVHxNQUNINjRfVEVYMV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI193Z2ZzdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1hZWldfQklUfE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfU1BFQ19CSVR8XAogICAgICAgICAgICAgTUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9QVEVYX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3dnZnNwdDAKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX3QwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfVEVYMF9CSVR8TUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X0ZPR19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19mCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19mdDAKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9URVgwX0JJVHxNQUNINjRfVEVYMV9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19mdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZwojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9TUEVDX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dzCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ3QwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2d0MHQxCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X1NQRUNfQklUfE1BQ0g2NF9URVgwX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dzdDAKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfU1BFQ19CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dzdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ2YKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfU1BFQ19CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZnMKI2luY2x1ZGUgIm1hY2g2NF92YnRtcC5oIgoKI2RlZmluZSBJTkQgKE1BQ0g2NF9SR0JBX0JJVHxNQUNINjRfRk9HX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZnQwCiNpbmNsdWRlICJtYWNoNjRfdmJ0bXAuaCIKCiNkZWZpbmUgSU5EIChNQUNINjRfUkdCQV9CSVR8TUFDSDY0X0ZPR19CSVR8TUFDSDY0X1RFWDBfQklUfE1BQ0g2NF9URVgxX0JJVCkKI2RlZmluZSBUQUcoeCkgeCMjX2dmdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxNQUNINjRfVEVYMF9CSVQpCiNkZWZpbmUgVEFHKHgpIHgjI19nZnN0MAojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZGVmaW5lIElORCAoTUFDSDY0X1JHQkFfQklUfE1BQ0g2NF9GT0dfQklUfE1BQ0g2NF9TUEVDX0JJVHxNQUNINjRfVEVYMF9CSVR8XAogICAgICAgICAgICAgTUFDSDY0X1RFWDFfQklUKQojZGVmaW5lIFRBRyh4KSB4IyNfZ2ZzdDB0MQojaW5jbHVkZSAibWFjaDY0X3ZidG1wLmgiCgojZW5kaWYKCnN0YXRpYyB2b2lkIGluaXRfc2V0dXBfdGFiKCB2b2lkICkKewogICBpbml0X3dnKCk7CiAgIGluaXRfd2dzKCk7CiAgIGluaXRfd2d0MCgpOwogICBpbml0X3dndDB0MSgpOwogICBpbml0X3dncHQwKCk7CiAgIGluaXRfd2dzdDAoKTsKICAgaW5pdF93Z3N0MHQxKCk7CiAgIGluaXRfd2dzcHQwKCk7CiAgIGluaXRfd2dmKCk7CiAgIGluaXRfd2dmcygpOwogICBpbml0X3dnZnQwKCk7CiAgIGluaXRfd2dmdDB0MSgpOwogICBpbml0X3dnZnB0MCgpOwogICBpbml0X3dnZnN0MCgpOwogICBpbml0X3dnZnN0MHQxKCk7CiAgIGluaXRfd2dmc3B0MCgpOwogICBpbml0X3QwKCk7CiAgIGluaXRfdDB0MSgpOwogICBpbml0X2YoKTsKICAgaW5pdF9mdDAoKTsKICAgaW5pdF9mdDB0MSgpOwogICBpbml0X2coKTsKICAgaW5pdF9ncygpOwogICBpbml0X2d0MCgpOwogICBpbml0X2d0MHQxKCk7CiAgIGluaXRfZ3N0MCgpOwogICBpbml0X2dzdDB0MSgpOwogICBpbml0X2dmKCk7CiAgIGluaXRfZ2ZzKCk7CiAgIGluaXRfZ2Z0MCgpOwogICBpbml0X2dmdDB0MSgpOwogICBpbml0X2dmc3QwKCk7CiAgIGluaXRfZ2ZzdDB0MSgpOwp9CgoKCnZvaWQgbWFjaDY0UHJpbnRTZXR1cEZsYWdzKCBjaGFyICptc2csIEdMdWludCBmbGFncyApCnsKICAgZnByaW50Ziggc3RkZXJyLCAiJXM6ICVkICVzJXMlcyVzJXMlcyVzXG4iLAoJICAgIG1zZywKCSAgICAoaW50KWZsYWdzLAoJICAgIChmbGFncyAmIE1BQ0g2NF9YWVpXX0JJVCkJPyAiIHh5encsIiA6ICIiLAoJICAgIChmbGFncyAmIE1BQ0g2NF9SR0JBX0JJVCkJPyAiIHJnYmEsIiA6ICIiLAoJICAgIChmbGFncyAmIE1BQ0g2NF9TUEVDX0JJVCkJPyAiIHNwZWMsIiA6ICIiLAoJICAgIChmbGFncyAmIE1BQ0g2NF9GT0dfQklUKQk/ICIgZm9nLCIgOiAiIiwKCSAgICAoZmxhZ3MgJiBNQUNINjRfVEVYMF9CSVQpCT8gIiB0ZXgtMCwiIDogIiIsCgkgICAgKGZsYWdzICYgTUFDSDY0X1RFWDFfQklUKQk/ICIgdGV4LTEsIiA6ICIiLAoJICAgIChmbGFncyAmIE1BQ0g2NF9QVEVYX0JJVCkJPyAiIHB0ZXgsIiA6ICIiKTsKfQoKCgoKdm9pZCBtYWNoNjRDaGVja1RleFNpemVzKCBHTGNvbnRleHQgKmN0eCApCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKCBjdHggKTsKCiAgIGlmICghc2V0dXBfdGFiW21tZXNhLT5TZXR1cEluZGV4XS5jaGVja190ZXhfc2l6ZXMoY3R4KSkgewogICAgICBUTkxjb250ZXh0ICp0bmwgPSBUTkxfQ09OVEVYVChjdHgpOwoKICAgICAgLyogSW52YWxpZGF0ZSBzdG9yZWQgdmVydHMKICAgICAgICovCiAgICAgIG1tZXNhLT5TZXR1cE5ld0lucHV0cyA9IH4wOwogICAgICBtbWVzYS0+U2V0dXBJbmRleCB8PSBNQUNINjRfUFRFWF9CSVQ7CgogICAgICBpZiAoIW1tZXNhLT5GYWxsYmFjayAmJgoJICAhKGN0eC0+X1RyaWFuZ2xlQ2FwcyAmIChERF9UUklfTElHSFRfVFdPU0lERXxERF9UUklfVU5GSUxMRUQpKSkgewoJIHRubC0+RHJpdmVyLlJlbmRlci5JbnRlcnAgPSBzZXR1cF90YWJbbW1lc2EtPlNldHVwSW5kZXhdLmludGVycDsKCSB0bmwtPkRyaXZlci5SZW5kZXIuQ29weVBWID0gc2V0dXBfdGFiW21tZXNhLT5TZXR1cEluZGV4XS5jb3B5X3B2OwogICAgICB9CiAgIH0KfQoKdm9pZCBtYWNoNjRCdWlsZFZlcnRpY2VzKCBHTGNvbnRleHQgKmN0eCwKCQkJR0x1aW50IHN0YXJ0LAoJCQlHTHVpbnQgY291bnQsCgkJCUdMdWludCBuZXdpbnB1dHMgKQp7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVCggY3R4ICk7CiAgIEdMdWludCBzdHJpZGUgPSBtbWVzYS0+dmVydGV4X3NpemUgKiBzaXplb2YoaW50KTsKICAgR0x1Ynl0ZSAqdiA9ICgoR0x1Ynl0ZSAqKW1tZXNhLT52ZXJ0cyArIChzdGFydCAqIHN0cmlkZSkpOwoKICAgbmV3aW5wdXRzIHw9IG1tZXNhLT5TZXR1cE5ld0lucHV0czsKICAgbW1lc2EtPlNldHVwTmV3SW5wdXRzID0gMDsKCiAgIGlmICghbmV3aW5wdXRzKQogICAgICByZXR1cm47CgogICBpZiAobmV3aW5wdXRzICYgVkVSVF9CSVRfUE9TKSB7CiAgICAgIHNldHVwX3RhYlttbWVzYS0+U2V0dXBJbmRleF0uZW1pdCggY3R4LCBzdGFydCwgY291bnQsIHYsIHN0cmlkZSApOwogICB9IGVsc2UgewogICAgICBHTHVpbnQgaW5kID0gMDsKCiAgICAgIGlmIChuZXdpbnB1dHMgJiBWRVJUX0JJVF9DT0xPUjApCgkgaW5kIHw9IE1BQ0g2NF9SR0JBX0JJVDsKCiAgICAgIGlmIChuZXdpbnB1dHMgJiBWRVJUX0JJVF9DT0xPUjEpCgkgaW5kIHw9IE1BQ0g2NF9TUEVDX0JJVDsKCiAgICAgIGlmIChuZXdpbnB1dHMgJiBWRVJUX0JJVF9URVgwKQoJIGluZCB8PSBNQUNINjRfVEVYMF9CSVQ7CgogICAgICBpZiAobmV3aW5wdXRzICYgVkVSVF9CSVRfVEVYMSkKCSBpbmQgfD0gTUFDSDY0X1RFWDFfQklUOwoKICAgICAgaWYgKG5ld2lucHV0cyAmIFZFUlRfQklUX0ZPRykKCSBpbmQgfD0gTUFDSDY0X0ZPR19CSVQ7CgogICAgICBpZiAobW1lc2EtPlNldHVwSW5kZXggJiBNQUNINjRfUFRFWF9CSVQpCgkgaW5kID0gfjA7CgogICAgICBpbmQgJj0gbW1lc2EtPlNldHVwSW5kZXg7CgogICAgICBpZiAoaW5kKSB7Cgkgc2V0dXBfdGFiW2luZF0uZW1pdCggY3R4LCBzdGFydCwgY291bnQsIHYsIHN0cmlkZSApOwogICAgICB9CiAgIH0KfQoKdm9pZCBtYWNoNjRDaG9vc2VWZXJ0ZXhTdGF0ZSggR0xjb250ZXh0ICpjdHggKQp7CiAgIFROTGNvbnRleHQgKnRubCA9IFROTF9DT05URVhUKGN0eCk7CiAgIG1hY2g2NENvbnRleHRQdHIgbW1lc2EgPSBNQUNINjRfQ09OVEVYVCggY3R4ICk7CiAgIEdMdWludCBpbmQgPSBNQUNINjRfWFlaV19CSVR8TUFDSDY0X1JHQkFfQklUOwogICAKICAgaWYgKGN0eC0+X1RyaWFuZ2xlQ2FwcyAmIEREX1NFUEFSQVRFX1NQRUNVTEFSKQogICAgICBpbmQgfD0gTUFDSDY0X1NQRUNfQklUOwoKICAgaWYgKGN0eC0+Rm9nLkVuYWJsZWQpCiAgICAgIGluZCB8PSBNQUNINjRfRk9HX0JJVDsKCiAgIGlmIChjdHgtPlRleHR1cmUuX0VuYWJsZWRVbml0cykgewogICAgICBpbmQgfD0gTUFDSDY0X1RFWDBfQklUOwogICAgICBpZiAoY3R4LT5UZXh0dXJlLlVuaXRbMF0uX1JlYWxseUVuYWJsZWQgJiYKCSAgY3R4LT5UZXh0dXJlLlVuaXRbMV0uX1JlYWxseUVuYWJsZWQpIHsKCSBpbmQgfD0gTUFDSDY0X1RFWDFfQklUOwogICAgICB9CiAgIH0KCiAgIG1tZXNhLT5TZXR1cEluZGV4ID0gaW5kOwoKICAgaWYgKGN0eC0+X1RyaWFuZ2xlQ2FwcyAmIChERF9UUklfTElHSFRfVFdPU0lERXxERF9UUklfVU5GSUxMRUQpKSB7CiAgICAgIHRubC0+RHJpdmVyLlJlbmRlci5JbnRlcnAgPSBtYWNoNjRfaW50ZXJwX2V4dHJhczsKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkNvcHlQViA9IG1hY2g2NF9jb3B5X3B2X2V4dHJhczsKICAgfSBlbHNlIHsKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkludGVycCA9IHNldHVwX3RhYltpbmRdLmludGVycDsKICAgICAgdG5sLT5Ecml2ZXIuUmVuZGVyLkNvcHlQViA9IHNldHVwX3RhYltpbmRdLmNvcHlfcHY7CiAgIH0KCiNpZiAwCiAgIGlmIChNQUNINjRfREVCVUcgJiBERUJVR19WRVJCT1NFX01TRykgewogICAgICBtYWNoNjRQcmludFNldHVwRmxhZ3MoIF9fRlVOQ1RJT05fXywgaW5kICk7CiAgfQojZW5kaWYKCiAgIGlmIChzZXR1cF90YWJbaW5kXS52ZXJ0ZXhfZm9ybWF0ICE9IG1tZXNhLT52ZXJ0ZXhfZm9ybWF0KSB7CiAgICAgIEZMVVNIX0JBVENIKG1tZXNhKTsKICAgICAgbW1lc2EtPnZlcnRleF9mb3JtYXQgPSBzZXR1cF90YWJbaW5kXS52ZXJ0ZXhfZm9ybWF0OwogICAgICBtbWVzYS0+dmVydGV4X3NpemUgPSBzZXR1cF90YWJbaW5kXS52ZXJ0ZXhfc2l6ZTsKICAgfQp9CgoKI2lmIDAKdm9pZCBtYWNoNjRfZW1pdF9jb250aWd1b3VzX3ZlcnRzKCBHTGNvbnRleHQgKmN0eCwKCQkJCSBHTHVpbnQgc3RhcnQsCgkJCQkgR0x1aW50IGNvdW50ICkKewogICBtYWNoNjRDb250ZXh0UHRyIG1tZXNhID0gTUFDSDY0X0NPTlRFWFQoY3R4KTsKICAgR0x1aW50IHZlcnRleF9zaXplID0gbW1lc2EtPnZlcnRleF9zaXplICogNDsKICAgR0x1aW50ICpkZXN0ID0gbWFjaDY0QWxsb2NEbWFMb3coIG1tZXNhLCAoY291bnQtc3RhcnQpICogdmVydGV4X3NpemUpOwogICBzZXR1cF90YWJbbW1lc2EtPlNldHVwSW5kZXhdLmVtaXQoIGN0eCwgc3RhcnQsIGNvdW50LCBkZXN0LCB2ZXJ0ZXhfc2l6ZSApOwp9CiNlbmRpZgoKCnZvaWQgbWFjaDY0SW5pdFZCKCBHTGNvbnRleHQgKmN0eCApCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKGN0eCk7CiAgIEdMdWludCBzaXplID0gVE5MX0NPTlRFWFQoY3R4KS0+dmIuU2l6ZTsKCiAgIG1tZXNhLT52ZXJ0cyA9IChHTHVieXRlICopQUxJR05fTUFMTE9DKHNpemUgKiA0ICogMTYsIDMyKTsKCiAgIHsKICAgICAgc3RhdGljIGludCBmaXJzdHRpbWUgPSAxOwogICAgICBpZiAoZmlyc3R0aW1lKSB7CgkgaW5pdF9zZXR1cF90YWIoKTsKCSBmaXJzdHRpbWUgPSAwOwogICAgICB9CiAgIH0KfQoKCnZvaWQgbWFjaDY0RnJlZVZCKCBHTGNvbnRleHQgKmN0eCApCnsKICAgbWFjaDY0Q29udGV4dFB0ciBtbWVzYSA9IE1BQ0g2NF9DT05URVhUKGN0eCk7CiAgIGlmIChtbWVzYS0+dmVydHMpIHsKICAgICAgQUxJR05fRlJFRShtbWVzYS0+dmVydHMpOwogICAgICBtbWVzYS0+dmVydHMgPSAwOwogICB9Cn0K