LyoKICogc3lzdGVtLmMKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIFN5c3RlbSBkZXBlbmRlbnQgcm91dGluZXMgZ28gaGVyZQogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgojaW5jbHVkZSA8ZXJybm8uaD4KCiNpZiBIQVZFX0lPX0gKI2luY2x1ZGUgPGlvLmg+CiNlbmRpZgojaWYgSEFWRV9ESVJFQ1RfSAojaW5jbHVkZSA8ZGlyZWN0Lmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgoKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9ORVREQl9ICiNpbmNsdWRlIDxuZXRkYi5oPgojZW5kaWYKCgojaWYgSEFWRV9TWVNfU09DS0lPX0gKI2luY2x1ZGUgPHN5cy9zb2NraW8uaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfTkxJU1RfSAojaW5jbHVkZSA8bmxpc3QuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKCiNpZiBIQVZFX0tTVEFUX0gKI2luY2x1ZGUgPGtzdGF0Lmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1BBUkFNX0gKI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX0RNQUxMT0NfSAojaW5jbHVkZSA8ZG1hbGxvYy5oPgojZW5kaWYKCiNpZmRlZiBIQVZFX1NZU19TVEFUX0gKI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNlbmRpZgojaWYgSEFWRV9GQ05UTF9ICiNpbmNsdWRlIDxmY250bC5oPgojZW5kaWYKCiNpZiBkZWZpbmVkKGhwdXgxMCkgfHwgZGVmaW5lZChocHV4MTEpCiNpbmNsdWRlIDxzeXMvcHN0YXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfVVRTTkFNRV9ICiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1DRkdfSAojaW5jbHVkZSA8c3lzL3N5c3RlbWNmZy5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19TWVNURU1JTkZPX0gKI2luY2x1ZGUgPHN5cy9zeXN0ZW1pbmZvLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoZGFyd2luOSkKI2luY2x1ZGUgPGNydF9leHRlcm5zLmg+ICAgICAgICAvKiBmb3IgX05TR2V0QXJndigpICovCiNlbmRpZgoKI2lmIEhBVkVfUFdEX0gKI2luY2x1ZGUgPHB3ZC5oPgojZW5kaWYKI2lmIEhBVkVfR1JQX0gKI2luY2x1ZGUgPGdycC5oPgojZW5kaWYKCiNpZiBIQVZFX0xJTUlUU19ICiNpbmNsdWRlIDxsaW1pdHMuaD4KI2VuZGlmCgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiNpZiAxIC8qSEFWRV9BUlBBX05BTUVTRVJfSCovCiNpbmNsdWRlIDxhcnBhL25hbWVzZXIuaD4KI2VuZGlmCiNpbmNsdWRlIDx2YWxpZGF0b3IvdmFsaWRhdG9yLmg+Ci8qIE5ldFNOTVAgYW5kIEROU1NFQy1Ub29scyBib3RoIGRlZmluZSBGUkVFLiBXZSdsbCBub3QgdXNlIGVpdGhlciBoZXJlLiAqLwojdW5kZWYgRlJFRQojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3N5c3RlbS5oPiAgICAvKiBmb3IgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcmVhZF9jb25maWcuaD4gLyogZm9yIGdldF90ZW1wX2ZpbGVfcGF0dGVybigpICovCgojaW5jbHVkZSAiaW5ldF9udG9wLmgiCgovKiBOZXRTTk1QIGFuZCBETlNTRUMtVG9vbHMgYm90aCBkZWZpbmUgRlJFRS4gV2UnbGwgbm90IHVzZSBlaXRoZXIgaGVyZS4gKi8KI3VuZGVmIEZSRUUKCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzeXN0ZW1fYWxsLCBsaWJuZXRzbm1wKQoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHVzZXJfaW5mb3JtYXRpb24sIHN5c3RlbV9hbGwpCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihjYWxjdWxhdGVfc2VjdGltZV9kaWZmLCBzeXN0ZW1fYWxsKQoKI2lmbmRlZiBJRkZfTE9PUEJBQ0sKIwlkZWZpbmUgSUZGX0xPT1BCQUNLIDAKI2VuZGlmCgojaWZkZWYgIElOQUREUl9MT09QQkFDSwojIGRlZmluZSBMT09QQkFDSyAgICBJTkFERFJfTE9PUEJBQ0sKI2Vsc2UKIyBkZWZpbmUgTE9PUEJBQ0sgICAgMHg3ZjAwMDAwMQojZW5kaWYKCiNpZm5kZWYgRUFJX0ZBSUwKIyBkZWZpbmUgRUFJX0ZBSUwgICAgLTQgICAgLyogTm9uLXJlY292ZXJhYmxlIGZhaWx1cmUgaW4gbmFtZSByZXMuICAqLwojZW5kaWYKCiNpZiBkZWZpbmVkKEhBVkVfRk9SSykKc3RhdGljIHZvaWQKX2RhZW1vbl9wcmVwKGludCBzdGRlcnJfbG9nKQp7CiAgICAvKiBBdm9pZCBrZWVwaW5nIGFueSBkaXJlY3RvcnkgaW4gdXNlLiAqLwogICAgY2hkaXIoIi8iKTsKCiAgICBpZiAoc3RkZXJyX2xvZykKICAgICAgICByZXR1cm47CgogICAgLyoKICAgICAqIENsb3NlIGluaGVyaXRlZCBmaWxlIGRlc2NyaXB0b3JzIHRvIGF2b2lkCiAgICAgKiBrZWVwaW5nIHVubmVjZXNzYXJ5IHJlZmVyZW5jZXMuCiAgICAgKi8KICAgIGNsb3NlKDApOwogICAgY2xvc2UoMSk7CiAgICBjbG9zZSgyKTsKCiAgICAvKgogICAgICogUmVkaXJlY3Qgc3Rke2luLG91dCxlcnJ9IHRvIC9kZXYvbnVsbCwganVzdCBpbiBjYXNlLgogICAgICovCiAgICBvcGVuKCIvZGV2L251bGwiLCBPX1JEV1IpOwogICAgZHVwKDApOwogICAgZHVwKDApOwp9CiNlbmRpZgoKLyoqCiAqIGZvcmsgY3VycmVudCBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQuCiAqCiAqIFRoaXMgZnVuY3Rpb24gZm9ya3MgYSBwcm9jZXNzIGludG8gdGhlIGJhY2tncm91bmQsIGluIG9yZGVyIHRvCiAqIGJlY29tZSBhIGRhZW1vbiBwcm9jZXNzLiBJdCBkb2VzIGEgZmV3IHRoaW5ncyBhbG9uZyB0aGUgd2F5OgogKgogKiAtIGJlY29taW5nIGEgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciwgYW5kICBmb3JraW5nIGEgc2Vjb25kIHRpbWUgc28KICogICB0aGF0IHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgY2FuIGV4aXQuCiAqCiAqIC0gY2hhbmdpbmcgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIC8KICoKICogLSBjbG9zaW5nIHN0ZGluLCBzdGRvdXQgYW5kIHN0ZGVyciAodW5sZXNzIHN0ZGVycl9sb2cgaXMgc2V0KSBhbmQKICogICByZWRpcmVjdGluZyB0aGVtIHRvIC9kZXYvbnVsbAogKgogKiBAcGFyYW0gcXVpdF9pbW1lZGlhdGVseSA6IGluZGljYXRlcyBpZiB0aGUgcGFyZW50IHByb2Nlc3Mgc2hvdWxkCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCBhZnRlciBhIHN1Y2Nlc3NmdWwgZm9yay4KICogQHBhcmFtIHN0ZGVycl9sb2cgICAgICAgOiBpbmRpY2F0ZXMgaWYgc3RkZXJyIGlzIGJlaW5nIHVzZWQgZm9yCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBhbmQgc2hvdWxkbid0IGJlIGNsb3NlZAogKiBAcmV0dXJucyAtMSA6IGZvcmsgZXJyb3IKICogICAgICAgICAgIDAgOiBjaGlsZCBwcm9jZXNzIHJldHVybmluZwogKiAgICAgICAgICA+MCA6IHBhcmVudCBwcm9jZXNzIHJldHVybmluZy4gcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGNoaWxkIFBJRC4KICovCmludApuZXRzbm1wX2RhZW1vbml6ZShpbnQgcXVpdF9pbW1lZGlhdGVseSwgaW50IHN0ZGVycl9sb2cpCnsKICAgIGludCBpID0gMDsKICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImRlYW1vbml6aW5nLi4uXG4iKSk7CiNpZiBIQVZFX0ZPUksKI2lmIGRlZmluZWQoZGFyd2luOSkKICAgICBjaGFyICAgICAgICAgICAgcGF0aCBbUEFUSF9NQVhdID0gIiI7CiAgICAgdWludDMyX3QgICAgICAgIHNpemUgPSBzaXplb2YgKHBhdGgpOwoKICAgICAvKgogICAgICAqIGlmIHdlIGFyZSBhbHJlYWR5IGxhdW5jaGVkIGluIGEgImRhZW1vbml6ZWQgc3RhdGUiLCBqdXN0CiAgICAgICogY2xvc2UgJiByZWRpcmVjdCB0aGUgZmlsZSBkZXNjcmlwdG9ycwogICAgICAqLwogICAgIGlmKGdldHBwaWQoKSA8PSAyKSB7CiAgICAgICAgIF9kYWVtb25fcHJlcChzdGRlcnJfbG9nKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQoKICAgICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGggKHBhdGgsICZzaXplKSkKICAgICAgICAgcmV0dXJuIC0xOwojZW5kaWYKICAgIC8qCiAgICAgKiBGb3JrIHRvIHJldHVybiBjb250cm9sIHRvIHRoZSBpbnZva2luZyBwcm9jZXNzIGFuZCB0bwogICAgICogZ3VhcmFudGVlIHRoYXQgd2UgYXJlbid0IGEgcHJvY2VzcyBncm91cCBsZWFkZXIuCiAgICAgKi8KICAgIGkgPSBmb3JrKCk7CiAgICBpZiAoaSAhPSAwKSB7CiAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImZpcnN0IGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgaWYoaSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCJmaXJzdCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgIm5ldHNubXBfZGFlbW9uaXplKClcbiIsIGVycm5vKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpZiAocXVpdF9pbW1lZGlhdGVseSkgewogICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJwYXJlbnQgZXhpdGluZ1xuIikpOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ2hpbGQuICovCiNpZmRlZiBIQVZFX1NFVFNJRAogICAgICAgIC8qIEJlY29tZSBhIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIuICovCiAgICAgICAgc2V0c2lkKCk7CiNlbmRpZgogICAgICAgIC8qCiAgICAgICAgICogRm9yayB0byBsZXQgdGhlIHByb2Nlc3Mvc2Vzc2lvbiBncm91cCBsZWFkZXIgZXhpdC4KICAgICAgICAgKi8KICAgICAgICBpZiAoKGkgPSBmb3JrKCkpICE9IDApIHsKICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwic2Vjb25kIGZvcmsgcmV0dXJuZWQgJWQuXG4iLCBpKSk7CiAgICAgICAgICAgIGlmKGkgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsInNlY29uZCBmb3JrIGZhaWxlZCAoZXJybm8gJWQpIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICJuZXRzbm1wX2RhZW1vbml6ZSgpXG4iLCBlcnJubyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogUGFyZW50LiAqLwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KI2lmbmRlZiBXSU4zMgogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiBDaGlsZC4gKi8KICAgICAgICAgICAgCiAgICAgICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsImNoaWxkIGNvbnRpbnVpbmdcbiIpKTsKCiNpZiAhIGRlZmluZWQoZGFyd2luOSkKICAgICAgICAgICAgX2RhZW1vbl9wcmVwKHN0ZGVycl9sb2cpOwojZWxzZQogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFNvbWUgZGFyd2luIGNhbGxzICh1c2luZyBtYWNoIHBvcnRzKSBkb24ndCB3b3JrIGFmdGVyCiAgICAgICAgICAgICAgKiBhIGZvcmsuIFNvLCBub3cgdGhhdCB3ZSd2ZSBmb3JrZWQsIHdlIHJlLWV4ZWMgb3Vyc2VsZgogICAgICAgICAgICAgICogdG8gZW5zdXJlIHRoYXQgdGhlIGNoaWxkJ3MgbWFjaCBwb3J0cyBhcmUgYWxsIHNldCB1cCBjb3JyZWN0bHksCiAgICAgICAgICAgICAgKiB0aGUgZ2V0cHBpZCBjYWxsIGFib3ZlIHdpbGwgcHJldmVudCB0aGUgZXhlYyBjaGlsZCBmcm9tCiAgICAgICAgICAgICAgKiBmb3JraW5nLi4uCiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGNoYXIgKiBjb25zdCAqYXJndiA9ICpfTlNHZXRBcmd2ICgpOwogICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwicmUtZXhlY2luZyBmb3JrZWQgY2hpbGRcbiIpKTsKICAgICAgICAgICAgIGV4ZWN2IChwYXRoLCBhcmd2KTsKICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsIkZvcmtlZCBjaGlsZCB1bmFibGUgdG8gcmUtZXhlYyAtICVzLlxuIiwgc3RyZXJyb3IgKGVycm5vKSk7CiAgICAgICAgICAgICBleGl0ICgwKTsKI2VuZGlmCiAgICAgICAgfQojZW5kaWYgLyogIVdJTjMyICovCiAgICB9CiNlbmRpZiAvKiBIQVZFX0ZPUksgKi8KICAgIHJldHVybiBpOwp9CgovKgogKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCiAqLwojaWZkZWYJCQkJCQkJV0lOMzIKaW5fYWRkcl90CmdldF9teWFkZHIodm9pZCkKewogICAgY2hhciAgICAgICAgICAgIGxvY2FsX2hvc3RbMTMwXTsKICAgIGludCAgICAgICAgICAgICByZXN1bHQ7CiAgICBMUEhPU1RFTlQgICAgICAgbHBzdEhvc3RlbnQ7CiAgICBTT0NLQUREUl9JTiAgICAgaW5fYWRkciwgcmVtb3RlX2luX2FkZHI7CiAgICBTT0NLRVQgICAgICAgICAgaFNvY2s7CiAgICBpbnQgICAgICAgICAgICAgbkFkZHJTaXplID0gc2l6ZW9mKFNPQ0tBRERSKTsKCiAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CgogICAgcmVzdWx0ID0gZ2V0aG9zdG5hbWUobG9jYWxfaG9zdCwgc2l6ZW9mKGxvY2FsX2hvc3QpKTsKICAgIGlmIChyZXN1bHQgPT0gMCkgewogICAgICAgIGxwc3RIb3N0ZW50ID0gZ2V0aG9zdGJ5bmFtZSgoTFBTVFIpIGxvY2FsX2hvc3QpOwogICAgICAgIGlmIChscHN0SG9zdGVudCkgewogICAgICAgICAgICBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9CiAgICAgICAgICAgICAgICAqKCh1X2xvbmcgRkFSICopIChscHN0SG9zdGVudC0+aF9hZGRyKSk7CiAgICAgICAgICAgIHJldHVybiAoKGluX2FkZHJfdCkgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKgogICAgICogaWYgd2UgYXJlIGhlcmUsIHRoYW4gd2UgZG9uJ3QgaGF2ZSBob3N0IGFkZHIgCiAgICAgKi8KICAgIGhTb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOwogICAgaWYgKGhTb2NrICE9IElOVkFMSURfU09DS0VUKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb25uZWN0IHRvIGFueSBwb3J0IGFuZCBhZGRyZXNzIAogICAgICAgICAqLwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9wb3J0ID0gaHRvbnMoSVBQT1JUX0VDSE8pOwogICAgICAgIHJlbW90ZV9pbl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcigiMC4wLjAuMCIpOwogICAgICAgIHJlc3VsdCA9CiAgICAgICAgICAgIGNvbm5lY3QoaFNvY2ssIChMUFNPQ0tBRERSKSAmIHJlbW90ZV9pbl9hZGRyLAogICAgICAgICAgICAgICAgICAgIHNpemVvZihTT0NLQUREUikpOwogICAgICAgIGlmIChyZXN1bHQgIT0gU09DS0VUX0VSUk9SKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGdldCBsb2NhbCBpcCBhZGRyZXNzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0c29ja25hbWUoaFNvY2ssIChMUFNPQ0tBRERSKSAmIGluX2FkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgIChpbnQgRkFSICopICZuQWRkclNpemUpOwogICAgICAgIH0KICAgICAgICBjbG9zZXNvY2tldChoU29jayk7CiAgICB9CiAgICByZXR1cm4gKChpbl9hZGRyX3QpIGluX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKfQoKbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKICAgIGxvbmcgICAgICAgICAgICByZXR1cm5fdmFsdWUgPSAwOwogICAgRFdPUkQgICAgICAgICAgIGJ1ZmZlcnNpemUgPSAoc2l6ZW9mKFBFUkZfREFUQV9CTE9DSykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFBFUkZfT0JKRUNUX1RZUEUpKSwKICAgICAgICB0eXBlID0gUkVHX0VYUEFORF9TWjsKICAgIFBQRVJGX0RBVEFfQkxPQ0sgcGVyZmRhdGEgPSBOVUxMOwoKICAgIC8qCiAgICAgKiBtaW4gcmVxdWlyZW1lbnQgaXMgb25lIFBFUkZfREFUQV9CTE9DSyBwbHVzIG9uZSBQRVJGX09CSkVDVF9UWVBFIAogICAgICovCiAgICBwZXJmZGF0YSA9IChQUEVSRl9EQVRBX0JMT0NLKSBtYWxsb2MoYnVmZmVyc2l6ZSk7CiAgICBpZiAoIXBlcmZkYXRhKQogICAgICAgIHJldHVybiAwOwoKICAgIG1lbXNldChwZXJmZGF0YSwgMCwgYnVmZmVyc2l6ZSk7CgogICAgUmVnUXVlcnlWYWx1ZUV4KEhLRVlfUEVSRk9STUFOQ0VfREFUQSwKICAgICAgICAgICAgICAgICAgICAiR2xvYmFsIiwgTlVMTCwgJnR5cGUsIChMUEJZVEUpIHBlcmZkYXRhLCAmYnVmZmVyc2l6ZSk7CgogICAgLyoKICAgICAqIHdlIGNhbiBub3QgcmVseSBvbiB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIHRoZXJlIGlzIGFsd2F5cyBtb3JlIHNvCiAgICAgKiB3ZSBjaGVjayB0aGUgc2lnbmF0dXJlIAogICAgICovCgogICAgaWYgKHdjc25jbXAocGVyZmRhdGEtPlNpZ25hdHVyZSwgTCJQRVJGIiwgNCkgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogc2lnbmF0dXJlIG9rLCBhbmQgYWxsIHdlIG5lZWQgaXMgaW4gdGhlIGluIHRoZSBQRVJGX0RBVEFfQkxPQ0sgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuX3ZhbHVlID0gKGxvbmcpICgocGVyZmRhdGEtPlBlcmZUaW1lMTAwblNlYy5RdWFkUGFydCAvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExPTkdMT05HKSAxMDAwMDApKTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybl92YWx1ZSA9IEdldFRpY2tDb3VudCgpIC8gMTA7CgogICAgUmVnQ2xvc2VLZXkoSEtFWV9QRVJGT1JNQU5DRV9EQVRBKTsKICAgIGZyZWUocGVyZmRhdGEpOwoKICAgIHJldHVybiByZXR1cm5fdmFsdWU7Cn0KCmNoYXIgICAgICAgICAgICoKd2luc29ja19zdGFydHVwKHZvaWQpCnsKICAgIFdPUkQgICAgICAgICAgICBWZXJzaW9uUmVxdWVzdGVkOwogICAgV1NBREFUQSAgICAgICAgIHN0V1NBRGF0YTsKICAgIGludCAgICAgICAgICAgICBpOwogICAgc3RhdGljIGNoYXIgICAgIGVycm1zZ1sxMDBdOwoKCS8qIHdpbnNvY2sgMTogdXNlIE1BS0VXT1JEKDEsMSkgKi8KCS8qIHdpbnNvY2sgMjogdXNlIE1BS0VXT1JEKDIsMikgKi8KCiAgICBWZXJzaW9uUmVxdWVzdGVkID0gTUFLRVdPUkQoMiwyKTsKICAgIGkgPSBXU0FTdGFydHVwKFZlcnNpb25SZXF1ZXN0ZWQsICZzdFdTQURhdGEpOwogICAgaWYgKGkgIT0gMCkgewogICAgICAgIGlmIChpID09IFdTQVZFUk5PVFNVUFBPUlRFRCkKICAgICAgICAgICAgc3ByaW50ZihlcnJtc2csCiAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBpbml0LiBzb2NrZXQgbGliLCBkb2VzIG5vdCBzdXBwb3J0IDEuMSIpOwogICAgICAgIGVsc2UgewogICAgICAgICAgICBzcHJpbnRmKGVycm1zZywgIlNvY2tldCBTdGFydHVwIGVycm9yICVkIiwgaSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoZXJybXNnKTsKICAgIH0KICAgIHJldHVybiAoTlVMTCk7Cn0KCnZvaWQKd2luc29ja19jbGVhbnVwKHZvaWQpCnsKICAgIFdTQUNsZWFudXAoKTsKfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhIFdJTjMyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogWFhYICBXaGF0IGlmIHdlIGhhdmUgbXVsdGlwbGUgYWRkcmVzc2VzPyAgT3Igbm8gYWRkcmVzc2VzIGZvciB0aGF0IG1hdHRlcj8KICogWFhYICBDb3VsZCBpdCBiZSBjb21wdXRlZCBvbmNlIHRoZW4gY2FjaGVkPyAgUHJvYmFibHkgbm90IHdvcnRoIGl0IChub3QKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdmVyeSBvZnRlbikuCiAqLwppbl9hZGRyX3QKZ2V0X215YWRkcih2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgc2QsIGksIGxhc3RsZW4gPSAwOwogICAgc3RydWN0IGlmY29uZiAgIGlmYzsKICAgIHN0cnVjdCBpZnJlcSAgICppZnJwID0gTlVMTDsKICAgIGluX2FkZHJfdCAgICAgICBhZGRyOwogICAgY2hhciAgICAgICAgICAgKmJ1ZiA9IE5VTEw7CgogICAgaWYgKChzZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyoKICAgICAqIENvcGUgd2l0aCBsb3RzIG9mIGludGVyZmFjZXMgYW5kIGJyb2tlbm5lc3Mgb2YgaW9jdGwgU0lPQ0dJRkNPTkYgb24KICAgICAqIHNvbWUgcGxhdGZvcm1zOyBzZWUgVy4gUi4gU3RldmVucywgYGBVbml4IE5ldHdvcmsgUHJvZ3JhbW1pbmcgVm9sdW1lCiAgICAgKiBJJycsIHAuNDM1LiAgCiAgICAgKi8KCiAgICBmb3IgKGkgPSA4OzsgaSArPSA4KSB7CiAgICAgICAgYnVmID0gKGNoYXIgKikgY2FsbG9jKGksIHNpemVvZihzdHJ1Y3QgaWZyZXEpKTsKICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgaWZjLmlmY19sZW4gPSBpICogc2l6ZW9mKHN0cnVjdCBpZnJlcSk7CiAgICAgICAgaWZjLmlmY19idWYgPSAoY2FkZHJfdCkgYnVmOwoKICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZDT05GLCAoY2hhciAqKSAmaWZjKSA8IDApIHsKICAgICAgICAgICAgaWYgKGVycm5vICE9IEVJTlZBTCB8fCBsYXN0bGVuICE9IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBTb21ldGhpbmcgaGFzIGdvbmUgZ2VudWluZWx5IHdyb25nLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE90aGVyd2lzZSwgaXQgY291bGQganVzdCBiZSB0aGF0IHRoZSBidWZmZXIgaXMgdG9vIHNtYWxsLiAgCiAgICAgICAgICAgICAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChpZmMuaWZjX2xlbiA9PSBsYXN0bGVuKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogVGhlIGxlbmd0aCBpcyB0aGUgc2FtZSBhcyB0aGUgbGFzdCB0aW1lOyB3ZSdyZSBkb25lLiAgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RsZW4gPSBpZmMuaWZjX2xlbjsKICAgICAgICB9CiAgICAgICAgZnJlZShidWYpOwogICAgfQoKICAgIGZvciAoaWZycCA9IGlmYy5pZmNfcmVxOwogICAgICAgIChjaGFyICopaWZycCA8IChjaGFyICopaWZjLmlmY19yZXEgKyBpZmMuaWZjX2xlbjsKI2lmZGVmIEhBVkVfU1RSVUNUX1NPQ0tBRERSX1NBX0xFTgogICAgICAgIGlmcnAgPSAoc3RydWN0IGlmcmVxICopKCgoY2hhciAqKSBpZnJwKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGlmcnAtPmlmcl9uYW1lKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZycC0+aWZyX2FkZHIuc2FfbGVuKQojZWxzZQogICAgICAgIGlmcnArKwojZW5kaWYKICAgICAgICApIHsKICAgICAgICBpZiAoaWZycC0+aWZyX2FkZHIuc2FfZmFtaWx5ICE9IEFGX0lORVQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGFkZHIgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGlmcnAtPmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkcjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopIGlmcnApIDwgMCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKChpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfVVApCiNpZmRlZiBJRkZfUlVOTklORwogICAgICAgICAgICAmJiAoaWZycC0+aWZyX2ZsYWdzICYgSUZGX1JVTk5JTkcpCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSUZGX1JVTk5JTkcgKi8KICAgICAgICAgICAgJiYgIShpZnJwLT5pZnJfZmxhZ3MgJiBJRkZfTE9PUEJBQ0spCiAgICAgICAgICAgICYmIGFkZHIgIT0gTE9PUEJBQ0spIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogSSAqcmVhbGx5KiBkb24ndCB1bmRlcnN0YW5kIHdoeSB0aGlzIGlzIG5lY2Vzc2FyeS4gIFBlcmhhcHMgZm9yCiAgICAgICAgICAgICAqIHNvbWUgYnJva2VuIHBsYXRmb3JtPyAgTGVhdmUgaXQgZm9yIG5vdy4gIEpCUE4gIAogICAgICAgICAgICAgKi8KI2lmZGVmIFNZU19JT0NUTF9IX0hBU19TSU9DR0lGQUREUgogICAgICAgICAgICBpZiAoaW9jdGwoc2QsIFNJT0NHSUZBRERSLCAoY2hhciAqKSBpZnJwKSA8IDApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFkZHIgPQogICAgICAgICAgICAgICAgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZnJwLT5pZnJfYWRkcikpLT5zaW5fYWRkci4KICAgICAgICAgICAgICAgIHNfYWRkcjsKI2VuZGlmCiAgICAgICAgICAgIGZyZWUoYnVmKTsKICAgICAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgICAgICByZXR1cm4gYWRkcjsKICAgICAgICB9CiAgICB9CiAgICBmcmVlKGJ1Zik7CiAgICBjbG9zZShzZCk7CiAgICByZXR1cm4gMDsKfQoKCiNpZiAhZGVmaW5lZChzb2xhcmlzMikgJiYgIWRlZmluZWQobGludXgpICYmICFkZWZpbmVkKGN5Z3dpbikKLyoKICogUmV0dXJucyBib290dGltZSBpbiBjZW50aXNlY29uZHMoISkuCiAqICAgICAgQ2FjaGVzIHRoaXMgZm9yIGZ1dHVyZSB1c2UuCiAqLwpsb25nCmdldF9ib290dGltZSh2b2lkKQp7CiAgICBzdGF0aWMgbG9uZyAgICAgYm9vdHRpbWVfY3NlY3MgPSAwOwojaWYgZGVmaW5lZChocHV4MTApIHx8IGRlZmluZWQoaHB1eDExKQogICAgc3RydWN0IHBzdF9zdGF0aWMgcHN0X2J1ZjsKI2Vsc2UKICAgIHN0cnVjdCB0aW1ldmFsICBib290dGltZTsKI2lmZGVmCU5FVFNOTVBfQ0FOX1VTRV9TWVNDVEwKICAgIGludCAgICAgICAgICAgICBtaWJbMl07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGludCAgICAgICAgICAgICBrbWVtOwojaWYgIWRlZmluZWQoaHB1eCkKICAgIHN0YXRpYyBjaGFyIGJvb3R0aW1lX25hbWVbXSA9ICJfYm9vdHRpbWUiOwojZWxzZQogICAgc3RhdGljIGNoYXIgYm9vdHRpbWVfbmFtZVtdID0gImJvb3R0aW1lIjsKI2VuZGlmCiAgICBzdGF0aWMgY2hhciBlbXB0eV9uYW1lW10gPSAiIjsKICAgIHN0cnVjdCBubGlzdCBubFsyXTsKCiAgICBtZW1zZXQobmwsIDAsIHNpemVvZihubCkpOwogICAgbmxbMF0ubl9uYW1lID0gYm9vdHRpbWVfbmFtZTsKICAgIG5sWzFdLm5fbmFtZSA9IGVtcHR5X25hbWU7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMCB8fCBocHV4IDExICovCgoKICAgIGlmIChib290dGltZV9jc2VjcyAhPSAwKQogICAgICAgIHJldHVybiAoYm9vdHRpbWVfY3NlY3MpOwoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgIHBzdGF0X2dldHN0YXRpYygmcHN0X2J1Ziwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdGljKSwgMSwgMCk7CiAgICBib290dGltZV9jc2VjcyA9IHBzdF9idWYuYm9vdF90aW1lICogMTAwOwojZWxpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMCiAgICBtaWJbMF0gPSBDVExfS0VSTjsKICAgIG1pYlsxXSA9IEtFUk5fQk9PVFRJTUU7CgogICAgbGVuID0gc2l6ZW9mKGJvb3R0aW1lKTsKCiAgICBzeXNjdGwobWliLCAyLCAmYm9vdHRpbWUsICZsZW4sIE5VTEwsIDApOwogICAgYm9vdHRpbWVfY3NlY3MgPSAoYm9vdHRpbWUudHZfc2VjICogMTAwKSArIChib290dGltZS50dl91c2VjIC8gMTAwMDApOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGlmICgoa21lbSA9IG9wZW4oIi9kZXYva21lbSIsIDApKSA8IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBubGlzdChLRVJORUxfTE9DLCBubCk7CiAgICBpZiAobmxbMF0ubl90eXBlID09IDApIHsKICAgICAgICBjbG9zZShrbWVtKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBsc2VlayhrbWVtLCAobG9uZykgbmxbMF0ubl92YWx1ZSwgTF9TRVQpOwogICAgcmVhZChrbWVtLCAmYm9vdHRpbWUsIHNpemVvZihib290dGltZSkpOwogICAgY2xvc2Uoa21lbSk7CiAgICBib290dGltZV9jc2VjcyA9IChib290dGltZS50dl9zZWMgKiAxMDApICsgKGJvb3R0aW1lLnR2X3VzZWMgLyAxMDAwMCk7CiNlbHNlCiAgICByZXR1cm4gMDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTAgfHwgaHB1eCAxMSAqLwoKICAgIHJldHVybiAoYm9vdHRpbWVfY3NlY3MpOwp9CiNlbmRpZgoKLyoqCiAqIFJldHVybnMgdGhlIHN5c3RlbSB1cHRpbWUgaW4gY2VudGlzZWNvbmRzLgogKgogKiBAbm90ZSBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBpcyBub3QgaWRlbnRpY2FsIHRvIHN5c1VwVGltZQogKiAgIGRlZmluZWQgaW4gUkZDIDEyMTMuIGdldF91cHRpbWUoKSByZXR1cm5zIHRoZSBzeXN0ZW0gdXB0aW1lIHdoaWxlCiAqICAgc3lzVXBUaW1lIHJlcHJlc2VudHMgdGhlIHRpbWUgdGhhdCBoYXMgZWxhcHNlZCBzaW5jZSB0aGUgbW9zdCByZWNlbnQKICogICByZXN0YXJ0IG9mIHRoZSBuZXR3b3JrIG1hbmFnZXIgKHNubXBkKS4KICoKICogQHNlZSBTZWUgYWxzbyBuZXRzbm1wX2dldF9hZ2VudF91cHRpbWUoKS4KICovCmxvbmcKZ2V0X3VwdGltZSh2b2lkKQp7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICBzdGF0aWMgY2hhciBsYm9sdF9uYW1lW10gPSAibGJvbHQiOwogICAgc3RydWN0IG5saXN0IG5sOwogICAgaW50IGttZW07CiAgICB0aW1lX3QgbGJvbHQ7CiAgICBubC5uX25hbWUgPSBsYm9sdF9uYW1lOwogICAgaWYoa25saXN0KCZubCwgMSwgc2l6ZW9mKHN0cnVjdCBubGlzdCkpICE9IDApIHJldHVybigwKTsKICAgIGlmKG5sLm5fdHlwZSA9PSAwIHx8IG5sLm5fdmFsdWUgPT0gMCkgcmV0dXJuKDApOwogICAgaWYoKGttZW0gPSBvcGVuKCIvZGV2L21lbSIsIDApKSA8IDApIHJldHVybiAwOwogICAgbHNlZWsoa21lbSwgKGxvbmcpIG5sLm5fdmFsdWUsIExfU0VUKTsKICAgIHJlYWQoa21lbSwgJmxib2x0LCBzaXplb2YobGJvbHQpKTsKICAgIGNsb3NlKGttZW0pOwogICAgcmV0dXJuKGxib2x0KTsKI2VsaWYgZGVmaW5lZChzb2xhcmlzMikKICAgIGtzdGF0X2N0bF90ICAgICprc2MgPSBrc3RhdF9vcGVuKCk7CiAgICBrc3RhdF90ICAgICAgICAqa3M7CiAgICBraWRfdCAgICAgICAgICAga2lkOwogICAga3N0YXRfbmFtZWRfdCAgKm5hbWVkOwogICAgdV9sb25nICAgICAgICAgIGxib2x0ID0gMDsKCiAgICBpZiAoa3NjKSB7CiAgICAgICAga3MgPSBrc3RhdF9sb29rdXAoa3NjLCAidW5peCIsIC0xLCAic3lzdGVtX21pc2MiKTsKICAgICAgICBpZiAoa3MpIHsKICAgICAgICAgICAga2lkID0ga3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKTsKICAgICAgICAgICAgaWYgKGtpZCAhPSAtMSkgewogICAgICAgICAgICAgICAgbmFtZWQgPSBrc3RhdF9kYXRhX2xvb2t1cChrcywgImxib2x0Iik7CiAgICAgICAgICAgICAgICBpZiAobmFtZWQpIHsKI2lmZGVmIEtTVEFUX0RBVEFfVUlOVDMyCiAgICAgICAgICAgICAgICAgICAgbGJvbHQgPSBuYW1lZC0+dmFsdWUudWkzMjsKI2Vsc2UKICAgICAgICAgICAgICAgICAgICBsYm9sdCA9IG5hbWVkLT52YWx1ZS51bDsKI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAga3N0YXRfY2xvc2Uoa3NjKTsKICAgIH0KICAgIHJldHVybiBsYm9sdDsKI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChjeWd3aW4pCiAgICBGSUxFICAgICAgICAgICAqaW4gPSBmb3BlbigiL3Byb2MvdXB0aW1lIiwgInIiKTsKICAgIGxvbmcgICAgICAgICAgICB1cHRpbSA9IDAsIGEsIGI7CiAgICBpZiAoaW4pIHsKICAgICAgICBpZiAoMiA9PSBmc2NhbmYoaW4sICIlbGQuJWxkIiwgJmEsICZiKSkKICAgICAgICAgICAgdXB0aW0gPSBhICogMTAwICsgYjsKICAgICAgICBmY2xvc2UoaW4pOwogICAgfQogICAgcmV0dXJuIHVwdGltOwojZWxzZQogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIGxvbmcgICAgICAgICAgICBib290dGltZV9jc2Vjcywgbm93dGltZV9jc2VjczsKCiAgICBib290dGltZV9jc2VjcyA9IGdldF9ib290dGltZSgpOwogICAgaWYgKGJvb3R0aW1lX2NzZWNzID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKICAgIG5vd3RpbWVfY3NlY3MgPSAobm93LnR2X3NlYyAqIDEwMCkgKyAobm93LnR2X3VzZWMgLyAxMDAwMCk7CgogICAgcmV0dXJuIChub3d0aW1lX2NzZWNzIC0gYm9vdHRpbWVfY3NlY3MpOwojZW5kaWYKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhIFdJTjMyICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCnN0YXRpYyB2YWxfY29udGV4dF90ICpfdmFsX2NvbnRleHQgPSBOVUxMOwoKc3RhdGljIHZhbF9jb250ZXh0X3QgKgpuZXRzbm1wX3ZhbGlkYXRvcl9jb250ZXh0KHZvaWQpCnsKICAgIGlmIChOVUxMID09IF92YWxfY29udGV4dCkgewogICAgICAgIGludCByYzsKICAgICAgICBjaGFyICphcHB0eXBlID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBUWVBFKTsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOnNlYzpjb250ZXh0IiwgImNyZWF0aW5nIGRuc3NlYyBjb250ZXh0IGZvciAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBhcHB0eXBlKSk7CiAgICAgICAgcmMgPSB2YWxfY3JlYXRlX2NvbnRleHQoYXBwdHlwZSwgJl92YWxfY29udGV4dCk7CiAgICB9CgogICAgcmV0dXJuIF92YWxfY29udGV4dDsKfQojZW5kaWYgLyogRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04gKi8KCmludApuZXRzbm1wX2dldGhvc3RieW5hbWVfdjQoY29uc3QgY2hhciogbmFtZSwgaW5fYWRkcl90ICphZGRyX291dCkKewojaWYgSEFWRV9HRVRBRERSSU5GTwogICAgc3RydWN0IGFkZHJpbmZvICphZGRycyA9IE5VTEw7CiAgICBzdHJ1Y3QgYWRkcmluZm8gaGludDsKICAgIGludCAgICAgICAgICAgICBlcnI7CgogICAgbWVtc2V0KCZoaW50LCAwLCBzaXplb2YgaGludCk7CiAgICBoaW50LmFpX2ZsYWdzID0gMDsKICAgIGhpbnQuYWlfZmFtaWx5ID0gUEZfSU5FVDsKICAgIGhpbnQuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwogICAgaGludC5haV9wcm90b2NvbCA9IDA7CgogICAgZXJyID0gbmV0c25tcF9nZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludCwgJmFkZHJzKTsKICAgIGlmIChlcnIgIT0gMCkgewogICAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICBpZiAoYWRkcnMgIT0gTlVMTCkgewogICAgICAgIG1lbWNweShhZGRyX291dCwKICAgICAgICAgICAgICAgJigoc3RydWN0IHNvY2thZGRyX2luICopIGFkZHJzLT5haV9hZGRyKS0+c2luX2FkZHIsCiAgICAgICAgICAgICAgIHNpemVvZihpbl9hZGRyX3QpKTsKICAgICAgICBmcmVlYWRkcmluZm8oYWRkcnMpOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIHJlc29sdmUgSVB2NCBob3N0bmFtZVxuIikpOwogICAgfQogICAgcmV0dXJuIDA7CgojZWxpZiBIQVZFX0dFVEhPU1RCWU5BTUUKICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CgogICAgaHAgPSBuZXRzbm1wX2dldGhvc3RieW5hbWUobmFtZSk7CiAgICBpZiAoaHAgPT0gTlVMTCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAoY291bGRuJ3QgcmVzb2x2ZSlcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgaWYgKGhwLT5oX2FkZHJ0eXBlICE9IEFGX0lORVQpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKG5vdCBBRl9JTkVUISlcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAocmVzb2x2ZWQgb2theSlcbiIpKTsKICAgICAgICBtZW1jcHkoYWRkcl9vdXQsIGhwLT5oX2FkZHIsIHNpemVvZihpbl9hZGRyX3QpKTsKICAgIH0KICAgIHJldHVybiAwOwoKI2VsaWYgSEFWRV9HRVRJUE5PREVCWU5BTUUKICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICBpbnQgICAgICAgICAgICAgZXJyOwoKICAgIGhwID0gZ2V0aXBub2RlYnluYW1lKHBlZXJuYW1lLCBBRl9JTkVULCAwLCAmZXJyKTsKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb3VsZG4ndCByZXNvbHZlID0gJWQpXG4iLCBlcnIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICJob3N0bmFtZSAocmVzb2x2ZWQgb2theSlcbiIpKTsKICAgIG1lbWNweShhZGRyX291dCwgaHAtPmhfYWRkciwgc2l6ZW9mKGluX2FkZHJfdCkpOwogICAgcmV0dXJuIDA7CgojZWxzZSAvKiBIQVZFX0dFVElQTk9ERUJZTkFNRSAqLwogICAgcmV0dXJuIC0xOwojZW5kaWYKfQoKaW50Cm5ldHNubXBfZ2V0YWRkcmluZm8oY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqc2VydmljZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYWRkcmluZm8gKmhpbnRzLCBzdHJ1Y3QgYWRkcmluZm8gKipyZXMpCnsKI2lmIEhBVkVfR0VUQUREUklORk8KICAgIHN0cnVjdCBhZGRyaW5mbyAqYWRkcnMgPSBOVUxMOwogICAgc3RydWN0IGFkZHJpbmZvIGhpbnQ7CiAgICBpbnQgICAgICAgICAgICAgZXJyOwojaWZkZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04KICAgIHZhbF9zdGF0dXNfdCAgICB2YWxfc3RhdHVzOwojZW5kaWYKCiAgICBERUJVR01TR1RMKCgiZG5zOmdldGFkZHJpbmZvIiwgImxvb2tpbmcgdXAgIikpOwogICAgaWYgKG5hbWUpCiAgICAgICAgREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiXCIlc1wiIiwgbmFtZSkpOwogICAgZWxzZQogICAgICAgIERFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIjxOVUxMPiIpKTsKCiAgICBpZiAoc2VydmljZSkKCURFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIjpcIiVzXCIiLCBzZXJ2aWNlKSk7CgogICAgaWYgKGhpbnRzKQoJREVCVUdNU0coKCJkbnM6Z2V0YWRkcmluZm8iLCAiIHdpdGggaGludCAoeyAuLi4gfSkiKSk7CiAgICBlbHNlCglERUJVR01TRygoImRuczpnZXRhZGRyaW5mbyIsICIgd2l0aCBubyBoaW50IikpOwoKICAgIERFQlVHTVNHKCgiZG5zOmdldGFkZHJpbmZvIiwgIlxuIikpOwoKICAgIGlmIChOVUxMID09IGhpbnRzKSB7CiAgICAgICAgbWVtc2V0KCZoaW50LCAwLCBzaXplb2YgaGludCk7CiAgICAgICAgaGludC5haV9mbGFncyA9IDA7CiAgICAgICAgaGludC5haV9mYW1pbHkgPSBQRl9JTkVUOwogICAgICAgIGhpbnQuYWlfc29ja3R5cGUgPSBTT0NLX0RHUkFNOwogICAgICAgIGhpbnQuYWlfcHJvdG9jb2wgPSAwOwogICAgICAgIGhpbnRzID0gJmhpbnQ7CiAgICB9IGVsc2UgewogICAgICAgIG1lbWNweSgmaGludCwgaGludHMsIHNpemVvZiBoaW50KTsKICAgIH0KCiNpZm5kZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04KICAgIGVyciA9IGdldGFkZHJpbmZvKG5hbWUsIE5VTEwsICZoaW50LCAmYWRkcnMpOwojZWxzZSAvKiBETlNTRUNfTE9DQUxfVkFMSURBVElPTiAqLwogICAgZXJyID0gdmFsX2dldGFkZHJpbmZvKG5ldHNubXBfdmFsaWRhdG9yX2NvbnRleHQoKSwgbmFtZSwgTlVMTCwgJmhpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJmFkZHJzLCAmdmFsX3N0YXR1cyk7CiAgICBERUJVR01TR1RMKCgiZG5zOnNlYzp2YWwiLCAiZXJyICVkLCB2YWxfc3RhdHVzICVkIC8gJXM7IHRydXN0ZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgZXJyLCB2YWxfc3RhdHVzLCBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cyksCiAgICAgICAgICAgICAgICB2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSk7CiAgICBpZiAoISB2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSB7CiAgICAgICAgaW50IHJjOwogICAgICAgIGlmICgoZXJyICE9IDApICYmIFZBTF9HRVRBRERSSU5GT19IQVNfU1RBVFVTKGVycikpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICJXQVJOSU5HOiBVTlRSVVNURUQgZXJyb3IgaW4gRE5TIHJlc29sdXRpb24gZm9yICVzIVxuIiwKICAgICAgICAgICAgICAgICAgICAgbmFtZSk7CiAgICAgICAgICAgIHJjID0gRUFJX0ZBSUw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgICAgICJUaGUgYXV0aGVudGljaXR5IG9mIEROUyByZXNwb25zZSBpcyBub3QgdHJ1c3RlZCAoJXMpXG4iLAogICAgICAgICAgICAgICAgICAgICBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cykpOwogICAgICAgICAgICByYyA9IEVBSV9OT05BTUU7CiAgICAgICAgfQogICAgICAgIC8qKiBjb250aW51ZSBhbnl3YXlzIGlmIEROU1NFQ19XQVJOX09OTFkgaXMgc2V0ICovCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0ROU1NFQ19XQVJOX09OTFkpKQogICAgICAgICAgICByZXR1cm4gcmM7CiAgICB9CgoKI2VuZGlmIC8qIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OICovCiAgICAqcmVzID0gYWRkcnM7CiAgICBpZiAoKDAgPT0gZXJyKSAmJiBhZGRycyAmJiBhZGRycy0+YWlfYWRkcikgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0YWRkcmluZm8iLCAiYW5zd2VyIHsgQUZfSU5FVCwgJXM6JWh1IH1cbiIsCiAgICAgICAgICAgICAgICAgICAgaW5ldF9udG9hKCgoc3RydWN0IHNvY2thZGRyX2luKilhZGRycy0+YWlfYWRkciktPnNpbl9hZGRyKSwKICAgICAgICAgICAgICAgICAgICBudG9ocygoKHN0cnVjdCBzb2NrYWRkcl9pbiopYWRkcnMtPmFpX2FkZHIpLT5zaW5fcG9ydCkpKTsKICAgIH0KICAgIHJldHVybiBlcnI7CiNlbHNlCiAgICBORVRTTk1QX0xPR09OQ0UoKExPR19FUlIsICJnZXRhZGRyaW5mbyBub3QgYXZhaWxhYmxlIikpOwogICAgcmV0dXJuIEVBSV9GQUlMOwojZW5kaWYgLyogZ2V0YWRkcmluZm8gKi8KfQoKc3RydWN0IGhvc3RlbnQgKgpuZXRzbm1wX2dldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKewojaWYgSEFWRV9HRVRIT1NUQllOQU1FCiNpZmRlZiBETlNTRUNfTE9DQUxfVkFMSURBVElPTgogICAgdmFsX3N0YXR1c190IHZhbF9zdGF0dXM7CiNlbmRpZgogICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKCiAgICBpZiAoTlVMTCA9PSBuYW1lKQogICAgICAgIHJldHVybiBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5bmFtZSIsICJsb29raW5nIHVwICVzXG4iLCBuYW1lKSk7CgojaWZkZWYgRE5TU0VDX0xPQ0FMX1ZBTElEQVRJT04KICAgIGhwICA9IHZhbF9nZXRob3N0YnluYW1lKG5ldHNubXBfdmFsaWRhdG9yX2NvbnRleHQoKSwgbmFtZSwgJnZhbF9zdGF0dXMpOwogICAgREVCVUdNU0dUTCgoImRuczpzZWM6dmFsIiwgInZhbF9zdGF0dXMgJWQgLyAlczsgdHJ1c3RlZDogJWRcbiIsCiAgICAgICAgICAgICAgICB2YWxfc3RhdHVzLCBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cyksCiAgICAgICAgICAgICAgICB2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSk7CiAgICBpZiAoIXZhbF9pc3RydXN0ZWQodmFsX3N0YXR1cykpIHsKICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywKICAgICAgICAgICAgICAgICAiVGhlIGF1dGhlbnRpY2l0eSBvZiBETlMgcmVzcG9uc2UgaXMgbm90IHRydXN0ZWQgKCVzKVxuIiwKICAgICAgICAgICAgICAgICBwX3ZhbF9zdGF0dXModmFsX3N0YXR1cykpOwogICAgICAgIC8qKiBjb250aW51ZSBhbnl3YXlzIGlmIEROU1NFQ19XQVJOX09OTFkgaXMgc2V0ICovCiAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0ROU1NFQ19XQVJOX09OTFkpKQogICAgICAgICAgICBocCA9IE5VTEw7CiAgICB9CiAgICBlbHNlIGlmICh2YWxfZG9lc19ub3RfZXhpc3QodmFsX3N0YXR1cykgJiYgaHApCiAgICAgICAgaHAgPSBOVUxMOwojZWxzZQogICAgaHAgPSBnZXRob3N0YnluYW1lKG5hbWUpOwojZW5kaWYKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnluYW1lIiwKICAgICAgICAgICAgICAgICAgICAiY291bGRuJ3QgcmVzb2x2ZSAlc1xuIiwgbmFtZSkpOwogICAgfSBlbHNlIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnluYW1lIiwKICAgICAgICAgICAgICAgICAgICAid2FybmluZzogcmVzcG9uc2UgZm9yICVzIG5vdCBBRl9JTkVUIVxuIiwgbmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgICBERUJVR01TR1RMKCgiZG5zOmdldGhvc3RieW5hbWUiLAogICAgICAgICAgICAgICAgICAgICIlcyByZXNvbHZlZCBva2F5XG4iLCBuYW1lKSk7CiAgICB9CiAgICByZXR1cm4gaHA7CiNlbHNlCiAgICBORVRTTk1QX0xPR09OQ0UoKExPR19FUlIsICJnZXRob3N0YnluYW1lIG5vdCBhdmFpbGFibGUiKSk7CiAgICByZXR1cm4gTlVMTDsKI2VuZGlmIC8qIEhBVkVfR0VUSE9TVEJZTkFNRSAqLwp9CgovKioKICogTG9vayB1cCB0aGUgaG9zdCBuYW1lIHZpYSBETlMuCiAqCiAqIEBwYXJhbVtpbl0gYWRkciBQb2ludGVyIHRvIHRoZSBhZGRyZXNzIHRvIHJlc29sdmUuIFRoaXMgYXJndW1lbnQgcG9pbnRzIGUuZy4KICogICB0byBhIHN0cnVjdCBpbl9hZGRyIGZvciBBRl9JTkVUIG9yIHRvIGEgc3RydWN0IGluNl9hZGRyIGZvciBBRl9JTkVUNi4KICogQHBhcmFtW2luXSBsZW4gIExlbmd0aCBpbiBieXRlcyBvZiAqYWRkci4KICogQHBhcmFtW2luXSB0eXBlIEFkZHJlc3MgZmFtaWx5LCBlLmcuIEFGX0lORVQgb3IgQUZfSU5FVDYuCiAqCiAqIEByZXR1cm4gUG9pbnRlciB0byBhIGhvc3RlbnQgc3RydWN0dXJlIGlmIGFkZHJlc3MgbG9va3VwIHN1Y2NlZWRlZCBvciBOVUxMCiAqICAgaWYgdGhlIGxvb2t1cCBmYWlsZWQuCiAqCiAqIEBzZWUgU2VlIGFsc28gdGhlIGdldGhvc3RieWFkZHIoKSBtYW4gcGFnZS4KICovCnN0cnVjdCBob3N0ZW50ICoKbmV0c25tcF9nZXRob3N0YnlhZGRyKGNvbnN0IHZvaWQgKmFkZHIsIHNvY2tsZW5fdCBsZW4sIGludCB0eXBlKQp7CiNpZiBIQVZFX0dFVEhPU1RCWUFERFIKICAgIHN0cnVjdCBob3N0ZW50ICpocCA9IE5VTEw7CiAgICBjaGFyIGJ1Zls2NF07CgogICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnlhZGRyIiwgInJlc29sdmluZyAlc1xuIiwKICAgICAgICAgICAgICAgIGluZXRfbnRvcCh0eXBlLCBhZGRyLCBidWYsIHNpemVvZihidWYpKSkpOwoKI2lmZGVmIEROU1NFQ19MT0NBTF9WQUxJREFUSU9OCiAgICB2YWxfc3RhdHVzX3QgdmFsX3N0YXR1czsKICAgIGhwID0gdmFsX2dldGhvc3RieWFkZHIobmV0c25tcF92YWxpZGF0b3JfY29udGV4dCgpLCBhZGRyLCBsZW4sIHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWxfc3RhdHVzKTsKICAgIERFQlVHTVNHVEwoKCJkbnM6c2VjOnZhbCIsICJ2YWxfc3RhdHVzICVkIC8gJXM7IHRydXN0ZWQ6ICVkXG4iLAogICAgICAgICAgICAgICAgdmFsX3N0YXR1cywgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpLAogICAgICAgICAgICAgICAgdmFsX2lzdHJ1c3RlZCh2YWxfc3RhdHVzKSkpOwogICAgaWYgKCF2YWxfaXN0cnVzdGVkKHZhbF9zdGF0dXMpKSB7CiAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsCiAgICAgICAgICAgICAgICAgIlRoZSBhdXRoZW50aWNpdHkgb2YgRE5TIHJlc3BvbnNlIGlzIG5vdCB0cnVzdGVkICglcylcbiIsCiAgICAgICAgICAgICAgICAgcF92YWxfc3RhdHVzKHZhbF9zdGF0dXMpKTsKICAgICAgICAvKiogY29udGludWUgYW55d2F5cyBpZiBETlNTRUNfV0FSTl9PTkxZIGlzIHNldCAqLwogICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9ETlNTRUNfV0FSTl9PTkxZKSkKICAgICAgICAgICAgaHAgPSBOVUxMOwogICAgfQogICAgZWxzZSBpZiAodmFsX2RvZXNfbm90X2V4aXN0KHZhbF9zdGF0dXMpICYmIGhwKQogICAgICAgIGhwID0gTlVMTDsKI2Vsc2UKICAgIGhwID0gZ2V0aG9zdGJ5YWRkcihhZGRyLCBsZW4sIHR5cGUpOwojZW5kaWYKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnlhZGRyIiwgImNvdWxkbid0IHJlc29sdmUgYWRkclxuIikpOwogICAgfSBlbHNlIGlmIChocC0+aF9hZGRydHlwZSAhPSBBRl9JTkVUKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImRuczpnZXRob3N0YnlhZGRyIiwKICAgICAgICAgICAgICAgICAgICAid2FybmluZzogcmVzcG9uc2UgZm9yIGFkZHIgbm90IEFGX0lORVQhXG4iKSk7CiAgICB9IGVsc2UgewogICAgICAgIERFQlVHTVNHVEwoKCJkbnM6Z2V0aG9zdGJ5YWRkciIsICJhZGRyIHJlc29sdmVkIG9rYXlcbiIpKTsKICAgIH0KICAgIHJldHVybiBocDsKI2Vsc2UKICAgIE5FVFNOTVBfTE9HT05DRSgoTE9HX0VSUiwgImdldGhvc3RieWFkZHIgbm90IGF2YWlsYWJsZSIpKTsKICAgIHJldHVybiBOVUxMOwojZW5kaWYKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaWZuZGVmIEhBVkVfU1RSTkNBU0VDTVAKCi8qCiAqIHRlc3QgZm9yIE5VTEwgcG9pbnRlcnMgYmVmb3JlIGFuZCBOVUxMIGNoYXJhY3RlcnMgYWZ0ZXIKICogKiBjb21wYXJpbmcgcG9zc2libHkgbm9uLU5VTEwgc3RyaW5ncy4KICogKiBXQVJOSU5HOiBUaGlzIGZ1bmN0aW9uIGRvZXMgTk9UIGNoZWNrIGZvciBhcnJheSBvdmVyZmxvdy4KICovCmludApzdHJuY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuY2gpCnsKICAgIHNpemVfdCAgICAgICAgICBpaTsKICAgIGludCAgICAgICAgICAgICByZXMgPSAtMTsKCiAgICBpZiAoIXMxKSB7CiAgICAgICAgaWYgKCFzMikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuICgtMSk7CiAgICB9CiAgICBpZiAoIXMyKQogICAgICAgIHJldHVybiAoMSk7CgogICAgZm9yIChpaSA9IDA7IChpaSA8IG5jaCkgJiYgKnMxICYmICpzMjsgaWkrKywgczErKywgczIrKykgewogICAgICAgIHJlcyA9IChpbnQpICh0b2xvd2VyKCpzMSkgLSB0b2xvd2VyKCpzMikpOwogICAgICAgIGlmIChyZXMgIT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CgogICAgaWYgKGlpID09IG5jaCkgewogICAgICAgIHMxLS07CiAgICAgICAgczItLTsKICAgIH0KCiAgICBpZiAoISpzMSkgewogICAgICAgIGlmICghKnMyKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmICghKnMyKQogICAgICAgIHJldHVybiAoMSk7CgogICAgcmV0dXJuIChyZXMpOwp9CgppbnQKc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCnsKICAgIHJldHVybiBzdHJuY2FzZWNtcChzMSwgczIsIDEwMDAwMDApOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1RSTkNBU0VDTVAgKi8KCgojaWZuZGVmIEhBVkVfU1RSRFVQCmNoYXIgICAgICAgICAgICoKc3RyZHVwKGNvbnN0IGNoYXIgKnNyYykKewogICAgaW50ICAgICAgICAgICAgIGxlbjsKICAgIGNoYXIgICAgICAgICAgICpkc3Q7CgogICAgbGVuID0gc3RybGVuKHNyYykgKyAxOwogICAgaWYgKChkc3QgPSAoY2hhciAqKSBtYWxsb2MobGVuKSkgPT0gTlVMTCkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgc3RyY3B5KGRzdCwgc3JjKTsKICAgIHJldHVybiAoZHN0KTsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1RSRFVQICovCgojaWZuZGVmIEhBVkVfU0VURU5WCmludApzZXRlbnYoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCBvdmVyd3JpdGUpCnsKICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgIGludCAgICAgICAgICAgICByZXQ7CgogICAgaWYgKG92ZXJ3cml0ZSA9PSAwKSB7CiAgICAgICAgaWYgKGdldGVudihuYW1lKSkKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICBjcCA9IChjaGFyICopIG1hbGxvYyhzdHJsZW4obmFtZSkgKyBzdHJsZW4odmFsdWUpICsgMik7CiAgICBpZiAoY3AgPT0gTlVMTCkKICAgICAgICByZXR1cm4gLTE7CiAgICBzcHJpbnRmKGNwLCAiJXM9JXMiLCBuYW1lLCB2YWx1ZSk7CiAgICByZXQgPSBwdXRlbnYoY3ApOwojaWZkZWYgV0lOMzIKICAgIGZyZWUoY3ApOwojZW5kaWYKICAgIHJldHVybiByZXQ7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX1NFVEVOViAqLwoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKGNhbGN1bGF0ZV90aW1lX2RpZmYsIG5ldHNubXBfdW51c2VkKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMQ1VMQVRFX1RJTUVfRElGRgovKioKICogQ29tcHV0ZSAoKm5vdyAtICp0aGVuKSBpbiBjZW50aXNlY29uZHMuCiAqLwppbnQKY2FsY3VsYXRlX3RpbWVfZGlmZihjb25zdCBzdHJ1Y3QgdGltZXZhbCAqbm93LCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdGhlbikKewogICAgc3RydWN0IHRpbWV2YWwgIGRpZmY7CgogICAgTkVUU05NUF9USU1FUlNVQihub3csIHRoZW4sICZkaWZmKTsKICAgIHJldHVybiAoaW50KShkaWZmLnR2X3NlYyAqIDEwMCArIGRpZmYudHZfdXNlYyAvIDEwMDAwKTsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9DQUxDVUxBVEVfVElNRV9ESUZGICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfQ0FMQ1VMQVRFX1NFQ1RJTUVfRElGRgovKiogQ29tcHV0ZSByb3VuZGVkICgqbm93IC0gKnRoZW4pIGluIHNlY29uZHMuICovCnVfaW50CmNhbGN1bGF0ZV9zZWN0aW1lX2RpZmYoY29uc3Qgc3RydWN0IHRpbWV2YWwgKm5vdywgY29uc3Qgc3RydWN0IHRpbWV2YWwgKnRoZW4pCnsKICAgIHN0cnVjdCB0aW1ldmFsICBkaWZmOwoKICAgIE5FVFNOTVBfVElNRVJTVUIobm93LCB0aGVuLCAmZGlmZik7CiAgICByZXR1cm4gZGlmZi50dl9zZWMgKyAoZGlmZi50dl91c2VjID49IDUwMDAwMEwpOwp9CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0NBTENVTEFURV9TRUNUSU1FX0RJRkYgKi8KCiNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCi8qCiAqIG9ubHkgZ2xpYmMyIGhhcyB0aGlzLgogKi8KY2hhciAgICAgICAgICAgKgpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDEgPSBoYXlzdGFjaywgKmNwMiA9IG5lZWRsZTsKICAgIGNvbnN0IGNoYXIgICAgICpjeDsKICAgIGludCAgICAgICAgICAgICB0c3RjaDEsIHRzdGNoMjsKCiAgICAvKgogICAgICogcHJpbnRmKCJsb29raW5nIGZvciAnJXMnIGluICclcydcbiIsIG5lZWRsZSwgaGF5c3RhY2spOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiBjcDIgJiYgKmNwMSAmJiAqY3AyKQogICAgICAgIGZvciAoY3AxID0gaGF5c3RhY2ssIGNwMiA9IG5lZWRsZTsgKmNwMTspIHsKICAgICAgICAgICAgY3ggPSBjcDE7CiAgICAgICAgICAgIGNwMiA9IG5lZWRsZTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiVCclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoISpjcDIpIHsgICAgLyogZm91bmQgdGhlIG5lZWRsZSAqLwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogcHJpbnRmKCJcbmZvdW5kICclcycgaW4gJyVzJ1xuIiwgbmVlZGxlLCBjeCk7IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGN4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghKmNwMSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB0c3RjaDEgPSB0b3VwcGVyKCpjcDEpOwogICAgICAgICAgICAgICAgdHN0Y2gyID0gdG91cHBlcigqY3AyKTsKICAgICAgICAgICAgICAgIGlmICh0c3RjaDEgIT0gdHN0Y2gyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiTSclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICAgICAgICAgIGNwMisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgxKTsKICAgICAgICAgICAgaWYgKCpjcDEpCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICB9CiAgICAvKgogICAgICogcHJpbnRmKCJcbiIpOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiAqY3AxKQogICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGNwMSk7CgogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmCgppbnQKbWtkaXJoaWVyKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSwgaW50IHNraXBsYXN0KQp7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2J1ZjsKICAgIGNoYXIgICAgICAgICAgICpvdXJjb3B5ID0gc3RyZHVwKHBhdGhuYW1lKTsKICAgIGNoYXIgICAgICAgICAgICplbnRyeTsKICAgIGNoYXIgICAgICAgICAgICpidWYgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICByZXM7CgogICAgcmVzID0gU05NUEVSUl9HRU5FUlI7CiAgICBpZiAoIW91cmNvcHkpCiAgICAgICAgZ290byBvdXQ7CgogICAgYnVmID0gbWFsbG9jKHN0cmxlbihwYXRobmFtZSkgKyAyKTsKICAgIGlmICghYnVmKQogICAgICAgIGdvdG8gb3V0OwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKiBjb252ZXJ0IGJhY2tzbGFzaCB0byBmb3J3YXJkIHNsYXNoICovCiAgICBmb3IgKGVudHJ5ID0gb3VyY29weTsgKmVudHJ5OyBlbnRyeSsrKQogICAgICAgIGlmICgqZW50cnkgPT0gJ1xcJykKICAgICAgICAgICAgKmVudHJ5ID0gJy8nOwojZW5kaWYKCiAgICBlbnRyeSA9IHN0cnRva19yKG91cmNvcHksICIvIiwgJnN0KTsKCiAgICBidWZbMF0gPSAnXDAnOwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKgogICAgICogQ2hlY2sgaWYgZmlyc3QgZW50cnkgY29udGFpbnMgYSBkcml2ZS1sZXR0ZXIKICAgICAqICAgZS5nICAiYzovcGF0aCIKICAgICAqLwogICAgaWYgKChlbnRyeSkgJiYgKCc6JyA9PSBlbnRyeVsxXSkgJiYKICAgICAgICAoKCdcMCcgPT0gZW50cnlbMl0pIHx8ICgnLycgPT0gZW50cnlbMl0pKSkgewogICAgICAgIHN0cmNhdChidWYsIGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsICIvIiwgJnN0KTsKICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIGNoZWNrIHRvIHNlZSBpZiBmaWxlbmFtZSBpcyBhIGRpcmVjdG9yeSAKICAgICAqLwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgc3RyY2F0KGJ1ZiwgIi8iKTsKICAgICAgICBzdHJjYXQoYnVmLCBlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiLyIsICZzdCk7CiAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwgJiYgc2tpcGxhc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmIChzdGF0KGJ1ZiwgJnNidWYpIDwgMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBETkUsIG1ha2UgaXQgCiAgICAgICAgICAgICAqLwojaWZkZWYgV0lOMzIKICAgICAgICAgICAgaWYgKENyZWF0ZURpcmVjdG9yeShidWYsIE5VTEwpID09IDApCiNlbHNlCiAgICAgICAgICAgIGlmIChta2RpcihidWYsIG1vZGUpID09IC0xKQojZW5kaWYKICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIkNyZWF0ZWQgZGlyZWN0b3J5OiAlc1xuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBleGlzdHMsIGlzIGl0IGEgZmlsZT8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoKHNidWYuc3RfbW9kZSAmIFNfSUZESVIpID09IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhY2shIGNhbid0IG1ha2UgYSBkaXJlY3Rvcnkgb24gdG9wIG9mIGEgZmlsZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXMgPSBTTk1QRVJSX1NVQ0NFU1M7Cm91dDoKICAgIGZyZWUoYnVmKTsKICAgIGZyZWUob3VyY29weSk7CiAgICByZXR1cm4gcmVzOwp9CgovKioKICogbmV0c25tcF9ta3RlbXAgY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGJhc2VkIG9uIHRoZQogKiAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0ZW1wRmlsZVBhdHRlcm4KICoKICogQHJldHVybiBmaWxlIGRlc2NyaXB0b3IKICovCmNvbnN0IGNoYXIgICAgICoKbmV0c25tcF9ta3RlbXAodm9pZCkKewojaWZkZWYgUEFUSF9NQVgKICAgIHN0YXRpYyBjaGFyICAgICBuYW1lW1BBVEhfTUFYXTsKI2Vsc2UKICAgIHN0YXRpYyBjaGFyICAgICBuYW1lWzI1Nl07CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIGZkID0gLTE7CgogICAgc3RybGNweShuYW1lLCBnZXRfdGVtcF9maWxlX3BhdHRlcm4oKSwgc2l6ZW9mKG5hbWUpKTsKI2lmZGVmIEhBVkVfTUtTVEVNUAogICAgewogICAgICAgIG1vZGVfdCBvbGRtYXNrID0gdW1hc2sofihTX0lSVVNSIHwgU19JV1VTUikpOwogICAgICAgIG5ldHNubXBfYXNzZXJ0KG9sZG1hc2sgIT0gKG1vZGVfdCkoLTEpKTsKICAgICAgICBmZCA9IG1rc3RlbXAobmFtZSk7CiAgICAgICAgdW1hc2sob2xkbWFzayk7CiAgICB9CiNlbHNlCiAgICBpZiAobWt0ZW1wKG5hbWUpKSB7CiMgaWZuZGVmIFdJTjMyCiAgICAgICAgZmQgPSBvcGVuKG5hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgU19JUlVTUiB8IFNfSVdVU1IpOwojIGVsc2UKICAgICAgICAvKgogICAgICAgICAqIFdpbjMyIG5lZWRzIF9TX0lSRUFEIHwgX1NfSVdSSVRFIHRvIHNldCBwZXJtaXNzaW9ucyBvbiBmaWxlCiAgICAgICAgICogYWZ0ZXIgY2xvc2luZwogICAgICAgICAqLwogICAgICAgIGZkID0gX29wZW4obmFtZSwgX09fQ1JFQVQgfCBfT19FWENMIHwgX09fV1JPTkxZLCBfU19JUkVBRCB8IF9TX0lXUklURSk7CiMgZW5kaWYKICAgIH0KI2VuZGlmCiAgICBpZiAoZmQgPj0gMCkgewogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF9ta3RlbXAiLCAidGVtcCBmaWxlIGNyZWF0ZWQ6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICByZXR1cm4gbmFtZTsKICAgIH0KICAgIHNubXBfbG9nKExPR19FUlIsICJuZXRzbm1wX21rdGVtcDogZXJyb3IgY3JlYXRpbmcgZmlsZSAlc1xuIiwKICAgICAgICAgICAgIG5hbWUpOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gd2FzIGNyZWF0ZWQgdG8gZGlmZmVyZW50aWF0ZSBhY3Rpb25zCiAqIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciBMaW51eCAyLjQga2VybmVscywgYnV0IG5vdCBsYXRlciBrZXJuZWxzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qga2VybmVscyBvbiBhbnkgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB1bmFtZSgpLgogKgogKiBJZiBub3QgcnVubmluZyBhIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgdW5hbWUoKSwgcmV0dXJuIC0xLgogKgogKiBJZiBvc3BuYW1lIG1hdGNoZXMsIGFuZCB0aGUgcmVsZWFzZSBtYXRjaGVzIHVwIHRocm91Z2ggdGhlIHByZWZpeCwKICogIHJldHVybiAwLgogKiBJZiB0aGUgcmVsZWFzZSBpcyBvcmRlcmVkIGhpZ2hlciwgcmV0dXJuIDEuCiAqIEJlIGF3YXJlIHRoYXQgIm9yZGVyZWQgaGlnaGVyIiBpcyBub3QgYSBndWFyYW50ZWUgb2YgY29ycmVjdG5lc3MuCiAqLwppbnQKbmV0c25tcF9vc19wcmVtYXRjaChjb25zdCBjaGFyICpvc3BtbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvc3BtcmVscHJlZml4KQp7CiNpZiBIQVZFX1NZU19VVFNOQU1FX0gKICBzdGF0aWMgaW50IHByaW50T1NvbmNlID0gMTsKICBzdHJ1Y3QgdXRzbmFtZSB1dHNidWY7CiAgaWYgKCAwID4gdW5hbWUoJnV0c2J1ZikpCiAgICByZXR1cm4gLTE7CgogIGlmIChwcmludE9Tb25jZSkgewogICAgcHJpbnRPU29uY2UgPSAwOwogICAgLyogc2hvdyB0aGUgZm91ciBlbGVtZW50cyB0aGF0IHRoZSBrZXJuZWwgY2FuIGJlIHN1cmUgb2YgKi8KICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJzeXNuYW1lICclcycsXG5yZWxlYXNlICclcycsXG52ZXJzaW9uICclcycsXG5tYWNoaW5lICclcydcbiIsCiAgICAgIHV0c2J1Zi5zeXNuYW1lLCB1dHNidWYucmVsZWFzZSwgdXRzYnVmLnZlcnNpb24sIHV0c2J1Zi5tYWNoaW5lKSk7CiAgfQogIGlmICgwICE9IHN0cmNhc2VjbXAodXRzYnVmLnN5c25hbWUsIG9zcG1uYW1lKSkgcmV0dXJuIC0xOwoKICAvKiBSZXF1aXJlZCB0byBtYXRjaCBvbmx5IHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgKi8KICByZXR1cm4gc3RybmNhc2VjbXAodXRzYnVmLnJlbGVhc2UsIG9zcG1yZWxwcmVmaXgsIHN0cmxlbihvc3BtcmVscHJlZml4KSk7CgojZWxzZQoKICByZXR1cm4gLTE7CgojZW5kaWYgLyogSEFWRV9TWVNfVVRTTkFNRV9IICovCn0KCi8qKgogKiBuZXRzbm1wX29zX2tlcm5lbF93aWR0aCBkZXRlcm1pbmVzIGtlcm5lbCB3aWR0aCBhdCBydW50aW1lCiAqIEN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgSVJJWCwgQUlYIGFuZCBUcnU2NCBVbml4CiAqCiAqIEByZXR1cm4ga2VybmVsIHdpZHRoICh1c3VhbGx5IDMyIG9yIDY0KSBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvcgogKi8KaW50Cm5ldHNubXBfb3Nfa2VybmVsX3dpZHRoKHZvaWQpCnsKI2lmZGVmIGlyaXg2CiAgY2hhciBidWZbOF07CiAgc3lzaW5mbyhfTUlQU19TSV9PU19OQU1FLCBidWYsIDcpOwogIGlmIChzdHJuY21wKCJJUklYNjQiLCBidWYsIDYpID09IDApIHsKICAgIHJldHVybiA2NDsKICB9IGVsc2UgaWYgKHN0cm5jbXAoIklSSVgiLCBidWYsIDQpID09IDApIHsKICAgIHJldHVybiAzMjsKICB9IGVsc2UgewogICAgcmV0dXJuIC0xOwogIH0KI2VsaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogIHJldHVybiAoX19LRVJORUxfMzIoKSA/IDMyIDogKF9fS0VSTkVMXzY0KCkgPyA2NCA6IC0xKSk7CiNlbGlmIGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2Y1KSB8fCBkZWZpbmVkKF9fYWxwaGEpCiAgcmV0dXJuIDY0OyAvKiBBbHBoYSBpcyBhbHdheXMgNjRiaXQgKi8KI2Vsc2UKICAvKiBrZXJuZWwgd2lkdGggZGV0ZWN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogIHJldHVybiAtMTsKI2VuZGlmCn0KCm5ldHNubXBfZmVhdHVyZV9jaGlsZF9vZihzdHJfdG9fdWlkLCB1c2VyX2luZm9ybWF0aW9uKQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX1VJRAovKioKICogQ29udmVydCBhIHVzZXIgbmFtZSBvciBudW1iZXIgaW50byBudW1lcmljIGZvcm0uCiAqCiAqIEBwYXJhbVtpbl0gdXNlcm9ydWlkIEVpdGhlciBhIFVuaXggdXNlciBuYW1lIG9yIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbgogKiAgIG9mIGEgdXNlciBudW1iZXIuCiAqCiAqIEByZXR1cm4gRWl0aGVyIGEgdXNlciBudW1iZXIgPiAwIG9yIDAgaWYgdXNlcm9ydWlkIGlzIG5vdCBhIHZhbGlkIHVzZXIKICogICBuYW1lLCBub3QgYSB2YWxpZCB1c2VyIG51bWJlciBvciB0aGUgbmFtZSBvZiB0aGUgcm9vdCB1c2VyLgogKi8KaW50IG5ldHNubXBfc3RyX3RvX3VpZChjb25zdCBjaGFyICp1c2Vyb3J1aWQpIHsKICAgIGludCB1aWQ7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgIHN0cnVjdCBwYXNzd2QgKnB3ZDsKI2VuZGlmCgogICAgdWlkID0gYXRvaSh1c2Vyb3J1aWQpOwoKICAgIGlmICh1aWQgPT0gMCkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgcHdkID0gZ2V0cHduYW0odXNlcm9ydWlkKTsKICAgICAgICB1aWQgPSBwd2QgPyBwd2QtPnB3X3VpZCA6IDA7CiAgICAgICAgZW5kcHdlbnQoKTsKI2VuZGlmCiAgICAgICAgaWYgKHVpZCA9PSAwKQogICAgICAgICAgICBzbm1wX2xvZyhMT0dfV0FSTklORywgIkNhbid0IGlkZW50aWZ5IHVzZXIgKCVzKS5cbiIsIHVzZXJvcnVpZCk7CiAgICB9CiAgICByZXR1cm4gdWlkOwogICAgCn0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfU1RSX1RPX1VJRCAqLwoKbmV0c25tcF9mZWF0dXJlX2NoaWxkX29mKHN0cl90b19naWQsIHVzZXJfaW5mb3JtYXRpb24pCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TVFJfVE9fR0lECi8qKgogKiBDb252ZXJ0IGEgZ3JvdXAgbmFtZSBvciBudW1iZXIgaW50byBudW1lcmljIGZvcm0uCiAqCiAqIEBwYXJhbVtpbl0gZ3JvdXBvcmdpZCBFaXRoZXIgYSBVbml4IGdyb3VwIG5hbWUgb3IgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uCiAqICAgb2YgYSBncm91cCBudW1iZXIuCiAqCiAqIEByZXR1cm4gRWl0aGVyIGEgZ3JvdXAgbnVtYmVyID4gMCBvciAwIGlmIGdyb3Vwb3JnaWQgaXMgbm90IGEgdmFsaWQgZ3JvdXAKICogICBuYW1lLCBub3QgYSB2YWxpZCBncm91cCBudW1iZXIgb3IgdGhlIHJvb3QgZ3JvdXAuCiAqLwppbnQgbmV0c25tcF9zdHJfdG9fZ2lkKGNvbnN0IGNoYXIgKmdyb3Vwb3JnaWQpCnsKICAgIGludCBnaWQ7CgogICAgZ2lkID0gYXRvaShncm91cG9yZ2lkKTsKCiAgICBpZiAoZ2lkID09IDApIHsKI2lmIEhBVkVfR0VUR1JOQU0gJiYgSEFWRV9HUlBfSAogICAgICAgIHN0cnVjdCBncm91cCAgKmdycDsKCiAgICAgICAgZ3JwID0gZ2V0Z3JuYW0oZ3JvdXBvcmdpZCk7CiAgICAgICAgZ2lkID0gZ3JwID8gZ3JwLT5ncl9naWQgOiAwOwogICAgICAgIGVuZGdyZW50KCk7CiNlbmRpZgogICAgICAgIGlmIChnaWQgPT0gMCkKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJDYW4ndCBpZGVudGlmeSBncm91cCAoJXMpLlxuIiwgZ3JvdXBvcmdpZCk7CiAgICB9CgogICAgcmV0dXJuIGdpZDsKfQojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9TVFJfVE9fR0lEICovCg==