LyoNCiAqICAgIENGX1N0YXJ0dXAuYyAtIERlZmF1bHQgaW5pdC9zdGFydHVwL3Rlcm1pbmF0aW9uIHJvdXRpbmVzIGZvcg0KICogICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZCBNZXRyb3dlcmtzIEMrKw0KICoNCiAqICAgIENvcHlyaWdodCCpIDE5OTMtMTk5OCBNZXRyb3dlcmtzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKiAgICBDb3B5cmlnaHQgqSAyMDA1IEZyZWVzY2FsZSBzZW1pQ29uZHVjdG9yIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKg0KICogICAgVEhFT1JZIE9GIE9QRVJBVElPTg0KICoNCiAqICAgIFRoaXMgdmVyc2lvbiBvZiB0aGVzdGFydHVwIGNvZGUgaXMgaW50ZW5kZWQgZm9yIGxpbmtlciByZWxvY2F0ZWQNCiAqICAgIGV4ZWN1dGFibGVzLiAgVGhlIHN0YXJ0dXAgY29kZSB3aWxsIGFzc2lnbiB0aGUgc3RhY2sgcG9pbnRlciB0bw0KICogICAgX19TUF9JTklULCBhc3NpZ24gdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVsYXRpdmUgYmFzZSBhZGRyZXNzDQogKiAgICB0byBhNSwgaW5pdGlhbGl6ZSB0aGUgLmJzcy8uc2JzcyBzZWN0aW9ucyB0byB6ZXJvLCBjYWxsIGFueQ0KICogICAgc3RhdGljIEMrKyBpbml0aWFsaXplcnMgYW5kIHRoZW4gY2FsbCBtYWluLiAgVXBvbiByZXR1cm5pbmcgZnJvbQ0KICogICAgbWFpbiBpdCB3aWxsIGNhbGwgQysrIGRlc3RydWN0b3JzIGFuZCBjYWxsIGV4aXQgdG8gdGVybWluYXRlLg0KICovDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KI3ByYWdtYSBjcGx1c3BsdXMgb2ZmDQojZW5kaWYNCiNwcmFnbWEgUElEIG9mZg0KI3ByYWdtYSBQSUMgb2ZmDQoNCiNpbmNsdWRlICJzdGFydGNmLmgiDQojaW5jbHVkZSAiUnVudGltZUNvbmZpZy5oIg0KDQoJLyogaW1wb3J0ZWQgZGF0YSAqLw0KDQpleHRlcm4gdW5zaWduZWQgbG9uZyBmYXIgX1NQX0lOSVQsIF9TREFfQkFTRTsNCmV4dGVybiB1bnNpZ25lZCBsb25nIGZhciBfU1RBUlRfQlNTLCBfRU5EX0JTUzsNCmV4dGVybiB1bnNpZ25lZCBsb25nIGZhciBfU1RBUlRfU0JTUywgX0VORF9TQlNTOw0KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmFyIF9fREFUQV9SQU0sIF9fREFUQV9ST00sIF9fREFUQV9FTkQ7DQoNCgkvKiBpbXBvcnRlZCByb3V0aW5lcyAqLw0KDQpleHRlcm4gdm9pZCBfX2NhbGxfc3RhdGljX2luaXRpYWxpemVycyh2b2lkKTsNCmV4dGVybiBpbnQgbWFpbihpbnQsIGNoYXIgKiopOw0KZXh0ZXJuIHZvaWQgZXhpdChpbnQpOw0KDQoJLyogZXhwb3J0ZWQgcm91dGluZXMgKi8NCg0KZXh0ZXJuIHZvaWQgX0V4aXRQcm9jZXNzKHZvaWQpOw0KZXh0ZXJuIGFzbSB2b2lkIF9zdGFydHVwKHZvaWQpOw0KZXh0ZXJuIHZvaWQgX19pbml0aWFsaXplX2hhcmR3YXJlKHZvaWQpOw0KZXh0ZXJuIHZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKTsNCg0KDQovKg0KICogICAgRHVtbXkgcm91dGluZSBmb3IgaW5pdGlhbGl6aW5nIGhhcmR3YXJlLiAgRm9yIHVzZXIncyBjdXN0b20gc3lzdGVtcywgeW91DQogKiAgICBjYW4gY3JlYXRlIHlvdXIgb3duIHJvdXRpbmUgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IHdpbGwgcGVyZm9ybSBIVw0KICogICAgaW5pdGlhbGl6YXRpb24uICBUaGUgbGlua2VyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIHRvIGlnbm9yZSB0aGlzDQogKiAgICBkZWZpbml0aW9uIGFuZCB1c2UgdGhlIHZlcnNpb24gaW4geW91ciBmaWxlLg0KICovDQojcHJhZ21hIG92ZXJsb2FkIHZvaWQgX19pbml0aWFsaXplX2hhcmR3YXJlKHZvaWQpOw0Kdm9pZCBfX2luaXRpYWxpemVfaGFyZHdhcmUodm9pZCkNCnsNCn0NCg0KLyoNCiAqICAgIER1bW15IHJvdXRpbmUgZm9yIGluaXRpYWxpemluZyBzeXN0ZW1zLiAgRm9yIHVzZXIncyBjdXN0b20gc3lzdGVtcywNCiAqICAgIHlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHJvdXRpbmUgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IHdpbGwgcGVyZm9ybQ0KICogICAgaW5pdGlhbGl6YXRpb24uICBUaGUgbGlua2VyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIHRvIGlnbm9yZSB0aGlzDQogKiAgICBkZWZpbml0aW9uIGFuZCB1c2UgdGhlIHZlcnNpb24gaW4geW91ciBmaWxlLg0KICovDQojcHJhZ21hIG92ZXJsb2FkIHZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKTsNCnZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKQ0Kew0KfQ0KDQovKg0KICogICAgRHVtbXkgcm91dGluZSBmb3IgaW5pdGlhbGl6aW5nIEMrKy4gIFRoaXMgcm91dGluZSB3aWxsIGdldCBvdmVybG9hZGVkIGJ5IHRoZSBDKysgcnVudGltZS4NCiAqLw0KI3ByYWdtYSBvdmVybG9hZCB2b2lkIF9fY2FsbF9zdGF0aWNfaW5pdGlhbGl6ZXJzKHZvaWQpOw0Kdm9pZCBfX2NhbGxfc3RhdGljX2luaXRpYWxpemVycyh2b2lkKQ0Kew0KfQ0KDQovKg0KICoJUm91dGluZSB0byBjb3B5IGEgc2luZ2xlIHNlY3Rpb24gZnJvbSBST00gdG8gUkFNIC4uLg0KICovDQpzdGF0aWMgX19kZWNsc3BlYyhyZWdpc3Rlcl9hYmkpIHZvaWQgX19jb3B5X3JvbV9zZWN0aW9uKGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjLCB1bnNpZ25lZCBsb25nIHNpemUpDQp7DQoJaWYgKGRzdCAhPSBzcmMpDQoJCSB3aGlsZSAoc2l6ZS0tKQ0KCQkgICAgKmRzdCsrID0gKnNyYysrOw0KfQ0KDQovKg0KICoJUm91dGluZSB0aGF0IGNvcGllcyBhbGwgc2VjdGlvbnMgdGhlIHVzZXIgbWFya2VkIGFzIFJPTSBpbnRvDQogKgl0aGVpciB0YXJnZXQgUkFNIGFkZHJlc3NlcyAuLi4NCiAqDQogKglfX1Nfcm9tcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIGlmIGl0DQogKglpcyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9ncmFtLiAgSXQgaXMgYSB0YWJsZSBvZiBSb21JbmZvDQogKglzdHJ1Y3R1cmVzLiAgVGhlIGZpbmFsIGVudHJ5IGluIHRoZSB0YWJsZSBoYXMgYWxsLXplcm8NCiAqCWZpZWxkcy4NCiAqLw0Kc3RhdGljIHZvaWQgX19jb3B5X3JvbV9zZWN0aW9uc190b19yYW0odm9pZCkNCnsNCglSb21JbmZvCQkqaW5mbzsNCg0KCS8qDQoJICoJR28gdGhyb3VnaCB0aGUgZW50aXJlIHRhYmxlLCBjb3B5aW5nIHNlY3Rpb25zIGZyb20gUk9NIHRvIFJBTS4NCgkgKi8NCglmb3IgKGluZm8gPSBfU19yb21wOyBpbmZvLT5Tb3VyY2UgIT0gMEwgfHwgaW5mby0+VGFyZ2V0ICE9IDBMIHx8IGluZm8tPlNpemUgIT0gMDsgKytpbmZvKQ0KICAgIF9fY29weV9yb21fc2VjdGlvbiggKGNoYXIgKilpbmZvLT5UYXJnZXQsKGNoYXIgKilpbmZvLT5Tb3VyY2UsIGluZm8tPlNpemUpOw0KCQkJCQkJCQ0KfQ0KDQovKg0KICogICAgRXhpdCBoYW5kbGVyIGNhbGxlZCBmcm9tIHRoZSBleGl0IHJvdXRpbmUsIGlmIHlvdXIgT1MgbmVlZHMNCiAqICAgIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIGZvciBleGl0IGhhbmRsaW5nIGp1c3QgcmVwbGFjZSB0aGlzDQogKiAgICByb3V0aW5lcyB3aXRoIHdoYXQgdGhlIE9TIG5lZWRzIHRvIGRvIC4uLg0KICovDQphc20gdm9pZCBfRXhpdFByb2Nlc3Modm9pZCkNCnsNCglpbGxlZ2FsDQoJcnRzDQp9DQoNCi8qDQogKiAgICBSb3V0aW5lIHRvIGNsZWFyIG91dCBibG9ja3Mgb2YgbWVtb3J5IHNob3VsZCBnaXZlIGdvb2QNCiAqICAgIHBlcmZvcm1hbmNlIHJlZ2FyZGxlc3Mgb2YgNjhrIG9yIENvbGRGaXJlIHBhcnQuDQogKi8NCnN0YXRpYyBfX2RlY2xzcGVjKHJlZ2lzdGVyX2FiaSkgdm9pZCBjbGVhcl9tZW0oY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nIG4pDQp7DQoJdW5zaWduZWQgbG9uZyBpOw0KCWxvbmcgKmxwdHI7DQoNCglpZiAobiA+PSAzMikNCgl7DQoJCS8qIGFsaWduIHN0YXJ0IGFkZHJlc3MgdG8gYSA0IGJ5dGUgYm91bmRhcnkgKi8NCgkJaSA9ICgtICh1bnNpZ25lZCBsb25nKSBkc3QpICYgMzsNCg0KCQlpZiAoaSkNCgkJew0KCQkJbiAtPSBpOw0KCQkJZG8NCgkJCQkqZHN0KysgPSAwOw0KCQkJd2hpbGUgKC0taSk7DQoJCX0NCg0KCQkvKiB1c2UgYW4gdW5yb2xsZWQgbG9vcCB0byB6ZXJvIG91dCAzMmJ5dGUgYmxvY2tzICovDQoJCWkgPSBuID4+IDU7DQoJCWlmIChpKQ0KCQl7DQoJCQlscHRyID0gKGxvbmcgKilkc3Q7DQoJCQlkc3QgKz0gaSAqIDMyOw0KCQkJZG8NCgkJCXsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCX0NCgkJCXdoaWxlICgtLWkpOw0KCQl9DQoJCWkgPSAobiAmIDMxKSA+PiAyOw0KDQoJCS8qIGhhbmRsZSBhbnkgNCBieXRlIGJsb2NrcyBsZWZ0ICovDQoJCWlmIChpKQ0KCQl7DQoJCQlscHRyID0gKGxvbmcgKilkc3Q7DQoJCQlkc3QgKz0gaSAqIDQ7DQoJCQlkbw0KCQkJCSpscHRyKysgPSAwOw0KCQkJd2hpbGUgKC0taSk7DQoJCX0NCgkJbiAmPSAzOw0KCX0NCg0KCS8qIGhhbmRsZSBhbnkgYnl0ZSBibG9ja3MgbGVmdCAqLw0KCWlmIChuKQ0KCQlkbw0KCQkJKmRzdCsrID0gMDsNCgkJd2hpbGUgKC0tbik7DQp9DQoNCi8qDQogKiAgICBTdGFydHVwIHJvdXRpbmUgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9uIC4uLg0KICovDQoNCmFzbSB2b2lkIF9zdGFydHVwKHZvaWQpDQp7DQoJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovDQogICAgbW92ZS53ICAgICAgICAjMHgyNzAwLHNyDQoNCgkvKiBQcmUtaW5pdCBTUCwgaW4gY2FzZSBtZW1vcnkgZm9yIHN0YWNrIGlzIG5vdCB2YWxpZCBpdCBzaG91bGQgYmUgc2V0dXAgdXNpbmcgDQoJICAgTUVNT1JZX0lOSVQgYmVmb3JlIF9faW5pdGlhbGl6ZV9oYXJkd2FyZSBpcyBjYWxsZWQgDQoJKi8NCglsZWEgX19TUF9BRlRFUl9SRVNFVCxhNzsgDQoNCiAgICAvKiBpbml0aWFsaXplIG1lbW9yeSAqLw0KICAgIE1FTU9SWV9JTklUDQoNCgkvKiBpbml0aWFsaXplIGFueSBoYXJkd2FyZSBzcGVjaWZpYyBpc3N1ZXMgKi8NCiAgICBqc3IgICAgICAgICAgIF9faW5pdGlhbGl6ZV9oYXJkd2FyZSAgIA0KICANCgkvKiBzZXR1cCB0aGUgc3RhY2sgcG9pbnRlciAqLw0KICAgIGxlYSAgICAgICAgICAgX1NQX0lOSVQsYTcNCg0KCS8qIHNldHVwIEE2IGR1bW15IHN0YWNrZnJhbWUgKi8NCiAgICBtb3ZlYS5sICAgICAgICMwLGE2DQogICAgbGluayAgICAgICAgICBhNiwjMA0KDQoJLyogc2V0dXAgQTUgKi8NCiAgICBsZWEgICAgICAgICAgIF9TREFfQkFTRSxhNQ0KDQoNCgkvKiB6ZXJvIGluaXRpYWxpemUgdGhlIC5ic3Mgc2VjdGlvbiAqLw0KDQogICAgbGVhICAgICAgICAgICBfRU5EX0JTUywgYTANCiAgICBsZWEgICAgICAgICAgIF9TVEFSVF9CU1MsIGExDQogICAgc3ViYS5sICAgICAgICBhMSwgYTANCiAgICBtb3ZlLmwgICAgICAgIGEwLCBkMA0KDQogICAgYmVxICAgICAgICAgICBfX3NraXBfYnNzX18NCg0KICAgIGxlYSAgICAgICAgICAgX1NUQVJUX0JTUywgYTANCg0KICAgIC8qIGNhbGwgY2xlYXJfbWVtIHdpdGggYmFzZSBwb2ludGVyIGluIGEwIGFuZCBzaXplIGluIGQwICovDQogICAganNyICAgICAgICAgICBjbGVhcl9tZW0NCg0KX19za2lwX2Jzc19fOg0KDQoJLyogemVybyBpbml0aWFsaXplIHRoZSAuc2JzcyBzZWN0aW9uICovDQoNCiAgICBsZWEgICAgICAgICAgIF9FTkRfU0JTUywgYTANCiAgICBsZWEgICAgICAgICAgIF9TVEFSVF9TQlNTLCBhMQ0KICAgIHN1YmEubCAgICAgICAgYTEsIGEwDQogICAgbW92ZS5sICAgICAgICBhMCwgZDANCg0KICAgIGJlcSAgICAgICAgICAgX19za2lwX3Nic3NfXw0KDQogICAgbGVhICAgICAgICAgICBfU1RBUlRfU0JTUywgYTANCg0KICAgIC8qIGNhbGwgY2xlYXJfbWVtIHdpdGggYmFzZSBwb2ludGVyIGluIGEwIGFuZCBzaXplIGluIGQwICovDQogICAganNyICAgICAgICAgICBjbGVhcl9tZW0NCg0KX19za2lwX3Nic3NfXzoNCg0KCS8qIGNvcHkgYWxsIFJPTSBzZWN0aW9ucyB0byB0aGVpciBSQU0gbG9jYXRpb25zIC4uLiAqLw0KI2lmIFNVUFBPUlRfUk9NX1RPX1JBTQ0KDQoJLyoNCgkgKiBfU19yb21wIGlzIGEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mDQoJICogdHlwZWRlZiBzdHJ1Y3QgUm9tSW5mbyB7DQogICAgICogICAgICB1bnNpZ25lZCBsb25nCVNvdXJjZTsNCiAgICAgKiAgICAgIHVuc2lnbmVkIGxvbmcJVGFyZ2V0Ow0KICAgICAqICAgICAgdW5zaWduZWQgbG9uZyAJU2l6ZTsNCiAgICAgKiAgfSBSb21JbmZvOw0KICAgICAqDQogICAgICogV2F0Y2ggb3V0IGlmIHlvdSdyZSByZWJhc2luZyB1c2luZyBfUElDUElEX0RFTFRBDQogICAgICovDQoNCiAgICBsZWEgICAgICAgICAgIF9TX3JvbXAsIGEwDQogICAgbW92ZS5sICAgICAgICBhMCwgZDANCiAgICBiZXEgICAgICAgICAgIF9fc2tpcF9yb21fY29weV9fICAgICAgICAgICAgDQogICAganNyICAgICAgICAgICBfX2NvcHlfcm9tX3NlY3Rpb25zX3RvX3JhbQ0KDQojZWxzZQ0KDQoJLyoNCiAgICogVGhlcmUncyBhIHNpbmdsZSBibG9jayB0byBjb3B5IGZyb20gUk9NIHRvIFJBTSwgcGVyZm9ybQ0KICAgKiB0aGUgY29weSBkaXJlY3RseSB3aXRob3V0IHVzaW5nIHRoZSBfX1Nfcm9tcCBzdHJ1Y3R1cmUNCiAgICovDQoNCiAgICBsZWEgICAgICAgICAgIF9fREFUQV9SQU0sIGEwDQogICAgbGVhICAgICAgICAgICBfX0RBVEFfUk9NLCBhMQ0KICAgIA0KICAgIGNtcGEgICAgICAgICAgYTAsYTENCiAgICBiZXEgICAgICAgICAgIF9fc2tpcF9yb21fY29weV9fDQogICAgICAgICAgICAgIA0KICAgIG1vdmUubCAgICAgICAgI19fREFUQV9FTkQsIGQwDQogICAgc3ViLmwgICAgICAgICBhMCwgZDANCiAgICAgICAgICAgICAgICAgIA0KICAgIGpzciAgICAgICAgICAgX19jb3B5X3JvbV9zZWN0aW9uDQoNCiNlbmRpZg0KX19za2lwX3JvbV9jb3B5X186DQoJDQoJLyogY2FsbCBDKysgc3RhdGljIGluaXRpYWxpemVycyAoX19zaW5pdF9fKHZvaWQpKSAqLw0KCWpzcgkJCSAgX19jYWxsX3N0YXRpY19pbml0aWFsaXplcnMNCg0KCWpzcgkJICAJICBfX2luaXRpYWxpemVfc3lzdGVtDQoNCgkvKiBjYWxsIG1haW4oaW50LCBjaGFyICoqKSAqLw0KCXBlYQkJCSAgX19hcmd2DQoJY2xyLmwJCSAgLShzcCkJCQkJLyogY2xlYXJpbmcgYSBsb25nIGlzIG9rIHNpbmNlIGl0J3MgY2FsbGVyIGNsZWFudXAgKi8NCglqc3IJCQkgIG1haW4NCglhZGRxLmwJCSM4LCBzcA0KCQ0KCXVubGsJCSAgYTYNCgkNCgkvKiBub3cgY2FsbCBleGl0KDApIHRvIHRlcm1pbmF0ZSB0aGUgYXBwbGljYXRpb24gKi8NCgljbHIubAkJICAtKHNwKQ0KCWpzcgkJCSAgZXhpdA0KCWFkZHEubAkJIzQsIHNwDQoNCgkvKiBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZSBidXQganVzdCBpbiBjYXNlICovDQoJaWxsZWdhbA0KCXJ0cw0KDQoJLyogZXhpdCB3aWxsIG5ldmVyIHJldHVybiAqLw0KX19hcmd2Og0KICAgIGRjLmwgICAgICAgICAgMA0KfQ0KDQo=