LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIE1WQklUUyBpbnRyaW5zaWMKICAgQ29weXJpZ2h0IChDKSAyMDA0LCAyMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBDb250cmlidXRlZCBieSBUb2JpYXMgU2NobPx0ZXIKClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgRm9ydHJhbiA5NSBydW50aW1lIGxpYnJhcnkgKGxpYmdmb3J0cmFuKS4KCkxpYmdmb3J0cmFuIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCnZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCkluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCmNvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCmFuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgp0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKZXhlY3V0YWJsZS4pCgpMaWJnZm9ydHJhbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIGxpYmdmb3J0cmFuOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwKd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwKQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuICAqLwoKLyogVE9ETzogVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYSBjb21waWxlciBidWlsdGluLiAgKi8KCiNpZm5kZWYgU1VCX05BTUUKI2luY2x1ZGUgPGxpYmdmb3J0cmFuLmg+CiNlbmRpZgoKI2lmZGVmIFNVQl9OQU1FCi8qIE1WQklUUyBjb3BpZXMgTEVOIGJpdHMgc3RhcnRpbmcgYXQgYml0IHBvc2l0aW9uIEZST01QT1MgZnJvbSBGUk9NCiAgIGludG8gVE8sIHN0YXJ0aW5nIGF0IGJpdCBwb3NpdGlvbiBUT1BPUy4gICovCgpleHRlcm4gdm9pZCBTVUJfTkFNRSAoY29uc3QgVFlQRSAqLCBjb25zdCBHRkNfSU5URUdFUl80ICosCgkJICAgICAgY29uc3QgR0ZDX0lOVEVHRVJfNCAqLCBUWVBFICosIGNvbnN0IEdGQ19JTlRFR0VSXzQgKik7CmV4cG9ydF9wcm90byhTVUJfTkFNRSk7Cgp2b2lkIApTVUJfTkFNRSAoY29uc3QgVFlQRSAqZnJvbSwgY29uc3QgR0ZDX0lOVEVHRVJfNCAqZnJvbXBvcywKICAgICAgICAgIGNvbnN0IEdGQ19JTlRFR0VSXzQgKmxlbiwgVFlQRSAqdG8sIGNvbnN0IEdGQ19JTlRFR0VSXzQgKnRvcG9zKQp7CiAgVFlQRSBvbGRiaXRzLCBuZXdiaXRzLCBsZW5tYXNrOwoKICBsZW5tYXNrID0gKCpsZW4gPT0gc2l6ZW9mIChUWVBFKSo4KSA/IH4oVFlQRSkwIDogKChUWVBFKTEgPDwgKmxlbikgLSAxOwogIG5ld2JpdHMgPSAoKChVVFlQRSkoKmZyb20pID4+ICpmcm9tcG9zKSAmIGxlbm1hc2spIDw8ICp0b3BvczsKICBvbGRiaXRzID0gKnRvICYgKH4obGVubWFzayA8PCAqdG9wb3MpKTsKCiAgKnRvID0gbmV3Yml0cyB8IG9sZGJpdHM7Cn0KI2VuZGlmCgojaWZuZGVmIFNVQl9OQU1FCiMgIGRlZmluZSBUWVBFIEdGQ19JTlRFR0VSXzEKIyAgZGVmaW5lIFVUWVBFIEdGQ19VSU5URUdFUl8xCiMgIGRlZmluZSBTVUJfTkFNRSBtdmJpdHNfaTEKIyAgaW5jbHVkZSAibXZiaXRzLmMiCiMgIHVuZGVmIFNVQl9OQU1FCiMgIHVuZGVmIFRZUEUKIyAgdW5kZWYgVVRZUEUKIAojICBkZWZpbmUgVFlQRSBHRkNfSU5URUdFUl8yCiMgIGRlZmluZSBVVFlQRSBHRkNfVUlOVEVHRVJfMgojICBkZWZpbmUgU1VCX05BTUUgbXZiaXRzX2kyCiMgIGluY2x1ZGUgIm12Yml0cy5jIgojICB1bmRlZiBTVUJfTkFNRQojICB1bmRlZiBUWVBFCiMgIHVuZGVmIFVUWVBFCiAKIyAgZGVmaW5lIFRZUEUgR0ZDX0lOVEVHRVJfNAojICBkZWZpbmUgVVRZUEUgR0ZDX1VJTlRFR0VSXzQKIyAgZGVmaW5lIFNVQl9OQU1FIG12Yml0c19pNAojICBpbmNsdWRlICJtdmJpdHMuYyIKIyAgdW5kZWYgU1VCX05BTUUKIyAgdW5kZWYgVFlQRQojICB1bmRlZiBVVFlQRQoKIyAgZGVmaW5lIFRZUEUgR0ZDX0lOVEVHRVJfOAojICBkZWZpbmUgVVRZUEUgR0ZDX1VJTlRFR0VSXzgKIyAgZGVmaW5lIFNVQl9OQU1FIG12Yml0c19pOAojICBpbmNsdWRlICJtdmJpdHMuYyIKIyAgdW5kZWYgU1VCX05BTUUKIyAgdW5kZWYgVFlQRQojICB1bmRlZiBVVFlQRQojZW5kaWYK