Ly8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qICAgICAgICAgQVRNRUwgTWljcm9jb250cm9sbGVyIFNvZnR3YXJlIFN1cHBvcnQgIC0gIFJPVVNTRVQgIC0KLy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SCi8vKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi8vKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQovLyogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLy8qIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLy8qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLAovLyogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgovLyogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLy8qIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKLy8qIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi8vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBGaWxlIE5hbWUgICAgICAgICAgIDogbGliX0FUOTFTQU03WDI1Ni5oCi8vKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMjU2IGlubGluZWQgZnVuY3Rpb25zCi8vKiBHZW5lcmF0ZWQgICAgICAgICAgIDogQVQ5MSBTVyBBcHBsaWNhdGlvbiBHcm91cCAgMDUvMjAvMjAwNSAoMTY6MjI6MjkpCi8vKgovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfcG1jX1NBTTdYLmgvMS4xL1R1ZSBGZWIgIDEgMDg6MzI6MTAgMjAwNS8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9WUkVHXzYwODVCLmgvMS4xL1R1ZSBGZWIgIDEgMTY6MjA6NDcgMjAwNS8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9zc2MuaC8xLjQvRnJpIEphbiAzMSAxMjoxOToyMCAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3dkdGNfNjA4MEEuaC8xLjEvV2VkIE9jdCAgNiAxMDozODozMCAyMDA0Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9zcGkyLmgvMS4xL01vbiBBdWcgMjUgMTQ6MjM6NTIgMjAwMy8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waXRjXzYwNzlBLmgvMS4yL1R1ZSBOb3YgIDkgMTQ6NDM6NTYgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX2Flc182MTQ5YS5oLzEuMS9Nb24gSmFuIDE3IDA3OjQzOjA5IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdHdpLmgvMS4zL01vbiBKdWwgMTkgMTQ6Mjc6NTggMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3J0dGNfNjA4MUEuaC8xLjEvV2VkIE9jdCAgNiAxMDozOTozOCAyMDA0Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VkcC5oLzEuNC9XZWQgRmViIDE2IDA4OjM5OjM0IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdGNfMTc1M2IuaC8xLjEvRnJpIEphbiAzMSAxMjoyMDowMiAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX01DX1NBTTdYLmgvMS4xL1RodSBNYXIgMjUgMTU6MTk6MTQgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX2Nhbl9BVDkxLmgvMS40L0ZyaSBPY3QgMTcgMDk6MTI6NTAgMjAwMy8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9QV01fU0FNLmgvMS4zL1RodSBKYW4gMjIgMTA6MTA6NTAgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8KLy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgbGliX0FUOTFTQU03WDI1Nl9ICiNkZWZpbmUgbGliX0FUOTFTQU03WDI1Nl9ICgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBBSUMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAoKHZvaWQgKCopICgpKSAweEU1MUZGRjIwKSAvLyBsZHIsIHBjLCBbcGMsICMtJkYyMF0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ29uZmlndXJlSXQKLy8qIFxicmllZiBJbnRlcnJ1cHQgSGFuZGxlciBJbml0aWFsaXphdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfQ29uZmlndXJlSXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkLCAgICAgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUKCXVuc2lnbmVkIGludCBwcmlvcml0eSwgICAvLyBcYXJnIHByaW9yaXR5IHRvIGdpdmUgdG8gdGhlIGludGVycnVwdAoJdW5zaWduZWQgaW50IHNyY190eXBlLCAgIC8vIFxhcmcgYWN0aXZhdGlvbiBhbmQgc2Vuc2Ugb2YgYWN0aXZhdGlvbgoJdm9pZCAoKm5ld0hhbmRsZXIpICh2b2lkKSApIC8vIFxhcmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIKewoJdW5zaWduZWQgaW50IG9sZEhhbmRsZXI7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA7CgogICAgb2xkSGFuZGxlciA9IHBBaWMtPkFJQ19TVlJbaXJxX2lkXTsKCiAgICBtYXNrID0gMHgxIDw8IGlycV9pZCA7CiAgICAvLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrIDsKICAgIC8vKiBTYXZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lIHBvaW50ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkKICAgIHBBaWMtPkFJQ19TVlJbaXJxX2lkXSA9ICh1bnNpZ25lZCBpbnQpIG5ld0hhbmRsZXIgOwogICAgLy8qIFN0b3JlIHRoZSBTb3VyY2UgTW9kZSBSZWdpc3RlcgogICAgcEFpYy0+QUlDX1NNUltpcnFfaWRdID0gc3JjX3R5cGUgfCBwcmlvcml0eSAgOwogICAgLy8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgICBwQWljLT5BSUNfSUNDUiA9IG1hc2sgOwoKCXJldHVybiBvbGRIYW5kbGVyOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRW5hYmxlSXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCApIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlciB0byBpbml0aWFsaXplCnsKICAgIC8vKiBFbmFibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAgIHBBaWMtPkFJQ19JRUNSID0gMHgxIDw8IGlycV9pZCA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0Rpc2FibGVJdCAoCglBVDkxUFNfQUlDIHBBaWMsICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkICkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUKewogICAgdW5zaWduZWQgaW50IG1hc2sgPSAweDEgPDwgaXJxX2lkOwogICAgLy8qIERpc2FibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAgIHBBaWMtPkFJQ19JRENSID0gbWFzayA7CiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApCiAgICBwQWljLT5BSUNfSUNDUiA9IG1hc2sgOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0NsZWFySXQKLy8qIFxicmllZiBDbGVhciBjb3JyZXNwb25kaW5nIElUIG51bWJlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NsZWFySXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkKSAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQp7CiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApCiAgICBwQWljLT5BSUNfSUNDUiA9ICgweDEgPDwgaXJxX2lkKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0Ci8vKiBcYnJpZWYgQWNrbm93bGVkZ2UgY29ycmVzcG9uZGluZyBJVCBudW1iZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0ICgKCUFUOTFQU19BSUMgcEFpYykgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwp7CiAgICBwQWljLT5BSUNfRU9JQ1IgPSBwQWljLT5BSUNfRU9JQ1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yCi8vKiBcYnJpZWYgQ29uZmlndXJlIHZlY3RvciBoYW5kbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yICgKCXVuc2lnbmVkIGludCAqcFZlY3RvciwgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl2b2lkICgqSGFuZGxlcikgKCkgKSAgIC8vIFxhcmcgSW50ZXJydXB0IEhhbmRsZXIKewoJdW5zaWduZWQgaW50IG9sZFZlY3RvciA9ICpwVmVjdG9yOwoKCWlmICgodW5zaWduZWQgaW50KSBIYW5kbGVyID09ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFKQoJCSpwVmVjdG9yID0gKHVuc2lnbmVkIGludCkgQVQ5MUNfQUlDX0JSQU5DSF9PUENPREU7CgllbHNlCgkJKnBWZWN0b3IgPSAoKCgoKHVuc2lnbmVkIGludCkgSGFuZGxlcikgLSAoKHVuc2lnbmVkIGludCkgcFZlY3RvcikgLSAweDgpID4+IDIpICYgMHgwMEZGRkZGRikgfCAweEVBMDAwMDAwOwoKCXJldHVybiBvbGRWZWN0b3I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfVHJpZwovLyogXGJyaWVmIFRyaWcgYW4gSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkICBBVDkxRl9BSUNfVHJpZyAoCglBVDkxUFNfQUlDIHBBaWMsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMKCXVuc2lnbmVkIGludCBpcnFfaWQpIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlcgp7CglwQWljLT5BSUNfSVNDUiA9ICgweDEgPDwgaXJxX2lkKSA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfSXNBY3RpdmUKLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIGFjdGl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCAgQVQ5MUZfQUlDX0lzQWN0aXZlICgKCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyCnsKCXJldHVybiAocEFpYy0+QUlDX0lTUiAmICgweDEgPDwgaXJxX2lkKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfSXNQZW5kaW5nCi8vKiBcYnJpZWYgVGVzdCBpZiBhbiBJVCBpcyBwZW5kaW5nCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfSXNQZW5kaW5nICgKCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyCnsKCXJldHVybiAocEFpYy0+QUlDX0lQUiAmICgweDEgPDwgaXJxX2lkKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfT3BlbgovLyogXGJyaWVmIFNldCBleGNlcHRpb24gdmVjdG9ycyBhbmQgQUlDIHJlZ2lzdGVycyB0byBkZWZhdWx0IHZhbHVlcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX09wZW4oCglBVDkxUFNfQUlDIHBBaWMsICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMKCXZvaWQgKCpJcnFIYW5kbGVyKSAoKSwgIC8vIFxhcmcgRGVmYXVsdCBJUlEgdmVjdG9yIGV4Y2VwdGlvbgoJdm9pZCAoKkZpcUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IEZJUSB2ZWN0b3IgZXhjZXB0aW9uCgl2b2lkICgqRGVmYXVsdEhhbmRsZXIpICAoKSwgLy8gXGFyZyBEZWZhdWx0IEhhbmRsZXIgc2V0IGluIElTUgoJdm9pZCAoKlNwdXJpb3VzSGFuZGxlcikgKCksIC8vIFxhcmcgRGVmYXVsdCBTcHVyaW91cyBIYW5kbGVyCgl1bnNpZ25lZCBpbnQgcHJvdGVjdE1vZGUpICAgLy8gXGFyZyBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyCnsKCWludCBpOwoKCS8vIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIHNldCBJVlIgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcgoJZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKCQlBVDkxRl9BSUNfRGlzYWJsZUl0KHBBaWMsIGkpOwoJCUFUOTFGX0FJQ19Db25maWd1cmVJdChwQWljLCBpLCBBVDkxQ19BSUNfUFJJT1JfTE9XRVNULCBBVDkxQ19BSUNfU1JDVFlQRV9ISUdIX0xFVkVMLCBEZWZhdWx0SGFuZGxlcik7Cgl9CgoJLy8gU2V0IHRoZSBJUlEgZXhjZXB0aW9uIHZlY3RvcgoJQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvcigodW5zaWduZWQgaW50ICopIDB4MTgsIElycUhhbmRsZXIpOwoJLy8gU2V0IHRoZSBGYXN0IEludGVycnVwdCBleGNlcHRpb24gdmVjdG9yCglBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCh1bnNpZ25lZCBpbnQgKikgMHgxQywgRmlxSGFuZGxlcik7CgoJcEFpYy0+QUlDX1NQVSA9ICh1bnNpZ25lZCBpbnQpIFNwdXJpb3VzSGFuZGxlcjsKCXBBaWMtPkFJQ19EQ1IgPSBwcm90ZWN0TW9kZTsKfQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQREMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0UngKLy8qIFxicmllZiBTZXQgdGhlIG5leHQgcmVjZWl2ZSB0cmFuc2ZlciBkZXNjcmlwdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFJ4ICgKCUFUOTFQU19QREMgcFBEQywgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZAoJdW5zaWduZWQgaW50IGJ5dGVzKSAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQKewoJcFBEQy0+UERDX1JOUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOwoJcFBEQy0+UERDX1JOQ1IgPSBieXRlczsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0VHgKLy8qIFxicmllZiBTZXQgdGhlIG5leHQgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRUeCAoCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkCgl1bnNpZ25lZCBpbnQgYnl0ZXMpICAgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkCnsKCXBQREMtPlBEQ19UTlBSID0gKHVuc2lnbmVkIGludCkgYWRkcmVzczsKCXBQREMtPlBEQ19UTkNSID0gYnl0ZXM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0UngKLy8qIFxicmllZiBTZXQgdGhlIHJlY2VpdmUgdHJhbnNmZXIgZGVzY3JpcHRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldFJ4ICgKCUFUOTFQU19QREMgcFBEQywgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKCWNoYXIgKmFkZHJlc3MsICAgICAgICAgLy8gXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgcmVjZWl2ZWQKCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQKewoJcFBEQy0+UERDX1JQUiA9ICh1bnNpZ25lZCBpbnQpIGFkZHJlc3M7CglwUERDLT5QRENfUkNSID0gYnl0ZXM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0VHgKLy8qIFxicmllZiBTZXQgdGhlIHRyYW5zbWl0IHRyYW5zZmVyIGRlc2NyaXB0b3IKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19TZXRUeCAoCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkCgl1bnNpZ25lZCBpbnQgYnl0ZXMpICAgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkCnsKCXBQREMtPlBEQ19UUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOwoJcFBEQy0+UERDX1RDUiA9IGJ5dGVzOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0VuYWJsZVR4Ci8vKiBcYnJpZWYgRW5hYmxlIHRyYW5zbWl0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRW5hYmxlVHggKAoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfVFhURU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlUngKLy8qIFxicmllZiBFbmFibGUgcmVjZWl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVJ4ICgKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Rpc2FibGVUeAovLyogXGJyaWVmIERpc2FibGUgdHJhbnNtaXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19EaXNhYmxlVHggKAoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfVFhURElTOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Rpc2FibGVSeAovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0Rpc2FibGVSeCAoCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcgp7CglwUERDLT5QRENfUFRDUiA9IEFUOTFDX1BEQ19SWFRESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNUeEVtcHR5Ci8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIHNlbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzVHhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXJldHVybiAhKHBQREMtPlBEQ19UQ1IpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkKLy8qIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkgKCAvLyBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcgp7CglyZXR1cm4gIShwUERDLT5QRENfVE5DUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNSeEVtcHR5Ci8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIGZpbGxlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNSeEVtcHR5ICggLy8gXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcmV0dXJuICEocFBEQy0+UERDX1JDUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIG5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgY3VycmVudCB0ZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXJldHVybiAhKHBQREMtPlBEQ19STkNSKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19PcGVuCi8vKiBcYnJpZWYgT3BlbiBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzLCByZS1lbmFibGUgUlggYW5kIFRYCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfT3BlbiAoCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOwoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsKCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QKCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7CglBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoKICAgIC8vKiBFbmFibGUgdGhlIFJYIGFuZCBUWCBQREMgdHJhbnNmZXIgcmVxdWVzdHMKCUFUOTFGX1BEQ19FbmFibGVSeChwUERDKTsKCUFUOTFGX1BEQ19FbmFibGVUeChwUERDKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19DbG9zZQovLyogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19DbG9zZSAoCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOwoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsKCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QKCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7CglBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZW5kRnJhbWUKLy8qIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BEQ19TZW5kRnJhbWUoCglBVDkxUFNfUERDIHBQREMsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJaWYgKEFUOTFGX1BEQ19Jc1R4RW1wdHkocFBEQykpIHsKCQkvLyogQnVmZmVyIGFuZCBuZXh0IGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQKCQlBVDkxRl9QRENfU2V0VHgocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOwoJCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgcE5leHRCdWZmZXIsIHN6TmV4dEJ1ZmZlcik7CgkJcmV0dXJuIDI7Cgl9CgllbHNlIGlmIChBVDkxRl9QRENfSXNOZXh0VHhFbXB0eShwUERDKSkgewoJCS8vKiBPbmx5IG9uZSBidWZmZXIgY2FuIGJlIGluaXRpYWxpemVkCgkJQVQ5MUZfUERDX1NldE5leHRUeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7CgkJcmV0dXJuIDE7Cgl9CgllbHNlIHsKCQkvLyogQWxsIGJ1ZmZlciBhcmUgaW4gdXNlLi4uCgkJcmV0dXJuIDA7Cgl9Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lCi8vKiBcYnJpZWYgQ2xvc2UgUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lICgKCUFUOTFQU19QREMgcFBEQywKCWNoYXIgKnBCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsCgljaGFyICpwTmV4dEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQp7CglpZiAoQVQ5MUZfUERDX0lzUnhFbXB0eShwUERDKSkgewoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZAoJCUFUOTFGX1BEQ19TZXRSeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7CgkJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCBwTmV4dEJ1ZmZlciwgc3pOZXh0QnVmZmVyKTsKCQlyZXR1cm4gMjsKCX0KCWVsc2UgaWYgKEFUOTFGX1BEQ19Jc05leHRSeEVtcHR5KHBQREMpKSB7CgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQKCQlBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIHBCdWZmZXIsIHN6QnVmZmVyKTsKCQlyZXR1cm4gMTsKCX0KCWVsc2UgewoJCS8vKiBBbGwgYnVmZmVyIGFyZSBpbiB1c2UuLi4KCQlyZXR1cm4gMDsKCX0KfQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBEQkdVCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0ludGVycnVwdEVuYWJsZQovLyogXGJyaWVmIEVuYWJsZSBEQkdVIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUoCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBlbmFibGVkCnsKICAgICAgICBwRGJndS0+REJHVV9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlCi8vKiBcYnJpZWYgRGlzYWJsZSBEQkdVIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlKAogICAgICAgIEFUOTFQU19EQkdVIHBEYmd1LCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZGJndSBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBEYmd1LT5EQkdVX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfREJHVV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIERCR1UgSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwRGJndS0+REJHVV9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBEQkdVIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfREJHVV9Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfREJHVSBwRGJndSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKICAgICAgICByZXR1cm4gKEFUOTFGX0RCR1VfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwRGJndSkgJiBmbGFnKTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUElPCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoCi8vKiBcYnJpZWYgRW5hYmxlIHBpbnMgdG8gYmUgZHJpdmVkIGJ5IHBlcmlwaGVyYWwKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdQZXJpcGgoCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgcGVyaXBoQUVuYWJsZSwgIC8vIFxhcmcgUEVSSVBIIEEgdG8gZW5hYmxlCgl1bnNpZ25lZCBpbnQgcGVyaXBoQkVuYWJsZSkgIC8vIFxhcmcgUEVSSVBIIEIgdG8gZW5hYmxlCgp7CglwUGlvLT5QSU9fQVNSID0gcGVyaXBoQUVuYWJsZTsKCXBQaW8tPlBJT19CU1IgPSBwZXJpcGhCRW5hYmxlOwoJcFBpby0+UElPX1BEUiA9IChwZXJpcGhBRW5hYmxlIHwgcGVyaXBoQkVuYWJsZSk7IC8vIFNldCBpbiBQZXJpcGggbW9kZQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ091dHB1dAovLyogXGJyaWVmIEVuYWJsZSBQSU8gaW4gb3V0cHV0IG1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdPdXRwdXQoCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgcGlvRW5hYmxlKSAgICAgIC8vIFxhcmcgUElPIHRvIGJlIGVuYWJsZWQKewoJcFBpby0+UElPX1BFUiA9IHBpb0VuYWJsZTsgLy8gU2V0IGluIFBJTyBtb2RlCglwUGlvLT5QSU9fT0VSID0gcGlvRW5hYmxlOyAvLyBDb25maWd1cmUgaW4gT3V0cHV0Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnSW5wdXQKLy8qIFxicmllZiBFbmFibGUgUElPIGluIGlucHV0IG1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dCgKCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBpbnB1dEVuYWJsZSkgICAgICAvLyBcYXJnIFBJTyB0byBiZSBlbmFibGVkCnsKCS8vIERpc2FibGUgb3V0cHV0CglwUGlvLT5QSU9fT0RSICA9IGlucHV0RW5hYmxlOwoJcFBpby0+UElPX1BFUiAgPSBpbnB1dEVuYWJsZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGluIG9wZW4gZHJhaW4KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4oCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbXVsdGlEcnZFbmFibGUpIC8vIFxhcmcgcGlvIHRvIGJlIGNvbmZpZ3VyZWQgaW4gb3BlbiBkcmFpbgp7CgkvLyBDb25maWd1cmUgdGhlIG11bHRpLWRyaXZlIG9wdGlvbgoJcFBpby0+UElPX01ERFIgPSB+bXVsdGlEcnZFbmFibGU7CglwUGlvLT5QSU9fTURFUiA9IG11bHRpRHJ2RW5hYmxlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ1B1bGx1cAovLyogXGJyaWVmIEVuYWJsZSBwdWxsdXAgb24gUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnUHVsbHVwKAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHB1bGx1cEVuYWJsZSkgICAvLyBcYXJnIGVuYWJsZSBwdWxsdXAgb24gUElPCnsKCQkvLyBDb25uZWN0IG9yIG5vdCBQdWxsdXAKCXBQaW8tPlBJT19QUFVEUiA9IH5wdWxsdXBFbmFibGU7CglwUGlvLT5QSU9fUFBVRVIgPSBwdWxsdXBFbmFibGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnRGlyZWN0RHJpdmUKLy8qIFxicmllZiBFbmFibGUgZGlyZWN0IGRyaXZlIG9uIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ0RpcmVjdERyaXZlKAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGRpcmVjdERyaXZlKSAgICAvLyBcYXJnIFBJTyB0byBiZSBjb25maWd1cmVkIHdpdGggZGlyZWN0IGRyaXZlCgp7CgkvLyBDb25maWd1cmUgdGhlIERpcmVjdCBEcml2ZQoJcFBpby0+UElPX09XRFIgID0gfmRpcmVjdERyaXZlOwoJcFBpby0+UElPX09XRVIgID0gZGlyZWN0RHJpdmU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnSW5wdXRGaWx0ZXIKLy8qIFxicmllZiBFbmFibGUgaW5wdXQgZmlsdGVyIG9uIGlucHV0IFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ0lucHV0RmlsdGVyKAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGlucHV0RmlsdGVyKSAgICAvLyBcYXJnIFBJTyB0byBiZSBjb25maWd1cmVkIHdpdGggaW5wdXQgZmlsdGVyCgp7CgkvLyBDb25maWd1cmUgdGhlIERpcmVjdCBEcml2ZQoJcFBpby0+UElPX0lGRFIgID0gfmlucHV0RmlsdGVyOwoJcFBpby0+UElPX0lGRVIgID0gaW5wdXRGaWx0ZXI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0SW5wdXQKLy8qIFxicmllZiBSZXR1cm4gUElPIGlucHV0IHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnB1dCggLy8gXHJldHVybiBQSU8gaW5wdXQKCUFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKCXJldHVybiBwUGlvLT5QSU9fUERTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0lucHV0U2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gaXMgaW5wdXQgZmxhZyBpcyBhY3RpdmUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW5wdXRTZXQoCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXQocFBpbykgJiBmbGFnKTsKfQoKCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fU2V0T3V0cHV0Ci8vKiBcYnJpZWYgU2V0IHRvIDEgb3V0cHV0IFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX1NldE91dHB1dCgKCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBvdXRwdXQgdG8gYmUgc2V0CnsKCXBQaW8tPlBJT19TT0RSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19DbGVhck91dHB1dAovLyogXGJyaWVmIFNldCB0byAwIG91dHB1dCBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DbGVhck91dHB1dCgKCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBvdXRwdXQgdG8gYmUgY2xlYXJlZAp7CglwUGlvLT5QSU9fQ09EUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRm9yY2VPdXRwdXQKLy8qIFxicmllZiBGb3JjZSBvdXRwdXQgd2hlbiBEaXJlY3QgZHJpdmUgb3B0aW9uIGlzIGVuYWJsZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19Gb3JjZU91dHB1dCgKCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBvdXRwdXQgdG8gYmUgZm9yY2VkCnsKCXBQaW8tPlBJT19PRFNSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19FbmFibGUKLy8qIFxicmllZiBFbmFibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fRW5hYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGVuYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19QRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0Rpc2FibGUKLy8qIFxicmllZiBEaXNhYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0Rpc2FibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19QRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQSU8gU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRTdGF0dXMoIC8vIFxyZXR1cm4gUElPIFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX1BTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc1NldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0U3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0RW5hYmxlCi8vKiBcYnJpZWYgT3V0cHV0IEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRFbmFibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGVuYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19PRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dERpc2FibGUKLy8qIFxicmllZiBPdXRwdXQgRW5hYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dERpc2FibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUGlvLT5QSU9fT0RSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyggLy8gXHJldHVybiBQSU8gT3V0cHV0IFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX09TUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc091cHV0U2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNPdXRwdXRTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0U3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUKLy8qIFxicmllZiBJbnB1dCBGaWx0ZXIgRW5hYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRW5hYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUGlvLT5QSU9fSUZFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJEaXNhYmxlCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIERpc2FibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJEaXNhYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBkaXNhYmxlZAp7CiAgICAgICAgcFBpby0+UElPX0lGRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldElucHV0RmlsdGVyU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnB1dCBGaWx0ZXIgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cyggLy8gXHJldHVybiBQSU8gSW5wdXQgRmlsdGVyIFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX0lGU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnB1dEZpbHRlclNldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIElucHV0IGZpbHRlciBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW5wdXRGaWx0ZXJTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dERhdGFTdGF0dXMoIC8vIFxyZXR1cm4gUElPIE91dHB1dCBEYXRhIFN0YXR1cwoJQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fT0RTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19JbnRlcnJ1cHRFbmFibGUKLy8qIFxicmllZiBFbmFibGUgUElPIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ludGVycnVwdEVuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZAp7CiAgICAgICAgcFBpby0+UElPX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW50ZXJydXB0RGlzYWJsZQovLyogXGJyaWVmIERpc2FibGUgUElPIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ludGVycnVwdERpc2FibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUGlvLT5QSU9fSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gUElPIEludGVycnVwdCBNYXNrIFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyggLy8gXHJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX0lTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0ludGVycnVwdFNldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW50ZXJydXB0U2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyhwUGlvKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX011bHRpRHJpdmVyRW5hYmxlCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUGlvLT5QSU9fTURFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIERpc2FibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUGlvLT5QSU9fTUREUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0TXVsdGlEcml2ZXJTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIE11bHRpIERyaXZlciBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBNdWx0aSBEcml2ZXIgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fTURTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc011bHRpRHJpdmVyU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gTXVsdGlEcml2ZXIgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc011bHRpRHJpdmVyU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQV9SZWdpc3RlclNlbGVjdGlvbgovLyogXGJyaWVmIFBJTyBBIFJlZ2lzdGVyIFNlbGVjdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0FfUmVnaXN0ZXJTZWxlY3Rpb24oCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gQSByZWdpc3RlciBzZWxlY3Rpb24KewogICAgICAgIHBQaW8tPlBJT19BU1IgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24KLy8qIFxicmllZiBQSU8gQiBSZWdpc3RlciBTZWxlY3Rpb24KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19CX1JlZ2lzdGVyU2VsZWN0aW9uKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIEIgcmVnaXN0ZXIgc2VsZWN0aW9uCnsKICAgICAgICBwUGlvLT5QSU9fQlNSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyggLy8gXHJldHVybiBQSU8gQUIgUmVnaXN0ZXIgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fQUJTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gQUIgUmVnaXN0ZXIgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyhwUGlvKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRW5hYmxlCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRXcml0ZUVuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZW5hYmxlZAp7CiAgICAgICAgcFBpby0+UElPX09XRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZQovLyogXGJyaWVmIE91dHB1dCBXcml0ZSBEaXNhYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19PV0RSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQSU8gT3V0cHV0IFdyaXRlIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIC8vIFxyZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMKICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19PV1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzT3V0cHV0V3JpdGVTZXQKLy8qIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXRXcml0ZSBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0V3JpdGVTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRDZmdQdWxsdXAKLy8qIFxicmllZiBSZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRDZmdQdWxsdXAoIC8vIFxyZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fUFBVU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNPdXRwdXREYXRhU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IERhdGEgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNPdXRwdXREYXRhU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldE91dHB1dERhdGFTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0NmZ1B1bGx1cFN0YXR1c1NldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwIFN0YXR1cyBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzQ2ZnUHVsbHVwU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAofkFUOTFGX1BJT19HZXRDZmdQdWxsdXAocFBpbykgJiBmbGFnKTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUE1DCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRW5hYmxlUmVnCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBTeXN0ZW0gQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0VuYWJsZVJlZyAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1vZGUpCnsKCS8vKiBXcml0ZSB0byB0aGUgU0NFUiByZWdpc3RlcgoJcFBNQy0+UE1DX1NDRVIgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0Rpc2FibGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIFN5c3RlbSBDbG9jayBEaXNhYmxlIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0Rpc2FibGVSZWcgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKQp7CgkvLyogV3JpdGUgdG8gdGhlIFNDRFIgcmVnaXN0ZXIKCXBQTUMtPlBNQ19TQ0RSID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRTeXNDbGtTdGF0dXNSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIFN5c3RlbSBDbG9jayBTdGF0dXMgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRTeXNDbGtTdGF0dXNSZWcgKAoJQVQ5MVBTX1BNQyBwUE1DIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcFBNQy0+UE1DX1NDU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2sKLy8qIFxicmllZiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrICgKCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgcGVyaXBoSWRzKSAgLy8gXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlCnsKCXBQTUMtPlBNQ19QQ0VSID0gcGVyaXBoSWRzOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jawovLyogXGJyaWVmIERpc2FibGUgcGVyaXBoZXJhbCBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jayAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHBlcmlwaElkcykgIC8vIFxhcmcgSURzIG9mIHBlcmlwaGVyYWxzIHRvIGVuYWJsZQp7CglwUE1DLT5QTUNfUENEUiA9IHBlcmlwaElkczsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRQZXJpcGhDbG9jawovLyogXGJyaWVmIEdldCBwZXJpcGhlcmFsIGNsb2NrIHN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0UGVyaXBoQ2xvY2sgKAoJQVQ5MVBTX1BNQyBwUE1DKSAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBQTUMtPlBNQ19QQ1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjaWxsYXRvclJlZwovLyogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0NmZ01haW5Pc2NpbGxhdG9yUmVnICgKCUFUOTFQU19DS0dSIHBDS0dSLCAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkKewoJcENLR1ItPkNLR1JfTU9SID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NLR1JfR2V0TWFpbk9zY2lsbGF0b3JSZWcKLy8qIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5Pc2NpbGxhdG9yUmVnICgKCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCnsKCXJldHVybiBwQ0tHUi0+Q0tHUl9NT1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0VuYWJsZU1haW5Pc2NpbGxhdG9yCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBtYWluIG9zY2lsbGF0b3IKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfRW5hYmxlTWFpbk9zY2lsbGF0b3IoCglBVDkxUFNfQ0tHUiBwQ0tHUikgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcgp7CglwQ0tHUi0+Q0tHUl9NT1IgfD0gQVQ5MUNfQ0tHUl9NT1NDRU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0Rpc2FibGVNYWluT3NjaWxsYXRvcgovLyogXGJyaWVmIERpc2FibGUgdGhlIG1haW4gb3NjaWxsYXRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9EaXNhYmxlTWFpbk9zY2lsbGF0b3IgKAoJQVQ5MVBTX0NLR1IgcENLR1IpIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKewoJcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX01PU0NFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY1N0YXJ0VXBUaW1lCi8vKiBcYnJpZWYgQ2ZnIE1PUiBSZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIG1haW4gb3NjIHN0YXJ0dXAgdGltZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjU3RhcnRVcFRpbWUgKAoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBzdGFydHVwX3RpbWUsICAvLyBcYXJnIG1haW4gb3NjIHN0YXJ0dXAgdGltZSBpbiBtaWNyb3NlY29uZCAodXMpCgl1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrKSAgLy8gXGFyZyBzbG93Q2xvY2sgaW4gSHoKewoJcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX09TQ09VTlQ7CglwQ0tHUi0+Q0tHUl9NT1IgfD0gKChzbG93Q2xvY2sgKiBzdGFydHVwX3RpbWUpLyg4KjEwMDAwMDApKSA8PCA4Owp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnCi8vKiBcYnJpZWYgQ2ZnIHRoZSBtYWluIG9zY2lsbGF0b3IKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnICgKCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCnsKCXJldHVybiBwQ0tHUi0+Q0tHUl9NQ0ZSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2sKLy8qIFxicmllZiBSZXR1cm4gTWFpbiBjbG9jayBpbiBIegovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5DbG9jayAoCglBVDkxUFNfQ0tHUiBwQ0tHUiwgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHNsb3dDbG9jaykgIC8vIFxhcmcgc2xvd0Nsb2NrIGluIEh6CnsKCXJldHVybiAoKHBDS0dSLT5DS0dSX01DRlIgICYgQVQ5MUNfQ0tHUl9NQUlORikgKiBzbG93Q2xvY2spID4+IDQ7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnTUNLUmVnCi8vKiBcYnJpZWYgQ2ZnIE1hc3RlciBDbG9jayBSZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ01DS1JlZyAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1vZGUpCnsKCXBQTUMtPlBNQ19NQ0tSID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRNQ0tSZWcKLy8qIFxicmllZiBSZXR1cm4gTWFzdGVyIENsb2NrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRNQ0tSZWcoCglBVDkxUFNfUE1DIHBQTUMpIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgp7CglyZXR1cm4gcFBNQy0+UE1DX01DS1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRNYXN0ZXJDbG9jawovLyogXGJyaWVmIFJldHVybiBtYXN0ZXIgY2xvY2sgaW4gSHogd2hpY2ggY29ycmVwb25kcyB0byBwcm9jZXNzb3IgY2xvY2sgZm9yIEFSTTcKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0TWFzdGVyQ2xvY2sgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKCUFUOTFQU19DS0dSIHBDS0dSLCAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrKSAgLy8gXGFyZyBzbG93Q2xvY2sgaW4gSHoKewoJdW5zaWduZWQgaW50IHJlZyA9IHBQTUMtPlBNQ19NQ0tSOwoJdW5zaWduZWQgaW50IHByZXNjYWxlciA9ICgxIDw8ICgocmVnICYgQVQ5MUNfUE1DX1BSRVMpID4+IDIpKTsKCXVuc2lnbmVkIGludCBwbGxEaXZpZGVyLCBwbGxNdWx0aXBsaWVyOwoKCXN3aXRjaCAocmVnICYgQVQ5MUNfUE1DX0NTUykgewoJCWNhc2UgQVQ5MUNfUE1DX0NTU19TTE9XX0NMSzogLy8gU2xvdyBjbG9jayBzZWxlY3RlZAoJCQlyZXR1cm4gc2xvd0Nsb2NrIC8gcHJlc2NhbGVyOwoJCWNhc2UgQVQ5MUNfUE1DX0NTU19NQUlOX0NMSzogLy8gTWFpbiBjbG9jayBpcyBzZWxlY3RlZAoJCQlyZXR1cm4gQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2socENLR1IsIHNsb3dDbG9jaykgLyBwcmVzY2FsZXI7CgkJY2FzZSBBVDkxQ19QTUNfQ1NTX1BMTF9DTEs6IC8vIFBMTEIgY2xvY2sgaXMgc2VsZWN0ZWQKCQkJcmVnID0gcENLR1ItPkNLR1JfUExMUjsKCQkJcGxsRGl2aWRlciAgICA9IChyZWcgICYgQVQ5MUNfQ0tHUl9ESVYpOwoJCQlwbGxNdWx0aXBsaWVyID0gKChyZWcgICYgQVQ5MUNfQ0tHUl9NVUwpID4+IDE2KSArIDE7CgkJCXJldHVybiBBVDkxRl9DS0dSX0dldE1haW5DbG9jayhwQ0tHUiwgc2xvd0Nsb2NrKSAvIHBsbERpdmlkZXIgKiBwbGxNdWx0aXBsaWVyIC8gcHJlc2NhbGVyOwoJfQoJcmV0dXJuIDA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUENLCi8vKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVQQ0sgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBwY2ssICAvLyBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcKCXVuc2lnbmVkIGludCBtb2RlKQp7CglwUE1DLT5QTUNfUENLUltwY2tdID0gbW9kZTsKCXBQTUMtPlBNQ19TQ0VSID0gKDEgPDwgcGNrKSA8PCA4Owp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQQ0sKLy8qIFxicmllZiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQQ0sgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBwY2spICAvLyBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcKewoJcFBNQy0+UE1DX1NDRFIgPSAoMSA8PCBwY2spIDw8IDg7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgUE1DIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZUl0ICgKCUFUOTFQU19QTUMgcFBNQywgICAgIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcFBNQy0+UE1DX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBQTUMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZUl0ICgKCUFUOTFQU19QTUMgcFBNQywgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBQTUMtPlBNQ19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFBNQyBJbnRlcnJ1cHQgU3RhdHVzCglBVDkxUFNfUE1DIHBQTUMpIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcgp7CglyZXR1cm4gcFBNQy0+UE1DX1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUE1DIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCglBVDkxUFNfUE1DIHBQTUMpIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcgp7CglyZXR1cm4gcFBNQy0+UE1DX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgUE1DIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19QTUMgcFBNQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwUE1DKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0lzU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQTUMgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfSXNTdGF0dXNTZXQoCiAgICAgICAgQVQ5MVBTX1BNQyBwUE1DLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX1BNQ19HZXRTdGF0dXMocFBNQykgJiBmbGFnKTsKfS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFJTVEMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1JTVFNvZnRSZXNldAovLyogXGJyaWVmIFN0YXJ0IFNvZnR3YXJlIFJlc2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTb2Z0UmVzZXQoCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMsCiAgICAgICAgdW5zaWduZWQgaW50IHJlc2V0KQp7CglwUlNUQy0+UlNUQ19SQ1IgPSAoMHhBNTAwMDAwMCB8IHJlc2V0KTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1JTVFNldE1vZGUKLy8qIFxicmllZiBTZXQgUmVzZXQgTW9kZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUlNUU2V0TW9kZSgKICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQywKICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSkKewoJcFJTVEMtPlJTVENfUk1SID0gKDB4QTUwMDAwMDAgfCBtb2RlKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1JTVEdldE1vZGUKLy8qIFxicmllZiBHZXQgUmVzZXQgTW9kZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SU1RHZXRNb2RlKAogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDKQp7CglyZXR1cm4gKHBSU1RDLT5SU1RDX1JNUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9SU1RHZXRTdGF0dXMKLy8qIFxicmllZiBHZXQgUmVzZXQgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVEdldFN0YXR1cygKICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQykKewoJcmV0dXJuIChwUlNUQy0+UlNUQ19SU1IpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlNUSXNTb2Z0UnN0QWN0aXZlCi8vKiBcYnJpZWYgUmV0dXJuICE9MCBpZiBzb2Z0d2FyZSByZXNldCBpcyBzdGlsbCBub3QgY29tcGxldGVkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVElzU29mdFJzdEFjdGl2ZSgKICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQykKewoJcmV0dXJuICgocFJTVEMtPlJTVENfUlNSKSAmIEFUOTFDX1JTVENfU1JDTVApOwp9Ci8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFJUVEMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfU2V0UlRUX1RpbWVCYXNlKCkKLy8qIFxicmllZiAgU2V0IHRoZSBSVFQgcHJlc2NhbGVyIGFjY29yZGluZyB0byB0aGUgVGltZUJhc2UgaW4gbXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFRpbWVCYXNlKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDLAogICAgICAgIHVuc2lnbmVkIGludCBtcykKewoJaWYgKG1zID4gMjAwMCkKCQlyZXR1cm4gMTsgICAvLyBBVDkxQ19USU1FX09VVF9PRl9SQU5HRQoJcFJUVEMtPlJUVENfUlRNUiAmPSB+MHhGRkZGOwkKCXBSVFRDLT5SVFRDX1JUTVIgfD0gKCgobXMgPDwgMTUpIC8xMDAwKSAmIDB4RkZGRik7CQoJcmV0dXJuIDA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgIEFUOTFGX1JUVFNldFByZXNjYWxlcigpCi8vKiBcYnJpZWYgIFNldCB0aGUgbmV3IHByZXNjYWxlciB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUU2V0UHJlc2NhbGVyKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDLAogICAgICAgIHVuc2lnbmVkIGludCBydHByZXMpCnsKCXBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsJCglwUlRUQy0+UlRUQ19SVE1SIHw9IChydHByZXMgJiAweEZGRkYpOwkKCXJldHVybiAocFJUVEMtPlJUVENfUlRNUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgIEFUOTFGX1JUVFJlc3RhcnQoKQovLyogXGJyaWVmICBSZXN0YXJ0IHRoZSBSVFQgcHJlc2NhbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUUmVzdGFydCgKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykKewoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX1JUVFJTVDsJCn0KCgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfU2V0QWxhcm1JTlQoKQovLyogXGJyaWVmICBFbmFibGUgUlRUIEFsYXJtIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldEFsYXJtSU5UKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CglwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfQUxNSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfQ2xlYXJBbGFybUlOVCgpCi8vKiBcYnJpZWYgIERpc2FibGUgUlRUIEFsYXJtIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyQWxhcm1JTlQoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpCnsKCXBSVFRDLT5SVFRDX1JUTVIgJj0gfkFUOTFDX1JUVENfQUxNSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfU2V0UnR0SW5jSU5UKCkKLy8qIFxicmllZiAgRW5hYmxlIFJUVCBJTkMgSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUU2V0UnR0SW5jSU5UKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CglwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfUlRUSU5DSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfQ2xlYXJSdHRJbmNJTlQoKQovLyogXGJyaWVmICBEaXNhYmxlIFJUVCBJTkMgSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUQ2xlYXJSdHRJbmNJTlQoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpCnsKCXBSVFRDLT5SVFRDX1JUTVIgJj0gfkFUOTFDX1JUVENfUlRUSU5DSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfU2V0QWxhcm1WYWx1ZSgpCi8vKiBcYnJpZWYgIFNldCBSVFQgQWxhcm0gVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybVZhbHVlKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDLCB1bnNpZ25lZCBpbnQgYWxhcm0pCnsKCXBSVFRDLT5SVFRDX1JUQVIgPSBhbGFybTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX0dldEFsYXJtVmFsdWUoKQovLyogXGJyaWVmICBHZXQgUlRUIEFsYXJtIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRHZXRBbGFybVZhbHVlKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CglyZXR1cm4ocFJUVEMtPlJUVENfUlRBUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgIEFUOTFGX1JUVEdldFN0YXR1cygpCi8vKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCBzdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVEdldFN0YXR1cygKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykKewoJcmV0dXJuKHBSVFRDLT5SVFRDX1JUU1IpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRfUmVhZFZhbHVlKCkKLy8qIFxicmllZiAgUmVhZCB0aGUgUlRUIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRSZWFkVmFsdWUoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpCnsKICAgICAgICByZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdmFsMSx2YWwyOwoJZG8KCXsKCQl2YWwxID0gcFJUVEMtPlJUVENfUlRWUjsKCQl2YWwyID0gcFJUVEMtPlJUVENfUlRWUjsKCX0JCgl3aGlsZSh2YWwxICE9IHZhbDIpOwoJcmV0dXJuKHZhbDEpOwp9Ci8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBJVEMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVEluaXQKLy8qIFxicmllZiBTeXN0ZW0gdGltZXIgaW5pdCA6IHBlcmlvZCBpbiC1c2Vjb25kLCBzeXN0ZW0gY2xvY2sgZnJlcSBpbiBNSHoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVEluaXQoCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMsCiAgICAgICAgdW5zaWduZWQgaW50IHBlcmlvZCwKICAgICAgICB1bnNpZ25lZCBpbnQgcGl0X2ZyZXF1ZW5jeSkKewoJcFBJVEMtPlBJVENfUElNUiA9IHBlcmlvZD8gKHBlcmlvZCAqIHBpdF9mcmVxdWVuY3kgKyA4KSA+PiA0IDogMDsgLy8gKzggdG8gYXZvaWQgJTEwIGFuZCAvMTAKCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRFTjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRTZXRQSVYKLy8qIFxicmllZiBTZXQgdGhlIFBJVCBQZXJpb2RpYyBJbnRlcnZhbCBWYWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUU2V0UElWKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDLAogICAgICAgIHVuc2lnbmVkIGludCBwaXYpCnsKCXBQSVRDLT5QSVRDX1BJTVIgPSBwaXYgfCAocFBJVEMtPlBJVENfUElNUiAmIChBVDkxQ19QSVRDX1BJVEVOIHwgQVQ5MUNfUElUQ19QSVRJRU4pKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVEVuYWJsZUludAovLyogXGJyaWVmIEVuYWJsZSBQSVQgcGVyaW9kaWMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRFbmFibGVJbnQoCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMpCnsKCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElURGlzYWJsZUludAovLyogXGJyaWVmIERpc2FibGUgUElUIHBlcmlvZGljIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElURGlzYWJsZUludCgKICAgICAgICBBVDkxUFNfUElUQyBwUElUQykKewoJcFBJVEMtPlBJVENfUElNUiAmPSB+QVQ5MUNfUElUQ19QSVRJRU47CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0TW9kZQovLyogXGJyaWVmIFJlYWQgUElUIG1vZGUgcmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0TW9kZSgKICAgICAgICBBVDkxUFNfUElUQyBwUElUQykKewoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJTVIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmVhZCBQSVQgc3RhdHVzIHJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFN0YXR1cygKICAgICAgICBBVDkxUFNfUElUQyBwUElUQykKewoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJU1IpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0UElJUgovLyogXGJyaWVmIFJlYWQgUElUIENQSVYgYW5kIFBJQ05UIHdpdGhvdXQgcmVzc2V0dGluZyB0aGUgY291bnRlcnMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0UElJUigKICAgICAgICBBVDkxUFNfUElUQyBwUElUQykKewoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJSVIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0UElWUgovLyogXGJyaWVmIFJlYWQgU3lzdGVtIHRpbWVyIENQSVYgYW5kIFBJQ05UIHdpdGhvdXQgcmVzc2V0dGluZyB0aGUgY291bnRlcnMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0UElWUigKICAgICAgICBBVDkxUFNfUElUQyBwUElUQykKewoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJVlIpOwp9Ci8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFdEVEMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1dEVFNldE1vZGUKLy8qIFxicmllZiBTZXQgV2F0Y2hkb2cgTW9kZSBSZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUU2V0TW9kZSgKICAgICAgICBBVDkxUFNfV0RUQyBwV0RUQywKICAgICAgICB1bnNpZ25lZCBpbnQgTW9kZSkKewoJcFdEVEMtPldEVENfV0RNUiA9IE1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9XRFRSZXN0YXJ0Ci8vKiBcYnJpZWYgUmVzdGFydCBXYXRjaGRvZwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUUmVzdGFydCgKICAgICAgICBBVDkxUFNfV0RUQyBwV0RUQykKewoJcFdEVEMtPldEVENfV0RDUiA9IDB4QTUwMDAwMDE7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9XRFRTR2V0dGF0dXMKLy8qIFxicmllZiBHZXQgV2F0Y2hkb2cgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1dEVFNHZXR0YXR1cygKICAgICAgICBBVDkxUFNfV0RUQyBwV0RUQykKewoJcmV0dXJuKHBXRFRDLT5XRFRDX1dEU1IgJiAweDMpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfV0RUR2V0UGVyaW9kCi8vKiBcYnJpZWYgVHJhbnNsYXRlIG1zIGludG8gV2F0Y2hkb2cgQ29tcGF0aWJsZSB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9XRFRHZXRQZXJpb2QodW5zaWduZWQgaW50IG1zKQp7CglpZiAoKG1zIDwgNCkgfHwgKG1zID4gMTYwMDApKQoJCXJldHVybiAwOwoJcmV0dXJuKChtcyA8PCA4KSAvIDEwMDApOwp9Ci8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFZSRUcKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1ZSRUdfRW5hYmxlX0xvd1Bvd2VyTW9kZQovLyogXGJyaWVmIEVuYWJsZSBWUkVHIExvdyBQb3dlciBNb2RlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9WUkVHX0VuYWJsZV9Mb3dQb3dlck1vZGUoCiAgICAgICAgQVQ5MVBTX1ZSRUcgcFZSRUcpCnsKCXBWUkVHLT5WUkVHX01SIHw9IEFUOTFDX1ZSRUdfUFNUREJZOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1ZSRUdfRGlzYWJsZV9Mb3dQb3dlck1vZGUKLy8qIFxicmllZiBEaXNhYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfRGlzYWJsZV9Mb3dQb3dlck1vZGUoCiAgICAgICAgQVQ5MVBTX1ZSRUcgcFZSRUcpCnsKCXBWUkVHLT5WUkVHX01SICY9IH5BVDkxQ19WUkVHX1BTVERCWTsJCn0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBNQwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwoKI2RlZmluZSBBVDkxQ19NQ19DT1JSRUNUX0tFWSAgKCh1bnNpZ25lZCBpbnQpIDB4NUEgPDwgMjQpIC8vIChNQykgQ29ycmVjdCBQcm90ZWN0IEtleQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX1JlbWFwCi8vKiBcYnJpZWYgTWFrZSBSZW1hcAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfUmVtYXAgKHZvaWQpICAgICAvLwp7CiAgICBBVDkxUFNfTUMgcE1DID0gKEFUOTFQU19NQykgQVQ5MUNfQkFTRV9NQzsKCiAgICBwTUMtPk1DX1JDUiA9IEFUOTFDX01DX1JDQjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19DZmdNb2RlUmVnCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBFRkMgTW9kZSBSZWdpc3RlciBvZiB0aGUgTUMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX0NmZ01vZGVSZWcgKAoJQVQ5MVBTX01DIHBNQywgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcgp7CgkvLyBXcml0ZSB0byB0aGUgRk1SIHJlZ2lzdGVyCglwTUMtPk1DX0ZNUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZwovLyogXGJyaWVmIFJldHVybiBNQyBFRkMgTW9kZSBSZWdzaXRlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZygKCUFUOTFQU19NQyBwTUMpIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCnsKCXJldHVybiBwTUMtPk1DX0ZNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19Db21wdXRlRk1DTgovLyogXGJyaWVmIFJldHVybiBNQyBFRkMgTW9kZSBSZWdzaXRlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfQ29tcHV0ZUZNQ04oCglpbnQgbWFzdGVyX2Nsb2NrKSAvLyBtYXN0ZXIgY2xvY2sgaW4gSHoKewoJcmV0dXJuIChtYXN0ZXJfY2xvY2svMTAwMDAwMCArMik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfUGVyZm9ybUNtZAovLyogXGJyaWVmIFBlcmZvcm0gRUZDIENvbW1hbmQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX01DX0VGQ19QZXJmb3JtQ21kICgKCUFUOTFQU19NQyBwTUMsIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCiAgICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfY21kKQp7CglwTUMtPk1DX0ZDUiA9IHRyYW5zZmVyX2NtZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0dldFN0YXR1cygKCUFUOTFQU19NQyBwTUMpIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCnsKCXJldHVybiBwTUMtPk1DX0ZTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyhwTUMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQKLy8qIFxicmllZiBUZXN0IGlmIEVGQyBNQyBJbnRlcnJ1cHQgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19Jc0ludGVycnVwdFNldCgKICAgICAgICBBVDkxUFNfTUMgcE1DLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfTUNfRUZDX0dldFN0YXR1cyhwTUMpICYgZmxhZyk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNQSQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX09wZW4KLy8qIFxicmllZiBPcGVuIGEgU1BJIFBvcnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX09wZW4gKAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudWxsKSAgLy8gXGFyZwp7CiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8KICAgICAgICByZXR1cm4gKCAwICk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2ZnQ3MKLy8qIFxicmllZiBDb25maWd1cmUgU1BJIGNoaXAgc2VsZWN0IHJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnQ3MgKAoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCglpbnQgY3MsICAgICAvLyBTUEkgY3MgbnVtYmVyICgwIHRvIDMpCiAJaW50IHZhbCkgICAvLyAgY2hpcCBzZWxlY3QgcmVnaXN0ZXIKewoJLy8qIFdyaXRlIHRvIHRoZSBDU1IgcmVnaXN0ZXIKCSoocFNQSS0+U1BJX0NTUiArIGNzKSA9IHZhbDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBTUEkgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlSXQgKAoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwU1BJLT5TUElfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFNQSSBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlSXQgKAoJQVQ5MVBTX1NQSSBwU1BJLCAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFNQSS0+U1BJX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfUmVzZXQKLy8qIFxicmllZiBSZXNldCB0aGUgU1BJIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9SZXNldCAoCglBVDkxUFNfU1BJIHBTUEkgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCgkpCnsKCS8vKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXIKCXBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TV1JTVDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGUKLy8qIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlICgKCUFUOTFQU19TUEkgcFNQSSAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKCSkKewoJLy8qIFdyaXRlIHRvIHRoZSBDUiByZWdpc3RlcgoJcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0Rpc2FibGUKLy8qIFxicmllZiBEaXNhYmxlIHRoZSBTUEkgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Rpc2FibGUgKAoJQVQ5MVBTX1NQSSBwU1BJIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgoJKQp7CgkvLyogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyCglwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRElTOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ01vZGUKLy8qIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnTW9kZSAoCglBVDkxUFNfU1BJIHBTUEksIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgoJaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyCnsKCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIKCXBTUEktPlNQSV9NUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2ZnUENTCi8vKiBcYnJpZWYgU3dpdGNoIHRvIHRoZSBjb3JyZWN0IFBDUyBvZiBTUEkgTW9kZSBSZWdpc3RlciA6IEZpeGVkIFBlcmlwaGVyYWwgU2VsZWN0ZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdQQ1MgKAoJQVQ5MVBTX1NQSSBwU1BJLCAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKCWNoYXIgUENTX0RldmljZSkgLy8gUENTIG9mIHRoZSBEZXZpY2UKewkKIAkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyCglwU1BJLT5TUElfTVIgJj0gMHhGRkYwRkZGRjsKCXBTUEktPlNQSV9NUiB8PSAoIChQQ1NfRGV2aWNlPDwxNikgJiBBVDkxQ19TUElfUENTICk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfUmVjZWl2ZUZyYW1lCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX1JlY2VpdmVGcmFtZSAoCglBVDkxUFNfU1BJIHBTUEksCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJcmV0dXJuIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoCgkJKEFUOTFQU19QREMpICYocFNQSS0+U1BJX1JQUiksCgkJcEJ1ZmZlciwKCQlzekJ1ZmZlciwKCQlwTmV4dEJ1ZmZlciwKCQlzek5leHRCdWZmZXIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX1NlbmRGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBiU1BJeQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfU2VuZEZyYW1lKAoJQVQ5MVBTX1NQSSBwU1BJLAoJY2hhciAqcEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzekJ1ZmZlciwKCWNoYXIgKnBOZXh0QnVmZmVyLAoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApCnsKCXJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKAoJCShBVDkxUFNfUERDKSAmKHBTUEktPlNQSV9SUFIpLAoJCXBCdWZmZXIsCgkJc3pCdWZmZXIsCgkJcE5leHRCdWZmZXIsCgkJc3pOZXh0QnVmZmVyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9DbG9zZQovLyogXGJyaWVmIENsb3NlIFNQSTogZGlzYWJsZSBJVCBkaXNhYmxlIHRyYW5zZmVydCwgY2xvc2UgUERDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2xvc2UgKAoJQVQ5MVBTX1NQSSBwU1BJKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKewogICAgLy8qIFJlc2V0IGFsbCB0aGUgQ2hpcCBTZWxlY3QgcmVnaXN0ZXIKICAgIHBTUEktPlNQSV9DU1JbMF0gPSAwIDsKICAgIHBTUEktPlNQSV9DU1JbMV0gPSAwIDsKICAgIHBTUEktPlNQSV9DU1JbMl0gPSAwIDsKICAgIHBTUEktPlNQSV9DU1JbM10gPSAwIDsKCiAgICAvLyogUmVzZXQgdGhlIFNQSSBtb2RlCiAgICBwU1BJLT5TUElfTVIgPSAwICA7CgogICAgLy8qIERpc2FibGUgYWxsIGludGVycnVwdHMKICAgIHBTUEktPlNQSV9JRFIgPSAweEZGRkZGRkZGIDsKCiAgICAvLyogQWJvcnQgdGhlIFBlcmlwaGVyYWwgRGF0YSBUcmFuc2ZlcnMKICAgIEFUOTFGX1BEQ19DbG9zZSgoQVQ5MVBTX1BEQykgJihwU1BJLT5TUElfUlBSKSk7CgogICAgLy8qIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGFuZCBzdG9wIGFueSBhY3Rpdml0eSBpbW1lZGlhdGVseQogICAgcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSURJUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9QdXRDaGFyCi8vKiBcYnJpZWYgU2VuZCBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiByZWFkeSB0byBzZW5kCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfUHV0Q2hhciAoCglBVDkxUFNfU1BJIHBTUEksCgl1bnNpZ25lZCBpbnQgY2hhcmFjdGVyLAogICAgICAgICAgICAgdW5zaWduZWQgaW50IGNzX251bWJlciApCnsKICAgIHVuc2lnbmVkIGludCB2YWx1ZV9mb3JfY3M7CiAgICB2YWx1ZV9mb3JfY3MgPSAofigxIDw8IGNzX251bWJlcikpICYgMHhGOyAgLy9QbGFjZSBhIHplcm8gYW1vbmcgYSA0IE9ORXMgbnVtYmVyCiAgICBwU1BJLT5TUElfVERSID0gKGNoYXJhY3RlciAmIDB4RkZGRikgfCAodmFsdWVfZm9yX2NzIDw8IDE2KTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9HZXRDaGFyCi8vKiBcYnJpZWYgUmVjZWl2ZSBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfU1BJX0dldENoYXIgKAoJY29uc3QgQVQ5MVBTX1NQSSBwU1BJKQp7CiAgICByZXR1cm4oKHBTUEktPlNQSV9SRFIpICYgMHhGRkZGKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFNQSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gU1BJIEludGVycnVwdCBNYXNrIFN0YXR1cwogICAgICAgIEFUOTFQU19TUEkgcFNwaSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFNwaS0+U1BJX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgU1BJIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfU1BJX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19TUEkgcFNwaSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMocFNwaSkgJiBmbGFnKTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVVNBUlQKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0JhdWRyYXRlCi8vKiBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBiYXVkcmF0ZQovLyogU3RhbmRhcmQgQXN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkKI2RlZmluZSBBVDkxQ19VU19BU1lOQ19NT0RFICggQVQ5MUNfVVNfVVNNT0RFX05PUk1BTCArIFwKICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXAogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQoKLy8qIFN0YW5kYXJkIEV4dGVybmFsIEFzeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5CiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfU0NLX01PREUgKCBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfRVhUICkKCi8vKiBTdGFuZGFyZCBTeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5CiNkZWZpbmUgQVQ5MUNfVVNfU1lOQ19NT0RFICggQVQ5MUNfVVNfU1lOQyArIFwKICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXAogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwKICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwKICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwKICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkKCi8vKiBTQ0sgdXNlZCBMYWJlbAojZGVmaW5lIEFUOTFDX1VTX1NDS19VU0VEIChBVDkxQ19VU19DS0xPIHwgQVQ5MUNfVVNfQ0xLU19FWFQpCgovLyogU3RhbmRhcmQgSVNPIFQ9MCBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgcGFyaXR5CiNkZWZpbmUgQVQ5MUNfVVNfSVNPX1JFQURFUl9NT0RFICggQVQ5MUNfVVNfVVNNT0RFX0lTTzc4MTZfMCArIFwKCQkJCQkgICAJCSBBVDkxQ19VU19DTEtTX0NMT0NLICtcCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXAogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX1BBUl9FVkVOICsgXAogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXAogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX0NLTE8gK1wKICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19PVkVSKQoKLy8qIFN0YW5kYXJkIElSREEgbW9kZQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX0lSREFfTU9ERSAoICBBVDkxQ19VU19VU01PREVfSVJEQSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkKCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19CYXVkcmF0ZQovLyogXGJyaWVmIENhbHVjdWxhdGUgYmF1ZF92YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIG1haW4gY2xvY2sgYW5kIHRoZSBiYXVkIHJhdGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfQmF1ZHJhdGUgKAoJY29uc3QgdW5zaWduZWQgaW50IG1haW5fY2xvY2ssIC8vIFxhcmcgcGVyaXBoZXJhbCBjbG9jawoJY29uc3QgdW5zaWduZWQgaW50IGJhdWRfcmF0ZSkgIC8vIFxhcmcgVUFSVCBiYXVkcmF0ZQp7Cgl1bnNpZ25lZCBpbnQgYmF1ZF92YWx1ZSA9ICgobWFpbl9jbG9jayoxMCkvKGJhdWRfcmF0ZSAqIDE2KSk7CglpZiAoKGJhdWRfdmFsdWUgJSAxMCkgPj0gNSkKCQliYXVkX3ZhbHVlID0gKGJhdWRfdmFsdWUgLyAxMCkgKyAxOwoJZWxzZQoJCWJhdWRfdmFsdWUgLz0gMTA7CglyZXR1cm4gYmF1ZF92YWx1ZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1NldEJhdWRyYXRlCi8vKiBcYnJpZWYgU2V0IHRoZSBiYXVkcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIENQVSBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1haW5DbG9jaywgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrCgl1bnNpZ25lZCBpbnQgc3BlZWQpICAgICAvLyBcYXJnIFVBUlQgYmF1ZHJhdGUKewoJLy8qIERlZmluZSB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXIKCXBVU0FSVC0+VVNfQlJHUiA9IEFUOTFGX1VTX0JhdWRyYXRlKG1haW5DbG9jaywgc3BlZWQpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfU2V0VGltZWd1YXJkCi8vKiBcYnJpZWYgU2V0IFVTQVJUIHRpbWVndWFyZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0VGltZWd1YXJkICgKCUFUOTFQU19VU0FSVCBwVVNBUlQsICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCB0aW1lZ3VhcmQpIC8vIFxhcmcgdGltZWd1YXJkIHZhbHVlCnsKCS8vKiBXcml0ZSB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyCglwVVNBUlQtPlVTX1RUR1IgPSB0aW1lZ3VhcmQgOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgVVNBUlQgSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZUl0ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQsIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcFVTQVJULT5VU19JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBVU0FSVCBJVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZUl0ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQsIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBVU0FSVC0+VVNfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0NvbmZpZ3VyZQovLyogXGJyaWVmIENvbmZpZ3VyZSBVU0FSVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfQ29uZmlndXJlICgKCUFUOTFQU19VU0FSVCBwVVNBUlQsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbWFpbkNsb2NrLCAgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrCgl1bnNpZ25lZCBpbnQgbW9kZSAsICAgICAgLy8gXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQKCXVuc2lnbmVkIGludCBiYXVkUmF0ZSAsICAvLyBcYXJnIGJhdWRyYXRlIHRvIGJlIHByb2dyYW1tZWQKCXVuc2lnbmVkIGludCB0aW1lZ3VhcmQgKSAvLyBcYXJnIHRpbWVndWFyZCB0byBiZSBwcm9ncmFtbWVkCnsKICAgIC8vKiBEaXNhYmxlIGludGVycnVwdHMKICAgIHBVU0FSVC0+VVNfSURSID0gKHVuc2lnbmVkIGludCkgLTE7CgogICAgLy8qIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcgogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JTVFJYIHwgQVQ5MUNfVVNfUlNUVFggfCBBVDkxQ19VU19SWERJUyB8IEFUOTFDX1VTX1RYRElTIDsKCgkvLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlcgoJQVQ5MUZfVVNfU2V0QmF1ZHJhdGUocFVTQVJULCBtYWluQ2xvY2ssIGJhdWRSYXRlKTsKCgkvLyogV3JpdGUgdGhlIFRpbWVndWFyZCBSZWdpc3RlcgoJQVQ5MUZfVVNfU2V0VGltZWd1YXJkKHBVU0FSVCwgdGltZWd1YXJkKTsKCiAgICAvLyogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMKICAgIEFUOTFGX1BEQ19PcGVuKChBVDkxUFNfUERDKSAmKHBVU0FSVC0+VVNfUlBSKSk7CgogICAgLy8qIERlZmluZSB0aGUgVVNBUlQgbW9kZQogICAgcFVTQVJULT5VU19NUiA9IG1vZGUgIDsKCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVSeAovLyogXGJyaWVmIEVuYWJsZSByZWNlaXZpbmcgY2hhcmFjdGVycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlUnggKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgLy8qIEVuYWJsZSByZWNlaXZlcgogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVUeAovLyogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGNoYXJhY3RlcnMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZVR4ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCnsKICAgIC8vKiBFbmFibGUgIHRyYW5zbWl0dGVyCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1Jlc2V0UngKLy8qIFxicmllZiBSZXNldCBSZWNlaXZlciBhbmQgcmUtZW5hYmxlIGl0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19SZXNldFJ4ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCnsKCS8vKiBSZXNldCByZWNlaXZlcgoJcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JTVFJYOwogICAgLy8qIFJlLUVuYWJsZSByZWNlaXZlcgogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19SZXNldFR4Ci8vKiBcYnJpZWYgUmVzZXQgVHJhbnNtaXR0ZXIgYW5kIHJlLWVuYWJsZSBpdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfUmVzZXRUeCAoCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CgkvLyogUmVzZXQgdHJhbnNtaXR0ZXIKCXBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RUWDsKICAgIC8vKiBFbmFibGUgdHJhbnNtaXR0ZXIKICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZVJ4Ci8vKiBcYnJpZWYgRGlzYWJsZSBSZWNlaXZlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZVJ4ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlVHgKLy8qIFxicmllZiBEaXNhYmxlIFRyYW5zbWl0dGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlVHggKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgLy8qIERpc2FibGUgdHJhbnNtaXR0ZXIKICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWERJUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0Nsb3NlCi8vKiBcYnJpZWYgQ2xvc2UgVVNBUlQ6IGRpc2FibGUgSVQgZGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIsIGNsb3NlIFBEQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfQ2xvc2UgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgLy8qIFJlc2V0IHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlcgogICAgcFVTQVJULT5VU19CUkdSID0gMCA7CgogICAgLy8qIFJlc2V0IHRoZSBVU0FSVCBtb2RlCiAgICBwVVNBUlQtPlVTX01SID0gMCAgOwoKICAgIC8vKiBSZXNldCB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyCiAgICBwVVNBUlQtPlVTX1RUR1IgPSAwOwoKICAgIC8vKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCiAgICBwVVNBUlQtPlVTX0lEUiA9IDB4RkZGRkZGRkYgOwoKICAgIC8vKiBBYm9ydCB0aGUgUGVyaXBoZXJhbCBEYXRhIFRyYW5zZmVycwogICAgQVQ5MUZfUERDX0Nsb3NlKChBVDkxUFNfUERDKSAmKHBVU0FSVC0+VVNfUlBSKSk7CgogICAgLy8qIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGFuZCBzdG9wIGFueSBhY3Rpdml0eSBpbW1lZGlhdGVseQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRElTIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JTVFJYIDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1R4UmVhZHkKLy8qIFxicmllZiBSZXR1cm4gMSBpZiBhIGNoYXJhY3RlciBjYW4gYmUgd3JpdHRlbiBpbiBVU19USFIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfVHhSZWFkeSAoCglBVDkxUFNfVVNBUlQgcFVTQVJUICkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgcmV0dXJuIChwVVNBUlQtPlVTX0NTUiAmIEFUOTFDX1VTX1RYUkRZKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1J4UmVhZHkKLy8qIFxicmllZiBSZXR1cm4gMSBpZiBhIGNoYXJhY3RlciBjYW4gYmUgcmVhZCBpbiBVU19SSFIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfUnhSZWFkeSAoCglBVDkxUFNfVVNBUlQgcFVTQVJUICkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgcmV0dXJuIChwVVNBUlQtPlVTX0NTUiAmIEFUOTFDX1VTX1JYUkRZKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0Vycm9yCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmbGFnCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX0Vycm9yICgKCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICByZXR1cm4gKHBVU0FSVC0+VVNfQ1NSICYKICAgIAkoQVQ5MUNfVVNfT1ZSRSB8ICAvLyBPdmVycnVuIGVycm9yCiAgICAJIEFUOTFDX1VTX0ZSQU1FIHwgLy8gRnJhbWluZyBlcnJvcgogICAgCSBBVDkxQ19VU19QQVJFKSk7ICAvLyBQYXJpdHkgZXJyb3IKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1B1dENoYXIKLy8qIFxicmllZiBTZW5kIGEgY2hhcmFjdGVyLGRvZXMgbm90IGNoZWNrIGlmIHJlYWR5IHRvIHNlbmQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1B1dENoYXIgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwKCWludCBjaGFyYWN0ZXIgKQp7CiAgICBwVVNBUlQtPlVTX1RIUiA9IChjaGFyYWN0ZXIgJiAweDFGRik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19HZXRDaGFyCi8vKiBcYnJpZWYgUmVjZWl2ZSBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiBhIGNoYXJhY3RlciBpcyBhdmFpbGFibGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfVVNfR2V0Q2hhciAoCgljb25zdCBBVDkxUFNfVVNBUlQgcFVTQVJUKQp7CiAgICByZXR1cm4oKHBVU0FSVC0+VVNfUkhSKSAmIDB4MUZGKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1NlbmRGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1NlbmRGcmFtZSgKCUFUOTFQU19VU0FSVCBwVVNBUlQsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJcmV0dXJuIEFUOTFGX1BEQ19TZW5kRnJhbWUoCgkJKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpLAoJCXBCdWZmZXIsCgkJc3pCdWZmZXIsCgkJcE5leHRCdWZmZXIsCgkJc3pOZXh0QnVmZmVyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1JlY2VpdmVGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1JlY2VpdmVGcmFtZSAoCglBVDkxUFNfVVNBUlQgcFVTQVJULAoJY2hhciAqcEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzekJ1ZmZlciwKCWNoYXIgKnBOZXh0QnVmZmVyLAoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApCnsKCXJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKAoJCShBVDkxUFNfUERDKSAmKHBVU0FSVC0+VVNfUlBSKSwKCQlwQnVmZmVyLAoJCXN6QnVmZmVyLAoJCXBOZXh0QnVmZmVyLAoJCXN6TmV4dEJ1ZmZlcik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19TZXRJcmRhRmlsdGVyCi8vKiBcYnJpZWYgU2V0IHRoZSB2YWx1ZSBvZiBJckRhIGZpbHRlciB0cmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldElyZGFGaWx0ZXIgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwKCXVuc2lnbmVkIGNoYXIgdmFsdWUKKQp7CglwVVNBUlQtPlVTX0lGID0gdmFsdWU7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNTQwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyogRGVmaW5lIHRoZSBzdGFuZGFyZCBJMlMgbW9kZSBjb25maWd1cmF0aW9uCgovLyogQ29uZmlndXJhdGlvbiB0byBzZXQgaW4gdGhlIFNTQyBUcmFuc21pdCBDbG9jayBNb2RlIFJlZ2lzdGVyCi8vKiBQYXJhbWV0ZXJzIDogIG5iX2JpdF9ieV9zbG90IDogOCwgMTYgb3IgMzIgYml0cwovLyogCQkJICBuYl9zbG90X2J5X2ZyYW1lIDogbnVtYmVyIG9mIGNoYW5uZWxzCiNkZWZpbmUgQVQ5MUNfSTJTX0FTWV9NQVNURVJfVFhfU0VUVElORyhuYl9iaXRfYnlfc2xvdCwgbmJfc2xvdF9ieV9mcmFtZSkoICtcCgkJCQkJCQkJCSAgIEFUOTFDX1NTQ19DS1NfRElWICAgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgQVQ5MUNfU1NDX0NLT19DT05USU5PVVMgICAgICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICBBVDkxQ19TU0NfQ0tHX05PTkUgICAgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfU1NDX1NUQVJUX0ZBTExfUkYgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgQVQ5MUNfU1NDX1NUVE9VVCAgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgKCgxPDwxNikgJiBBVDkxQ19TU0NfU1RURExZKSArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAoKCgobmJfYml0X2J5X3Nsb3QqbmJfc2xvdF9ieV9mcmFtZSkvMiktMSkgPDwyNCkpCgoKLy8qIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgRnJhbWUgTW9kZSBSZWdpc3RlcgovLyogUGFyYW1ldGVycyA6IG5iX2JpdF9ieV9zbG90IDogOCwgMTYgb3IgMzIgYml0cwovLyogCQkJIG5iX3Nsb3RfYnlfZnJhbWUgOiBudW1iZXIgb2YgY2hhbm5lbHMKI2RlZmluZSBBVDkxQ19JMlNfQVNZX1RYX0ZSQU1FX1NFVFRJTkcobmJfYml0X2J5X3Nsb3QsIG5iX3Nsb3RfYnlfZnJhbWUpKCArXAoJCQkJCQkJCQkobmJfYml0X2J5X3Nsb3QtMSkgICtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUFUOTFDX1NTQ19NU0JGICAgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJKCgobmJfc2xvdF9ieV9mcmFtZS0xKTw8OCkgJiBBVDkxQ19TU0NfREFUTkIpICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkoKChuYl9iaXRfYnlfc2xvdC0xKTw8MTYpICYgQVQ5MUNfU1NDX0ZTTEVOKSArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlBVDkxQ19TU0NfRlNPU19ORUdBVElWRSkKCgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX1NldEJhdWRyYXRlCi8vKiBcYnJpZWYgU2V0IHRoZSBiYXVkcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIENQVSBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX1NldEJhdWRyYXRlICgKICAgICAgICBBVDkxUFNfU1NDIHBTU0MsICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBtYWluQ2xvY2ssIC8vIFxhcmcgcGVyaXBoZXJhbCBjbG9jawogICAgICAgIHVuc2lnbmVkIGludCBzcGVlZCkgICAgIC8vIFxhcmcgU1NDIGJhdWRyYXRlCnsKICAgICAgICB1bnNpZ25lZCBpbnQgYmF1ZF92YWx1ZTsKICAgICAgICAvLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlcgogICAgICAgIGlmIChzcGVlZCA9PSAwKQogICAgICAgICAgIGJhdWRfdmFsdWUgPSAwOwogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgYmF1ZF92YWx1ZSA9ICh1bnNpZ25lZCBpbnQpIChtYWluQ2xvY2sgKiAxMCkvKDIqc3BlZWQpOwogICAgICAgICAgIGlmICgoYmF1ZF92YWx1ZSAlIDEwKSA+PSA1KQogICAgICAgICAgICAgICAgICBiYXVkX3ZhbHVlID0gKGJhdWRfdmFsdWUgLyAxMCkgKyAxOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgYmF1ZF92YWx1ZSAvPSAxMDsKICAgICAgICB9CgogICAgICAgIHBTU0MtPlNTQ19DTVIgPSBiYXVkX3ZhbHVlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0NvbmZpZ3VyZQovLyogXGJyaWVmIENvbmZpZ3VyZSBTU0MKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19Db25maWd1cmUgKAogICAgICAgICAgICAgQVQ5MVBTX1NTQyBwU1NDLCAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgogICAgICAgICAgICAgdW5zaWduZWQgaW50IHN5c3RfY2xvY2ssICAvLyBcYXJnIFN5c3RlbSBDbG9jayBGcmVxdWVuY3kKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkX3JhdGUsICAgLy8gXGFyZyBFeHBlY3RlZCBCYXVkIFJhdGUgRnJlcXVlbmN5CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xvY2tfcngsICAgIC8vIFxhcmcgUmVjZWl2ZXIgQ2xvY2sgUGFyYW1ldGVycwogICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGVfcngsICAgICAvLyBcYXJnIG1vZGUgUmVnaXN0ZXIgdG8gYmUgcHJvZ3JhbW1lZAogICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3R4LCAgICAvLyBcYXJnIFRyYW5zbWl0dGVyIENsb2NrIFBhcmFtZXRlcnMKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlX3R4KSAgICAgLy8gXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQKewogICAgLy8qIERpc2FibGUgaW50ZXJydXB0cwoJcFNTQy0+U1NDX0lEUiA9ICh1bnNpZ25lZCBpbnQpIC0xOwoKICAgIC8vKiBSZXNldCByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIKCXBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19TV1JTVCB8IEFUOTFDX1NTQ19SWERJUyB8IEFUOTFDX1NTQ19UWERJUyA7CgogICAgLy8qIERlZmluZSB0aGUgQ2xvY2sgTW9kZSBSZWdpc3RlcgoJQVQ5MUZfU1NDX1NldEJhdWRyYXRlKHBTU0MsIHN5c3RfY2xvY2ssIGJhdWRfcmF0ZSk7CgogICAgIC8vKiBXcml0ZSB0aGUgUmVjZWl2ZSBDbG9jayBNb2RlIFJlZ2lzdGVyCglwU1NDLT5TU0NfUkNNUiA9ICBjbG9ja19yeDsKCiAgICAgLy8qIFdyaXRlIHRoZSBUcmFuc21pdCBDbG9jayBNb2RlIFJlZ2lzdGVyCglwU1NDLT5TU0NfVENNUiA9ICBjbG9ja190eDsKCiAgICAgLy8qIFdyaXRlIHRoZSBSZWNlaXZlIEZyYW1lIE1vZGUgUmVnaXN0ZXIKCXBTU0MtPlNTQ19SRk1SID0gIG1vZGVfcng7CgogICAgIC8vKiBXcml0ZSB0aGUgVHJhbnNtaXQgRnJhbWUgTW9kZSBSZWdpc3RlcgoJcFNTQy0+U1NDX1RGTVIgPSAgbW9kZV90eDsKCiAgICAvLyogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMKCUFUOTFGX1BEQ19PcGVuKChBVDkxUFNfUERDKSAmKHBTU0MtPlNTQ19SUFIpKTsKCgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVJ4Ci8vKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmluZyBkYXRhcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0VuYWJsZVJ4ICgKCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCnsKICAgIC8vKiBFbmFibGUgcmVjZWl2ZXIKICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19SWEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0Rpc2FibGVSeAovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2aW5nIGRhdGFzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRGlzYWJsZVJ4ICgKCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRW5hYmxlVHgKLy8qIFxicmllZiBFbmFibGUgc2VuZGluZyBkYXRhcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0VuYWJsZVR4ICgKCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCnsKICAgIC8vKiBFbmFibGUgIHRyYW5zbWl0dGVyCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfVFhFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlVHgKLy8qIFxicmllZiBEaXNhYmxlIHNlbmRpbmcgZGF0YXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlVHggKAoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKewogICAgLy8qIERpc2FibGUgIHRyYW5zbWl0dGVyCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfVFhESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgU1NDIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRW5hYmxlSXQgKAoJQVQ5MVBTX1NTQyBwU1NDLCAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwU1NDLT5TU0NfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFNTQyBJVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0Rpc2FibGVJdCAoCglBVDkxUFNfU1NDIHBTU0MsIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyCglwU1NDLT5TU0NfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19SZWNlaXZlRnJhbWUKLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19SZWNlaXZlRnJhbWUgKAoJQVQ5MVBTX1NTQyBwU1NDLAoJY2hhciAqcEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzekJ1ZmZlciwKCWNoYXIgKnBOZXh0QnVmZmVyLAoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApCnsKCXJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKAoJCShBVDkxUFNfUERDKSAmKHBTU0MtPlNTQ19SUFIpLAoJCXBCdWZmZXIsCgkJc3pCdWZmZXIsCgkJcE5leHRCdWZmZXIsCgkJc3pOZXh0QnVmZmVyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19TZW5kRnJhbWUKLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19TZW5kRnJhbWUoCglBVDkxUFNfU1NDIHBTU0MsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJcmV0dXJuIEFUOTFGX1BEQ19TZW5kRnJhbWUoCgkJKEFUOTFQU19QREMpICYocFNTQy0+U1NDX1JQUiksCgkJcEJ1ZmZlciwKCQlzekJ1ZmZlciwKCQlwTmV4dEJ1ZmZlciwKCQlzek5leHRCdWZmZXIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gU1NDIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBTU0MgSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1NTQyBwU3NjKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwU3NjLT5TU0NfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBTU0MgSW50ZXJydXB0IGlzIE1hc2tlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1NTQyBwU3NjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwU3NjKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUV0kKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RXSV9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBUV0kgSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9FbmFibGVJdCAoCglBVDkxUFNfVFdJIHBUV0ksIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBUV0ktPlRXSV9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgVFdJIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfRGlzYWJsZUl0ICgKCUFUOTFQU19UV0kgcFRXSSwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBUV0ktPlRXSV9JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NvbmZpZ3VyZQovLyogXGJyaWVmIENvbmZpZ3VyZSBUV0kgaW4gbWFzdGVyIG1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9Db25maWd1cmUgKCBBVDkxUFNfVFdJIHBUV0kgKSAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcgp7CiAgICAvLyogRGlzYWJsZSBpbnRlcnJ1cHRzCglwVFdJLT5UV0lfSURSID0gKHVuc2lnbmVkIGludCkgLTE7CgogICAgLy8qIFJlc2V0IHBlcmlwaGVyYWwKCXBUV0ktPlRXSV9DUiA9IEFUOTFDX1RXSV9TV1JTVDsKCgkvLyogU2V0IE1hc3RlciBtb2RlCglwVFdJLT5UV0lfQ1IgPSBBVDkxQ19UV0lfTVNFTjsKCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRXSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfVFdJIHBUd2kpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBUd2ktPlRXSV9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UV0lfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFRXSSBJbnRlcnJ1cHQgaXMgTWFza2VkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfVFdJIHBUd2ksICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKICAgICAgICByZXR1cm4gKEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBUd2kpICYgZmxhZyk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBXTUMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9HZXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUFdNIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19HZXRTdGF0dXMoIC8vIFxyZXR1cm4gUFdNIEludGVycnVwdCBTdGF0dXMKCUFUOTFQU19QV01DIHBQV00pIC8vIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgp7CglyZXR1cm4gcFBXTS0+UFdNQ19TUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9JbnRlcnJ1cHRFbmFibGUKLy8qIFxicmllZiBFbmFibGUgUFdNIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19JbnRlcnJ1cHRFbmFibGUoCiAgICAgICAgQVQ5MVBTX1BXTUMgcFB3bSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgUFdNIGludGVycnVwdCB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUHdtLT5QV01DX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fSW50ZXJydXB0RGlzYWJsZQovLyogXGJyaWVmIERpc2FibGUgUFdNIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19JbnRlcnJ1cHREaXNhYmxlKAogICAgICAgIEFUOTFQU19QV01DIHBQd20sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFBXTSBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBQd20tPlBXTUNfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBXTSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfUFdNQyBwUHdtKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUHdtLT5QV01DX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwUFdNKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0lzU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0lzU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfUFdNQ19HZXRTdGF0dXMocFBXTSkgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9DZmdDaGFubmVsCi8vKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DZmdDaGFubmVsKAogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxJZCwgLy8gXGFyZyBQV00gY2hhbm5lbCBJRAogICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCAvLyBcYXJnICBQV00gbW9kZQogICAgICAgIHVuc2lnbmVkIGludCBwZXJpb2QsIC8vIFxhcmcgUFdNIHBlcmlvZAogICAgICAgIHVuc2lnbmVkIGludCBkdXR5KSAvLyBcYXJnIFBXTSBkdXR5IGN5Y2xlCnsKCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NNUiA9IG1vZGU7CglwUFdNLT5QV01DX0NIW2NoYW5uZWxJZF0uUFdNQ19DRFRZUiA9IGR1dHk7CglwUFdNLT5QV01DX0NIW2NoYW5uZWxJZF0uUFdNQ19DUFJEUiA9IHBlcmlvZDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9TdGFydENoYW5uZWwKLy8qIFxicmllZiBFbmFibGUgY2hhbm5lbAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19TdGFydENoYW5uZWwoCiAgICAgICAgQVQ5MVBTX1BXTUMgcFBXTSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQKewoJcFBXTS0+UFdNQ19FTkEgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNX1N0b3BDaGFubmVsCi8vKiBcYnJpZWYgRGlzYWJsZSBjaGFubmVsCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1N0b3BDaGFubmVsKAogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkCnsKCXBQV00tPlBXTUNfRElTID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9VcGRhdGVDaGFubmVsCi8vKiBcYnJpZWYgVXBkYXRlIFBlcmlvZCBvciBEdXR5IEN5Y2xlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1VwZGF0ZUNoYW5uZWwoCiAgICAgICAgQVQ5MVBTX1BXTUMgcFBXTSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbElkLCAvLyBcYXJnIFBXTSBjaGFubmVsIElECiAgICAgICAgdW5zaWduZWQgaW50IHVwZGF0ZSkgLy8gXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQKewoJcFBXTS0+UFdNQ19DSFtjaGFubmVsSWRdLlBXTUNfQ1VQRFIgPSB1cGRhdGU7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFVEUAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIFVEUCBJVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VuYWJsZUl0ICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBVRFAtPlVEUF9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgVURQIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRGlzYWJsZUl0ICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyCglwVURQLT5VRFBfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9TZXRBZGRyZXNzCi8vKiBcYnJpZWYgU2V0IFVEUCBmdW5jdGlvbmFsIGFkZHJlc3MKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9TZXRBZGRyZXNzICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGFkZHJlc3MpICAgLy8gXGFyZyBuZXcgVURQIGFkZHJlc3MKewoJcFVEUC0+VURQX0ZBRERSID0gKEFUOTFDX1VEUF9GRU4gfCBhZGRyZXNzKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVFcAovLyogXGJyaWVmIEVuYWJsZSBFbmRwb2ludAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VuYWJsZUVwICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyCnsKCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdIHw9IEFUOTFDX1VEUF9FUEVEUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9EaXNhYmxlRXAKLy8qIFxicmllZiBFbmFibGUgRW5kcG9pbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9EaXNhYmxlRXAgKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKewoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gJj0gfkFUOTFDX1VEUF9FUEVEUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9TZXRTdGF0ZQovLyogXGJyaWVmIFNldCBVRFAgRGV2aWNlIHN0YXRlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfU2V0U3RhdGUgKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgbmV3IFVEUCBhZGRyZXNzCnsKCXBVRFAtPlVEUF9HTEJTVEFURSAgJj0gfihBVDkxQ19VRFBfRkFEREVOIHwgQVQ5MUNfVURQX0NPTkZHKTsKCXBVRFAtPlVEUF9HTEJTVEFURSAgfD0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9HZXRTdGF0ZQovLyogXGJyaWVmIHJldHVybiBVRFAgRGV2aWNlIHN0YXRlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9HZXRTdGF0ZSAoIC8vIFxyZXR1cm4gdGhlIFVEUCBkZXZpY2Ugc3RhdGUKCUFUOTFQU19VRFAgcFVEUCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCnsKCXJldHVybiAocFVEUC0+VURQX0dMQlNUQVRFICAmIChBVDkxQ19VRFBfRkFEREVOIHwgQVQ5MUNfVURQX0NPTkZHKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfUmVzZXRFcAovLyogXGJyaWVmIFJlc2V0IFVEUCBlbmRwb2ludAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1Jlc2V0RXAgKCAvLyBccmV0dXJuIHRoZSBVRFAgZGV2aWNlIHN0YXRlCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBFbmRwb2ludHMgdG8gYmUgcmVzZXQKewoJcFVEUC0+VURQX1JTVEVQID0gZmxhZzsKCXBVRFAtPlVEUF9SU1RFUCA9IDA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTdGFsbAovLyogXGJyaWVmIEVuZHBvaW50IHdpbGwgU1RBTEwgcmVxdWVzdHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFN0YWxsKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKewoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gQVQ5MUNfVURQX0ZPUkNFU1RBTEw7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBXcml0ZQovLyogXGJyaWVmIFdyaXRlIHZhbHVlIGluIHRoZSBEUFIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFdyaXRlKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKCXVuc2lnbmVkIGNoYXIgdmFsdWUpICAgICAvLyBcYXJnIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIERQUgp7CglwVURQLT5VRFBfRkRSW2VuZHBvaW50XSA9IHZhbHVlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwUmVhZAovLyogXGJyaWVmIFJldHVybiB2YWx1ZSBmcm9tIHRoZSBEUFIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0VwUmVhZCgKCUFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyCnsKCXJldHVybiBwVURQLT5VRFBfRkRSW2VuZHBvaW50XTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9FcEVuZE9mV3IKLy8qIFxicmllZiBOb3RpZnkgdGhlIFVEUCB0aGF0IHZhbHVlcyBpbiBEUFIgYXJlIHJlYWR5IHRvIGJlIHNlbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcEVuZE9mV3IoCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgp7CglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSB8PSBBVDkxQ19VRFBfVFhQS1RSRFk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBDbGVhcgovLyogXGJyaWVmIENsZWFyIGZsYWcgaW4gdGhlIGVuZHBvaW50IENTUiByZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwQ2xlYXIoCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQsICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgICAgIC8vIFxhcmcgZmxhZyB0byBiZSBjbGVhcmVkCnsKCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdICY9IH4oZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTZXQKLy8qIFxicmllZiBTZXQgZmxhZyBpbiB0aGUgZW5kcG9pbnQgQ1NSIHJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBTZXQoCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQsICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgICAgIC8vIFxhcmcgZmxhZyB0byBiZSBjbGVhcmVkCnsKCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdIHw9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gdGhlIGVuZHBvaW50IENTUiByZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfRXBTdGF0dXMoCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgp7CglyZXR1cm4gcFVEUC0+VURQX0NTUltlbmRwb2ludF07Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFVEUCBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfVURQIHBVZHApIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBVZHAtPlVEUF9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFVEUCBJbnRlcnJ1cHQgaXMgTWFza2VkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1VEUF9Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfVURQIHBVZHAsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKICAgICAgICByZXR1cm4gKEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBVZHApICYgZmxhZyk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRDCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUKLy8qIFxicmllZiBFbmFibGUgVEMgSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUoCiAgICAgICAgQVQ5MVBTX1RDIHBUYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZAp7CiAgICAgICAgcFRjLT5UQ19JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVENfSW50ZXJydXB0RGlzYWJsZQovLyogXGJyaWVmIERpc2FibGUgVEMgSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQ19JbnRlcnJ1cHREaXNhYmxlKAogICAgICAgIEFUOTFQU19UQyBwVGMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgVEMgaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwVGMtPlRDX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFRDIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRDIEludGVycnVwdCBNYXNrIFN0YXR1cwogICAgICAgIEFUOTFQU19UQyBwVGMpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFRjLT5UQ19JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgVEMgSW50ZXJydXB0IGlzIE1hc2tlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfVEMgcFRjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKICAgICAgICByZXR1cm4gKEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMocFRjKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBDQU4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KI2RlZmluZQlTVEFOREFSRF9GT1JNQVQgMAojZGVmaW5lCUVYVEVOREVEX0ZPUk1BVCAxCgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfSW5pdE1haWxib3hSZWdpc3RlcnMoKQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9Jbml0TWFpbGJveFJlZ2lzdGVycyhBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LAoJCQkJCQkJCWludCAgCQkJbW9kZV9yZWcsCgkJCQkJCQkJaW50IAkJCWFjY2VwdGFuY2VfbWFza19yZWcsCgkJCQkJCQkJaW50ICAJCQlpZF9yZWcsCgkJCQkJCQkJaW50ICAJCQlkYXRhX2xvd19yZWcsCgkJCQkJCQkJaW50ICAJCQlkYXRhX2hpZ2hfcmVnLAoJCQkJCQkJCWludCAgCQkJY29udHJvbF9yZWcpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUNSIAk9IDB4MDsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTU1SIAk9IG1vZGVfcmVnOwoJQ0FOX01haWxib3gtPkNBTl9NQl9NQU0gCT0gYWNjZXB0YW5jZV9tYXNrX3JlZzsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEIAk9IGlkX3JlZzsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURMIAk9IGRhdGFfbG93X3JlZzsgCQkKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIIAk9IGRhdGFfaGlnaF9yZWc7CglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiAJPSBjb250cm9sX3JlZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0VuYWJsZUNBTigpCi8vKiBcYnJpZWYKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0VuYWJsZUNBTigKCUFUOTFQU19DQU4gcENBTikgICAgIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgp7CglwQ0FOLT5DQU5fTVIgfD0gQVQ5MUNfQ0FOX0NBTkVOOwoKCS8vIFdhaXQgZm9yIFdBS0VVUCBmbGFnIHJhaXNpbmcgPD0+IDExLXJlY2Vzc2l2ZS1iaXQgd2VyZSBzY2FubmVkIGJ5IHRoZSB0cmFuc2NlaXZlcgoJd2hpbGUoIChwQ0FOLT5DQU5fU1IgJiBBVDkxQ19DQU5fV0FLRVVQKSAhPSBBVDkxQ19DQU5fV0FLRVVQICk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EaXNhYmxlQ0FOKCkKLy8qIFxicmllZgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfRGlzYWJsZUNBTigKCUFUOTFQU19DQU4gcENBTikgICAgIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgp7CglwQ0FOLT5DQU5fTVIgJj0gfkFUOTFDX0NBTl9DQU5FTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBDQU4gaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fRW5hYmxlSXQgKAoJQVQ5MVBTX0NBTiBwQ0FOLCAgICAgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwQ0FOLT5DQU5fSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIENBTiBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9EaXNhYmxlSXQgKAoJQVQ5MVBTX0NBTiBwQ0FOLCAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcENBTi0+Q0FOX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBJbnRlcnJ1cHQgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRTdGF0dXMoIC8vIFxyZXR1cm4gQ0FOIEludGVycnVwdCBTdGF0dXMKCUFUOTFQU19DQU4gcENBTikgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCnsKCXJldHVybiBwQ0FOLT5DQU5fU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBDQU4gSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIENBTiBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKCUFUOTFQU19DQU4gcENBTikgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCnsKCXJldHVybiBwQ0FOLT5DQU5fSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBDQU4gSW50ZXJydXB0IGlzIE1hc2tlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX0NBTiBwQ0FOLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBDQU4pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSXNTdGF0dXNTZXQKLy8qIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9Jc1N0YXR1c1NldCgKICAgICAgICBBVDkxUFNfQ0FOIHBDQU4sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfQ0FOX0dldFN0YXR1cyhwQ0FOKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01vZGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIENBTiBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTW9kZVJlZyAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyCnsKCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIKCXBDQU4tPkNBTl9NUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TW9kZVJlZwovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgdmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1vZGVSZWcgKAoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcENBTi0+Q0FOX01SOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdCYXVkcmF0ZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgQmF1ZHJhdGUgb2YgdGhlIENBTiBjb250cm9sbGVyIGZvciB0aGUgbmV0d29yawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ0JhdWRyYXRlUmVnICgKCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgYmF1ZHJhdGVfY2ZnKQp7CgkvLyogV3JpdGUgdG8gdGhlIEJSIHJlZ2lzdGVyCglwQ0FOLT5DQU5fQlIgPSBiYXVkcmF0ZV9jZmc7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEJhdWRyYXRlCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBCYXVkcmF0ZSBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgZm9yIHRoZSBuZXR3b3JrIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRCYXVkcmF0ZSAoCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQ0FOLT5DQU5fQlI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlcgovLyogXGJyaWVmIFJldHVybiBDQU4gVGltZXIgUmVnc2l0ZXIgVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlciAoCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQ0FOLT5DQU5fVElNOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRUaW1lc3RhbXAKLy8qIFxicmllZiBSZXR1cm4gQ0FOIFRpbWVzdGFtcCBSZWdpc3RlciBWYWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0VGltZXN0YW1wICgKCUFUOTFQU19DQU4gcENBTiAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBDQU4tPkNBTl9USU1FU1RQOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRFcnJvckNvdW50ZXIKLy8qIFxicmllZiBSZXR1cm4gQ0FOIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIgVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEVycm9yQ291bnRlciAoCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQ0FOLT5DQU5fRUNSOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0Ci8vKiBcYnJpZWYgUmVxdWVzdCBmb3IgYSB0cmFuc2ZlciBvbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0ICgKCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCiAgICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfY21kKQp7CglwQ0FOLT5DQU5fVENSID0gdHJhbnNmZXJfY21kOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9Jbml0QWJvcnRSZXF1ZXN0Ci8vKiBcYnJpZWYgQWJvcnQgdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveGVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fSW5pdEFib3J0UmVxdWVzdCAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgogICAgdW5zaWduZWQgaW50IGFib3J0X2NtZCkKewoJcENBTi0+Q0FOX0FDUiA9IGFib3J0X2NtZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZU1vZGVSZWcKLy8qIFxicmllZiBQcm9ncmFtIHRoZSBNZXNzYWdlIE1vZGUgUmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlTW9kZVJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKICAgIHVuc2lnbmVkIGludCBtb2RlKQp7CglDQU5fTWFpbGJveC0+Q0FOX01CX01NUiA9IG1vZGU7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNZXNzYWdlIE1vZGUgUmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NTVI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VJRFJlZwovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIKLy8qIFxicmllZiBWZXJzaW9uID09IDAgZm9yIFN0YW5kYXJkIG1lc3NzYWdlLCBWZXJzaW9uID09IDEgZm9yIEV4dGVuZGVkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUlEUmVnICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGlkLAogICAgdW5zaWduZWQgY2hhciB2ZXJzaW9uKQp7CglpZih2ZXJzaW9uPT0wKQkvLyBJRHZBIFN0YW5kYXJkIEZvcm1hdAoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQ8PDE4OwoJZWxzZQkvLyBJRHZCIEV4dGVuZGVkIEZvcm1hdAoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQgfCAoMTw8MjkpOwkvLyBzZXQgTUlERSBiaXQKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlSURSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VJRFJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKewoJcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUlEOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZwovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IG1hc2spCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gbWFzazsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcgKAoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94CnsKCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01BTTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRGYW1pbHlJRAovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0RmFtaWx5SUQgKAoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94CnsKCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01GSUQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VDdHJsCi8vKiBcYnJpZWYgUmVxdWVzdCBhbmQgY29uZmlnIGZvciBhIHRyYW5zZmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3gKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQ3RybFJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKICAgIHVuc2lnbmVkIGludCBtZXNzYWdlX2N0cmxfY21kKQp7CglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiA9IG1lc3NhZ2VfY3RybF9jbWQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQ0FOIE1haWxib3ggU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlU3RhdHVzICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NU1I7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93Ci8vKiBcYnJpZWYgUHJvZ3JhbSBkYXRhIGxvdyB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93ICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGRhdGEpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURMID0gZGF0YTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFMb3cKLy8qIFxicmllZiBSZXR1cm4gZGF0YSBsb3cgdmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhTG93ICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NREw7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhSGlnaAovLyogXGJyaWVmIFByb2dyYW0gZGF0YSBoaWdoIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFIaWdoICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGRhdGEpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIID0gZGF0YTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFIaWdoCi8vKiBcYnJpZWYgUmV0dXJuIGRhdGEgaGlnaCB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFIaWdoICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NREg7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX09wZW4KLy8qIFxicmllZiBPcGVuIGEgQ0FOIFBvcnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX09wZW4gKAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudWxsKSAgLy8gXGFyZwp7CiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8KICAgICAgICByZXR1cm4gKCAwICk7Cn0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQURDCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgQURDIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0VuYWJsZUl0ICgKCUFUOTFQU19BREMgcEFEQywgICAgIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcEFEQy0+QURDX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBBREMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRGlzYWJsZUl0ICgKCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBBREMtPkFEQ19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0U3RhdHVzKCAvLyBccmV0dXJuIEFEQyBJbnRlcnJ1cHQgU3RhdHVzCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgp7CglyZXR1cm4gcEFEQy0+QURDX1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQURDIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBBREMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgp7CglyZXR1cm4gcEFEQy0+QURDX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgQURDIEludGVycnVwdCBpcyBNYXNrZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19BREMgcEFEQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwQURDKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0lzU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBBREMgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfSXNTdGF0dXNTZXQoCiAgICAgICAgQVQ5MVBTX0FEQyBwQURDLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX0FEQ19HZXRTdGF0dXMocEFEQykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdNb2RlUmVnCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ01vZGVSZWcgKAoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcgp7CgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyCglwQURDLT5BRENfTVIgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldE1vZGVSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFEQyBjb250cm9sbGVyIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRNb2RlUmVnICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19NUjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnVGltaW5ncwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgZGlmZmVyZW50IG5lY2Vzc2FyeSB0aW1pbmdzIG9mIHRoZSBBREMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1RpbWluZ3MgKAoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtY2tfY2xvY2ssIC8vIGluIE1IegoJdW5zaWduZWQgaW50IGFkY19jbG9jaywgLy8gaW4gTUh6Cgl1bnNpZ25lZCBpbnQgc3RhcnR1cF90aW1lLCAvLyBpbiB1cwoJdW5zaWduZWQgaW50IHNhbXBsZV9hbmRfaG9sZF90aW1lKQkvLyBpbiBucwp7Cgl1bnNpZ25lZCBpbnQgcHJlc2NhbCxzdGFydHVwLHNodGltOwoJCglwcmVzY2FsID0gbWNrX2Nsb2NrLygyKmFkY19jbG9jaykgLSAxOwoJc3RhcnR1cCA9IGFkY19jbG9jaypzdGFydHVwX3RpbWUvOCAtIDE7CglzaHRpbSA9IGFkY19jbG9jaypzYW1wbGVfYW5kX2hvbGRfdGltZS8xMDAwIC0gMTsKCQoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlcgoJcEFEQy0+QURDX01SID0gKCAocHJlc2NhbDw8OCkgJiBBVDkxQ19BRENfUFJFU0NBTCkgfCAoIChzdGFydHVwPDwxNikgJiBBVDkxQ19BRENfU1RBUlRVUCkgfCAoIChzaHRpbTw8MjQpICYgQVQ5MUNfQURDX1NIVElNKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19FbmFibGVDaGFubmVsCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0VuYWJsZUNoYW5uZWwgKAoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBjaGFubmVsKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcgp7CgkvLyogV3JpdGUgdG8gdGhlIENIRVIgcmVnaXN0ZXIKCXBBREMtPkFEQ19DSEVSID0gY2hhbm5lbDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19EaXNhYmxlQ2hhbm5lbAovLyogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19EaXNhYmxlQ2hhbm5lbCAoCglBVDkxUFNfQURDIHBBREMsIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGNoYW5uZWwpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyCnsKCS8vKiBXcml0ZSB0byB0aGUgQ0hEUiByZWdpc3RlcgoJcEFEQy0+QURDX0NIRFIgPSBjaGFubmVsOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENoYW5uZWxTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQURDIFRpbWVyIFJlZ2lzdGVyIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DSFNSOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24KLy8qIFxicmllZiBTb2Z0d2FyZSByZXF1ZXN0IGZvciBhIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24gKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglwQURDLT5BRENfQ1IgPSBBVDkxQ19BRENfU1RBUlQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX1NvZnRSZXNldAovLyogXGJyaWVmIFNvZnR3YXJlIHJlc2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfU29mdFJlc2V0ICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcEFEQy0+QURDX0NSID0gQVQ5MUNfQURDX1NXUlNUOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRMYXN0Q29udmVydGVkRGF0YQovLyogXGJyaWVmIFJldHVybiB0aGUgTGFzdCBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGEgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0xDRFI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDAKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMCBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMCAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSMDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAxIENvbnZlcnRlZCBEYXRhCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gxICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DRFIxOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gyCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDIgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDIgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0NEUjI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDMKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMyBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMyAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSMzsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINAovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA0IENvbnZlcnRlZCBEYXRhCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g0ICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DRFI0OwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g1Ci8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDUgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDUgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0NEUjU7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDYKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNiBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINiAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSNjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINwovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA3IENvbnZlcnRlZCBEYXRhCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g3ICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DRFI3OwkKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUVTCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgQUVTIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0VuYWJsZUl0ICgKCUFUOTFQU19BRVMgcEFFUywgICAgIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcEFFUy0+QUVTX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBBRVMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRGlzYWJsZUl0ICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBBRVMtPkFFU19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBBRVMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgU3RhdHVzCglBVDkxUFNfQUVTIHBBRVMpIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgp7CglyZXR1cm4gcEFFUy0+QUVTX0lTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gQUVTIEludGVycnVwdCBNYXNrIFN0YXR1cwoJQVQ5MVBTX0FFUyBwQUVTKSAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBBRVMtPkFFU19JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIEFFUyBJbnRlcnJ1cHQgaXMgTWFza2VkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfQUVTIHBBRVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfQUVTX0dldEludGVycnVwdE1hc2tTdGF0dXMocEFFUykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19Jc1N0YXR1c1NldAovLyogXGJyaWVmIFRlc3QgaWYgQUVTIFN0YXR1cyBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19BRVMgcEFFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9BRVNfR2V0U3RhdHVzKHBBRVMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfQ2ZnTW9kZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19DZmdNb2RlUmVnICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIKewoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlcgoJcEFFUy0+QUVTX01SID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRNb2RlUmVnCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBRVMgY29udHJvbGxlciB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0TW9kZVJlZyAoCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQUVTLT5BRVNfTVI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZwovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyAoCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgkpCnsKCXBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TVEFSVDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU29mdFJlc2V0Ci8vKiBcYnJpZWYgUmVzZXQgQUVTCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU29mdFJlc2V0ICgKCUFUOTFQU19BRVMgcEFFUyAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKCSkKewoJcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX1NXUlNUOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19Mb2FkTmV3U2VlZAovLyogXGJyaWVmIExvYWQgTmV3IFNlZWQgaW4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKAoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJKQp7CglwQUVTLT5BRVNfQ1IgPSBBVDkxQ19BRVNfTE9BRFNFRUQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1NldENyeXB0b0tleQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5ICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGtleXdvcmQKCSkKewoJcEFFUy0+QUVTX0tFWVd4UltpbmRleF0gPSBrZXl3b3JkOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19JbnB1dERhdGEKLy8qIFxicmllZiBTZXQgSW5wdXQgRGF0YSB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfSW5wdXREYXRhICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGluZGF0YQoJKQp7CglwQUVTLT5BRVNfSURBVEF4UltpbmRleF0gPSBpbmRhdGE7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEKLy8qIFxicmllZiBHZXQgT3V0cHV0IERhdGEgeAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0T3V0cHV0RGF0YSAoCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleAoJKQp7CglyZXR1cm4gcEFFUy0+QUVTX09EQVRBeFJbaW5kZXhdOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvcgovLyogXGJyaWVmIFNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKG9yIENvdW50ZXIpIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciAoCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBpbml0dmVjdG9yCgkpCnsKCXBBRVMtPkFFU19JVnhSW2luZGV4XSA9IGluaXR2ZWN0b3I7CQp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUREVTCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIFRERVMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0VuYWJsZUl0ICgKCUFUOTFQU19UREVTIHBUREVTLCAgICAgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcFRERVMtPlRERVNfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBUREVTIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19EaXNhYmxlSXQgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFRERVMtPlRERVNfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldFN0YXR1cyggLy8gXHJldHVybiBUREVTIEludGVycnVwdCBTdGF0dXMKCUFUOTFQU19UREVTIHBUREVTKSAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCnsKCXJldHVybiBwVERFUy0+VERFU19JU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCglBVDkxUFNfVERFUyBwVERFUykgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgp7CglyZXR1cm4gcFRERVMtPlRERVNfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgVERFUyBJbnRlcnJ1cHQgaXMgTWFza2VkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1RERVMgcFRERVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX1RERVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwVERFUykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfSXNTdGF0dXNTZXQKLy8qIFxicmllZiBUZXN0IGlmIFRERVMgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19UREVTIHBUREVTLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9UREVTX0dldFN0YXR1cyhwVERFUykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfQ2ZnTW9kZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ01vZGVSZWcgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcgp7CgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyCglwVERFUy0+VERFU19NUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldE1vZGVSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlciB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldE1vZGVSZWcgKAoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcFRERVMtPlRERVNfTVI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TdGFydFByb2Nlc3NpbmcKLy8qIFxicmllZiBTdGFydCBFbmNyeXB0aW9uIG9yIERlY3J5cHRpb24KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU3RhcnRQcm9jZXNzaW5nICgKCUFUOTFQU19UREVTIHBUREVTIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCSkKewoJcFRERVMtPlRERVNfQ1IgPSBBVDkxQ19UREVTX1NUQVJUOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfU29mdFJlc2V0Ci8vKiBcYnJpZWYgUmVzZXQgVERFUwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19Tb2Z0UmVzZXQgKAoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJKQp7CglwVERFUy0+VERFU19DUiA9IEFUOTFDX1RERVNfU1dSU1Q7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkxCi8vKiBcYnJpZWYgU2V0IENyeXB0b2dyYXBoaWMgS2V5IDEgV29yZCB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldENyeXB0b0tleTEgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgaW5kZXgsCgl1bnNpZ25lZCBpbnQga2V5d29yZAoJKQp7CglwVERFUy0+VERFU19LRVkxV3hSW2luZGV4XSA9IGtleXdvcmQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkyCi8vKiBcYnJpZWYgU2V0IENyeXB0b2dyYXBoaWMgS2V5IDIgV29yZCB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldENyeXB0b0tleTIgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgaW5kZXgsCgl1bnNpZ25lZCBpbnQga2V5d29yZAoJKQp7CglwVERFUy0+VERFU19LRVkyV3hSW2luZGV4XSA9IGtleXdvcmQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkzCi8vKiBcYnJpZWYgU2V0IENyeXB0b2dyYXBoaWMgS2V5IDMgV29yZCB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldENyeXB0b0tleTMgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgaW5kZXgsCgl1bnNpZ25lZCBpbnQga2V5d29yZAoJKQp7CglwVERFUy0+VERFU19LRVkzV3hSW2luZGV4XSA9IGtleXdvcmQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19JbnB1dERhdGEKLy8qIFxicmllZiBTZXQgSW5wdXQgRGF0YSB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0lucHV0RGF0YSAoCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBpbmRhdGEKCSkKewoJcFRERVMtPlRERVNfSURBVEF4UltpbmRleF0gPSBpbmRhdGE7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19HZXRPdXRwdXREYXRhCi8vKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRPdXRwdXREYXRhICgKCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4CgkpCnsKCXJldHVybiBwVERFUy0+VERFU19PREFUQXhSW2luZGV4XTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yCi8vKiBcYnJpZWYgU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yICgKCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGluaXR2ZWN0b3IKCSkKewoJcFRERVMtPlRERVNfSVZ4UltpbmRleF0gPSBpbml0dmVjdG9yOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0RCR1VfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgREJHVQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgREJHVSBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI3X0RSWEQgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjhfRFRYRCAgICApLCAvLyBQZXJpcGhlcmFsIEEKCQkwKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUE1DCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUE1DIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIzMF9QQ0syICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI5X1BDSzEgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjBfUENLMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIwX1BDSzAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjJfUENLMiAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMV9QQ0sxICAgICkpOyAvLyBQZXJpcGhlcmFsIEIKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkwLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzMF9QQ0syICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEzX1BDSzEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjdfUENLMyAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9WUkVHX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFZSRUcKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlNUQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSU1RDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBTU0MKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1NDKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBTU0Mgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI1X1JLICAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjJfVEsgICAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMV9URiAgICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI0X1JEICAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjZfUkYgICAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyM19URCAgICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1dEVENfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgV0RUQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VUzFfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVVMxCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzFfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1VTMSkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVMxX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVVMxIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMV9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkwLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNl9SSTEgICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI0X0RTUjEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjNfRENEMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNV9EVFIxICAgICkpOyAvLyBQZXJpcGhlcmFsIEIKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE3X1NDSzEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOF9SVFMxICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTZfVFhEMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE1X1JYRDEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOV9DVFMxICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTMF9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVUzAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMF9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVVMwKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VUzBfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzAgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMwX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTBfUlhEMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE0X0NUUzAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBM19SVFMwICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTJfU0NLMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExX1RYRDAgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJMV9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBTUEkxCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TUEkxKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUEkxX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMSBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE2X05QQ1MxMyAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTBfTlBDUzExICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxMV9OUENTMTIgICkpOyAvLyBQZXJpcGhlcmFsIEIKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkwLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE0X05QQ1MxMyAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjlfTlBDUzEzICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMV9OUENTMTAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIyX1NQQ0sxICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjVfTlBDUzExICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyX05QQ1MxMSAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjRfTUlTTzEgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzX05QQ1MxMiAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjZfTlBDUzEyICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyM19NT1NJMSAgICkpOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSTBfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgU1BJMAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMF9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1BJMCkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNQSTAgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMF9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkwLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxM19OUENTMDEgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE3X05QQ1MwMyAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTRfTlBDUzAyICApKTsgLy8gUGVyaXBoZXJhbCBCCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTZfTUlTTzAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExM19OUENTMDEgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE1X05QQ1MwMyAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTdfTU9TSTAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExOF9TUENLMCAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE0X05QQ1MwMiAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTJfTlBDUzAwICApLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE3X05QQ1MwMSAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOV9OUENTMDMgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQThfTlBDUzAyICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFBJVEMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVENfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFJQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9GSVEpIHwKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9JUlEwKSB8CgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfSVJRMSkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQUlDIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzMF9JUlEwICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI5X0ZJUSAgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTRfSVJRMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQUVTCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0FFUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRXSQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UV0kpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RXSV9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRXSSBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTFfVFdDSyAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExMF9UV0QgICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBREMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfQURDKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBREMgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE4X0FEVFJHICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDNfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMyBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIM19DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMl9QV00zICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjMwX1BXTTMgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDJfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMiBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMl9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMV9QV00yICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI5X1BXTTIgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDFfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMSBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMV9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMF9QV00xICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI4X1BXTTEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDBfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMCBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMF9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxOV9QV00wICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI3X1BXTTAgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlRUQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSVFRDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVRFAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVURQKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRERVMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RERVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0VNQUNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgRU1BQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfRU1BQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfRU1BQykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfRU1BQ19DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIEVNQUMgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfRU1BQ19DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyX0VUWDAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTJfRVRYRVIgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNl9FQ09MICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjExX0VUWDMgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCNl9FUlgxICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE1X0VSWERWICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTNfRVJYMiAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIzX0VUWDEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCOF9FTURDICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjVfRVJYMCAgICApIHwKCQkvLygodW5zaWduZWQgaW50KSBBVDkxQ19QQjE4X0VGMTAwICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTRfRVJYMyAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI0X0VDUlNfRUNSU0RWKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMV9FVFhFTiAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjEwX0VUWDIgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0spIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI5X0VNRElPICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCN19FUlhFUiAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE3X0VSWENLICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMwX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMwX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UQzApKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDMF9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMCBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjNfVElPQTAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNF9USU9CMCAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjEyX1RDTEswICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMxX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMxX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UQzEpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDMV9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMSBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzFfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjVfVElPQTEgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNl9USU9CMSAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE5X1RDTEsxICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMyX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UQzIpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDMl9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMiBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzJfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjhfVElPQjIgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyN19USU9BMiAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkwLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExNV9UQ0xLMiAgICkpOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIE1DCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9BX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFBJT0EKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT0FfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1BJT0EpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT0JfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElPQgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPQl9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfUElPQikpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIENBTgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9DQU4pKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIENBTiBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjBfQ0FOVFggICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExOV9DQU5SWCAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTUNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUFdNQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfUFdNQykpOwp9CgojZW5kaWYgLy8gbGliX0FUOTFTQU03WDI1Nl9ICg==