LyoNCk9wZW5DViBmb3IgQW5kcm9pZCBOREsNCkNvcHlyaWdodCAoYykgMjAwNi0yMDA5IFNJUHJvcCBQcm9qZWN0IGh0dHA6Ly93d3cuc2lwcm9wLm9yZy8NCg0KVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuDQpJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLg0KUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsDQppbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0IGZyZWVseSwNCnN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6DQoNCjEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLg0KMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLg0KMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4NCiovDQojaW5jbHVkZSAiY3ZqbmkuaCINCiNpbmNsdWRlIDx0aW1lLmg+DQoNCg0KI2RlZmluZSBUSFJFU0hPTEQJMTANCiNkZWZpbmUgVEhSRVNIT0xEX01BWF9WQUxVRQkyNTUNCg0KI2RlZmluZSBDT05UT1VSX01BWF9MRVZFTAkxDQojZGVmaW5lIExJTkVfVEhJQ0tORVNTCTINCiNkZWZpbmUgTElORV9UWVBFCTgNCg0KI2RlZmluZSBIQUFSX1NDQUxFICgxLjQpDQojZGVmaW5lIElNQUdFX1NDQUxFICgyKQ0KI2RlZmluZSBNSU5fTkVJR0hCT1JTICgyKQ0KI2RlZmluZSBIQUFSX0ZMQUdTX1NJTkdMRV9GQUNFICgwIHwgQ1ZfSEFBUl9GSU5EX0JJR0dFU1RfT0JKRUNUIHwgQ1ZfSEFBUl9ET19ST1VHSF9TRUFSQ0gpDQojZGVmaW5lIEhBQVJfRkxBR1NfQUxMX0ZBQ0VTICgwKQ0KLy8gT3RoZXIgb3B0aW9ucyB3ZSBkcm9wcGVkIG91dDoNCi8vIENWX0hBQVJfRE9fQ0FOTllfUFJVTklORyB8IENWX0hBQVJfU0NBTEVfSU1BR0UNCiNkZWZpbmUgTUlOX1NJWkVfV0lEVEggKDIwKQ0KI2RlZmluZSBNSU5fU0laRV9IRUlHSFQgKDIwKQ0KI2RlZmluZSBQQURfRkFDRV9TSVpFICgxMCkNCiNkZWZpbmUgUEFEX0ZBQ0VfQVJFQSAoNDApDQojZGVmaW5lIFBBRF9GQUNFX0FSRUFfMiAoUEFEX0ZBQ0VfQVJFQSAqIDIpDQoNCi8vIEluaXRpYWxpemUgYSBzb2NrZXQgY2FwdHVyZSB0byBncmFiIGltYWdlcyBmcm9tIGEgc29ja2V0IGNvbm5lY3Rpb24uDQpKTklFWFBPUlQNCmpib29sZWFuDQpKTklDQUxMDQpKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9jcmVhdGVTb2NrZXRDYXB0dXJlKEpOSUVudiogZW52LA0KCQkJCQkJCQkJCQkJICBqb2JqZWN0IHRoaXosDQoJCQkJCQkJCQkJCQkgIGpzdHJpbmcgYWRkcmVzc19zdHIsDQoJCQkJCQkJCQkJCQkgIGpzdHJpbmcgcG9ydF9zdHIsDQoJCQkJCQkJCQkJCQkgIGppbnQgd2lkdGgsDQoJCQkJCQkJCQkJCQkgIGppbnQgaGVpZ2h0KSB7DQoJY29uc3QgY2hhciAqYWRkcmVzc19jaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoYWRkcmVzc19zdHIsIDApOw0KCWlmIChhZGRyZXNzX2NoYXJzID09IDApIHsNCgkJTE9HVigiRXJyb3IgbG9hZGluZyBzb2NrZXQgYWRkcmVzcy4iKTsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCgkNCgljb25zdCBjaGFyICpwb3J0X2NoYXJzID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhwb3J0X3N0ciwgMCk7DQoJaWYgKHBvcnRfY2hhcnMgPT0gMCkgew0KCQllbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhhZGRyZXNzX3N0ciwgYWRkcmVzc19jaGFycyk7DQoJCUxPR1YoIkVycm9yIGxvYWRpbmcgc29ja2V0IHBvcnQuIik7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJCQkJCQkJCQkJCQkJDQoJbV9jYXB0dXJlID0gY3ZDcmVhdGVTb2NrZXRDYXB0dXJlKGFkZHJlc3NfY2hhcnMsIHBvcnRfY2hhcnMsIHdpZHRoLCBoZWlnaHQpOw0KCWVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGFkZHJlc3Nfc3RyLCBhZGRyZXNzX2NoYXJzKTsNCgllbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhwb3J0X3N0ciwgcG9ydF9jaGFycyk7DQoJaWYgKG1fY2FwdHVyZSA9PSAwKQ0KCXsNCgkJTE9HVigiRXJyb3IgY3JlYXRpbmcgc29ja2V0IGNhcHR1cmUuIik7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQoJcmV0dXJuIHRydWU7DQp9DQoNCkpOSUVYUE9SVA0Kdm9pZA0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfcmVsZWFzZVNvY2tldENhcHR1cmUoSk5JRW52KiBlbnYsDQoJCQkJCQkJCQkJCQkgICBqb2JqZWN0IHRoaXopIHsNCglpZiAobV9jYXB0dXJlKSB7DQoJCWN2UmVsZWFzZUNhcHR1cmUoJm1fY2FwdHVyZSk7DQoJCW1fY2FwdHVyZSA9IDA7DQoJfQ0KfQ0KDQpKTklFWFBPUlQNCmpib29sZWFuDQpKTklDQUxMDQpKYXZhX29yZ19zaXByb3Bfb3BlbmN2X09wZW5DVl9ncmFiU291cmNlSW1hZ2VGcm9tQ2FwdHVyZShKTklFbnYqIGVudiwNCgkJCQkJCQkJCQkJCQkJIGpvYmplY3QgdGhpeikgew0KCWlmIChtX2NhcHR1cmUgPT0gMCkNCgl7DQoJCUxPR0UoIkNhcHR1cmUgd2FzIG5ldmVyIGluaXRpYWxpemVkLiIpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCQ0KCWlmIChjdkdyYWJGcmFtZShtX2NhcHR1cmUpID09IDApDQoJew0KCQlMT0dFKCJGYWlsZWQgdG8gZ3JhYiBmcmFtZSBmcm9tIHRoZSBjYXB0dXJlLiIpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCQ0KCUlwbEltYWdlICpmcmFtZSA9IGN2UmV0cmlldmVGcmFtZShtX2NhcHR1cmUpOw0KCWlmIChmcmFtZSA9PSAwKQ0KCXsNCgkJTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGZyYW1lIGZyb20gdGhlIGNhcHR1cmUuIik7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQoJaWYgKG1fc291cmNlSW1hZ2UpIHsNCgkJY3ZSZWxlYXNlSW1hZ2UoJm1fc291cmNlSW1hZ2UpOw0KCQltX3NvdXJjZUltYWdlID0gMDsNCgl9DQoJDQoJbV9zb3VyY2VJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZHZXRTaXplKGZyYW1lKSwgSVBMX0RFUFRIXzhVLCANCgkJZnJhbWUtPm5DaGFubmVscyk7DQoJDQoJLy8gQ2hlY2sgdGhlIG9yaWdpbiBvZiBpbWFnZS4gSWYgdG9wIGxlZnQsIGNvcHkgdGhlIGltYWdlIGZyYW1lIHRvIGZyYW1lX2NvcHkuDQoJLy8gRWxzZSBmbGlwIGFuZCBjb3B5IHRoZSBpbWFnZS4NCglpZiAoZnJhbWUtPm9yaWdpbiA9PSBJUExfT1JJR0lOX1RMKSB7DQoJICAgIGN2Q29weShmcmFtZSwgbV9zb3VyY2VJbWFnZSwgMCk7DQoJfQ0KCWVsc2Ugew0KCSAgICBjdkZsaXAoZnJhbWUsIG1fc291cmNlSW1hZ2UsIDApOw0KCX0NCgkNCglyZXR1cm4gdHJ1ZTsNCn0NCg0KLy8gR2VuZXJhdGUgYW5kIHJldHVybiBhIGJvb2xlYW4gYXJyYXkgZnJvbSB0aGUgc291cmNlIGltYWdlLg0KLy8gUmV0dXJuIDAgaWYgYSBmYWlsdXJlIG9jY3VycyBvciBpZiB0aGUgc291cmNlIGltYWdlIGlzIHVuZGVmaW5lZC4NCkpOSUVYUE9SVA0KamJvb2xlYW5BcnJheQ0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZ2V0U291cmNlSW1hZ2UoSk5JRW52KiBlbnYsDQoJCQkJCQkJCQkgICAgCSBqb2JqZWN0IHRoaXopDQp7DQoJaWYgKG1fc291cmNlSW1hZ2UgPT0gMCkgew0KCQlMT0dFKCJFcnJvciBzb3VyY2UgaW1hZ2Ugd2FzIG5vdCBzZXQuIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglDdk1hdCBzdHViOw0KICAgIEN2TWF0ICptYXRfaW1hZ2UgPSBjdkdldE1hdChtX3NvdXJjZUltYWdlLCAmc3R1Yik7DQogICAgaW50IGNoYW5uZWxzID0gQ1ZfTUFUX0NOKCBtYXRfaW1hZ2UtPnR5cGUgKTsNCiAgICBpbnQgaXBsX2RlcHRoID0gY3ZDdlRvSXBsRGVwdGgobWF0X2ltYWdlLT50eXBlKTsNCg0KCVdMTm9uRmlsZUJ5dGVTdHJlYW0gKnN0cm0gPSBuZXcgV0xOb25GaWxlQnl0ZVN0cmVhbSgpOw0KICAgIGxvYWRJbWFnZUJ5dGVzKG1hdF9pbWFnZS0+ZGF0YS5wdHIsIG1hdF9pbWFnZS0+c3RlcCwgbWF0X2ltYWdlLT53aWR0aCwNCgkJbWF0X2ltYWdlLT5oZWlnaHQsIGlwbF9kZXB0aCwgY2hhbm5lbHMsIHN0cm0pOw0KCQ0KCWludCBpbWFnZVNpemUgPSBzdHJtLT5HZXRTaXplKCk7DQoJamJvb2xlYW5BcnJheSByZXNfYXJyYXkgPSBlbnYtPk5ld0Jvb2xlYW5BcnJheShpbWFnZVNpemUpOw0KICAgIGlmIChyZXNfYXJyYXkgPT0gMCkgew0KCQlMT0dFKCJVbmFibGUgdG8gYWxsb2NhdGUgYSBuZXcgYm9vbGVhbiBhcnJheSBmb3IgdGhlIHNvdXJjZSBpbWFnZS4iKTsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIGVudi0+U2V0Qm9vbGVhbkFycmF5UmVnaW9uKHJlc19hcnJheSwgMCwgaW1hZ2VTaXplLCAoamJvb2xlYW4qKXN0cm0tPkdldEJ5dGUoKSk7DQoJDQoJc3RybS0+Q2xvc2UoKTsNCglTQUZFX0RFTEVURShzdHJtKTsNCgkNCglyZXR1cm4gcmVzX2FycmF5Ow0KfQ0KDQovLyBHaXZlbiBhbiBpbnRlZ2VyIGFycmF5IG9mIGltYWdlIGRhdGEsIGxvYWQgYW4gSXBsSW1hZ2UuDQovLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byByZWxlYXNlIHRoZSBJcGxJbWFnZS4NCklwbEltYWdlKiBnZXRJcGxJbWFnZUZyb21JbnRBcnJheShKTklFbnYqIGVudiwgamludEFycmF5IGFycmF5X2RhdGEsIA0KCQkJCQkJCQkgIGppbnQgd2lkdGgsIGppbnQgaGVpZ2h0KSB7DQoJLy8gTG9hZCBJbWFnZQ0KCWludCAqcGl4ZWxzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKGFycmF5X2RhdGEsIDApOw0KCWlmIChwaXhlbHMgPT0gMCkgew0KCQlMT0dFKCJFcnJvciBnZXR0aW5nIGludCBhcnJheSBvZiBwaXhlbHMuIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglJcGxJbWFnZSAqaW1hZ2UgPSBsb2FkUGl4ZWxzKHBpeGVscywgd2lkdGgsIGhlaWdodCk7DQoJZW52LT5SZWxlYXNlSW50QXJyYXlFbGVtZW50cyhhcnJheV9kYXRhLCBwaXhlbHMsIDApOw0KCWlmKGltYWdlID09IDApIHsNCgkJTE9HRSgiRXJyb3IgbG9hZGluZyBwaXhlbCBhcnJheS4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KCQ0KCXJldHVybiBpbWFnZTsNCn0NCg0KLy8gU2V0IHRoZSBzb3VyY2UgaW1hZ2UgYW5kIHJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwgb3IgZmFsc2Ugb3RoZXJ3aXNlLg0KSk5JRVhQT1JUDQpqYm9vbGVhbg0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1Zfc2V0U291cmNlSW1hZ2UoSk5JRW52KiBlbnYsDQoJCQkJCQkJCQkJCSBqb2JqZWN0IHRoaXosDQoJCQkJCQkJCQkJCSBqaW50QXJyYXkgcGhvdG9fZGF0YSwNCgkJCQkJCQkJCQkJIGppbnQgd2lkdGgsDQoJCQkJCQkJCQkJCSBqaW50IGhlaWdodCkNCnsJDQoJLy8gUmVsZWFzZSB0aGUgaW1hZ2UgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiByZWxlYXNlZC4NCglpZiAobV9zb3VyY2VJbWFnZSkgew0KCQljdlJlbGVhc2VJbWFnZSgmbV9zb3VyY2VJbWFnZSk7DQoJCW1fc291cmNlSW1hZ2UgPSAwOw0KCX0NCgltX2ZhY2VzRm91bmQgPSAwOw0KCQ0KCW1fc291cmNlSW1hZ2UgPSBnZXRJcGxJbWFnZUZyb21JbnRBcnJheShlbnYsIHBob3RvX2RhdGEsIHdpZHRoLCBoZWlnaHQpOw0KCWlmIChtX3NvdXJjZUltYWdlID09IDApIHsNCgkJTE9HRSgiRXJyb3Igc291cmNlIGltYWdlIGNvdWxkIG5vdCBiZSBjcmVhdGVkLiIpOw0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCQ0KCXJldHVybiB0cnVlOw0KfQ0KDQpKTklFWFBPUlQNCmpib29sZWFuQXJyYXkNCkpOSUNBTEwNCkphdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2ZpbmRDb250b3VycyhKTklFbnYqIGVudiwNCgkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQoJCQkJCQkJCQkJamludCB3aWR0aCwNCgkJCQkJCQkJCQlqaW50IGhlaWdodCkgew0KCUlwbEltYWdlICpncmF5SW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdkdldFNpemUobV9zb3VyY2VJbWFnZSksIElQTF9ERVBUSF84VSwgMSApOwkJLy8Jg0+DjIFbg1iDUIFbg4uJ5pGcl3BJcGxJbWFnZQ0KCUlwbEltYWdlICpiaW5hcnlJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2R2V0U2l6ZShtX3NvdXJjZUltYWdlKSwgSVBMX0RFUFRIXzhVLCAxICk7CS8vCTKSbInmkZyXcElwbEltYWdlDQoJSXBsSW1hZ2UgKmNvbnRvdXJJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2R2V0U2l6ZShtX3NvdXJjZUltYWdlKSwgSVBMX0RFUFRIXzhVLCAzICk7CS8vCZfWinOJ5pGcl3BJcGxJbWFnZQ0KDQoJLy8JQkdSgqmC54NPg4yBW4NYg1CBW4OLgsmVz4q3greC6Q0KCWN2Q3Z0Q29sb3IoIG1fc291cmNlSW1hZ2UsIGdyYXlJbWFnZSwgQ1ZfQkdSMkdSQVkgKTsNCg0KCS8vCYNPg4yBW4NYg1CBW4OLgqmC5zKSbILJlc+Kt4K3gukNCgljdlRocmVzaG9sZCggZ3JheUltYWdlLCBiaW5hcnlJbWFnZSwgVEhSRVNIT0xELCBUSFJFU0hPTERfTUFYX1ZBTFVFLCBDVl9USFJFU0hfQklOQVJZICk7DQoNCgkvLwmX1opzkoqPb5dwgsyDgYOCg4qC8IptlduCt4LpDQoJQ3ZNZW1TdG9yYWdlKiBzdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKCAwICk7CS8vCZKKj2+Cs4Lqgr2X1opzgvCV25G2greC6ZfMiOYNCglDdlNlcSogZmluZF9jb250b3VyID0gMDsJCS8vCZfWinOC1oLMg3yDQ4OTg14gICAgICAgICAgIA0KDQoJLy8JMpJsieaRnJKGgsyX1opzgvCMqYLCgq+BQYK7gsyQlILwldSCtw0KCWludCBmaW5kX2NvbnRvdXJfbnVtID0gY3ZGaW5kQ29udG91cnMoIA0KCQliaW5hcnlJbWFnZSwJCQkvLwmT/JfNieaRnCiCV4Nyg2KDZ4NWg5ODT4OLg2CDg4OTg2yDi4FqDQoJCXN0b3JhZ2UsCQkJCS8vCZKKj2+Cs4Lqgr2X1opzgvCV25G2greC6ZfMiOYNCgkJJmZpbmRfY29udG91ciwJCQkvLwmI6pTUik+RpILMl9aKc4LWgsyDfINDg5ODXoLWgsyDfINDg5ODXg0KCQlzaXplb2YoIEN2Q29udG91ciApLAkvLwmDVoFbg1CDk4NYg3eDYoNfgsyDVINDg1kNCgkJQ1ZfUkVUUl9MSVNULAkJCS8vCZKKj2+DgoFbg2ggDQoJCUNWX0NIQUlOX0FQUFJPWF9OT05FLAkvLwmQhJLojuiWQA0KCQljdlBvaW50KCAwLCAwICkJCQkvLwmDSYN0g1qDYoNnDQoJKTsNCg0KCS8vCZWokcyCzJfWinOC8JDUkEaCxZVgieaCt4LpDQoJQ3ZTY2FsYXIgcmVkID0gQ1ZfUkdCKCAyNTUsIDAsIDAgKTsNCgljdkRyYXdDb250b3VycyggDQoJCW1fc291cmNlSW1hZ2UsCQkJLy8Jl9aKc4LwlWCJ5oK3gumJ5pGcDQoJCWZpbmRfY29udG91ciwJCQkvLwmNxY+JgsyX1opzgtaCzIN8g0ODk4NeDQoJCXJlZCwJCQkJCS8vCYpPkaSX1opzkPyCzJBGDQoJCXJlZCwJCQkJCS8vCZPgkaSX1opzkPyBaYyKgWqCzJBGDQoJCUNPTlRPVVJfTUFYX0xFVkVMLAkJLy8JlWCJ5oKzguqC6ZfWinOCzI3FkeWDjIN4g4sNCgkJTElORV9USElDS05FU1MsCQkJLy8JlWCJ5oKzguqC6ZfWinOQ/ILMkb6Csw0KCQlMSU5FX1RZUEUsCQkJCS8vCZD8gsyO7ZfeDQoJCWN2UG9pbnQoIDAsIDAgKQkJCS8vCYNJg3SDWoNig2cNCgkpOyAgIA0KDQoJaW50IGltYWdlU2l6ZTsNCglDdk1hdCBzdHViLCAqbWF0X2ltYWdlOw0KICAgIGludCBjaGFubmVscywgaXBsX2RlcHRoOw0KICAgIG1hdF9pbWFnZSA9IGN2R2V0TWF0KCBtX3NvdXJjZUltYWdlLCAmc3R1YiApOw0KICAgIGNoYW5uZWxzID0gQ1ZfTUFUX0NOKCBtYXRfaW1hZ2UtPnR5cGUgKTsNCg0KICAgIGlwbF9kZXB0aCA9IGN2Q3ZUb0lwbERlcHRoKG1hdF9pbWFnZS0+dHlwZSk7DQoNCglMT0dWKCJMb2FkIGxvYWRJbWFnZUJ5dGVzLiIpOw0KCVdMTm9uRmlsZUJ5dGVTdHJlYW0qIHN0cm0gPSBuZXcgV0xOb25GaWxlQnl0ZVN0cmVhbSgpOw0KICAgIGxvYWRJbWFnZUJ5dGVzKG1hdF9pbWFnZS0+ZGF0YS5wdHIsIG1hdF9pbWFnZS0+c3RlcCwgbWF0X2ltYWdlLT53aWR0aCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0X2ltYWdlLT5oZWlnaHQsIGlwbF9kZXB0aCwgY2hhbm5lbHMsIHN0cm0pOw0KDQoJaW1hZ2VTaXplID0gc3RybS0+R2V0U2l6ZSgpOw0KCWpib29sZWFuQXJyYXkgcmVzX2FycmF5ID0gZW52LT5OZXdCb29sZWFuQXJyYXkoaW1hZ2VTaXplKTsNCglMT0dWKCJMb2FkIE5ld0Jvb2xlYW5BcnJheS4iKTsNCiAgICBpZiAocmVzX2FycmF5ID09IDApIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KICAgIGVudi0+U2V0Qm9vbGVhbkFycmF5UmVnaW9uKHJlc19hcnJheSwgMCwgaW1hZ2VTaXplLCAoamJvb2xlYW4qKXN0cm0tPkdldEJ5dGUoKSk7DQoJTE9HVigiTG9hZCBTZXRCb29sZWFuQXJyYXlSZWdpb24uIik7DQoNCglMT0dWKCJSZWxlYXNlIHNvdXJjZUltYWdlIik7DQoJaWYgKG1fc291cmNlSW1hZ2UpIHsNCgkJY3ZSZWxlYXNlSW1hZ2UoJm1fc291cmNlSW1hZ2UpOw0KCQltX3NvdXJjZUltYWdlID0gMDsNCgl9DQoJTE9HVigiUmVsZWFzZSBiaW5hcnlJbWFnZSIpOw0KCWN2UmVsZWFzZUltYWdlKCAmYmluYXJ5SW1hZ2UgKTsNCglMT0dWKCJSZWxlYXNlIGdyYXlJbWFnZSIpOw0KCWN2UmVsZWFzZUltYWdlKCAmZ3JheUltYWdlICk7DQoJTE9HVigiUmVsZWFzZSBjb250b3VySW1hZ2UiKTsNCgljdlJlbGVhc2VJbWFnZSggJmNvbnRvdXJJbWFnZSApOw0KCUxPR1YoIlJlbGVhc2Ugc3RvcmFnZSIpOw0KCWN2UmVsZWFzZU1lbVN0b3JhZ2UoICZzdG9yYWdlICk7DQoJTE9HVigiRGVsZXRlIHN0cm0iKTsNCglzdHJtLT5DbG9zZSgpOw0KCVNBRkVfREVMRVRFKHN0cm0pOw0KDQoJcmV0dXJuIHJlc19hcnJheTsNCn0NCg0KSk5JRVhQT1JUDQpqYm9vbGVhbg0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfaW5pdEZhY2VEZXRlY3Rpb24oSk5JRW52KiBlbnYsDQoJCQkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQoJCQkJCQkJCQkJCQlqc3RyaW5nIGNhc2NhZGVfcGF0aF9zdHIpIHsNCgkNCgkvLyBGaXJzdCBjYWxsIHJlbGVhc2UgdG8gZW5zdXJlIHRoZSBtZW1vcnkgaXMgZW1wdHkuDQoJSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfcmVsZWFzZUZhY2VEZXRlY3Rpb24oZW52LCB0aGl6KTsNCgkJCQkJCQkJCQkJCQ0KCWNoYXIgYnVmZmVyWzEwMF07DQoJY2xvY2tfdCB0b3RhbF90aW1lX3N0YXJ0ID0gY2xvY2soKTsNCgkNCgltX3NtYWxsZXN0RmFjZVNpemUud2lkdGggPSBNSU5fU0laRV9XSURUSDsNCgltX3NtYWxsZXN0RmFjZVNpemUuaGVpZ2h0ID0gTUlOX1NJWkVfSEVJR0hUOw0KCQ0KCWNvbnN0IGNoYXIgKmNhc2NhZGVfcGF0aF9jaGFycyA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoY2FzY2FkZV9wYXRoX3N0ciwgMCk7DQoJaWYgKGNhc2NhZGVfcGF0aF9jaGFycyA9PSAwKSB7DQoJCUxPR0UoIkVycm9yIGdldHRpbmcgY2FzY2FkZSBzdHJpbmcuIik7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQoJbV9jYXNjYWRlID0gKEN2SGFhckNsYXNzaWZpZXJDYXNjYWRlKiljdkxvYWQoY2FzY2FkZV9wYXRoX2NoYXJzKTsNCgllbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhjYXNjYWRlX3BhdGhfc3RyLCBjYXNjYWRlX3BhdGhfY2hhcnMpOw0KCWlmIChtX2Nhc2NhZGUgPT0gMCkgew0KCQlMT0dFKCJFcnJvciBsb2FkaW5nIGNhc2NhZGUuIik7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJDQoJbV9zdG9yYWdlID0gY3ZDcmVhdGVNZW1TdG9yYWdlKDApOw0KCQ0KCWNsb2NrX3QgdG90YWxfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gdG90YWxfdGltZV9zdGFydDsNCglzcHJpbnRmKGJ1ZmZlciwgIlRvdGFsIFRpbWUgdG8gaW5pdDogJWYiLCAoZG91YmxlKXRvdGFsX3RpbWVfZmluaXNoIC8gKGRvdWJsZSlDTE9DS1NfUEVSX1NFQyk7DQoJTE9HVihidWZmZXIpOw0KCQ0KCXJldHVybiB0cnVlOw0KfQ0KDQovLyBSZWxlYXNlIGFsbCBvZiB0aGUgbWVtb3J5IHVzZWQgYnkgZmFjZSB0cmFja2luZy4NCkpOSUVYUE9SVA0Kdm9pZA0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfcmVsZWFzZUZhY2VEZXRlY3Rpb24oSk5JRW52KiBlbnYsDQoJCQkJCQkJCQkJCQkgICBqb2JqZWN0IHRoaXopIHsNCgkJCQkJCQkJCQkJDQoJbV9mYWNlc0ZvdW5kID0gMDsNCgltX2ZhY2VDcm9wQXJlYS53aWR0aCA9IG1fZmFjZUNyb3BBcmVhLmhlaWdodCA9IDA7DQoJDQoJaWYgKG1fY2FzY2FkZSkgew0KCQljdlJlbGVhc2VIYWFyQ2xhc3NpZmllckNhc2NhZGUoJm1fY2FzY2FkZSk7DQoJCW1fY2FzY2FkZSA9IDA7DQoJfQ0KCQ0KCWlmIChtX3NvdXJjZUltYWdlKSB7DQoJCWN2UmVsZWFzZUltYWdlKCZtX3NvdXJjZUltYWdlKTsNCgkJbV9zb3VyY2VJbWFnZSA9IDA7DQoJfQ0KCQ0KCWlmIChtX2dyYXlJbWFnZSkgew0KCQljdlJlbGVhc2VJbWFnZSgmbV9ncmF5SW1hZ2UpOw0KCQltX2dyYXlJbWFnZSA9IDA7DQoJfQ0KCQ0KCWlmIChtX3NtYWxsSW1hZ2UpIHsNCgkJY3ZSZWxlYXNlSW1hZ2UoJm1fc21hbGxJbWFnZSk7DQoJCW1fc21hbGxJbWFnZSA9IDA7DQoJfQ0KCQ0KCWlmIChtX3N0b3JhZ2UpIHsNCgkJY3ZSZWxlYXNlTWVtU3RvcmFnZSgmbV9zdG9yYWdlKTsNCgkJbV9zdG9yYWdlID0gMDsNCgl9DQp9DQoNCi8vIEluaXRhbGl6ZSB0aGUgc21hbGwgaW1hZ2UgYW5kIHRoZSBncmF5IGltYWdlIHVzaW5nIHRoZSBpbnB1dCBzb3VyY2UgaW1hZ2UuDQovLyBJZiBhIHByZXZpb3VzIGZhY2Ugd2FzIHNwZWNpZmllZCwgd2Ugd2lsbCBsaW1pdCB0aGUgUk9JIHRvIHRoYXQgZmFjZS4NCnZvaWQgaW5pdEZhY2VEZXRlY3Rpb25JbWFnZXMoSXBsSW1hZ2UgKnNvdXJjZUltYWdlLCBkb3VibGUgc2NhbGUgPSAxLjApIHsNCglpZiAobV9ncmF5SW1hZ2UgPT0gMCkgew0KCQltX2dyYXlJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZHZXRTaXplKHNvdXJjZUltYWdlKSwgSVBMX0RFUFRIXzhVLCAxKTsNCgl9DQoJDQoJaWYgKG1fc21hbGxJbWFnZSA9PSAwKSB7DQoJCW1fc21hbGxJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoY3ZTaXplKGN2Um91bmQoc291cmNlSW1hZ2UtPndpZHRoIC8gc2NhbGUpLCANCgkJCWN2Um91bmQoc291cmNlSW1hZ2UtPmhlaWdodCAvIHNjYWxlKSksIElQTF9ERVBUSF84VSwgMSk7DQoJfQ0KCQ0KCWlmKG1fZmFjZUNyb3BBcmVhLndpZHRoID4gMCAmJiBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPiAwKSB7DQoJCWN2U2V0SW1hZ2VST0kobV9zbWFsbEltYWdlLCBtX2ZhY2VDcm9wQXJlYSk7DQoJDQoJCUN2UmVjdCB0UHJldiA9IGN2UmVjdChtX2ZhY2VDcm9wQXJlYS54ICogc2NhbGUsIG1fZmFjZUNyb3BBcmVhLnkgKiBzY2FsZSwgDQoJCQltX2ZhY2VDcm9wQXJlYS53aWR0aCAqIHNjYWxlLCBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgKiBzY2FsZSk7DQoJCWN2U2V0SW1hZ2VST0koc291cmNlSW1hZ2UsIHRQcmV2KTsNCgkJY3ZTZXRJbWFnZVJPSShtX2dyYXlJbWFnZSwgdFByZXYpOw0KCX0gZWxzZSB7DQoJCWN2UmVzZXRJbWFnZVJPSShtX3NtYWxsSW1hZ2UpOw0KCQljdlJlc2V0SW1hZ2VST0kobV9ncmF5SW1hZ2UpOw0KCX0NCgkNCiAgICBjdkN2dENvbG9yKHNvdXJjZUltYWdlLCBtX2dyYXlJbWFnZSwgQ1ZfQkdSMkdSQVkpOw0KICAgIGN2UmVzaXplKG1fZ3JheUltYWdlLCBtX3NtYWxsSW1hZ2UsIENWX0lOVEVSX0xJTkVBUik7DQogICAgY3ZFcXVhbGl6ZUhpc3QobV9zbWFsbEltYWdlLCBtX3NtYWxsSW1hZ2UpOw0KCWN2Q2xlYXJNZW1TdG9yYWdlKG1fc3RvcmFnZSk7DQoJDQoJY3ZSZXNldEltYWdlUk9JKHNvdXJjZUltYWdlKTsNCn0NCg0KLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiByZWN0YW5nbGVzLCByZXR1cm4gYW4gYXJyYXkgb2YgQW5kcm9pZCBSZWN0IG9iamVjdHMNCi8vIG9yIG51bGwgaWYgYW55IGVycm9ycyBvY2N1ci4NCmpvYmplY3RBcnJheSBzZXFSZWN0c1RvQW5kcm9pZFJlY3RzKEpOSUVudiogZW52LCBDdlNlcSAqcmVjdHMpIHsNCglpZiAocmVjdHMgPT0gMCB8fCByZWN0cy0+dG90YWwgPD0gMCkgew0KCQlMT0dFKCJObyByZWN0YW5nbGVzIHdlcmUgc3BlY2lmaWVkISIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJDQoJamNsYXNzIGpjbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9ncmFwaGljcy9SZWN0Iik7DQoJaWYgKGpjbHMgPT0gMCkgew0KCQlMT0dFKCJVbmFibGUgdG8gZmluZCBjbGFzcyBhbmRyb2lkLmdyYXBoaWNzLlJlY3QiKTsNCgkJcmV0dXJuIDA7DQoJfQ0KCQ0KCWptZXRob2RJRCBqY29uc3RydWN0ID0gZW52LT5HZXRNZXRob2RJRChqY2xzLCAiPGluaXQ+IiwgIihJSUlJKVYiKTsNCglpZiAoamNvbnN0cnVjdCA9PSAwKSB7DQoJCUxPR0UoIlVuYWJsZSB0byBmaW5kIGNvbnN0cnVjdG9yIFJlY3QoaW50LCBpbnQsIGludCwgaW50KSIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJDQoJam9iamVjdEFycmF5IGFyeSA9IGVudi0+TmV3T2JqZWN0QXJyYXkocmVjdHMtPnRvdGFsLCBqY2xzLCAwKTsNCglpZiAoYXJ5ID09IDApIHsNCgkJTE9HRSgiVW5hYmxlIHRvIGNyZWF0ZSBSZWN0IGFycmF5Iik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglmb3IgKGludCBpID0gMDsgaSA8IHJlY3RzLT50b3RhbDsgaSsrKSB7DQoJCWNoYXIgYnVmZmVyWzEwMF07DQoJCUN2UmVjdCAqcmVjdCA9IChDdlJlY3QqKWN2R2V0U2VxRWxlbShyZWN0cywgaSk7DQoJCWlmIChyZWN0ID09IDApIHsNCgkJCXNwcmludGYoYnVmZmVyLCAiSW52YWxpZCBSZWN0YW5nbGUgIyVkIiwgaSk7DQoJCQlMT0dFKGJ1ZmZlcik7DQoJCQlyZXR1cm4gMDsNCgkJfQ0KCQkNCgkJam9iamVjdCBqcmVjdCA9IGVudi0+TmV3T2JqZWN0KGpjbHMsIGpjb25zdHJ1Y3QsIHJlY3QtPngsIHJlY3QtPnksIA0KCQkJcmVjdC0+d2lkdGgsIHJlY3QtPmhlaWdodCk7DQoJCWlmIChqcmVjdCA9PSAwKSB7DQoJCQlzcHJpbnRmKGJ1ZmZlciwgIlVuYWJsZSB0byBjcmVhdGUgQW5kcm9pZCBSZWN0IG9iamVjdCBmb3IgcmVjdGFuZ2xlICMlZCIsIGkpOw0KCQkJTE9HRShidWZmZXIpOw0KCQkJcmV0dXJuIDA7DQoJCX0NCgkJDQoJCWVudi0+U2V0T2JqZWN0QXJyYXlFbGVtZW50KGFyeSwgaSwganJlY3QpOw0KCQllbnYtPkRlbGV0ZUxvY2FsUmVmKGpyZWN0KTsNCgl9DQoJDQoJcmV0dXJuIGFyeTsNCn0NCg0KLy8gSWRlbnRpZnkgYWxsIG9mIHRoZSBmYWNlcyBpbiB0aGUgc291cmNlIGltYWdlIGFuZCByZXR1cm4gYW4gYXJyYXkNCi8vIG9mIEFuZHJvaWQgUmVjdCBvYmplY3RzIHdpdGggdGhlIGZhY2UgY29vcmRpbmF0ZXMuICBJZiBhbnkgZXJyb3JzDQovLyBvY2N1ciwgYSAwIGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuDQpKTklFWFBPUlQNCmpvYmplY3RBcnJheQ0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZmluZEFsbEZhY2VzKEpOSUVudiogZW52LA0KCQkJCQkJCQkJICAgICAgIGpvYmplY3QgdGhpeikgew0KCWNoYXIgYnVmZmVyWzEwMF07DQoJY2xvY2tfdCB0b3RhbF90aW1lX3N0YXJ0ID0gY2xvY2soKTsNCgkNCglpZiAobV9jYXNjYWRlID09IDAgfHwgbV9zdG9yYWdlID09IDApIHsNCgkJTE9HRSgiRXJyb3IgZmluZCBmYWNlcyB3YXMgbm90IGluaXRpYWxpemVkLiIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJDQoJaWYgKG1fc291cmNlSW1hZ2UgPT0gMCkgew0KCQlMT0dFKCJFcnJvciBzb3VyY2UgaW1hZ2Ugd2FzIG5vdCBzZXQuIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglpbml0RmFjZURldGVjdGlvbkltYWdlcyhtX3NvdXJjZUltYWdlLCBJTUFHRV9TQ0FMRSk7DQoNCgljbG9ja190IGhhYXJfZGV0ZWN0X3RpbWVfc3RhcnQgPSBjbG9jaygpOw0KICAgIG1fZmFjZXNGb3VuZCA9IG15Y3ZIYWFyRGV0ZWN0T2JqZWN0cyhtX3NtYWxsSW1hZ2UsIG1fY2FzY2FkZSwgbV9zdG9yYWdlLCBIQUFSX1NDQUxFLCANCgkJTUlOX05FSUdIQk9SUywgSEFBUl9GTEFHU19BTExfRkFDRVMsIGN2U2l6ZShNSU5fU0laRV9XSURUSCwgTUlOX1NJWkVfSEVJR0hUKSk7DQoJCQ0KCWNsb2NrX3QgaGFhcl9kZXRlY3RfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gaGFhcl9kZXRlY3RfdGltZV9zdGFydDsNCglzcHJpbnRmKGJ1ZmZlciwgIlRvdGFsIFRpbWUgdG8gY3ZIYWFyRGV0ZWN0T2JqZWN0cyBpbiBmaW5kQWxsRmFjZXM6ICVmIiwgKGRvdWJsZSloYWFyX2RldGVjdF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KCUxPR1YoYnVmZmVyKTsNCgkNCglqb2JqZWN0QXJyYXkgZmFjZVJlY3RzID0gMDsNCglpZiAobV9mYWNlc0ZvdW5kID09IDAgfHwgbV9mYWNlc0ZvdW5kLT50b3RhbCA8PSAwKSB7DQoJCUxPR1YoIkZBQ0VTX0RFVEVDVEVEIDAiKTsNCgl9IGVsc2Ugew0KCQlzcHJpbnRmKGJ1ZmZlciwgIkZBQ0VTX0RFVEVDVEVEICVkIiwgbV9mYWNlc0ZvdW5kLT50b3RhbCk7DQoJCUxPR1YoYnVmZmVyKTsNCgkJbV9mYWNlQ3JvcEFyZWEud2lkdGggPSBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPSAwOw0KCQlmYWNlUmVjdHMgPSBzZXFSZWN0c1RvQW5kcm9pZFJlY3RzKGVudiwgbV9mYWNlc0ZvdW5kKTsNCgl9DQoJDQoJY2xvY2tfdCB0b3RhbF90aW1lX2ZpbmlzaCA9IGNsb2NrKCkgLSB0b3RhbF90aW1lX3N0YXJ0Ow0KCXNwcmludGYoYnVmZmVyLCAiVG90YWwgVGltZSB0byBmaW5kQWxsRmFjZXM6ICVmIiwgKGRvdWJsZSl0b3RhbF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KCUxPR1YoYnVmZmVyKTsNCgkNCglyZXR1cm4gZmFjZVJlY3RzOw0KfQ0KDQovLyBTdG9yZSB0aGUgcHJldmlvdXMgZmFjZSBmb3VuZCBpbiB0aGUgc2NlbmUuDQp2b2lkIHN0b3JlUHJldmlvdXNGYWNlKEN2UmVjdCogZmFjZSkgew0KCWNoYXIgYnVmZmVyWzEwMF07DQoJaWYgKG1fZmFjZUNyb3BBcmVhLndpZHRoID4gMCAmJiBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPiAwKSB7DQoJCWZhY2UtPnggKz0gbV9mYWNlQ3JvcEFyZWEueDsNCgkJZmFjZS0+eSArPSBtX2ZhY2VDcm9wQXJlYS55Ow0KCQlzcHJpbnRmKGJ1ZmZlciwgIkZhY2UgcmVjdCArIG1fZmFjZUNyb3BBcmVhOiAoJWQsICVkKSB0byAoJWQsICVkKSIsIGZhY2UtPngsIGZhY2UtPnksIA0KCQkJZmFjZS0+eCArIGZhY2UtPndpZHRoLCBmYWNlLT55ICsgZmFjZS0+aGVpZ2h0KTsNCgkJTE9HVihidWZmZXIpOw0KCX0NCgkNCglpbnQgc3RhcnRYID0gTUFYKGZhY2UtPnggLSBQQURfRkFDRV9BUkVBLCAwKTsNCglpbnQgc3RhcnRZID0gTUFYKGZhY2UtPnkgLSBQQURfRkFDRV9BUkVBLCAwKTsNCglpbnQgdyA9IG1fc21hbGxJbWFnZS0+d2lkdGggLSBzdGFydFggLSBmYWNlLT53aWR0aCAtIFBBRF9GQUNFX0FSRUFfMjsNCglpbnQgaCA9IG1fc21hbGxJbWFnZS0+aGVpZ2h0IC0gc3RhcnRZIC0gZmFjZS0+aGVpZ2h0IC0gUEFEX0ZBQ0VfQVJFQV8yOw0KCWludCBzdyA9IGZhY2UtPnggLSBQQURfRkFDRV9BUkVBLCBzaCA9IGZhY2UtPnkgLSBQQURfRkFDRV9BUkVBOw0KCW1fZmFjZUNyb3BBcmVhID0gY3ZSZWN0KHN0YXJ0WCwgc3RhcnRZLCANCgkJZmFjZS0+d2lkdGggKyBQQURfRkFDRV9BUkVBXzIgKyAoKHcgPCAwKSA/IHcgOiAwKSArICgoc3cgPCAwKSA/IHN3IDogMCksDQoJCWZhY2UtPmhlaWdodCArIFBBRF9GQUNFX0FSRUFfMiArICgoaCA8IDApID8gaCA6IDApICsgKChzaCA8IDApID8gc2ggOiAwKSk7DQoJc3ByaW50ZihidWZmZXIsICJtX2ZhY2VDcm9wQXJlYTogKCVkLCAlZCkgdG8gKCVkLCAlZCkiLCBtX2ZhY2VDcm9wQXJlYS54LCBtX2ZhY2VDcm9wQXJlYS55LCANCgkJbV9mYWNlQ3JvcEFyZWEueCArIG1fZmFjZUNyb3BBcmVhLndpZHRoLCBtX2ZhY2VDcm9wQXJlYS55ICsgbV9mYWNlQ3JvcEFyZWEuaGVpZ2h0KTsNCglMT0dWKGJ1ZmZlcik7DQp9DQoNCi8vIEdpdmVuIGEgcmVjdGFuZ2xlLCByZXR1cm4gYW4gQW5kcm9pZCBSZWN0IG9iamVjdCBvciBudWxsIGlmIGFueSANCi8vIGVycm9ycyBvY2N1ci4NCmpvYmplY3QgcmVjdFRvQW5kcm9pZFJlY3QoSk5JRW52KiBlbnYsIEN2UmVjdCAqcmVjdCkgew0KCWlmIChyZWN0ID09IDApIHsNCgkJTE9HRSgiTm8gcmVjdGFuZ2xlIHdhcyBzcGVjaWZpZWQhIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglqY2xhc3MgamNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL2dyYXBoaWNzL1JlY3QiKTsNCglpZiAoamNscyA9PSAwKSB7DQoJCUxPR0UoIlVuYWJsZSB0byBmaW5kIGNsYXNzIGFuZHJvaWQuZ3JhcGhpY3MuUmVjdCIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJDQoJam1ldGhvZElEIGpjb25zdHJ1Y3QgPSBlbnYtPkdldE1ldGhvZElEKGpjbHMsICI8aW5pdD4iLCAiKElJSUkpViIpOw0KCWlmIChqY29uc3RydWN0ID09IDApIHsNCgkJTE9HRSgiVW5hYmxlIHRvIGZpbmQgY29uc3RydWN0b3IgUmVjdChpbnQsIGludCwgaW50LCBpbnQpIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglyZXR1cm4gZW52LT5OZXdPYmplY3QoamNscywgamNvbnN0cnVjdCwgcmVjdC0+eCwgcmVjdC0+eSwgDQoJCXJlY3QtPndpZHRoLCByZWN0LT5oZWlnaHQpOw0KfQ0KDQovLyBJZGVudGlmeSBhIHNpbmdsZSBmYWNlIGluIHRoZSBzb3VyY2UgaW1hZ2UgYW5kIHJldHVybiBhbiBBbmRyb2lkDQovLyBBbmRyb2lkIFJlY3Qgb2JqZWN0IHdpdGggdGhlIGZhY2UgY29vcmRpbmF0ZXMuICBUaGlzIG1ldGhvZCBpcw0KLy8gb3B0aW1pemVkIGJ5IGZvY3VzaW5nIG9uIGEgc2luZ2xlIGZhY2UgYW5kIGNyb3BwaW5nIHRoZSBkZXRlY3Rpb24NCi8vIHJlZ2lvbiB0byB0aGUgYXJlYSB3aGVyZSB0aGUgZmFjZSBpcyBsb2NhdGVkIHBsdXMgc29tZSBhZGRpdGlvbmFsDQovLyBwYWRkaW5nIHRvIGFjY291bnQgZm9yIHNsaWdodCBoZWFkIG1vdmVtZW50cy4gIElmIGFueSBlcnJvcnMgb2NjdXIsIA0KLy8gYSAwIGFycmF5IHdpbGwgYmUgcmV0dXJuZWQuDQpKTklFWFBPUlQNCmpvYmplY3QNCkpOSUNBTEwNCkphdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2ZpbmRTaW5nbGVGYWNlKEpOSUVudiogZW52LA0KCQkJCQkJCQkJCQkgam9iamVjdCB0aGl6KSB7DQoJY2hhciBidWZmZXJbMTAwXTsNCgljbG9ja190IHRvdGFsX3RpbWVfc3RhcnQgPSBjbG9jaygpOw0KCQ0KCWlmIChtX2Nhc2NhZGUgPT0gMCB8fCBtX3N0b3JhZ2UgPT0gMCkgew0KCQlMT0dFKCJFcnJvciBmaW5kIGZhY2VzIHdhcyBub3QgaW5pdGlhbGl6ZWQuIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCglpZiAobV9zb3VyY2VJbWFnZSA9PSAwKSB7DQoJCUxPR0UoIkVycm9yIHNvdXJjZSBpbWFnZSB3YXMgbm90IHNldC4iKTsNCgkJcmV0dXJuIDA7DQoJfQ0KCQ0KCWluaXRGYWNlRGV0ZWN0aW9uSW1hZ2VzKG1fc291cmNlSW1hZ2UsIElNQUdFX1NDQUxFKTsNCg0KCWNsb2NrX3QgaGFhcl9kZXRlY3RfdGltZV9zdGFydCA9IGNsb2NrKCk7DQogICAgbV9mYWNlc0ZvdW5kID0gbXljdkhhYXJEZXRlY3RPYmplY3RzKG1fc21hbGxJbWFnZSwgbV9jYXNjYWRlLCBtX3N0b3JhZ2UsIEhBQVJfU0NBTEUsIA0KCQlNSU5fTkVJR0hCT1JTLCBIQUFSX0ZMQUdTX1NJTkdMRV9GQUNFLCBtX3NtYWxsZXN0RmFjZVNpemUpOw0KCQkNCgljbG9ja190IGhhYXJfZGV0ZWN0X3RpbWVfZmluaXNoID0gY2xvY2soKSAtIGhhYXJfZGV0ZWN0X3RpbWVfc3RhcnQ7DQoJc3ByaW50ZihidWZmZXIsICJUb3RhbCBUaW1lIHRvIGN2SGFhckRldGVjdE9iamVjdHMgaW4gZmluZFNpbmdsZUZhY2U6ICVmIiwgKGRvdWJsZSloYWFyX2RldGVjdF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KCUxPR1YoYnVmZmVyKTsNCgkNCglqb2JqZWN0IGZhY2VSZWN0ID0gMDsNCglpZiAobV9mYWNlc0ZvdW5kID09IDAgfHwgbV9mYWNlc0ZvdW5kLT50b3RhbCA8PSAwKSB7DQoJCUxPR1YoIkZBQ0VTX0RFVEVDVEVEIDAiKTsNCgkJbV9mYWNlQ3JvcEFyZWEud2lkdGggPSBtX2ZhY2VDcm9wQXJlYS5oZWlnaHQgPSAwOw0KCQltX3NtYWxsZXN0RmFjZVNpemUud2lkdGggPSBNSU5fU0laRV9XSURUSDsNCgkJbV9zbWFsbGVzdEZhY2VTaXplLmhlaWdodCA9IE1JTl9TSVpFX0hFSUdIVDsNCgl9IGVsc2Ugew0KCQlMT0dWKCJGQUNFU19ERVRFQ1RFRCAxIik7DQoJCUN2UmVjdCAqZmFjZSA9IChDdlJlY3QqKWN2R2V0U2VxRWxlbShtX2ZhY2VzRm91bmQsIDApOw0KCQlpZiAoZmFjZSA9PSAwKSB7DQoJCQlMT0dFKCJJbnZhbGlkIHJlY3RhbmdsZSBkZXRlY3RlZCIpOw0KCQkJcmV0dXJuIDA7DQoJCX0NCgkJbV9zbWFsbGVzdEZhY2VTaXplLndpZHRoID0gTUFYKGZhY2UtPndpZHRoIC0gUEFEX0ZBQ0VfU0laRSwgTUlOX1NJWkVfV0lEVEgpOw0KCQltX3NtYWxsZXN0RmFjZVNpemUuaGVpZ2h0ID0gTUFYKGZhY2UtPmhlaWdodCAtIFBBRF9GQUNFX1NJWkUsIE1JTl9TSVpFX0hFSUdIVCk7DQoJCWZhY2VSZWN0ID0gcmVjdFRvQW5kcm9pZFJlY3QoZW52LCBmYWNlKTsNCgkJc3RvcmVQcmV2aW91c0ZhY2UoZmFjZSk7DQoJfQ0KCQ0KCWNsb2NrX3QgdG90YWxfdGltZV9maW5pc2ggPSBjbG9jaygpIC0gdG90YWxfdGltZV9zdGFydDsNCglzcHJpbnRmKGJ1ZmZlciwgIlRvdGFsIFRpbWUgdG8gZmluZFNpbmdsZUZhY2U6ICVmIiwgKGRvdWJsZSl0b3RhbF90aW1lX2ZpbmlzaCAvIChkb3VibGUpQ0xPQ0tTX1BFUl9TRUMpOw0KCUxPR1YoYnVmZmVyKTsNCgkNCglyZXR1cm4gZmFjZVJlY3Q7DQp9DQoNCi8vIERyYXcgYSByZWN0YW5nbGUgb24gdGhlIHNvdXJjZSBpbWFnZSBhcm91bmQgdGhlIHNwZWNpZmllZCBmYWNlIHJlY3RhbmdsZS4NCi8vIFNjYWxlIHRoZSBmYWNlIGFyZWEgdG8gdGhlIGRyYXcgYXJlYSBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHNjYWxlLg0Kdm9pZCBoaWdobGlnaHRGYWNlKElwbEltYWdlICpzb3VyY2VJbWFnZSwgQ3ZSZWN0ICpmYWNlLCBkb3VibGUgc2NhbGUgPSAxLjApIHsNCgljaGFyIGJ1ZmZlclsxMDBdOw0KCXNwcmludGYoYnVmZmVyLCAiRmFjZSBSZWN0YW5nbGU6ICh4OiAlZCwgeTogJWQpIHRvICh3OiAlZCwgaDogJWQpIiwgDQoJCWZhY2UtPngsIGZhY2UtPnksIGZhY2UtPndpZHRoLCBmYWNlLT5oZWlnaHQpOw0KCUxPR1YoYnVmZmVyKTsNCglDdlBvaW50IHB0MSA9IGN2UG9pbnQoaW50KGZhY2UtPnggKiBzY2FsZSksIGludChmYWNlLT55ICogc2NhbGUpKTsNCglDdlBvaW50IHB0MiA9IGN2UG9pbnQoaW50KChmYWNlLT54ICsgZmFjZS0+d2lkdGgpICogc2NhbGUpLCANCgkJaW50KChmYWNlLT55ICsgZmFjZS0+aGVpZ2h0KSAqIHNjYWxlKSk7DQoJc3ByaW50ZihidWZmZXIsICJEcmF3IFJlY3RhbmdsZTogKCVkLCAlZCkgdG8gKCVkLCAlZCkiLCBwdDEueCwgcHQxLnksIHB0Mi54LCBwdDIueSk7DQoJTE9HVihidWZmZXIpOw0KICAgIGN2UmVjdGFuZ2xlKHNvdXJjZUltYWdlLCBwdDEsIHB0MiwgQ1ZfUkdCKDI1NSwgMCwgMCksIDMsIDgsIDApOw0KfQ0KDQovLyBEcmF3IHJlY3RhbmdsZXMgb24gdGhlIHNvdXJjZSBpbWFnZSBhcm91bmQgZWFjaCBmYWNlIHRoYXQgd2FzIGZvdW5kLg0KLy8gU2NhbGUgdGhlIGZhY2UgYXJlYSB0byB0aGUgZHJhdyBhcmVhIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgc2NhbGUuDQovLyBSZXR1cm4gdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZmFjZSB3YXMgaGlnaGxpZ2h0ZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4NCmJvb2wgaGlnaGxpZ2h0RmFjZXMoSXBsSW1hZ2UgKnNvdXJjZUltYWdlLCBDdlNlcSAqZmFjZXMsIGRvdWJsZSBzY2FsZSA9IDEuMCkgew0KCWlmIChmYWNlcyA9PSAwIHx8IGZhY2VzLT50b3RhbCA8PSAwKSB7DQoJCUxPR1YoIk5vIGZhY2VzIHdlcmUgaGlnaGxpZ2h0ZWQhIik7DQoJCXJldHVybiBmYWxzZTsNCgl9IGVsc2Ugew0KCQlMT0dWKCJEcmF3aW5nIHJlY3RhbmdsZXMgb24gZWFjaCBmYWNlIik7DQoJCWludCBjb3VudDsNCgkJQ3ZSZWN0KiBmYWNlOw0KCQlmb3IgKGludCBpID0gMDsgaSA8IGZhY2VzLT50b3RhbDsgaSsrKSB7DQoJCQlmYWNlID0gKEN2UmVjdCopY3ZHZXRTZXFFbGVtKGZhY2VzLCBpKTsNCgkJCWhpZ2hsaWdodEZhY2Uoc291cmNlSW1hZ2UsIGZhY2UsIHNjYWxlKTsNCgkJfQ0KCX0NCgkNCglyZXR1cm4gdHJ1ZTsNCn0NCg0KLy8gSGlnaGxpZ2h0IHRoZSBmYWNlcyB0aGF0IHdlcmUgZGV0ZWN0ZWQgaW4gdGhlIHNvdXJjZSBpbWFnZS4NCi8vIFJldHVybiB0cnVlIGlmIG9uZSBvciBtb3JlIGZhY2VzIGlzIGhpZ2hsaWdodGVkIG9yIGZhbHNlIG90aGVyd2lzZS4NCkpOSUVYUE9SVA0KamJvb2xlYW4NCkpOSUNBTEwNCkphdmFfb3JnX3NpcHJvcF9vcGVuY3ZfT3BlbkNWX2hpZ2hsaWdodEZhY2VzKEpOSUVudiogZW52LA0KCQkJCQkJCQkJICAgIAkgam9iamVjdCB0aGl6KSB7DQoJaWYgKG1fZmFjZXNGb3VuZCA9PSAwIHx8IG1fZmFjZXNGb3VuZC0+dG90YWwgPD0gMCkgew0KCQlMT0dWKCJObyBmYWNlcyBmb3VuZCB0byBoaWdobGlnaHQhIik7DQoJCXJldHVybiBmYWxzZTsNCgl9IGVsc2Ugew0KCQloaWdobGlnaHRGYWNlcyhtX3NvdXJjZUltYWdlLCBtX2ZhY2VzRm91bmQsIElNQUdFX1NDQUxFKTsNCgl9DQoJDQoJcmV0dXJuIHRydWU7DQp9DQoNCiNpZiAwDQoNCkpOSUVYUE9SVA0KamJvb2xlYW5BcnJheQ0KSk5JQ0FMTA0KSmF2YV9vcmdfc2lwcm9wX29wZW5jdl9PcGVuQ1ZfZmFjZURldGVjdChKTklFbnYqIGVudiwNCgkJCQkJCQkJCQlqb2JqZWN0IHRoaXosDQoJCQkJCQkJCQkJamludEFycmF5IHBob3RvX2RhdGExLA0KCQkJCQkJCQkJCWppbnRBcnJheSBwaG90b19kYXRhMiwNCgkJCQkJCQkJCQlqaW50IHdpZHRoLA0KCQkJCQkJCQkJCWppbnQgaGVpZ2h0KSB7DQoJTE9HVigiTG9hZCBkZXNwLiIpOw0KDQoJaW50IGksIHgsIHk7DQoJaW50KiBwaXhlbHM7DQoJSXBsSW1hZ2UgKmZyYW1lSW1hZ2U7DQoJDQoJSXBsSW1hZ2UgKmJhY2tncm91bmRJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQoJSXBsSW1hZ2UgKmdyYXlJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQoJSXBsSW1hZ2UgKmRpZmZlcmVuY2VJbWFnZSA9IGN2Q3JlYXRlSW1hZ2UoIGN2U2l6ZSh3aWR0aCwgaGVpZ2h0KSwgSVBMX0RFUFRIXzhVLCAxICk7DQoJDQoJSXBsSW1hZ2UgKmhzdkltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDMgKTsNCglJcGxJbWFnZSAqaHVlSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdlNpemUod2lkdGgsIGhlaWdodCksIElQTF9ERVBUSF84VSwgMSApOw0KCUlwbEltYWdlICpzYXR1cmF0aW9uSW1hZ2UgPSBjdkNyZWF0ZUltYWdlKCBjdlNpemUod2lkdGgsIGhlaWdodCksIElQTF9ERVBUSF84VSwgMSApOw0KCUlwbEltYWdlICp2YWx1ZUltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCglJcGxJbWFnZSAqdGhyZXNob2xkSW1hZ2UxID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCglJcGxJbWFnZSAqdGhyZXNob2xkSW1hZ2UyID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCglJcGxJbWFnZSAqdGhyZXNob2xkSW1hZ2UzID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCglJcGxJbWFnZSAqZmFjZUltYWdlID0gY3ZDcmVhdGVJbWFnZSggY3ZTaXplKHdpZHRoLCBoZWlnaHQpLCBJUExfREVQVEhfOFUsIDEgKTsNCgkNCglDdk1vbWVudHMgbW9tZW50Ow0KCWRvdWJsZSBtXzAwOw0KCWRvdWJsZSBtXzEwOw0KCWRvdWJsZSBtXzAxOw0KCWludCBncmF2aXR5WDsNCglpbnQgZ3Jhdml0eVk7DQoNCglqYm9vbGVhbkFycmF5IHJlc19hcnJheTsNCglpbnQgaW1hZ2VTaXplOw0KDQoNCg0KCS8vIExvYWQgSW1hZ2UNCglwaXhlbHMgPSBlbnYtPkdldEludEFycmF5RWxlbWVudHMocGhvdG9fZGF0YTEsIDApOw0KCWZyYW1lSW1hZ2UgPSBsb2FkUGl4ZWxzKHBpeGVscywgd2lkdGgsIGhlaWdodCk7DQoJaWYoZnJhbWVJbWFnZSA9PSAwKSB7DQoJCUxPR1YoIkVycm9yIGxvYWRQaXhlbHMuIik7DQoJCXJldHVybiAwOw0KCX0NCgkNCgkNCgljdkN2dENvbG9yKCBmcmFtZUltYWdlLCBiYWNrZ3JvdW5kSW1hZ2UsIENWX0JHUjJHUkFZICk7DQoJDQoJDQoJcGl4ZWxzID0gZW52LT5HZXRJbnRBcnJheUVsZW1lbnRzKHBob3RvX2RhdGEyLCAwKTsNCglmcmFtZUltYWdlID0gbG9hZFBpeGVscyhwaXhlbHMsIHdpZHRoLCBoZWlnaHQpOw0KCWlmKGZyYW1lSW1hZ2UgPT0gMCkgew0KCQlMT0dWKCJFcnJvciBsb2FkUGl4ZWxzLiIpOw0KCQlyZXR1cm4gMDsNCgl9DQoJY3ZDdnRDb2xvciggZnJhbWVJbWFnZSwgZ3JheUltYWdlLCBDVl9CR1IyR1JBWSApOw0KCWN2QWJzRGlmZiggZ3JheUltYWdlLCBiYWNrZ3JvdW5kSW1hZ2UsIGRpZmZlcmVuY2VJbWFnZSApOw0KCQ0KCWN2Q3Z0Q29sb3IoIGZyYW1lSW1hZ2UsIGhzdkltYWdlLCBDVl9CR1IySFNWICk7DQoJTE9HVigiTG9hZCBjdkN2dENvbG9yLiIpOw0KCWN2U3BsaXQoIGhzdkltYWdlLCBodWVJbWFnZSwgc2F0dXJhdGlvbkltYWdlLCB2YWx1ZUltYWdlLCAwICk7DQoJTE9HVigiTG9hZCBjdlNwbGl0LiIpOw0KCWN2VGhyZXNob2xkKCBodWVJbWFnZSwgdGhyZXNob2xkSW1hZ2UxLCBUSFJFU0hfQk9UVE9NLCBUSFJFU0hPTERfTUFYX1ZBTFVFLCBDVl9USFJFU0hfQklOQVJZICk7DQoJY3ZUaHJlc2hvbGQoIGh1ZUltYWdlLCB0aHJlc2hvbGRJbWFnZTIsIFRIUkVTSF9UT1AsIFRIUkVTSE9MRF9NQVhfVkFMVUUsIENWX1RIUkVTSF9CSU5BUllfSU5WICk7DQoJY3ZBbmQoIHRocmVzaG9sZEltYWdlMSwgdGhyZXNob2xkSW1hZ2UyLCB0aHJlc2hvbGRJbWFnZTMsIDAgKTsNCglMT0dWKCJMb2FkIGN2QW5kLiIpOw0KCQ0KCWN2QW5kKCBkaWZmZXJlbmNlSW1hZ2UsIHRocmVzaG9sZEltYWdlMywgZmFjZUltYWdlLCAwICk7DQoJDQoJY3ZNb21lbnRzKCBmYWNlSW1hZ2UsICZtb21lbnQsIDAgKTsNCgltXzAwID0gY3ZHZXRTcGF0aWFsTW9tZW50KCAmbW9tZW50LCAwLCAwICk7DQoJbV8xMCA9IGN2R2V0U3BhdGlhbE1vbWVudCggJm1vbWVudCwgMSwgMCApOw0KCW1fMDEgPSBjdkdldFNwYXRpYWxNb21lbnQoICZtb21lbnQsIDAsIDEgKTsNCglncmF2aXR5WCA9IG1fMTAgLyBtXzAwOw0KCWdyYXZpdHlZID0gbV8wMSAvIG1fMDA7DQoJTE9HVigiTG9hZCBjdk1vbWVudHMuIik7DQoNCg0KCWN2Q2lyY2xlKCBmcmFtZUltYWdlLCBjdlBvaW50KCBncmF2aXR5WCwgZ3Jhdml0eVkgKSwgQ0lSQ0xFX1JBRElVUywNCgkJIENWX1JHQiggMjU1LCAwLCAwICksIExJTkVfVEhJQ0tORVNTLCBMSU5FX1RZUEUsIDAgKTsNCg0KDQoNCg0KCUN2TWF0IHN0dWIsICptYXRfaW1hZ2U7DQogICAgaW50IGNoYW5uZWxzLCBpcGxfZGVwdGg7DQogICAgbWF0X2ltYWdlID0gY3ZHZXRNYXQoIGZyYW1lSW1hZ2UsICZzdHViICk7DQogICAgY2hhbm5lbHMgPSBDVl9NQVRfQ04oIG1hdF9pbWFnZS0+dHlwZSApOw0KDQogICAgaXBsX2RlcHRoID0gY3ZDdlRvSXBsRGVwdGgobWF0X2ltYWdlLT50eXBlKTsNCg0KCVdMTm9uRmlsZUJ5dGVTdHJlYW0qIG1fc3RybSA9IG5ldyBXTE5vbkZpbGVCeXRlU3RyZWFtKCk7DQogICAgbG9hZEltYWdlQnl0ZXMobWF0X2ltYWdlLT5kYXRhLnB0ciwgbWF0X2ltYWdlLT5zdGVwLCBtYXRfaW1hZ2UtPndpZHRoLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRfaW1hZ2UtPmhlaWdodCwgaXBsX2RlcHRoLCBjaGFubmVscywgbV9zdHJtKTsNCglMT0dWKCJMb2FkIGxvYWRJbWFnZUJ5dGVzLiIpOw0KDQoNCglpbWFnZVNpemUgPSBtX3N0cm0tPkdldFNpemUoKTsNCglyZXNfYXJyYXkgPSBlbnYtPk5ld0Jvb2xlYW5BcnJheShpbWFnZVNpemUpOw0KCUxPR1YoIkxvYWQgTmV3Qnl0ZUFycmF5LiIpOw0KICAgIGlmIChyZXNfYXJyYXkgPT0gMCkgew0KICAgICAgICByZXR1cm4gMDsNCiAgICB9DQogICAgZW52LT5TZXRCb29sZWFuQXJyYXlSZWdpb24ocmVzX2FycmF5LCAwLCBpbWFnZVNpemUsIChqYm9vbGVhbiopbV9zdHJtLT5HZXRCeXRlKCkpOw0KCUxPR1YoIkxvYWQgU2V0Qm9vbGVhbkFycmF5UmVnaW9uLiIpOw0KDQoNCg0KDQoJY3ZSZWxlYXNlSW1hZ2UoICZiYWNrZ3JvdW5kSW1hZ2UgKTsNCgljdlJlbGVhc2VJbWFnZSggJmdyYXlJbWFnZSApOw0KCWN2UmVsZWFzZUltYWdlKCAmZGlmZmVyZW5jZUltYWdlICk7DQoJY3ZSZWxlYXNlSW1hZ2UoICZoc3ZJbWFnZSApOw0KCWN2UmVsZWFzZUltYWdlKCAmaHVlSW1hZ2UgKTsNCgljdlJlbGVhc2VJbWFnZSggJnNhdHVyYXRpb25JbWFnZSApOw0KCWN2UmVsZWFzZUltYWdlKCAmdmFsdWVJbWFnZSApOw0KCWN2UmVsZWFzZUltYWdlKCAmdGhyZXNob2xkSW1hZ2UxICk7DQoJY3ZSZWxlYXNlSW1hZ2UoICZ0aHJlc2hvbGRJbWFnZTIgKTsNCgljdlJlbGVhc2VJbWFnZSggJnRocmVzaG9sZEltYWdlMyApOw0KCWN2UmVsZWFzZUltYWdlKCAmZmFjZUltYWdlICk7DQoJY3ZSZWxlYXNlSW1hZ2UoICZmcmFtZUltYWdlICk7DQoJbV9zdHJtLT5DbG9zZSgpOw0KCVNBRkVfREVMRVRFKG1fc3RybSk7DQoNCglyZXR1cm4gcmVzX2FycmF5Ow0KDQp9DQojZW5kaWYNCg0K