LyogbW9kdWxlLmggLSBkZWZpbml0aW9ucyBmb3IgdGhlIG1vZHVsZQ0KICoNCiAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4NCiAqDQogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4NCiAqDQogKiBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZA0KICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcw0KICogYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4NCiAqDQogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwNCiAqIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQNCiAqIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoNCiAqDQogKiAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdA0KICogICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUNCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQ0KICogICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4NCiAqIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlDQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuDQogKiAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KICovDQoNCiNpZm5kZWYgUFlTUUxJVEVfTU9EVUxFX0gNCiNkZWZpbmUgUFlTUUxJVEVfTU9EVUxFX0gNCiNpbmNsdWRlICJQeXRob24uaCINCg0KI2RlZmluZSBQWVNRTElURV9WRVJTSU9OICIyLjYuMCINCg0KZXh0ZXJuIFB5T2JqZWN0KiBweXNxbGl0ZV9FcnJvcjsNCmV4dGVybiBQeU9iamVjdCogcHlzcWxpdGVfV2FybmluZzsNCmV4dGVybiBQeU9iamVjdCogcHlzcWxpdGVfSW50ZXJmYWNlRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX0RhdGFiYXNlRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX0ludGVybmFsRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX09wZXJhdGlvbmFsRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX0ludGVncml0eUVycm9yOw0KZXh0ZXJuIFB5T2JqZWN0KiBweXNxbGl0ZV9EYXRhRXJyb3I7DQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX05vdFN1cHBvcnRlZEVycm9yOw0KDQpleHRlcm4gUHlPYmplY3QqIHB5c3FsaXRlX09wdGltaXplZFVuaWNvZGU7DQoNCi8qIHRoZSBmdW5jdGlvbnMgdGltZS50aW1lKCkgYW5kIHRpbWUuc2xlZXAoKSAqLw0KZXh0ZXJuIFB5T2JqZWN0KiB0aW1lX3RpbWU7DQpleHRlcm4gUHlPYmplY3QqIHRpbWVfc2xlZXA7DQoNCi8qIEEgZGljdGlvbmFyeSwgbWFwcGluZyBjb2x1bSB0eXBlcyAoSU5URUdFUiwgVkFSQ0hBUiwgZXRjLikgdG8gY29udmVydGVyDQogKiBmdW5jdGlvbnMsIHRoYXQgY29udmVydCB0aGUgU1FMIHZhbHVlIHRvIHRoZSBhcHByb3ByaWF0ZSBQeXRob24gdmFsdWUuDQogKiBUaGUga2V5IGlzIHVwcGVyY2FzZS4NCiAqLw0KZXh0ZXJuIFB5T2JqZWN0KiBjb252ZXJ0ZXJzOw0KDQpleHRlcm4gaW50IF9lbmFibGVfY2FsbGJhY2tfdHJhY2ViYWNrczsNCmV4dGVybiBpbnQgcHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkOw0KDQojZGVmaW5lIFBBUlNFX0RFQ0xUWVBFUyAxDQojZGVmaW5lIFBBUlNFX0NPTE5BTUVTIDINCiNlbmRpZg0K