LyogJElkJCAKICogCiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZSAKICogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGggIAogKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIAogKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uICAKICogMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSAgCiAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCAKICogCiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCAKICogCiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgCiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIAogKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCAKICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIAogKi8gCgovKgogKiBldGNoX2FycmFyeWxpc3QuaCAKICogYXJyYXlsaXN0IGltcGxlbWVudGF0aW9uLgogKi8KCiNpZm5kZWYgRVRDSEFSUkFZTElTVF9ICiNkZWZpbmUgRVRDSEFSUkFZTElTVF9ICgojaW5jbHVkZSAiZXRjaC5oIgojaW5jbHVkZSAiZXRjaF9tdXRleC5oIgojaW5jbHVkZSAiZXRjaF9jb2xsZWN0aW9uLmgiCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIiB7CiNlbmRpZgoKI2RlZmluZSBFVENIQVJSQVlMSVNUX0RFRlNJWkUgMTI4CiNkZWZpbmUgRVRDSEFSUkFZTElTVF9DT05URU5UX1NJTVBMRSAwICAvKiBjb250ZW50IG1lbW9yeSBmcmVlZCBhcyBhIHVuaXQgKi8KI2RlZmluZSBFVENIQVJSQVlMSVNUX0NPTlRFTlRfT0JKRUNUIDEgIC8qIGNvbnRlbnQgaXMgZXRjaG9iamVjdCAqLwojZGVmaW5lIEVUQ0hBUlJBWUxJU1RfU1lOQ0hST05JWkVEIFRSVUUKCi8vVE9ETzogQ2hlY2u0LCB3aHkgdGhpcyBpcyBuZWVkZWQKdHlwZWRlZiBpbnQgKCphcnJheWNhbGxiYWNrKSAoaW50LCB2b2lkKik7IC8qIGFycmF5bGlzdCBjYWxsYmFjayBzaWduYXR1cmUgKi8KCgovKiogCiAqICBldGNoX2FycmF5bGlzdDogZGF0YSBzdHJ1Y3R1cmUgZW5jYXBzdWxhdGluZyB0aGUgYXJyYXlsaXN0CiAqICBpZiBpc19yZWFkb25seSBpcyBzZXQsIGNvbnRlbnQgaXMgcmVhZCBvbmx5IGFuZCB0aGVyZWZvcmUgaXNfZnJlZV9jb250ZW50ICAKICogIHdpbGwgaGF2ZSBubyBlZmZlY3QgLS0gbGlzdCBpdGVtcyBtYXkgc3RpbGwgYmUgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQuIFRoaXMKICogIGd1YXJkcyBhZ2FpbnN0IGFjY2lkZW50YWxseSBmcmVlaW5nIG1lbW9yeSBkdXJpbmcgYXJyYXlsaXN0IGRlc3RydWN0aW9uIAogKiAgZm9yIGFycmF5cyBvZiByZWZlcmVuY2VzIHdoaWNoIGFyZSBzdGlsbCBpbnRlbmRlZCB0byByZW1haW4gaW4gdXNlLiAKICovCnR5cGVkZWYgc3RydWN0IGV0Y2hfYXJyYXlsaXN0CnsKICAgIGV0Y2hfb2JqZWN0IG9iamVjdDsKCiAgICB2b2lkKiogYmFzZTsKICAgIHVuc2lnbmVkIHNob3J0IGNvbnRlbnRfb2JqX3R5cGU7ICAvKiBldGNoIG9ial90eXBlIG9mIGEgbmF0aXZlIHZhbHVlICovCiAgICB1bnNpZ25lZCBzaG9ydCBjb250ZW50X2NsYXNzX2lkOyAgLyogZXRjaCBjbGFzc19pZCBvZiBhIG5hdGl2ZSB2YWx1ZSAqLwogICAgdW5zaWduZWQgaW50IGNvdW50OwoKICAgIC8qIHRoaXMgb2JqZWN0IG1heSBiZSBtYXNrZWQgYnkgZXRjaF9jb2xsZWN0aW9uX21hc2sgdG8gZGV0ZXJtaW5lIGNvbnRlbnQKICAgICAqIHR5cGUgYW5kIGNsYXNzLCBzbyBkbyBub3QgYWRkIGFueSBmaWVsZHMgYWJvdmUgdGhpcyBjb21tZW50ICovCgogICAgdW5zaWduZWQgaW50IGRlbHRhOwogICAgdW5zaWduZWQgaW50IHNpemU7CiAgICBpX2l0ZXJhYmxlIGl0ZXJhYmxlOwoKICAgIGJ5dGUgaXNfcmVhZG9ubHk7ICAKICAgIGJ5dGUgY29udGVudF90eXBlOwoKICAgIGFycmF5Y2FsbGJhY2sgZnJlZWhvb2s7IC8qIGhvb2sgZm9yIGZyZWUgbGlzdCBjb250ZW50ICovCgp9IGV0Y2hfYXJyYXlsaXN0OwoKCmV0Y2hfYXJyYXlsaXN0KiBuZXdfZXRjaF9hcnJheWxpc3QoY29uc3QgdW5zaWduZWQgaW50IGluaXRpYWxzaXplLCBjb25zdCB1bnNpZ25lZCBpbnQgZGVsdGFzaXplKTsKZXRjaF9hcnJheWxpc3QqIG5ld19ldGNoX2FycmF5bGlzdF9mcm9tKGV0Y2hfYXJyYXlsaXN0Kik7CmV0Y2hfYXJyYXlsaXN0KiBuZXdfZXRjaF9hcnJheWxpc3Rfc3luY2hyb25pemVkKGNvbnN0IHVuc2lnbmVkIGludCBpbml0aWFsc2l6ZSwgY29uc3QgdW5zaWduZWQgaW50IGRlbHRhc2l6ZSk7CmV0Y2hfYXJyYXlsaXN0KiBuZXdfZXRjaF9hcnJheWxpc3Rfc3luY2hyb25pemVkX2Zyb20oZXRjaF9hcnJheWxpc3QqKTsKCmludCAgIGV0Y2hfYXJyYXlsaXN0X2FkZCAgICAgIChldGNoX2FycmF5bGlzdCosIHZvaWQqIGNvbnRlbnQpOwppbnQgICBldGNoX2FycmF5bGlzdF9hZGRfZnJvbSAoZXRjaF9hcnJheWxpc3QqLCBldGNoX2FycmF5bGlzdCogbmV3aXRlbXMsIGV0Y2hfY29tcGFyYXRvcik7IAppbnQgICBldGNoX2FycmF5bGlzdF9jb250YWluc3AoZXRjaF9hcnJheWxpc3QqLCB2b2lkKiBjb250ZW50LCBjb25zdCB1bnNpZ25lZCBzdGFydGF0KTsgLyogcG9pbnRlciBjb21wYXJlICovCmludCAgIGV0Y2hfYXJyYXlsaXN0X2NvbnRhaW5zIChldGNoX2FycmF5bGlzdCosIHZvaWQqIGNvbnRlbnQsIGNvbnN0IHVuc2lnbmVkIHN0YXJ0YXQsIGV0Y2hfY29tcGFyYXRvcik7CmludCAgIGV0Y2hfYXJyYXlsaXN0X2NvdW50KGV0Y2hfYXJyYXlsaXN0KiBsaXN0KTsKaW50ICAgZXRjaF9hcnJheWxpc3RfaW5kZXhvZnAgKGV0Y2hfYXJyYXlsaXN0Kiwgdm9pZCogY29udGVudCwgY29uc3QgdW5zaWduZWQgc3RhcnRhdCk7IC8qIHBvaW50ZXIgY29tcGFyZSAqLwppbnQgICBldGNoX2FycmF5bGlzdF9pbmRleG9mICAoZXRjaF9hcnJheWxpc3QqLCB2b2lkKiBjb250ZW50LCBjb25zdCB1bnNpZ25lZCBzdGFydGF0LCBldGNoX2NvbXBhcmF0b3IpOwppbnQgICBldGNoX2FycmF5bGlzdF9yZW1vdmVfY29udGVudChldGNoX2FycmF5bGlzdCosIHZvaWQqIGNvbnRlbnQsIGNvbnN0IHVuc2lnbmVkIHN0YXJ0YXQsIGV0Y2hfY29tcGFyYXRvcik7CmludCAgIGV0Y2hfYXJyYXlsaXN0X2luc2VydCAgIChldGNoX2FycmF5bGlzdCosIGNvbnN0IHVuc2lnbmVkIGksIHZvaWQqIGNvbnRlbnQpOwppbnQgICBldGNoX2FycmF5bGlzdF9yZW1vdmUgICAoZXRjaF9hcnJheWxpc3QqLCBjb25zdCB1bnNpZ25lZCBpLCBjb25zdCBpbnQgaXNfZnJlZV9jb250ZW50KTsKaW50ICAgZXRjaF9hcnJheWxpc3Rfc2V0ICAgICAgKGV0Y2hfYXJyYXlsaXN0KiwgY29uc3QgdW5zaWduZWQgaSwgdm9pZCogY29udGVudCk7CnZvaWQqIGV0Y2hfYXJyYXlsaXN0X2dldCAgICAgIChldGNoX2FycmF5bGlzdCosIGNvbnN0IHVuc2lnbmVkIGkpOwp2b2lkICBldGNoX2FycmF5bGlzdF9jbGVhciAgICAoZXRjaF9hcnJheWxpc3QqLCBjb25zdCBpbnQgaXNfZnJlZV9jb250ZW50KTsKdm9pZCAgZXRjaF9hcnJheWxpc3RfZGVzdHJveSAgKGV0Y2hfYXJyYXlsaXN0KiwgY29uc3QgaW50IGlzX2ZyZWVfY29udGVudCk7CnZvaWQgIGV0Y2hfYXJyYXlsaXN0X2NvcHlhdHRycyhldGNoX2FycmF5bGlzdCogdG8sIGV0Y2hfYXJyYXlsaXN0KiBmcm9tKTsKCi8qIAogKiBleHBsaWNpdCBzeW5jaHJvbml6YXRpb24gbG9ja2luZyBtZXRob2RzLgogKiB0aGVzZSBzaG91bGQgYmUgdXNlZCBvbmx5IGZvciBsb2NraW5nIGEgbGlzdCBkdXJpbmcgbGlzdCBpdGVyYXRpb24uICAgCiAqIGZvciBzeW5jaHJvbml6YXRpb24gb2YgbGlzdCBvcGVyYXRpb25zLCB0aGUgcHJlc2VuY2Ugb2YgbGlzdC5zeW5jaG9vayAgCiAqIGFuZCBsaXN0LnN5bmNsb2NrIGlzIHN1ZmZpY2llbnQuIAogKi8KaW50ICAgZXRjaF9hcnJheWxpc3RfZ2V0bG9jayAgKGV0Y2hfYXJyYXlsaXN0Kik7CmludCAgIGV0Y2hfYXJyYXlsaXN0X3RyeWxvY2sgIChldGNoX2FycmF5bGlzdCopOwppbnQgICBldGNoX2FycmF5bGlzdF9yZWxsb2NrICAoZXRjaF9hcnJheWxpc3QqKTsKCi8qIGlfaXRlcmFibGUgZnVuY3Rpb24gb3ZlcnJpZGVzICovCmludCAgIGV0Y2hfYXJyYXlsaXN0X2l0ZXJhYmxlX2ZpcnN0ICAgKGV0Y2hfaXRlcmF0b3IqKTsKaW50ICAgZXRjaF9hcnJheWxpc3RfaXRlcmFibGVfbmV4dCAgICAoZXRjaF9pdGVyYXRvciopOwppbnQgICBldGNoX2FycmF5bGlzdF9pdGVyYWJsZV9oYXNfbmV4dChldGNoX2l0ZXJhdG9yKik7CgojaWZkZWYgX19jcGx1c3BsdXMKfQojZW5kaWYKCiNlbmRpZiAvKiAjaWZuZGVmIEVUQ0hBUlJBWUxJU1RfSCAqLwo=