LyoKICogIFUtYm9vdCAtIHg4NiBTdGFydHVwIENvZGUKICoKICogKEMpIENvcHlyaWdodCAyMDA4LTIwMTEKICogR3JhZW1lIFJ1c3MsIDxncmFlbWUucnVzc0BnbWFpbC5jb20+CiAqCiAqIChDKSBDb3B5cmlnaHQgMjAwMgogKiBEYW5pZWwgRW5nc3Ry9m0sIE9taWNyb24gQ2V0aSBBQiwgPGRhbmllbEBvbWljcm9uLnNlPgogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb25maWcuaD4KI2luY2x1ZGUgPHZlcnNpb24uaD4KI2luY2x1ZGUgPGFzbS9nbG9iYWxfZGF0YS5oPgojaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci1mbGFncy5oPgoKLnNlY3Rpb24gLnRleHQKLmNvZGUzMgouZ2xvYmwgX3N0YXJ0Ci50eXBlIF9zdGFydCwgQGZ1bmN0aW9uCi5nbG9ibCBfeDg2Ym9vdF9zdGFydApfeDg2Ym9vdF9zdGFydDoKCS8qCgkgKiBUaGlzIGlzIHRoZSBmYWlsIHNhZmUgMzItYml0IGJvb3RzdHJhcCBlbnRyeSBwb2ludC4gVGhlCgkgKiBmb2xsb3dpbmcgY29kZSBpcyBub3QgZXhlY3V0ZWQgZnJvbSBhIGNvbGQtcmVzZXQgKGFjdHVhbGx5LCBhCgkgKiBsb3Qgb2YgaXQgaXMsIGJ1dCBmcm9tIHJlYWwtbW9kZSBhZnRlciBjb2xkIHJlc2V0LiBJdCBpcwoJICogcmVwZWF0ZWQgaGVyZSB0byBwdXQgdGhlIGJvYXJkIGludG8gYSBzdGF0ZSBhcyBjbG9zZSB0byBjb2xkCgkgKiByZXNldCBhcyBuZWNlc3NhcnkpCgkgKi8KCWNsaQoJY2xkCgoJLyogVHVybiBvZiBjYWNoZSAodGhpcyBtaWdodCByZXF1aXJlIGEgNDg2LWNsYXNzIENQVSkgKi8KCW1vdmwJJWNyMCwgJWVheAoJb3JsCSQoWDg2X0NSMF9OVyB8IFg4Nl9DUjBfQ0QpLCAlZWF4Cgltb3ZsCSVlYXgsICVjcjAKCXdiaW52ZAoKCS8qIFRlbGwgMzItYml0IGNvZGUgaXQgaXMgYmVpbmcgZW50ZXJlZCBmcm9tIGFuIGluLVJBTSBjb3B5ICovCgltb3Z3CSRHRF9GTEdfV0FSTV9CT09ULCAlYngKX3N0YXJ0OgoJLyogVGhpcyBpcyB0aGUgMzItYml0IGNvbGQtcmVzZXQgZW50cnkgcG9pbnQgKi8KCgkvKiBMb2FkIHRoZSBzZWdlbWVudCByZWdpc3RlcyB0byBtYXRjaCB0aGUgZ2R0IGxvYWRlZCBpbiBzdGFydDE2LlMgKi8KCW1vdmwJJDB4MTgsICVlYXgKCW1vdncJJWF4LCAlZnMKCW1vdncJJWF4LCAlZHMKCW1vdncJJWF4LCAlZ3MKCW1vdncJJWF4LCAlZXMKCW1vdncJJWF4LCAlc3MKCgkvKiBDbGVhciB0aGUgaW50ZXJ1cHQgdmVjdG9ycyAqLwoJbGlkdAlibGFua19pZHRfcHRyCgoJLyogRWFybHkgcGxhdGZvcm0gaW5pdCAoc2V0dXAgZ3BpbywgZXRjICkgKi8KCWptcAllYXJseV9ib2FyZF9pbml0Ci5nbG9ibCBlYXJseV9ib2FyZF9pbml0X3JldAplYXJseV9ib2FyZF9pbml0X3JldDoKCgkvKiBJbml0aWFsaXNlIENhY2hlLUFzLVJBTSAqLwoJam1wCWNhcl9pbml0Ci5nbG9ibCBjYXJfaW5pdF9yZXQKY2FyX2luaXRfcmV0OgoJLyoKCSAqIFdlIG5vdyBoYXZlIENPTkZJR19TWVNfQ0FSX1NJWkUgYnl0ZXMgb2YgQ2FjaGUtQXMtUkFNIChvciBTUkFNLAoJICogb3IgZnVsbHkgaW5pdGlhbGlzZWQgU0RSQU0gLSB3ZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGljaCkKCSAqIHN0YXJ0aW5nIGF0IENPTkZJR19TWVNfQ0FSX0FERFIgdG8gYmUgdXNlZCBhcyBhIHRlbXBvcmFyeSBzdGFjawoJICovCgltb3ZsCSRDT05GSUdfU1lTX0lOSVRfU1BfQUREUiwgJWVzcAoKCS8qIFNldCBwYXJhbWV0ZXIgdG8gYm9hcmRfaW5pdF9mKCkgdG8gYm9vdCBmbGFncyAqLwoJeG9ybAklZWF4LCAlZWF4Cgltb3Z3CSVieCwgJWF4CgoJLyogRW50ZXIsIFUtYm9vdCEgKi8KCWNhbGwJYm9hcmRfaW5pdF9mCgoJLyogaW5kaWNhdGUgKGxhY2sgb2YpIHByb2dyZXNzICovCgltb3Z3CSQweDg1LCAlYXgKCWptcAlkaWUKCi5nbG9ibCByZWxvY2F0ZV9jb2RlCi50eXBlIHJlbG9jYXRlX2NvZGUsIEBmdW5jdGlvbgpyZWxvY2F0ZV9jb2RlOgoJLyoKCSAqIFNEUkFNIGhhcyBiZWVuIGluaXRpYWxpc2VkLCBVLUJvb3QgY29kZSBoYXMgYmVlbiBjb3BpZWQgaW50bwoJICogUkFNLCBCU1MgaGFzIGJlZW4gY2xlYXJlZCBhbmQgcmVsb2NhdGlvbiBhZGp1c3RtZW50cyBoYXZlIGJlZW4KCSAqIG1hZGUuIEl0IGlzIG5vdyB0aW1lIHRvIGp1bXAgaW50byB0aGUgaW4tUkFNIGNvcHkgb2YgVS1Cb290CgkgKgoJICogJWVheCA9IEFkZHJlc3Mgb2YgdG9wIG9mIHN0YWNrCgkgKiAlZWR4ID0gQWRkcmVzcyBvZiBHbG9iYWwgRGF0YQoJICogJWVjeCA9IEJhc2UgYWRkcmVzcyBvZiBpbi1SQU0gY29weSBvZiBVLUJvb3QKCSAqLwoKCS8qIFNldHVwIHN0YWNrIGluIFJBTSAqLwoJbW92bAklZWF4LCAlZXNwCgoJLyogU2V0dXAgY2FsbCBhZGRyZXNzIG9mIGluLVJBTSBjb3B5IG9mIGJvYXJkX2luaXRfcigpICovCgltb3ZsCSRib2FyZF9pbml0X3IsICVlYnAKCWFkZGwJKEdEX1JFTE9DX09GRiAqIDQpKCVlZHgpLCAlZWJwCgoJLyogU2V0dXAgcGFyYW1ldGVycyB0byBib2FyZF9pbml0X3IoKSAqLwoJbW92bAklZWR4LCAlZWF4Cgltb3ZsCSVlY3gsICVlZHgKCgkvKiBKdW1wIHRvIGluLVJBTSBjb3B5IG9mIGJvYXJkX2luaXRfcigpICovCgljYWxsCSolZWJwCgpkaWU6CWhsdAoJam1wCWRpZQoJaGx0CgpibGFua19pZHRfcHRyOgoJLndvcmQJMAkJLyogbGltaXQgKi8KCS5sb25nCTAJCS8qIGJhc2UgKi8K