LyoNCiAqICAgIENGX1N0YXJ0dXAuYyAtIERlZmF1bHQgaW5pdC9zdGFydHVwL3Rlcm1pbmF0aW9uIHJvdXRpbmVzIGZvcg0KICogICAgICAgICAgICAgICAgICAgICBFbWJlZGRlZCBNZXRyb3dlcmtzIEMrKw0KICoNCiAqICAgIENvcHlyaWdodCCpIDE5OTMtMTk5OCBNZXRyb3dlcmtzLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQogKiAgICBDb3B5cmlnaHQgqSAyMDA1IEZyZWVzY2FsZSBzZW1pQ29uZHVjdG9yIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCiAqDQogKg0KICogICAgVEhFT1JZIE9GIE9QRVJBVElPTg0KICoNCiAqICAgIFRoaXMgdmVyc2lvbiBvZiB0aGVzdGFydHVwIGNvZGUgaXMgaW50ZW5kZWQgZm9yIGxpbmtlciByZWxvY2F0ZWQNCiAqICAgIGV4ZWN1dGFibGVzLiAgVGhlIHN0YXJ0dXAgY29kZSB3aWxsIGFzc2lnbiB0aGUgc3RhY2sgcG9pbnRlciB0bw0KICogICAgX19TUF9JTklULCBhc3NpZ24gdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEgcmVsYXRpdmUgYmFzZSBhZGRyZXNzDQogKiAgICB0byBhNSwgaW5pdGlhbGl6ZSB0aGUgLmJzcy8uc2JzcyBzZWN0aW9ucyB0byB6ZXJvLCBjYWxsIGFueQ0KICogICAgc3RhdGljIEMrKyBpbml0aWFsaXplcnMgYW5kIHRoZW4gY2FsbCBtYWluLiAgVXBvbiByZXR1cm5pbmcgZnJvbQ0KICogICAgbWFpbiBpdCB3aWxsIGNhbGwgQysrIGRlc3RydWN0b3JzIGFuZCBjYWxsIGV4aXQgdG8gdGVybWluYXRlLg0KICovDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KI3ByYWdtYSBjcGx1c3BsdXMgb2ZmDQojZW5kaWYNCiNwcmFnbWEgUElEIG9mZg0KI3ByYWdtYSBQSUMgb2ZmDQoNCiNpbmNsdWRlICJzdGFydGNmLmgiDQojaW5jbHVkZSAiUnVudGltZUNvbmZpZy5oIg0KDQoJLyogaW1wb3J0ZWQgZGF0YSAqLw0KDQpleHRlcm4gdW5zaWduZWQgbG9uZyBmYXIgX1NQX0lOSVQsIF9TREFfQkFTRTsNCmV4dGVybiB1bnNpZ25lZCBsb25nIGZhciBfU1RBUlRfQlNTLCBfRU5EX0JTUzsNCmV4dGVybiB1bnNpZ25lZCBsb25nIGZhciBfU1RBUlRfU0JTUywgX0VORF9TQlNTOw0KZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZmFyIF9fREFUQV9SQU0sIF9fREFUQV9ST00sIF9fREFUQV9FTkQ7DQoNCgkvKiBpbXBvcnRlZCByb3V0aW5lcyAqLw0KDQpleHRlcm4gdm9pZCBfX2NhbGxfc3RhdGljX2luaXRpYWxpemVycyh2b2lkKTsNCmV4dGVybiBpbnQgbWFpbihpbnQsIGNoYXIgKiopOw0KZXh0ZXJuIHZvaWQgZXhpdChpbnQpOw0KDQoJLyogZXhwb3J0ZWQgcm91dGluZXMgKi8NCg0KZXh0ZXJuIHZvaWQgX0V4aXRQcm9jZXNzKHZvaWQpOw0KZXh0ZXJuIGFzbSB2b2lkIF9zdGFydHVwKHZvaWQpOw0KZXh0ZXJuIHZvaWQgX19pbml0aWFsaXplX2hhcmR3YXJlKHZvaWQpOw0KZXh0ZXJuIHZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKTsNCg0KDQovKg0KICogICAgRHVtbXkgcm91dGluZSBmb3IgaW5pdGlhbGl6aW5nIGhhcmR3YXJlLiAgRm9yIHVzZXIncyBjdXN0b20gc3lzdGVtcywgeW91DQogKiAgICBjYW4gY3JlYXRlIHlvdXIgb3duIHJvdXRpbmUgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IHdpbGwgcGVyZm9ybSBIVw0KICogICAgaW5pdGlhbGl6YXRpb24uICBUaGUgbGlua2VyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIHRvIGlnbm9yZSB0aGlzDQogKiAgICBkZWZpbml0aW9uIGFuZCB1c2UgdGhlIHZlcnNpb24gaW4geW91ciBmaWxlLg0KICovDQojcHJhZ21hIG92ZXJsb2FkIHZvaWQgX19pbml0aWFsaXplX2hhcmR3YXJlKHZvaWQpOw0Kdm9pZCBfX2luaXRpYWxpemVfaGFyZHdhcmUodm9pZCkNCnsNCn0NCg0KLyoNCiAqICAgIER1bW15IHJvdXRpbmUgZm9yIGluaXRpYWxpemluZyBzeXN0ZW1zLiAgRm9yIHVzZXIncyBjdXN0b20gc3lzdGVtcywNCiAqICAgIHlvdSBjYW4gY3JlYXRlIHlvdXIgb3duIHJvdXRpbmUgb2YgdGhlIHNhbWUgbmFtZSB0aGF0IHdpbGwgcGVyZm9ybQ0KICogICAgaW5pdGlhbGl6YXRpb24uICBUaGUgbGlua2VyIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nIHRvIGlnbm9yZSB0aGlzDQogKiAgICBkZWZpbml0aW9uIGFuZCB1c2UgdGhlIHZlcnNpb24gaW4geW91ciBmaWxlLg0KICovDQojcHJhZ21hIG92ZXJsb2FkIHZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKTsNCnZvaWQgX19pbml0aWFsaXplX3N5c3RlbSh2b2lkKQ0Kew0KfQ0KDQovKg0KICogICAgRHVtbXkgcm91dGluZSBmb3IgaW5pdGlhbGl6aW5nIEMrKy4gIFRoaXMgcm91dGluZSB3aWxsIGdldCBvdmVybG9hZGVkIGJ5IHRoZSBDKysgcnVudGltZS4NCiAqLw0KI3ByYWdtYSBvdmVybG9hZCB2b2lkIF9fY2FsbF9zdGF0aWNfaW5pdGlhbGl6ZXJzKHZvaWQpOw0Kdm9pZCBfX2NhbGxfc3RhdGljX2luaXRpYWxpemVycyh2b2lkKQ0Kew0KfQ0KDQovKg0KICoJUm91dGluZSB0byBjb3B5IGEgc2luZ2xlIHNlY3Rpb24gZnJvbSBST00gdG8gUkFNIC4uLg0KICovDQpzdGF0aWMgX19kZWNsc3BlYyhyZWdpc3Rlcl9hYmkpIHZvaWQgX19jb3B5X3JvbV9zZWN0aW9uKGNoYXIqIGRzdCwgY29uc3QgY2hhciogc3JjLCB1bnNpZ25lZCBsb25nIHNpemUpDQp7DQoJaWYgKGRzdCAhPSBzcmMpDQoJCSB3aGlsZSAoc2l6ZS0tKQ0KCQkgICAgKmRzdCsrID0gKnNyYysrOw0KfQ0KDQovKg0KICoJUm91dGluZSB0aGF0IGNvcGllcyBhbGwgc2VjdGlvbnMgdGhlIHVzZXIgbWFya2VkIGFzIFJPTSBpbnRvDQogKgl0aGVpciB0YXJnZXQgUkFNIGFkZHJlc3NlcyAuLi4NCiAqDQogKglfX1Nfcm9tcCBpcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgbGlua2VyIGlmIGl0DQogKglpcyByZWZlcmVuY2VkIGJ5IHRoZSBwcm9ncmFtLiAgSXQgaXMgYSB0YWJsZSBvZiBSb21JbmZvDQogKglzdHJ1Y3R1cmVzLiAgVGhlIGZpbmFsIGVudHJ5IGluIHRoZSB0YWJsZSBoYXMgYWxsLXplcm8NCiAqCWZpZWxkcy4NCiAqLw0Kc3RhdGljIHZvaWQgX19jb3B5X3JvbV9zZWN0aW9uc190b19yYW0odm9pZCkNCnsNCglSb21JbmZvCQkqaW5mbzsNCg0KCS8qDQoJICoJR28gdGhyb3VnaCB0aGUgZW50aXJlIHRhYmxlLCBjb3B5aW5nIHNlY3Rpb25zIGZyb20gUk9NIHRvIFJBTS4NCgkgKi8NCglmb3IgKGluZm8gPSBfU19yb21wOyBpbmZvLT5Tb3VyY2UgIT0gMEwgfHwgaW5mby0+VGFyZ2V0ICE9IDBMIHx8IGluZm8tPlNpemUgIT0gMDsgKytpbmZvKQ0KICAgIF9fY29weV9yb21fc2VjdGlvbiggKGNoYXIgKilpbmZvLT5UYXJnZXQsKGNoYXIgKilpbmZvLT5Tb3VyY2UsIGluZm8tPlNpemUpOw0KCQkJCQkJCQ0KfQ0KDQovKg0KICogICAgRXhpdCBoYW5kbGVyIGNhbGxlZCBmcm9tIHRoZSBleGl0IHJvdXRpbmUsIGlmIHlvdXIgT1MgbmVlZHMNCiAqICAgIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIGZvciBleGl0IGhhbmRsaW5nIGp1c3QgcmVwbGFjZSB0aGlzDQogKiAgICByb3V0aW5lcyB3aXRoIHdoYXQgdGhlIE9TIG5lZWRzIHRvIGRvIC4uLg0KICovDQphc20gdm9pZCBfRXhpdFByb2Nlc3Modm9pZCkNCnsNCglpbGxlZ2FsDQoJcnRzDQp9DQoNCi8qDQogKiAgICBSb3V0aW5lIHRvIGNsZWFyIG91dCBibG9ja3Mgb2YgbWVtb3J5IHNob3VsZCBnaXZlIGdvb2QNCiAqICAgIHBlcmZvcm1hbmNlIHJlZ2FyZGxlc3Mgb2YgNjhrIG9yIENvbGRGaXJlIHBhcnQuDQogKi8NCnN0YXRpYyBfX2RlY2xzcGVjKHJlZ2lzdGVyX2FiaSkgdm9pZCBjbGVhcl9tZW0oY2hhciAqZHN0LCB1bnNpZ25lZCBsb25nIG4pDQp7DQoJdW5zaWduZWQgbG9uZyBpOw0KCWxvbmcgKmxwdHI7DQoNCglpZiAobiA+PSAzMikNCgl7DQoJCS8qIGFsaWduIHN0YXJ0IGFkZHJlc3MgdG8gYSA0IGJ5dGUgYm91bmRhcnkgKi8NCgkJaSA9ICgtICh1bnNpZ25lZCBsb25nKSBkc3QpICYgMzsNCg0KCQlpZiAoaSkNCgkJew0KCQkJbiAtPSBpOw0KCQkJZG8NCgkJCQkqZHN0KysgPSAwOw0KCQkJd2hpbGUgKC0taSk7DQoJCX0NCg0KCQkvKiB1c2UgYW4gdW5yb2xsZWQgbG9vcCB0byB6ZXJvIG91dCAzMmJ5dGUgYmxvY2tzICovDQoJCWkgPSBuID4+IDU7DQoJCWlmIChpKQ0KCQl7DQoJCQlscHRyID0gKGxvbmcgKilkc3Q7DQoJCQlkc3QgKz0gaSAqIDMyOw0KCQkJZG8NCgkJCXsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCQkqbHB0cisrID0gMDsNCgkJCX0NCgkJCXdoaWxlICgtLWkpOw0KCQl9DQoJCWkgPSAobiAmIDMxKSA+PiAyOw0KDQoJCS8qIGhhbmRsZSBhbnkgNCBieXRlIGJsb2NrcyBsZWZ0ICovDQoJCWlmIChpKQ0KCQl7DQoJCQlscHRyID0gKGxvbmcgKilkc3Q7DQoJCQlkc3QgKz0gaSAqIDQ7DQoJCQlkbw0KCQkJCSpscHRyKysgPSAwOw0KCQkJd2hpbGUgKC0taSk7DQoJCX0NCgkJbiAmPSAzOw0KCX0NCg0KCS8qIGhhbmRsZSBhbnkgYnl0ZSBibG9ja3MgbGVmdCAqLw0KCWlmIChuKQ0KCQlkbw0KCQkJKmRzdCsrID0gMDsNCgkJd2hpbGUgKC0tbik7DQp9DQoNCi8qDQogKiAgICBTdGFydHVwIHJvdXRpbmUgZm9yIGVtYmVkZGVkIGFwcGxpY2F0aW9uIC4uLg0KICovDQoNCmFzbSB2b2lkIF9zdGFydHVwKHZvaWQpDQp7DQoJLyogZGlzYWJsZSBpbnRlcnJ1cHRzICovDQogICAgbW92ZS53ICAgICAgICAjMHgyNzAwLHNyDQogICAgDQoJLyogUHJlLWluaXQgU1AsIGluIGNhc2UgbWVtb3J5IGZvciBzdGFjayBpcyBub3QgdmFsaWQgaXQgc2hvdWxkIGJlIHNldHVwIHVzaW5nIA0KCSAgIE1FTU9SWV9JTklUIGJlZm9yZSBfX2luaXRpYWxpemVfaGFyZHdhcmUgaXMgY2FsbGVkIA0KCSovDQoJbGVhIF9fU1BfQUZURVJfUkVTRVQsYTc7IA0KDQogICAgLyogaW5pdGlhbGl6ZSBtZW1vcnkgKi8NCiAgICBNRU1PUllfSU5JVA0KDQoJLyogaW5pdGlhbGl6ZSBhbnkgaGFyZHdhcmUgc3BlY2lmaWMgaXNzdWVzICovDQogICAganNyICAgICAgICAgICBfX2luaXRpYWxpemVfaGFyZHdhcmUgICANCiAgDQoJLyogc2V0dXAgdGhlIHN0YWNrIHBvaW50ZXIgKi8NCiAgICBsZWEgICAgICAgICAgIF9TUF9JTklULGE3DQoNCgkvKiBzZXR1cCBBNiBkdW1teSBzdGFja2ZyYW1lICovDQogICAgbW92ZWEubCAgICAgICAjMCxhNg0KICAgIGxpbmsgICAgICAgICAgYTYsIzANCg0KCS8qIHNldHVwIEE1ICovDQogICAgbGVhICAgICAgICAgICBfU0RBX0JBU0UsYTUNCg0KDQoJLyogemVybyBpbml0aWFsaXplIHRoZSAuYnNzIHNlY3Rpb24gKi8NCg0KICAgIGxlYSAgICAgICAgICAgX0VORF9CU1MsIGEwDQogICAgbGVhICAgICAgICAgICBfU1RBUlRfQlNTLCBhMQ0KICAgIHN1YmEubCAgICAgICAgYTEsIGEwDQogICAgbW92ZS5sICAgICAgICBhMCwgZDANCg0KICAgIGJlcSAgICAgICAgICAgX19za2lwX2Jzc19fDQoNCiAgICBsZWEgICAgICAgICAgIF9TVEFSVF9CU1MsIGEwDQoNCiAgICAvKiBjYWxsIGNsZWFyX21lbSB3aXRoIGJhc2UgcG9pbnRlciBpbiBhMCBhbmQgc2l6ZSBpbiBkMCAqLw0KICAgIGpzciAgICAgICAgICAgY2xlYXJfbWVtDQoNCl9fc2tpcF9ic3NfXzoNCg0KCS8qIHplcm8gaW5pdGlhbGl6ZSB0aGUgLnNic3Mgc2VjdGlvbiAqLw0KDQogICAgbGVhICAgICAgICAgICBfRU5EX1NCU1MsIGEwDQogICAgbGVhICAgICAgICAgICBfU1RBUlRfU0JTUywgYTENCiAgICBzdWJhLmwgICAgICAgIGExLCBhMA0KICAgIG1vdmUubCAgICAgICAgYTAsIGQwDQoNCiAgICBiZXEgICAgICAgICAgIF9fc2tpcF9zYnNzX18NCg0KICAgIGxlYSAgICAgICAgICAgX1NUQVJUX1NCU1MsIGEwDQoNCiAgICAvKiBjYWxsIGNsZWFyX21lbSB3aXRoIGJhc2UgcG9pbnRlciBpbiBhMCBhbmQgc2l6ZSBpbiBkMCAqLw0KICAgIGpzciAgICAgICAgICAgY2xlYXJfbWVtDQoNCl9fc2tpcF9zYnNzX186DQoNCgkvKiBjb3B5IGFsbCBST00gc2VjdGlvbnMgdG8gdGhlaXIgUkFNIGxvY2F0aW9ucyAuLi4gKi8NCiNpZiBTVVBQT1JUX1JPTV9UT19SQU0NCg0KCS8qDQoJICogX1Nfcm9tcCBpcyBhIG51bGwgdGVybWluYXRlZCBhcnJheSBvZg0KCSAqIHR5cGVkZWYgc3RydWN0IFJvbUluZm8gew0KICAgICAqICAgICAgdW5zaWduZWQgbG9uZwlTb3VyY2U7DQogICAgICogICAgICB1bnNpZ25lZCBsb25nCVRhcmdldDsNCiAgICAgKiAgICAgIHVuc2lnbmVkIGxvbmcgCVNpemU7DQogICAgICogIH0gUm9tSW5mbzsNCiAgICAgKg0KICAgICAqIFdhdGNoIG91dCBpZiB5b3UncmUgcmViYXNpbmcgdXNpbmcgX1BJQ1BJRF9ERUxUQQ0KICAgICAqLw0KDQogICAgbGVhICAgICAgICAgICBfU19yb21wLCBhMA0KICAgIG1vdmUubCAgICAgICAgYTAsIGQwDQogICAgYmVxICAgICAgICAgICBfX3NraXBfcm9tX2NvcHlfXyAgICAgICAgICAgIA0KICAgIGpzciAgICAgICAgICAgX19jb3B5X3JvbV9zZWN0aW9uc190b19yYW0NCg0KI2Vsc2UNCg0KCS8qDQogICAqIFRoZXJlJ3MgYSBzaW5nbGUgYmxvY2sgdG8gY29weSBmcm9tIFJPTSB0byBSQU0sIHBlcmZvcm0NCiAgICogdGhlIGNvcHkgZGlyZWN0bHkgd2l0aG91dCB1c2luZyB0aGUgX19TX3JvbXAgc3RydWN0dXJlDQogICAqLw0KDQogICAgbGVhICAgICAgICAgICBfX0RBVEFfUkFNLCBhMA0KICAgIGxlYSAgICAgICAgICAgX19EQVRBX1JPTSwgYTENCiAgICANCiAgICBjbXBhICAgICAgICAgIGEwLGExDQogICAgYmVxICAgICAgICAgICBfX3NraXBfcm9tX2NvcHlfXw0KICAgICAgICAgICAgICANCiAgICBtb3ZlLmwgICAgICAgICNfX0RBVEFfRU5ELCBkMA0KICAgIHN1Yi5sICAgICAgICAgYTAsIGQwDQogICAgICAgICAgICAgICAgICANCiAgICBqc3IgICAgICAgICAgIF9fY29weV9yb21fc2VjdGlvbg0KDQojZW5kaWYNCl9fc2tpcF9yb21fY29weV9fOg0KCQ0KCS8qIGNhbGwgQysrIHN0YXRpYyBpbml0aWFsaXplcnMgKF9fc2luaXRfXyh2b2lkKSkgKi8NCglqc3IJCQkgIF9fY2FsbF9zdGF0aWNfaW5pdGlhbGl6ZXJzDQoNCglqc3IJCSAgCSAgX19pbml0aWFsaXplX3N5c3RlbQ0KDQoJLyogY2FsbCBtYWluKGludCwgY2hhciAqKikgKi8NCglwZWEJCQkgIF9fYXJndg0KCWNsci5sCQkgIC0oc3ApCQkJCS8qIGNsZWFyaW5nIGEgbG9uZyBpcyBvayBzaW5jZSBpdCdzIGNhbGxlciBjbGVhbnVwICovDQoJanNyCQkJICBtYWluDQoJYWRkcS5sCQkjOCwgc3ANCgkNCgl1bmxrCQkgIGE2DQoJDQoJLyogbm93IGNhbGwgZXhpdCgwKSB0byB0ZXJtaW5hdGUgdGhlIGFwcGxpY2F0aW9uICovDQoJY2xyLmwJCSAgLShzcCkNCglqc3IJCQkgIGV4aXQNCglhZGRxLmwJCSM0LCBzcA0KDQoJLyogc2hvdWxkIG5ldmVyIHJlYWNoIGhlcmUgYnV0IGp1c3QgaW4gY2FzZSAqLw0KCWlsbGVnYWwNCglydHMNCg0KCS8qIGV4aXQgd2lsbCBuZXZlciByZXR1cm4gKi8NCl9fYXJndjoNCiAgICBkYy5sICAgICAgICAgIDANCn0NCg0K