LyogVGhpcyBmaWxlIGlzIG9iai1ldmF4LmgKICAgQ29weXJpZ2h0IDE5OTYsIDIwMDAsIDIwMDUsIDIwMDcsIDIwMDksIDIwMTAKICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IEtsYXVzIEvkbXBmIChra2FlbXBmQHByb2dpcy5kZSkgb2YKICAgICBwcm9HSVMgU29mdHdhcmUsIEFhY2hlbiwgR2VybWFueS4KCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdBUywgdGhlIEdOVSBBc3NlbWJsZXIuCgogICBHQVMgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzLCBvciAoYXQgeW91ciBvcHRpb24pCiAgIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgR0FTIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggR0FTOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8KICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgNTEgRnJhbmtsaW4gU3RyZWV0IC0gRmlmdGggRmxvb3IsIEJvc3RvbiwKICAgTUEgMDIxMTAtMTMwMSwgVVNBLiAgKi8KCi8qCiAqIFRoaXMgZmlsZSBpcyBvYmotZXZheC5oIGFuZCBpcyBpbnRlbmRlZCB0byBiZSBhIHRlbXBsYXRlIGZvcgogKiBvYmplY3QgZm9ybWF0IHNwZWNpZmljIGhlYWRlciBmaWxlcy4KICovCgojaW5jbHVkZSAiYXMuaCIKCi8qIGRlZmluZSBhbiBvYmogc3BlY2lmaWMgbWFjcm8gb2ZmIHdoaWNoIHRhcmdldCBjcHUgYmFjayBlbmRzIG1heSBrZXkuICAqLwojZGVmaW5lIE9CSl9FVkFYIDEKCi8qIGluY2x1ZGUgd2hhdGV2ZXIgdGFyZ2V0IGNwdSBpcyBhcHByb3ByaWF0ZS4gICovCiNpbmNsdWRlICJ0YXJnLWNwdS5oIgoKI2RlZmluZSBPVVRQVVRfRkxBVk9SIGJmZF90YXJnZXRfZXZheF9mbGF2b3VyCgpzdHJ1Y3QgZml4OwoKc3RydWN0IGFscGhhX2xpbmthZ2VfZml4dXBzCnsKICBzdHJ1Y3QgYWxwaGFfbGlua2FnZV9maXh1cHMgKm5leHQ7CiAgc3RydWN0IGZpeCAqZml4cDsKICBzZWdUIHNlZzsKICBzeW1ib2xTICpsYWJlbDsKfTsKCi8qCiAqIFNZTUJPTFMKICovCgovKgogKiBJZiB5b3VyIG9iamVjdCBmb3JtYXQgbmVlZHMgdG8gcmVvcmRlciBzeW1ib2xzLCBkZWZpbmUgdGhpcy4gIFdoZW4KICogZGVmaW5lZCwgc3ltYm9scyBhcmUga2VwdCBvbiBhIGRvdWJseSBsaW5rZWQgbGlzdCBhbmQgZnVuY3Rpb25zIGFyZQogKiBtYWRlIGF2YWlsYWJsZSBmb3IgcHVzaCwgaW5zZXJ0LCBhcHBlbmQsIGFuZCBkZWxldGUuICBJZiBub3QgZGVmaW5lZCwKICogc3ltYm9scyBhcmUga2VwdCBvbiBhIHNpbmdseSBsaW5rZWQgbGlzdCwgb25seSB0aGUgYXBwZW5kIGFuZCBjbGVhcgogKiBmYWNpbGl0aWVzIGFyZSBhdmFpbGFibGUsIGFuZCB0aGV5IGFyZSBtYWNyb3MuCiAqLwoKLyogI2RlZmluZSBTWU1CT0xTX05FRURfUEFDS1BPSU5URVJTICovCgovKiAgKi8KdHlwZWRlZiBzdHJ1Y3QKICB7CiAgICB2b2lkICpub3RoaW5nOwogIH0Kb2JqX3N5bWJvbF90eXBlOwkJLyogc2hvdWxkIGJlIHRoZSBmb3JtYXQncyBzeW1ib2wgc3RydWN0dXJlICovCgp0eXBlZGVmIHZvaWQgKm9iamVjdF9oZWFkZXJzOwoKI2RlZmluZSBPQkpfRU1JVF9MSU5FTk8oYSxiLGMpCS8qIG11c3QgYmUgKnNvbWV0aGluZyouICBUaGlzIG5vLW9wJ3MgaXQgb3V0LiAgKi8KCi8qIFRoaXMgZmllbGQga2VlcHMgdGhlIHN5bWJvbHMgcG9zaXRpb24gaW4gdGhlIGxpbmsgc2VjdGlvbi4gICovCiNkZWZpbmUgT0JKX1NZTUZJRUxEX1RZUEUgdmFsdWVUCgojZGVmaW5lIG9ial9zeW1ib2xfbmV3X2hvb2socykgICAgICAgZXZheF9zeW1ib2xfbmV3X2hvb2sgKHMpCiNkZWZpbmUgb2JqX2Zyb2Jfc3ltYm9sKHMscCkgICAgICAgICBldmF4X2Zyb2Jfc3ltYm9sIChzLCAmcCkKI2RlZmluZSBvYmpfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QgIGV2YXhfZnJvYl9maWxlX2JlZm9yZV9hZGp1c3QKI2RlZmluZSBvYmpfZnJvYl9maWxlX2JlZm9yZV9maXggICAgIGV2YXhfZnJvYl9maWxlX2JlZm9yZV9maXgKCiNkZWZpbmUgU19HRVRfT1RIRVIoUykJMAojZGVmaW5lIFNfR0VUX1RZUEUoUykJMAojZGVmaW5lIFNfR0VUX0RFU0MoUykJMAoKI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1NUQUNLIDkKI2RlZmluZSBQRFNDX1NfS19LSU5EX0ZQX1JFR0lTVEVSIDEwCiNkZWZpbmUgUERTQ19TX0tfS0lORF9OVUxMIDgKCiNkZWZpbmUgUERTQ19TX0tfTUlOX1NUQUNLX1NJWkUgMzIKI2RlZmluZSBQRFNDX1NfS19NSU5fUkVHSVNURVJfU0laRSAyNAojZGVmaW5lIFBEU0NfU19LX05VTExfU0laRSAxNgoKI2RlZmluZSBQRFNDX1NfTV9IQU5ETEVSX1ZBTElEIDB4MTAJCS8qIGxvdyBieXRlICovCiNkZWZpbmUgUERTQ19TX01fSEFORExFUl9EQVRBX1ZBTElEIDB4NDAJLyogbG93IGJ5dGUgKi8KI2RlZmluZSBQRFNDX1NfTV9CQVNFX1JFR19JU19GUCAweDgwCQkvKiBsb3cgYnl0ZSAqLwojZGVmaW5lIFBEU0NfU19NX05BVElWRSAweDEwCQkvKiBoaWdoIGJ5dGUgKi8KI2RlZmluZSBQRFNDX1NfTV9OT19KQUNLRVQgMHgyMAkJLyogaGlnaCBieXRlICovCgojZGVmaW5lIExLUF9TX0tfU0laRSAxNgoKZXh0ZXJuIHNlZ1QgYWxwaGFfbGlua19zZWN0aW9uOwpleHRlcm4gc3RydWN0IGFscGhhX2xpbmthZ2VfZml4dXBzICphbHBoYV9saW5rYWdlX2ZpeHVwX3Jvb3Q7CgpleHRlcm4gdm9pZCBldmF4X3NlY3Rpb24gKGludCk7CmV4dGVybiB2b2lkIGV2YXhfc3ltYm9sX25ld19ob29rIChzeW1ib2xTICopOwpleHRlcm4gdm9pZCBldmF4X2Zyb2Jfc3ltYm9sIChzeW1ib2xTICosIGludCAqKTsKZXh0ZXJuIHZvaWQgZXZheF9mcm9iX2ZpbGVfYmVmb3JlX2FkanVzdCAodm9pZCk7CmV4dGVybiB2b2lkIGV2YXhfZnJvYl9maWxlX2JlZm9yZV9maXggKHZvaWQpOwpleHRlcm4gY2hhciAqZXZheF9zaG9ydGVuX25hbWUgKGNoYXIgKik7CgovKgogKiBMb2NhbCBWYXJpYWJsZXM6CiAqIGNvbW1lbnQtY29sdW1uOiAwCiAqIGZpbGwtY29sdW1uOiAxMzEKICogRW5kOgogKi8K