LyoKICogc3lzdGVtLmMKICovCi8qIFBvcnRpb25zIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvcHlyaWdodChzKS4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgIENvcHlyaWdodCAxOTkyIGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CgogICAgICAgICAgICAgICAgICAgICAgQWxsIFJpZ2h0cyBSZXNlcnZlZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwKcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdApib3RoIHRoYXQgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4Kc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBDTVUgbm90IGJlCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZQpzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uCgpDTVUgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsIElOQ0xVRElORwpBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwKQ01VIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUgpBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsCldIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSIFRPUlRJT1VTIEFDVElPTiwKQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUwpTT0ZUV0FSRS4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IChDKSAyMDA3IEFwcGxlLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCi8qCiAqIFN5c3RlbSBkZXBlbmRlbnQgcm91dGluZXMgZ28gaGVyZQogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxlcnJuby5oPgoKI2lmIEhBVkVfSU9fSAojaW5jbHVkZSA8aW8uaD4KI2VuZGlmCiNpZiBIQVZFX0RJUkVDVF9ICiNpbmNsdWRlIDxkaXJlY3QuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaWZkZWYgV0lOMzIKIyAgaW5jbHVkZSA8c3lzL3RpbWViLmg+CiMgZWxzZQojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVuZGlmCiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgoKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgoKI2lmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9ICiNpbmNsdWRlIDxuZXQvaWYuaD4KI2VuZGlmCiNpZiBIQVZFX05FVERCX0gKI2luY2x1ZGUgPG5ldGRiLmg+CiNlbmRpZgoKCiNpZiBIQVZFX1NZU19TT0NLSU9fSAojaW5jbHVkZSA8c3lzL3NvY2tpby5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCgojaWZkZWYgSEFWRV9OTElTVF9ICiNpbmNsdWRlIDxubGlzdC5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19GSUxFX0gKI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNlbmRpZgoKI2lmIEhBVkVfS1NUQVRfSAojaW5jbHVkZSA8a3N0YXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2VuZGlmCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgoKI2lmIEhBVkVfRE1BTExPQ19ICiNpbmNsdWRlIDxkbWFsbG9jLmg+CiNlbmRpZgoKI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2VuZGlmCiNpZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKI2luY2x1ZGUgPHN5cy9wc3RhdC5oPgojZW5kaWYKCiNpZiBIQVZFX1NZU19VVFNOQU1FX0gKI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU1RFTUNGR19ICiNpbmNsdWRlIDxzeXMvc3lzdGVtY2ZnLmg+CiNlbmRpZgoKI2lmIEhBVkVfU1lTX1NZU1RFTUlORk9fSAojaW5jbHVkZSA8c3lzL3N5c3RlbWluZm8uaD4KI2VuZGlmCgojaWYgZGVmaW5lZChkYXJ3aW45KQojaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4gICAgICAgIC8qIGZvciBfTlNHZXRBcmd2KCkgKi8KI2VuZGlmCgojaWYgSEFWRV9QV0RfSAojaW5jbHVkZSA8cHdkLmg+CiNlbmRpZgojaWYgSEFWRV9HUlBfSAojaW5jbHVkZSA8Z3JwLmg+CiNlbmRpZgoKI2lmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC90eXBlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvb3V0cHV0X2FwaS5oPgojaW5jbHVkZSA8bmV0LXNubXAvdXRpbGl0aWVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3N5c3RlbS5oPiAgICAvKiBmb3IgImludGVybmFsIiBkZWZpbml0aW9ucyAqLwoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hcGkuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvcmVhZF9jb25maWcuaD4gLyogZm9yIGdldF90ZW1wX2ZpbGVfcGF0dGVybigpICovCgojaWZuZGVmIElGRl9MT09QQkFDSwojCWRlZmluZSBJRkZfTE9PUEJBQ0sgMAojZW5kaWYKCiNpZmRlZiAgSU5BRERSX0xPT1BCQUNLCiMgZGVmaW5lIExPT1BCQUNLICAgIElOQUREUl9MT09QQkFDSwojZWxzZQojIGRlZmluZSBMT09QQkFDSyAgICAweDdmMDAwMDAxCiNlbmRpZgoKI2lmIGRlZmluZWQoSEFWRV9GT1JLKQpzdGF0aWMgdm9pZApfZGFlbW9uX3ByZXAoaW50IHN0ZGVycl9sb2cpCnsKICAgIC8qIEF2b2lkIGtlZXBpbmcgYW55IGRpcmVjdG9yeSBpbiB1c2UuICovCiAgICBjaGRpcigiLyIpOwoKICAgIGlmIChzdGRlcnJfbG9nKQogICAgICAgIHJldHVybjsKCiAgICAvKgogICAgICogQ2xvc2UgaW5oZXJpdGVkIGZpbGUgZGVzY3JpcHRvcnMgdG8gYXZvaWQKICAgICAqIGtlZXBpbmcgdW5uZWNlc3NhcnkgcmVmZXJlbmNlcy4KICAgICAqLwogICAgY2xvc2UoMCk7CiAgICBjbG9zZSgxKTsKICAgIGNsb3NlKDIpOwoKICAgIC8qCiAgICAgKiBSZWRpcmVjdCBzdGR7aW4sb3V0LGVycn0gdG8gL2Rldi9udWxsLCBqdXN0IGluIGNhc2UuCiAgICAgKi8KICAgIG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CiAgICBkdXAoMCk7CiAgICBkdXAoMCk7Cn0KI2VuZGlmCgovKioKICogZm9yayBjdXJyZW50IHByb2Nlc3MgaW50byB0aGUgYmFja2dyb3VuZC4KICoKICogVGhpcyBmdW5jdGlvbiBmb3JrcyBhIHByb2Nlc3MgaW50byB0aGUgYmFja2dyb3VuZCwgaW4gb3JkZXIgdG8KICogYmVjb21lIGEgZGFlbW9uIHByb2Nlc3MuIEl0IGRvZXMgYSBmZXcgdGhpbmdzIGFsb25nIHRoZSB3YXk6CiAqCiAqIC0gYmVjb21pbmcgYSBwcm9jZXNzL3Nlc3Npb24gZ3JvdXAgbGVhZGVyLCBhbmQgIGZvcmtpbmcgYSBzZWNvbmQgdGltZSBzbwogKiAgIHRoYXQgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciBjYW4gZXhpdC4KICoKICogLSBjaGFuZ2luZyB0aGUgd29ya2luZyBkaXJlY3RvcnkgdG8gLwogKgogKiAtIGNsb3Npbmcgc3RkaW4sIHN0ZG91dCBhbmQgc3RkZXJyICh1bmxlc3Mgc3RkZXJyX2xvZyBpcyBzZXQpIGFuZAogKiAgIHJlZGlyZWN0aW5nIHRoZW0gdG8gL2Rldi9udWxsCiAqCiAqIEBwYXJhbSBxdWl0X2ltbWVkaWF0ZWx5IDogaW5kaWNhdGVzIGlmIHRoZSBwYXJlbnQgcHJvY2VzcyBzaG91bGQKICogICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IGFmdGVyIGEgc3VjY2Vzc2Z1bCBmb3JrLgogKiBAcGFyYW0gc3RkZXJyX2xvZyAgICAgICA6IGluZGljYXRlcyBpZiBzdGRlcnIgaXMgYmVpbmcgdXNlZCBmb3IKICogICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nIGFuZCBzaG91bGRuJ3QgYmUgY2xvc2VkCiAqIEByZXR1cm5zIC0xIDogZm9yayBlcnJvcgogKiAgICAgICAgICAgMCA6IGNoaWxkIHByb2Nlc3MgcmV0dXJuaW5nCiAqICAgICAgICAgID4wIDogcGFyZW50IHByb2Nlc3MgcmV0dXJuaW5nLiByZXR1cm5lZCB2YWx1ZSBpcyB0aGUgY2hpbGQgUElELgogKi8KaW50Cm5ldHNubXBfZGFlbW9uaXplKGludCBxdWl0X2ltbWVkaWF0ZWx5LCBpbnQgc3RkZXJyX2xvZykKewogICAgaW50IGkgPSAwOwogICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiZGVhbW9uaXppbmcuLi5cbiIpKTsKI2lmIEhBVkVfRk9SSwojaWYgZGVmaW5lZChkYXJ3aW45KQogICAgIGNoYXIgICAgICAgICAgICBwYXRoIFtQQVRIX01BWF0gPSAiIjsKICAgICB1aW50MzJfdCAgICAgICAgc2l6ZSA9IHNpemVvZiAocGF0aCk7CgogICAgIC8qCiAgICAgICogaWYgd2UgYXJlIGFscmVhZHkgbGF1bmNoZWQgaW4gYSAiZGFlbW9uaXplZCBzdGF0ZSIsIGp1c3QKICAgICAgKiBjbG9zZSAmIHJlZGlyZWN0IHRoZSBmaWxlIGRlc2NyaXB0b3JzCiAgICAgICovCiAgICAgaWYoZ2V0cHBpZCgpIDw9IDIpIHsKICAgICAgICAgX2RhZW1vbl9wcmVwKHN0ZGVycl9sb2cpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CgogICAgIGlmIChfTlNHZXRFeGVjdXRhYmxlUGF0aCAocGF0aCwgJnNpemUpKQogICAgICAgICByZXR1cm4gLTE7CiNlbmRpZgogICAgLyoKICAgICAqIEZvcmsgdG8gcmV0dXJuIGNvbnRyb2wgdG8gdGhlIGludm9raW5nIHByb2Nlc3MgYW5kIHRvCiAgICAgKiBndWFyYW50ZWUgdGhhdCB3ZSBhcmVuJ3QgYSBwcm9jZXNzIGdyb3VwIGxlYWRlci4KICAgICAqLwogICAgaSA9IGZvcmsoKTsKICAgIGlmIChpICE9IDApIHsKICAgICAgICAvKiBQYXJlbnQuICovCiAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiZmlyc3QgZm9yayByZXR1cm5lZCAlZC5cbiIsIGkpKTsKICAgICAgICBpZihpID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsImZpcnN0IGZvcmsgZmFpbGVkIChlcnJubyAlZCkgaW4gIgogICAgICAgICAgICAgICAgICAgICAibmV0c25tcF9kYWVtb25pemUoKVxuIiwgZXJybm8pOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChxdWl0X2ltbWVkaWF0ZWx5KSB7CiAgICAgICAgICAgIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsInBhcmVudCBleGl0aW5nXG4iKSk7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBDaGlsZC4gKi8KI2lmZGVmIEhBVkVfU0VUU0lECiAgICAgICAgLyogQmVjb21lIGEgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlci4gKi8KICAgICAgICBzZXRzaWQoKTsKI2VuZGlmCiAgICAgICAgLyoKICAgICAgICAgKiBGb3JrIHRvIGxldCB0aGUgcHJvY2Vzcy9zZXNzaW9uIGdyb3VwIGxlYWRlciBleGl0LgogICAgICAgICAqLwogICAgICAgIGlmICgoaSA9IGZvcmsoKSkgIT0gMCkgewogICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJzZWNvbmQgZm9yayByZXR1cm5lZCAlZC5cbiIsIGkpKTsKICAgICAgICAgICAgaWYoaSA9PSAtMSkgewogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwic2Vjb25kIGZvcmsgZmFpbGVkIChlcnJubyAlZCkgaW4gIgogICAgICAgICAgICAgICAgICAgICAgICAgIm5ldHNubXBfZGFlbW9uaXplKClcbiIsIGVycm5vKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBQYXJlbnQuICovCiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQojaWZuZGVmIFdJTjMyCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qIENoaWxkLiAqLwogICAgICAgICAgICAKICAgICAgICAgICAgREVCVUdNU0dUKCgiZGFlbW9uaXplIiwiY2hpbGQgY29udGludWluZ1xuIikpOwoKI2lmICEgZGVmaW5lZChkYXJ3aW45KQogICAgICAgICAgICBfZGFlbW9uX3ByZXAoc3RkZXJyX2xvZyk7CiNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogU29tZSBkYXJ3aW4gY2FsbHMgKHVzaW5nIG1hY2ggcG9ydHMpIGRvbid0IHdvcmsgYWZ0ZXIKICAgICAgICAgICAgICAqIGEgZm9yay4gU28sIG5vdyB0aGF0IHdlJ3ZlIGZvcmtlZCwgd2UgcmUtZXhlYyBvdXJzZWxmCiAgICAgICAgICAgICAgKiB0byBlbnN1cmUgdGhhdCB0aGUgY2hpbGQncyBtYWNoIHBvcnRzIGFyZSBhbGwgc2V0IHVwIGNvcnJlY3RseSwKICAgICAgICAgICAgICAqIHRoZSBnZXRwcGlkIGNhbGwgYWJvdmUgd2lsbCBwcmV2ZW50IHRoZSBleGVjIGNoaWxkIGZyb20KICAgICAgICAgICAgICAqIGZvcmtpbmcuLi4KICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgY2hhciAqIGNvbnN0ICphcmd2ID0gKl9OU0dldEFyZ3YgKCk7CiAgICAgICAgICAgICBERUJVR01TR1QoKCJkYWVtb25pemUiLCJyZS1leGVjaW5nIGZvcmtlZCBjaGlsZFxuIikpOwogICAgICAgICAgICAgZXhlY3YgKHBhdGgsIGFyZ3YpOwogICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwiRm9ya2VkIGNoaWxkIHVuYWJsZSB0byByZS1leGVjIC0gJXMuXG4iLCBzdHJlcnJvciAoZXJybm8pKTsKICAgICAgICAgICAgIGV4aXQgKDApOwojZW5kaWYKICAgICAgICB9CiNlbmRpZiAvKiAhV0lOMzIgKi8KICAgIH0KI2VuZGlmIC8qIEhBVkVfRk9SSyAqLwogICAgcmV0dXJuIGk7Cn0KCi8qCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKICovCiNpZmRlZgkJCQkJCQlXSU4zMgojCWRlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOCiMJZGVmaW5lIFdJTjMySU9fSVNfU1RESU8KIwlkZWZpbmUgUEFUSExFTgkxMDI0CgojCWluY2x1ZGUgPHRjaGFyLmg+CiMJaW5jbHVkZSA8d2luZG93cy5oPgoKLyoKICogTWluR1cgZGVmaW5lcyBXSU4zMiwgYnV0IGhhcyB3b3JraW5nIGRpcmVudCBzdHVmZi4KICovCiNpZm5kZWYgSEFWRV9ESVJFTlRfSCAKCi8qCiAqIFRoZSBpZGVhIGhlcmUgaXMgdG8gcmVhZCBhbGwgdGhlIGRpcmVjdG9yeSBuYW1lcyBpbnRvIGEgc3RyaW5nIHRhYmxlCiAqICogKHNlcGFyYXRlZCBieSBudWxscykgYW5kIHdoZW4gb25lIG9mIHRoZSBvdGhlciBkaXIgZnVuY3Rpb25zIGlzIGNhbGxlZAogKiAqIHJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgY3VycmVudCBmaWxlIG5hbWUuCiAqLwpESVIgICAgICAgICAgICAqCm9wZW5kaXIoY29uc3QgY2hhciAqZmlsZW5hbWUpCnsKICAgIERJUiAgICAgICAgICAgICpwOwogICAgbG9uZyAgICAgICAgICAgIGxlbjsKICAgIGxvbmcgICAgICAgICAgICBpZHg7CiAgICBjaGFyICAgICAgICAgICAgc2Nhbm5hbWVzcGNbUEFUSExFTl07CiAgICBjaGFyICAgICAgICAgICAqc2Nhbm5hbWUgPSBzY2FubmFtZXNwYzsKICAgIHN0cnVjdCBzdGF0ICAgICBzYnVmOwogICAgV0lOMzJfRklORF9EQVRBIEZpbmREYXRhOwogICAgSEFORExFICAgICAgICAgIGZoOwoKICAgIC8qCiAgICAgKiBjaGVjayB0byBzZWUgaWYgZmlsZW5hbWUgaXMgYSBkaXJlY3RvcnkgCiAgICAgKi8KICAgIGlmICgoc3RhdChmaWxlbmFtZSwgJnNidWYpIDwgMCkgfHwgKChzYnVmLnN0X21vZGUgJiBTX0lGRElSKSA9PSAwKSkgewogICAgICAgIHJldHVybiBOVUxMOwogICAgfQoKICAgIC8qCiAgICAgKiBnZXQgdGhlIGZpbGUgc3lzdGVtIGNoYXJhY3RlcmlzdGljcyAKICAgICAqLwogICAgLyoKICAgICAqIGlmKEdldEZ1bGxQYXRoTmFtZShmaWxlbmFtZSwgU05NUF9NQVhQQVRILCByb290LCAmZHVtbXkpKSB7CiAgICAgKiAqICAgIGlmKGR1bW15ID0gc3RyY2hyKHJvb3QsICdcXCcpKQogICAgICogKiAgICAgICAgKisrZHVtbXkgPSAnXDAnOwogICAgICogKiAgICBpZihHZXRWb2x1bWVJbmZvcm1hdGlvbihyb290LCB2b2xuYW1lLCBTTk1QX01BWFBBVEgsICZzZXJpYWwsCiAgICAgKiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXhuYW1lLCAmZmxhZ3MsIDAsIDApKSB7CiAgICAgKiAqICAgICAgICBkb3duY2FzZSA9ICEoZmxhZ3MgJiBGU19DQVNFX0lTX1BSRVNFUlZFRCk7CiAgICAgKiAqICAgIH0KICAgICAqICogIH0KICAgICAqICogIGVsc2UgewogICAgICogKiAgICBkb3duY2FzZSA9IFRSVUU7CiAgICAgKiAqICB9CiAgICAgKi8KCiAgICAvKgogICAgICogQ3JlYXRlIHRoZSBzZWFyY2ggcGF0dGVybiAKICAgICAqLwogICAgc3RyY3B5KHNjYW5uYW1lLCBmaWxlbmFtZSk7CgogICAgaWYgKHN0cmNocigiL1xcIiwgKihzY2FubmFtZSArIHN0cmxlbihzY2FubmFtZSkgLSAxKSkgPT0gTlVMTCkKICAgICAgICBzdHJjYXQoc2Nhbm5hbWUsICIvKiIpOwogICAgZWxzZQogICAgICAgIHN0cmNhdChzY2FubmFtZSwgIioiKTsKCiAgICAvKgogICAgICogZG8gdGhlIEZpbmRGaXJzdEZpbGUgY2FsbCAKICAgICAqLwogICAgZmggPSBGaW5kRmlyc3RGaWxlKHNjYW5uYW1lLCAmRmluZERhdGEpOwogICAgaWYgKGZoID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CgogICAgLyoKICAgICAqIEdldCB1cyBhIERJUiBzdHJ1Y3R1cmUgCiAgICAgKi8KICAgIHAgPSAoRElSICopIG1hbGxvYyhzaXplb2YoRElSKSk7CiAgICAvKgogICAgICogTmV3eigxMzAzLCBwLCAxLCBESVIpOyAKICAgICAqLwogICAgaWYgKHAgPT0gTlVMTCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAvKgogICAgICogbm93IGFsbG9jYXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzdHJpbmcgdGFibGUgZm9yCiAgICAgKiAqIHRoZSBmaWxlbmFtZXMgdGhhdCB3ZSBmaW5kLgogICAgICovCiAgICBpZHggPSBzdHJsZW4oRmluZERhdGEuY0ZpbGVOYW1lKSArIDE7CiAgICBwLT5zdGFydCA9IChjaGFyICopIG1hbGxvYyhpZHgpOwogICAgLyoKICAgICAqIE5ldygxMzA0LCBwLT5zdGFydCwgaWR4LCBjaGFyKTsKICAgICAqLwogICAgaWYgKHAtPnN0YXJ0ID09IE5VTEwpIHsKICAgICAgICBmcmVlKHApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgc3RyY3B5KHAtPnN0YXJ0LCBGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgLyoKICAgICAqIGlmKGRvd25jYXNlKQogICAgICogKiAgICBzdHJsd3IocC0+c3RhcnQpOwogICAgICovCiAgICBwLT5uZmlsZXMgPSAwOwoKICAgIC8qCiAgICAgKiBsb29wIGZpbmRpbmcgYWxsIHRoZSBmaWxlcyB0aGF0IG1hdGNoIHRoZSB3aWxkY2FyZAogICAgICogKiAod2hpY2ggc2hvdWxkIGJlIGFsbCBvZiB0aGVtIGluIHRoaXMgZGlyZWN0b3J5ISkuCiAgICAgKiAqIHRoZSB2YXJpYWJsZSBpZHggc2hvdWxkIHBvaW50IG9uZSBwYXN0IHRoZSBudWxsIHRlcm1pbmF0b3IKICAgICAqICogb2YgdGhlIHByZXZpb3VzIHN0cmluZyBmb3VuZC4KICAgICAqLwogICAgd2hpbGUgKEZpbmROZXh0RmlsZShmaCwgJkZpbmREYXRhKSkgewogICAgICAgIGxlbiA9IHN0cmxlbihGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgICAgIC8qCiAgICAgICAgICogYnVtcCB0aGUgc3RyaW5nIHRhYmxlIHNpemUgYnkgZW5vdWdoIGZvciB0aGUKICAgICAgICAgKiAqIG5ldyBuYW1lIGFuZCBpdCdzIG51bGwgdGVybWluYXRvcgogICAgICAgICAqLwogICAgICAgIHAtPnN0YXJ0ID0gKGNoYXIgKikgcmVhbGxvYygodm9pZCAqKSBwLT5zdGFydCwgaWR4ICsgbGVuICsgMSk7CiAgICAgICAgLyoKICAgICAgICAgKiBSZW5ldyhwLT5zdGFydCwgaWR4K2xlbisxLCBjaGFyKTsKICAgICAgICAgKi8KICAgICAgICBpZiAocC0+c3RhcnQgPT0gTlVMTCkgewogICAgICAgICAgICBmcmVlKHApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CiAgICAgICAgc3RyY3B5KCZwLT5zdGFydFtpZHhdLCBGaW5kRGF0YS5jRmlsZU5hbWUpOwogICAgICAgIC8qCiAgICAgICAgICogaWYgKGRvd25jYXNlKSAKICAgICAgICAgKiAqICAgICAgICBzdHJsd3IoJnAtPnN0YXJ0W2lkeF0pOwogICAgICAgICAqLwogICAgICAgIHAtPm5maWxlcysrOwogICAgICAgIGlkeCArPSBsZW4gKyAxOwogICAgfQogICAgRmluZENsb3NlKGZoKTsKICAgIHAtPnNpemUgPSBpZHg7CiAgICBwLT5jdXJyID0gcC0+c3RhcnQ7CiAgICByZXR1cm4gcDsKfQoKCi8qCiAqIFJlYWRkaXIganVzdCByZXR1cm5zIHRoZSBjdXJyZW50IHN0cmluZyBwb2ludGVyIGFuZCBidW1wcyB0aGUKICogKiBzdHJpbmcgcG9pbnRlciB0byB0aGUgbkRsbEV4cG9ydCBlbnRyeS4KICovCnN0cnVjdCBkaXJlY3QgICoKcmVhZGRpcihESVIgKiBkaXJwKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgc3RhdGljIGludCAgICAgIGR1bW15ID0gMDsKCiAgICBpZiAoZGlycC0+Y3VycikgewogICAgICAgIC8qCiAgICAgICAgICogZmlyc3Qgc2V0IHVwIHRoZSBzdHJ1Y3R1cmUgdG8gcmV0dXJuIAogICAgICAgICAqLwogICAgICAgIGxlbiA9IHN0cmxlbihkaXJwLT5jdXJyKTsKICAgICAgICBzdHJjcHkoZGlycC0+ZGlyc3RyLmRfbmFtZSwgZGlycC0+Y3Vycik7CiAgICAgICAgZGlycC0+ZGlyc3RyLmRfbmFtbGVuID0gbGVuOwoKICAgICAgICAvKgogICAgICAgICAqIEZha2UgYW4gaW5vZGUgCiAgICAgICAgICovCiAgICAgICAgZGlycC0+ZGlyc3RyLmRfaW5vID0gZHVtbXkrKzsKCiAgICAgICAgLyoKICAgICAgICAgKiBOb3cgc2V0IHVwIGZvciB0aGUgbkRsbEV4cG9ydCBjYWxsIHRvIHJlYWRkaXIgCiAgICAgICAgICovCiAgICAgICAgZGlycC0+Y3VyciArPSBsZW4gKyAxOwogICAgICAgIGlmIChkaXJwLT5jdXJyID49IChkaXJwLT5zdGFydCArIGRpcnAtPnNpemUpKSB7CiAgICAgICAgICAgIGRpcnAtPmN1cnIgPSBOVUxMOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICYoZGlycC0+ZGlyc3RyKTsKICAgIH0gZWxzZQogICAgICAgIHJldHVybiBOVUxMOwp9CgovKgogKiBmcmVlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IG9wZW5kaXIgCiAqLwppbnQKY2xvc2VkaXIoRElSICogZGlycCkKewogICAgZnJlZShkaXJwLT5zdGFydCk7CiAgICBmcmVlKGRpcnApOwogICAgcmV0dXJuIDE7Cn0KI2VuZGlmIC8qIEhBVkVfRElSRU5UX0ggKi8KCiNpZm5kZWYgSEFWRV9HRVRUSU1FT0ZEQVkKCmludApnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQp7CiAgICBzdHJ1Y3QgX3RpbWViICAgdGltZWJ1ZmZlcjsKCiAgICBfZnRpbWUoJnRpbWVidWZmZXIpOwogICAgdHYtPnR2X3VzZWMgPSB0aW1lYnVmZmVyLm1pbGxpdG0gKiAxMDAwOwogICAgdHYtPnR2X3NlYyA9IHRpbWVidWZmZXIudGltZTsKICAgIHJldHVybiAoMCk7Cn0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhSEFWRV9HRVRUSU1FT0ZEQVkgKi8KCmluX2FkZHJfdApnZXRfbXlhZGRyKHZvaWQpCnsKICAgIGNoYXIgICAgICAgICAgICBsb2NhbF9ob3N0WzEzMF07CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwogICAgTFBIT1NURU5UICAgICAgIGxwc3RIb3N0ZW50OwogICAgU09DS0FERFJfSU4gICAgIGluX2FkZHIsIHJlbW90ZV9pbl9hZGRyOwogICAgU09DS0VUICAgICAgICAgIGhTb2NrOwogICAgaW50ICAgICAgICAgICAgIG5BZGRyU2l6ZSA9IHNpemVvZihTT0NLQUREUik7CgogICAgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOwoKICAgIHJlc3VsdCA9IGdldGhvc3RuYW1lKGxvY2FsX2hvc3QsIHNpemVvZihsb2NhbF9ob3N0KSk7CiAgICBpZiAocmVzdWx0ID09IDApIHsKICAgICAgICBscHN0SG9zdGVudCA9IGdldGhvc3RieW5hbWUoKExQU1RSKSBsb2NhbF9ob3N0KTsKICAgICAgICBpZiAobHBzdEhvc3RlbnQpIHsKICAgICAgICAgICAgaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPQogICAgICAgICAgICAgICAgKigodV9sb25nIEZBUiAqKSAobHBzdEhvc3RlbnQtPmhfYWRkcikpOwogICAgICAgICAgICByZXR1cm4gKChpbl9hZGRyX3QpIGluX2FkZHIuc2luX2FkZHIuc19hZGRyKTsKICAgICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIGlmIHdlIGFyZSBoZXJlLCB0aGFuIHdlIGRvbid0IGhhdmUgaG9zdCBhZGRyIAogICAgICovCiAgICBoU29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKICAgIGlmIChoU29jayAhPSBJTlZBTElEX1NPQ0tFVCkgewogICAgICAgIC8qCiAgICAgICAgICogY29ubmVjdCB0byBhbnkgcG9ydCBhbmQgYWRkcmVzcyAKICAgICAgICAgKi8KICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fcG9ydCA9IGh0b25zKElQUE9SVF9FQ0hPKTsKICAgICAgICByZW1vdGVfaW5fYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpbmV0X2FkZHIoIjAuMC4wLjAiKTsKICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBjb25uZWN0KGhTb2NrLCAoTFBTT0NLQUREUikgJiByZW1vdGVfaW5fYWRkciwKICAgICAgICAgICAgICAgICAgICBzaXplb2YoU09DS0FERFIpKTsKICAgICAgICBpZiAocmVzdWx0ICE9IFNPQ0tFVF9FUlJPUikgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBnZXQgbG9jYWwgaXAgYWRkcmVzcyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldHNvY2tuYW1lKGhTb2NrLCAoTFBTT0NLQUREUikgJiBpbl9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAoaW50IEZBUiAqKSAmbkFkZHJTaXplKTsKICAgICAgICB9CiAgICAgICAgY2xvc2Vzb2NrZXQoaFNvY2spOwogICAgfQogICAgcmV0dXJuICgoaW5fYWRkcl90KSBpbl9hZGRyLnNpbl9hZGRyLnNfYWRkcik7Cn0KCmxvbmcKZ2V0X3VwdGltZSh2b2lkKQp7CiAgICBsb25nICAgICAgICAgICAgcmV0dXJuX3ZhbHVlID0gMDsKICAgIERXT1JEICAgICAgICAgICBidWZmZXJzaXplID0gKHNpemVvZihQRVJGX0RBVEFfQkxPQ0spICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihQRVJGX09CSkVDVF9UWVBFKSksCiAgICAgICAgdHlwZSA9IFJFR19FWFBBTkRfU1o7CiAgICBQUEVSRl9EQVRBX0JMT0NLIHBlcmZkYXRhID0gTlVMTDsKCiAgICAvKgogICAgICogbWluIHJlcXVpcmVtZW50IGlzIG9uZSBQRVJGX0RBVEFfQkxPQ0sgcGx1cyBvbmUgUEVSRl9PQkpFQ1RfVFlQRSAKICAgICAqLwogICAgcGVyZmRhdGEgPSAoUFBFUkZfREFUQV9CTE9DSykgbWFsbG9jKGJ1ZmZlcnNpemUpOwogICAgaWYgKCFwZXJmZGF0YSkKICAgICAgICByZXR1cm4gMDsKCiAgICBtZW1zZXQocGVyZmRhdGEsIDAsIGJ1ZmZlcnNpemUpOwoKICAgIFJlZ1F1ZXJ5VmFsdWVFeChIS0VZX1BFUkZPUk1BTkNFX0RBVEEsCiAgICAgICAgICAgICAgICAgICAgIkdsb2JhbCIsIE5VTEwsICZ0eXBlLCAoTFBCWVRFKSBwZXJmZGF0YSwgJmJ1ZmZlcnNpemUpOwoKICAgIC8qCiAgICAgKiB3ZSBjYW4gbm90IHJlbHkgb24gdGhlIHJldHVybiB2YWx1ZSBzaW5jZSB0aGVyZSBpcyBhbHdheXMgbW9yZSBzbwogICAgICogd2UgY2hlY2sgdGhlIHNpZ25hdHVyZSAKICAgICAqLwoKICAgIGlmICh3Y3NuY21wKHBlcmZkYXRhLT5TaWduYXR1cmUsIEwiUEVSRiIsIDQpID09IDApIHsKICAgICAgICAvKgogICAgICAgICAqIHNpZ25hdHVyZSBvaywgYW5kIGFsbCB3ZSBuZWVkIGlzIGluIHRoZSBpbiB0aGUgUEVSRl9EQVRBX0JMT0NLIAogICAgICAgICAqLwogICAgICAgIHJldHVybl92YWx1ZSA9IChsb25nKSAoKHBlcmZkYXRhLT5QZXJmVGltZTEwMG5TZWMuUXVhZFBhcnQgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMT05HTE9ORykgMTAwMDAwKSk7CiAgICB9IGVsc2UKICAgICAgICByZXR1cm5fdmFsdWUgPSBHZXRUaWNrQ291bnQoKSAvIDEwOwoKICAgIFJlZ0Nsb3NlS2V5KEhLRVlfUEVSRk9STUFOQ0VfREFUQSk7CiAgICBmcmVlKHBlcmZkYXRhKTsKCiAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwp9CgpjaGFyICAgICAgICAgICAqCndpbnNvY2tfc3RhcnR1cCh2b2lkKQp7CiAgICBXT1JEICAgICAgICAgICAgVmVyc2lvblJlcXVlc3RlZDsKICAgIFdTQURBVEEgICAgICAgICBzdFdTQURhdGE7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0YXRpYyBjaGFyICAgICBlcnJtc2dbMTAwXTsKCgkvKiB3aW5zb2NrIDE6IHVzZSBNQUtFV09SRCgxLDEpICovCgkvKiB3aW5zb2NrIDI6IHVzZSBNQUtFV09SRCgyLDIpICovCgogICAgVmVyc2lvblJlcXVlc3RlZCA9IE1BS0VXT1JEKDIsMik7CiAgICBpID0gV1NBU3RhcnR1cChWZXJzaW9uUmVxdWVzdGVkLCAmc3RXU0FEYXRhKTsKICAgIGlmIChpICE9IDApIHsKICAgICAgICBpZiAoaSA9PSBXU0FWRVJOT1RTVVBQT1JURUQpCiAgICAgICAgICAgIHNwcmludGYoZXJybXNnLAogICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gaW5pdC4gc29ja2V0IGxpYiwgZG9lcyBub3Qgc3VwcG9ydCAxLjEiKTsKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3ByaW50ZihlcnJtc2csICJTb2NrZXQgU3RhcnR1cCBlcnJvciAlZCIsIGkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKGVycm1zZyk7CiAgICB9CiAgICByZXR1cm4gKE5VTEwpOwp9Cgp2b2lkCndpbnNvY2tfY2xlYW51cCh2b2lkKQp7CiAgICBXU0FDbGVhbnVwKCk7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogISBXSU4zMiAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIFhYWCAgV2hhdCBpZiB3ZSBoYXZlIG11bHRpcGxlIGFkZHJlc3Nlcz8gIE9yIG5vIGFkZHJlc3NlcyBmb3IgdGhhdCBtYXR0ZXI/CiAqIFhYWCAgQ291bGQgaXQgYmUgY29tcHV0ZWQgb25jZSB0aGVuIGNhY2hlZD8gIFByb2JhYmx5IG5vdCB3b3J0aCBpdCAobm90CiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHZlcnkgb2Z0ZW4pLgogKi8KaW5fYWRkcl90CmdldF9teWFkZHIodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIHNkLCBpLCBsYXN0bGVuID0gMDsKICAgIHN0cnVjdCBpZmNvbmYgICBpZmM7CiAgICBzdHJ1Y3QgaWZyZXEgICAqaWZycCA9IE5VTEw7CiAgICBpbl9hZGRyX3QgICAgICAgYWRkcjsKICAgIGNoYXIgICAgICAgICAgICpidWYgPSBOVUxMOwoKICAgIGlmICgoc2QgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qCiAgICAgKiBDb3BlIHdpdGggbG90cyBvZiBpbnRlcmZhY2VzIGFuZCBicm9rZW5uZXNzIG9mIGlvY3RsIFNJT0NHSUZDT05GIG9uCiAgICAgKiBzb21lIHBsYXRmb3Jtczsgc2VlIFcuIFIuIFN0ZXZlbnMsIGBgVW5peCBOZXR3b3JrIFByb2dyYW1taW5nIFZvbHVtZQogICAgICogSScnLCBwLjQzNS4gIAogICAgICovCgogICAgZm9yIChpID0gODs7IGkgKz0gOCkgewogICAgICAgIGJ1ZiA9IChjaGFyICopIGNhbGxvYyhpLCBzaXplb2Yoc3RydWN0IGlmcmVxKSk7CiAgICAgICAgaWYgKGJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmYy5pZmNfbGVuID0gaSAqIHNpemVvZihzdHJ1Y3QgaWZyZXEpOwogICAgICAgIGlmYy5pZmNfYnVmID0gKGNhZGRyX3QpIGJ1ZjsKCiAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGQ09ORiwgKGNoYXIgKikgJmlmYykgPCAwKSB7CiAgICAgICAgICAgIGlmIChlcnJubyAhPSBFSU5WQUwgfHwgbGFzdGxlbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogU29tZXRoaW5nIGhhcyBnb25lIGdlbnVpbmVseSB3cm9uZy4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgICAgICAgICBjbG9zZShzZCk7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBPdGhlcndpc2UsIGl0IGNvdWxkIGp1c3QgYmUgdGhhdCB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbC4gIAogICAgICAgICAgICAgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaWZjLmlmY19sZW4gPT0gbGFzdGxlbikgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIFRoZSBsZW5ndGggaXMgdGhlIHNhbWUgYXMgdGhlIGxhc3QgdGltZTsgd2UncmUgZG9uZS4gIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0bGVuID0gaWZjLmlmY19sZW47CiAgICAgICAgfQogICAgICAgIGZyZWUoYnVmKTsKICAgIH0KCiAgICBmb3IgKGlmcnAgPSBpZmMuaWZjX3JlcTsKICAgICAgICAoY2hhciAqKWlmcnAgPCAoY2hhciAqKWlmYy5pZmNfcmVxICsgaWZjLmlmY19sZW47CiNpZmRlZiBIQVZFX1NUUlVDVF9TT0NLQUREUl9TQV9MRU4KICAgICAgICBpZnJwID0gKHN0cnVjdCBpZnJlcSAqKSgoKGNoYXIgKikgaWZycCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihpZnJwLT5pZnJfbmFtZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcnAtPmlmcl9hZGRyLnNhX2xlbikKI2Vsc2UKICAgICAgICBpZnJwKysKI2VuZGlmCiAgICAgICAgKSB7CiAgICAgICAgaWYgKGlmcnAtPmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBhZGRyID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZnJwLT5pZnJfYWRkcikpLT5zaW5fYWRkci5zX2FkZHI7CgogICAgICAgIGlmIChpb2N0bChzZCwgU0lPQ0dJRkZMQUdTLCAoY2hhciAqKSBpZnJwKSA8IDApIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmICgoaWZycC0+aWZyX2ZsYWdzICYgSUZGX1VQKQojaWZkZWYgSUZGX1JVTk5JTkcKICAgICAgICAgICAgJiYgKGlmcnAtPmlmcl9mbGFncyAmIElGRl9SVU5OSU5HKQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElGRl9SVU5OSU5HICovCiAgICAgICAgICAgICYmICEoaWZycC0+aWZyX2ZsYWdzICYgSUZGX0xPT1BCQUNLKQogICAgICAgICAgICAmJiBhZGRyICE9IExPT1BCQUNLKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEkgKnJlYWxseSogZG9uJ3QgdW5kZXJzdGFuZCB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICBQZXJoYXBzIGZvcgogICAgICAgICAgICAgKiBzb21lIGJyb2tlbiBwbGF0Zm9ybT8gIExlYXZlIGl0IGZvciBub3cuICBKQlBOICAKICAgICAgICAgICAgICovCiNpZmRlZiBTWVNfSU9DVExfSF9IQVNfU0lPQ0dJRkFERFIKICAgICAgICAgICAgaWYgKGlvY3RsKHNkLCBTSU9DR0lGQUREUiwgKGNoYXIgKikgaWZycCkgPCAwKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZGRyID0KICAgICAgICAgICAgICAgICgoc3RydWN0IHNvY2thZGRyX2luICopICYoaWZycC0+aWZyX2FkZHIpKS0+c2luX2FkZHIuCiAgICAgICAgICAgICAgICBzX2FkZHI7CiNlbmRpZgogICAgICAgICAgICBmcmVlKGJ1Zik7CiAgICAgICAgICAgIGNsb3NlKHNkKTsKICAgICAgICAgICAgcmV0dXJuIGFkZHI7CiAgICAgICAgfQogICAgfQogICAgZnJlZShidWYpOwogICAgY2xvc2Uoc2QpOwogICAgcmV0dXJuIDA7Cn0KCgojaWYgIWRlZmluZWQoc29sYXJpczIpICYmICFkZWZpbmVkKGxpbnV4KSAmJiAhZGVmaW5lZChjeWd3aW4pCi8qCiAqIFJldHVybnMgYm9vdHRpbWUgaW4gY2VudGlzZWNvbmRzKCEpLgogKiAgICAgIENhY2hlcyB0aGlzIGZvciBmdXR1cmUgdXNlLgogKi8KbG9uZwpnZXRfYm9vdHRpbWUodm9pZCkKewogICAgc3RhdGljIGxvbmcgICAgIGJvb3R0aW1lX2NzZWNzID0gMDsKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBwc3Rfc3RhdGljIHBzdF9idWY7CiNlbHNlCiAgICBzdHJ1Y3QgdGltZXZhbCAgYm9vdHRpbWU7CiNpZmRlZglORVRTTk1QX0NBTl9VU0VfU1lTQ1RMCiAgICBpbnQgICAgICAgICAgICAgbWliWzJdOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKI2VsaWYgZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfTkxJU1QpCiAgICBpbnQgICAgICAgICAgICAga21lbTsKICAgIHN0YXRpYyBzdHJ1Y3Qgbmxpc3QgbmxbXSA9IHsKI2lmICFkZWZpbmVkKGhwdXgpCiAgICAgICAgeyhjaGFyICopICJfYm9vdHRpbWUifSwKI2Vsc2UKICAgICAgICB7KGNoYXIgKikgImJvb3R0aW1lIn0sCiNlbmRpZgogICAgICAgIHsoY2hhciAqKSAiIn0KICAgIH07CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMCB8fCBocHV4IDExICovCgoKICAgIGlmIChib290dGltZV9jc2VjcyAhPSAwKQogICAgICAgIHJldHVybiAoYm9vdHRpbWVfY3NlY3MpOwoKI2lmIGRlZmluZWQoaHB1eDEwKSB8fCBkZWZpbmVkKGhwdXgxMSkKICAgIHBzdGF0X2dldHN0YXRpYygmcHN0X2J1Ziwgc2l6ZW9mKHN0cnVjdCBwc3Rfc3RhdGljKSwgMSwgMCk7CiAgICBib290dGltZV9jc2VjcyA9IHBzdF9idWYuYm9vdF90aW1lICogMTAwOwojZWxpZiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMCiAgICBtaWJbMF0gPSBDVExfS0VSTjsKICAgIG1pYlsxXSA9IEtFUk5fQk9PVFRJTUU7CgogICAgbGVuID0gc2l6ZW9mKGJvb3R0aW1lKTsKCiAgICBzeXNjdGwobWliLCAyLCAmYm9vdHRpbWUsICZsZW4sIE5VTEwsIDApOwogICAgYm9vdHRpbWVfY3NlY3MgPSAoYm9vdHRpbWUudHZfc2VjICogMTAwKSArIChib290dGltZS50dl91c2VjIC8gMTAwMDApOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfQ0FOX1VTRV9OTElTVCkKICAgIGlmICgoa21lbSA9IG9wZW4oIi9kZXYva21lbSIsIDApKSA8IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBubGlzdChLRVJORUxfTE9DLCBubCk7CiAgICBpZiAobmxbMF0ubl90eXBlID09IDApIHsKICAgICAgICBjbG9zZShrbWVtKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBsc2VlayhrbWVtLCAobG9uZykgbmxbMF0ubl92YWx1ZSwgTF9TRVQpOwogICAgcmVhZChrbWVtLCAmYm9vdHRpbWUsIHNpemVvZihib290dGltZSkpOwogICAgY2xvc2Uoa21lbSk7CiAgICBib290dGltZV9jc2VjcyA9IChib290dGltZS50dl9zZWMgKiAxMDApICsgKGJvb3R0aW1lLnR2X3VzZWMgLyAxMDAwMCk7CiNlbHNlCiAgICByZXR1cm4gMDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTAgfHwgaHB1eCAxMSAqLwoKICAgIHJldHVybiAoYm9vdHRpbWVfY3NlY3MpOwp9CiNlbmRpZgoKLyoKICogUmV0dXJucyB1cHRpbWUgaW4gY2VudGlzZWNvbmRzKCEpLgogKi8KbG9uZwpnZXRfdXB0aW1lKHZvaWQpCnsKI2lmICFkZWZpbmVkKHNvbGFyaXMyKSAmJiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoY3lnd2luKSAmJiAhZGVmaW5lZChhaXg0KSAmJiAhZGVmaW5lZChhaXg1KSAmJiAhZGVmaW5lZChhaXg2KQogICAgc3RydWN0IHRpbWV2YWwgIG5vdzsKICAgIGxvbmcgICAgICAgICAgICBib290dGltZV9jc2Vjcywgbm93dGltZV9jc2VjczsKCiAgICBib290dGltZV9jc2VjcyA9IGdldF9ib290dGltZSgpOwogICAgaWYgKGJvb3R0aW1lX2NzZWNzID09IDApCiAgICAgICAgcmV0dXJuIDA7CiAgICBnZXR0aW1lb2ZkYXkoJm5vdywgKHN0cnVjdCB0aW1lem9uZSAqKSAwKTsKICAgIG5vd3RpbWVfY3NlY3MgPSAobm93LnR2X3NlYyAqIDEwMCkgKyAobm93LnR2X3VzZWMgLyAxMDAwMCk7CgogICAgcmV0dXJuIChub3d0aW1lX2NzZWNzIC0gYm9vdHRpbWVfY3NlY3MpOwojZW5kaWYKCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogICAgc3RydWN0IG5saXN0IG5sOwogICAgaW50IGttZW07CiAgICB0aW1lX3QgbGJvbHQ7CiAgICBubC5uX25hbWUgPSAoY2hhciAqKSAibGJvbHQiOwogICAgaWYoa25saXN0KCZubCwgMSwgc2l6ZW9mKHN0cnVjdCBubGlzdCkpICE9IDApIHJldHVybigwKTsKICAgIGlmKG5sLm5fdHlwZSA9PSAwIHx8IG5sLm5fdmFsdWUgPT0gMCkgcmV0dXJuKDApOwogICAgaWYoKGttZW0gPSBvcGVuKCIvZGV2L21lbSIsIDApKSA8IDApIHJldHVybiAwOwogICAgbHNlZWsoa21lbSwgKGxvbmcpIG5sLm5fdmFsdWUsIExfU0VUKTsKICAgIHJlYWQoa21lbSwgJmxib2x0LCBzaXplb2YobGJvbHQpKTsKICAgIGNsb3NlKGttZW0pOwogICAgcmV0dXJuKGxib2x0KTsKI2VuZGlmCgojaWZkZWYgc29sYXJpczIKICAgIGtzdGF0X2N0bF90ICAgICprc2MgPSBrc3RhdF9vcGVuKCk7CiAgICBrc3RhdF90ICAgICAgICAqa3M7CiAgICBraWRfdCAgICAgICAgICAga2lkOwogICAga3N0YXRfbmFtZWRfdCAgKm5hbWVkOwogICAgdV9sb25nICAgICAgICAgIGxib2x0ID0gMDsKCiAgICBpZiAoa3NjKSB7CiAgICAgICAga3MgPSBrc3RhdF9sb29rdXAoa3NjLCAidW5peCIsIC0xLCAic3lzdGVtX21pc2MiKTsKICAgICAgICBpZiAoa3MpIHsKICAgICAgICAgICAga2lkID0ga3N0YXRfcmVhZChrc2MsIGtzLCBOVUxMKTsKICAgICAgICAgICAgaWYgKGtpZCAhPSAtMSkgewogICAgICAgICAgICAgICAgbmFtZWQgPSBrc3RhdF9kYXRhX2xvb2t1cChrcywgImxib2x0Iik7CiAgICAgICAgICAgICAgICBpZiAobmFtZWQpIHsKI2lmZGVmIEtTVEFUX0RBVEFfVUlOVDMyCiAgICAgICAgICAgICAgICAgICAgbGJvbHQgPSBuYW1lZC0+dmFsdWUudWkzMjsKI2Vsc2UKICAgICAgICAgICAgICAgICAgICBsYm9sdCA9IG5hbWVkLT52YWx1ZS51bDsKI2VuZGlmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAga3N0YXRfY2xvc2Uoa3NjKTsKICAgIH0KICAgIHJldHVybiBsYm9sdDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKI2lmZGVmIGxpbnV4CiAgICBGSUxFICAgICAgICAgICAqaW4gPSBmb3BlbigiL3Byb2MvdXB0aW1lIiwgInIiKTsKICAgIGxvbmcgICAgICAgICAgICB1cHRpbSA9IDAsIGEsIGI7CiAgICBpZiAoaW4pIHsKICAgICAgICBpZiAoMiA9PSBmc2NhbmYoaW4sICIlbGQuJWxkIiwgJmEsICZiKSkKICAgICAgICAgICAgdXB0aW0gPSBhICogMTAwICsgYjsKICAgICAgICBmY2xvc2UoaW4pOwogICAgfQogICAgcmV0dXJuIHVwdGltOwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCgojaWZkZWYgY3lnd2luCiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCiNlbmRpZgp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICEgV0lOMzIgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgppbnQKbmV0c25tcF9nZXRob3N0YnluYW1lX3Y0KGNvbnN0IGNoYXIqIG5hbWUsIGluX2FkZHJfdCAqYWRkcl9vdXQpCnsKCiNpZiBIQVZFX0dFVEFERFJJTkZPCiAgICBzdHJ1Y3QgYWRkcmluZm8gKmFkZHJzID0gTlVMTDsKICAgIHN0cnVjdCBhZGRyaW5mbyBoaW50OwogICAgaW50ICAgICAgICAgICAgIGVycjsKCiAgICBtZW1zZXQoJmhpbnQsIDAsIHNpemVvZiBoaW50KTsKICAgIGhpbnQuYWlfZmxhZ3MgPSAwOwogICAgaGludC5haV9mYW1pbHkgPSBQRl9JTkVUOwogICAgaGludC5haV9zb2NrdHlwZSA9IFNPQ0tfREdSQU07CiAgICBoaW50LmFpX3Byb3RvY29sID0gMDsKCiAgICBlcnIgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmaGludCwgJmFkZHJzKTsKICAgIGlmIChlcnIgIT0gMCkgewojaWYgSEFWRV9HQUlfU1RSRVJST1IKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiZ2V0YWRkcmluZm86ICVzICVzXG4iLCBuYW1lLAogICAgICAgICAgICAgICAgIGdhaV9zdHJlcnJvcihlcnIpKTsKI2Vsc2UKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiZ2V0YWRkcmluZm86ICVzIChlcnJvciAlZClcbiIsIG5hbWUsCiAgICAgICAgICAgICAgICAgZXJyKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgaWYgKGFkZHJzICE9IE5VTEwpIHsKICAgICAgICBtZW1jcHkoYWRkcl9vdXQsCiAgICAgICAgICAgICAgICYoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBhZGRycy0+YWlfYWRkciktPnNpbl9hZGRyLAogICAgICAgICAgICAgICBzaXplb2YoaW5fYWRkcl90KSk7CiAgICAgICAgZnJlZWFkZHJpbmZvKGFkZHJzKTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlIElQdjQgaG9zdG5hbWVcbiIpKTsKICAgIH0KICAgIHJldHVybiAwOwoKI2VsaWYgSEFWRV9HRVRIT1NUQllOQU1FCiAgICBzdHJ1Y3QgaG9zdGVudCAqaHAgPSBOVUxMOwoKICAgIGhwID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKICAgIGlmIChocCA9PSBOVUxMKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChjb3VsZG4ndCByZXNvbHZlKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSBpZiAoaHAtPmhfYWRkcnR5cGUgIT0gQUZfSU5FVCkgewogICAgICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgICAgICJob3N0bmFtZSAobm90IEFGX0lORVQhKVxuIikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0gZWxzZSB7CiAgICAgICAgREVCVUdNU0dUTCgoImdldF90aGlzYWRkciIsCiAgICAgICAgICAgICAgICAgICAgImhvc3RuYW1lIChyZXNvbHZlZCBva2F5KVxuIikpOwogICAgICAgIG1lbWNweShhZGRyX291dCwgaHAtPmhfYWRkciwgc2l6ZW9mKGluX2FkZHJfdCkpOwogICAgfQogICAgcmV0dXJuIDA7CgojZWxpZiBIQVZFX0dFVElQTk9ERUJZTkFNRQogICAgc3RydWN0IGhvc3RlbnQgKmhwID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICBlcnI7CgogICAgaHAgPSBnZXRpcG5vZGVieW5hbWUocGVlcm5hbWUsIEFGX0lORVQsIDAsICZlcnIpOwogICAgaWYgKGhwID09IE5VTEwpIHsKICAgICAgICBERUJVR01TR1RMKCgiZ2V0X3RoaXNhZGRyIiwKICAgICAgICAgICAgICAgICAgICAiaG9zdG5hbWUgKGNvdWxkbid0IHJlc29sdmUgPSAlZClcbiIsIGVycikpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIERFQlVHTVNHVEwoKCJnZXRfdGhpc2FkZHIiLAogICAgICAgICAgICAgICAgImhvc3RuYW1lIChyZXNvbHZlZCBva2F5KVxuIikpOwogICAgbWVtY3B5KGFkZHJfb3V0LCBocC0+aF9hZGRyLCBzaXplb2YoaW5fYWRkcl90KSk7CiAgICByZXR1cm4gMDsKCiNlbHNlIC8qIEhBVkVfR0VUSVBOT0RFQllOQU1FICovCiAgICByZXR1cm4gLTE7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSEFWRV9TVFJOQ0FTRUNNUAoKLyoKICogdGVzdCBmb3IgTlVMTCBwb2ludGVycyBiZWZvcmUgYW5kIE5VTEwgY2hhcmFjdGVycyBhZnRlcgogKiAqIGNvbXBhcmluZyBwb3NzaWJseSBub24tTlVMTCBzdHJpbmdzLgogKiAqIFdBUk5JTkc6IFRoaXMgZnVuY3Rpb24gZG9lcyBOT1QgY2hlY2sgZm9yIGFycmF5IG92ZXJmbG93LgogKi8KaW50CnN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG5jaCkKewogICAgc2l6ZV90ICAgICAgICAgIGlpOwogICAgaW50ICAgICAgICAgICAgIHJlcyA9IC0xOwoKICAgIGlmICghczEpIHsKICAgICAgICBpZiAoIXMyKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gKC0xKTsKICAgIH0KICAgIGlmICghczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICBmb3IgKGlpID0gMDsgKGlpIDwgbmNoKSAmJiAqczEgJiYgKnMyOyBpaSsrLCBzMSsrLCBzMisrKSB7CiAgICAgICAgcmVzID0gKGludCkgKHRvbG93ZXIoKnMxKSAtIHRvbG93ZXIoKnMyKSk7CiAgICAgICAgaWYgKHJlcyAhPSAwKQogICAgICAgICAgICBicmVhazsKICAgIH0KCiAgICBpZiAoaWkgPT0gbmNoKSB7CiAgICAgICAgczEtLTsKICAgICAgICBzMi0tOwogICAgfQoKICAgIGlmICghKnMxKSB7CiAgICAgICAgaWYgKCEqczIpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIHJldHVybiAoLTEpOwogICAgfQogICAgaWYgKCEqczIpCiAgICAgICAgcmV0dXJuICgxKTsKCiAgICByZXR1cm4gKHJlcyk7Cn0KCmludApzdHJjYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKewogICAgcmV0dXJuIHN0cm5jYXNlY21wKHMxLCBzMiwgMTAwMDAwMCk7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJOQ0FTRUNNUCAqLwoKCiNpZm5kZWYgSEFWRV9TVFJEVVAKY2hhciAgICAgICAgICAgKgpzdHJkdXAoY29uc3QgY2hhciAqc3JjKQp7CiAgICBpbnQgICAgICAgICAgICAgbGVuOwogICAgY2hhciAgICAgICAgICAgKmRzdDsKCiAgICBsZW4gPSBzdHJsZW4oc3JjKSArIDE7CiAgICBpZiAoKGRzdCA9IChjaGFyICopIG1hbGxvYyhsZW4pKSA9PSBOVUxMKQogICAgICAgIHJldHVybiAoTlVMTCk7CiAgICBzdHJjcHkoZHN0LCBzcmMpOwogICAgcmV0dXJuIChkc3QpOwp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSEFWRV9TVFJEVVAgKi8KCiNpZm5kZWYgSEFWRV9TRVRFTlYKaW50CnNldGVudihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IG92ZXJ3cml0ZSkKewogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICBpZiAob3ZlcndyaXRlID09IDApIHsKICAgICAgICBpZiAoZ2V0ZW52KG5hbWUpKQogICAgICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNwID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihuYW1lKSArIHN0cmxlbih2YWx1ZSkgKyAyKTsKICAgIGlmIChjcCA9PSBOVUxMKQogICAgICAgIHJldHVybiAtMTsKICAgIHNwcmludGYoY3AsICIlcz0lcyIsIG5hbWUsIHZhbHVlKTsKICAgIHJldCA9IHB1dGVudihjcCk7CiNpZmRlZiBXSU4zMgogICAgZnJlZShjcCk7CiNlbmRpZgogICAgcmV0dXJuIHJldDsKfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU0VURU5WICovCgovKiByZXR1cm5zIGNlbnRpc2Vjb25kcyAqLwppbnQKY2FsY3VsYXRlX3RpbWVfZGlmZihzdHJ1Y3QgdGltZXZhbCAqbm93LCBzdHJ1Y3QgdGltZXZhbCAqdGhlbikKewogICAgc3RydWN0IHRpbWV2YWwgIHRtcCwgZGlmZjsKICAgIG1lbWNweSgmdG1wLCBub3csIHNpemVvZihzdHJ1Y3QgdGltZXZhbCkpOwogICAgdG1wLnR2X3NlYy0tOwogICAgdG1wLnR2X3VzZWMgKz0gMTAwMDAwMEw7CiAgICBkaWZmLnR2X3NlYyA9IHRtcC50dl9zZWMgLSB0aGVuLT50dl9zZWM7CiAgICBkaWZmLnR2X3VzZWMgPSB0bXAudHZfdXNlYyAtIHRoZW4tPnR2X3VzZWM7CiAgICBpZiAoZGlmZi50dl91c2VjID4gMTAwMDAwMEwpIHsKICAgICAgICBkaWZmLnR2X3VzZWMgLT0gMTAwMDAwMEw7CiAgICAgICAgZGlmZi50dl9zZWMrKzsKICAgIH0KICAgIHJldHVybiAoKGRpZmYudHZfc2VjICogMTAwKSArIChkaWZmLnR2X3VzZWMgLyAxMDAwMCkpOwp9CgovKiByZXR1cm5zIGRpZmYgaW4gcm91bmRlZCBzZWNvbmRzICovCnVfaW50CmNhbGN1bGF0ZV9zZWN0aW1lX2RpZmYoc3RydWN0IHRpbWV2YWwgKm5vdywgc3RydWN0IHRpbWV2YWwgKnRoZW4pCnsKICAgIHN0cnVjdCB0aW1ldmFsICB0bXAsIGRpZmY7CiAgICBtZW1jcHkoJnRtcCwgbm93LCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsKICAgIHRtcC50dl9zZWMtLTsKICAgIHRtcC50dl91c2VjICs9IDEwMDAwMDBMOwogICAgZGlmZi50dl9zZWMgPSB0bXAudHZfc2VjIC0gdGhlbi0+dHZfc2VjOwogICAgZGlmZi50dl91c2VjID0gdG1wLnR2X3VzZWMgLSB0aGVuLT50dl91c2VjOwogICAgaWYgKGRpZmYudHZfdXNlYyA+IDEwMDAwMDBMKSB7CiAgICAgICAgZGlmZi50dl91c2VjIC09IDEwMDAwMDBMOwogICAgICAgIGRpZmYudHZfc2VjKys7CiAgICB9CiAgICBpZiAoZGlmZi50dl91c2VjID49IDUwMDAwMEwpCiAgICAgICAgcmV0dXJuIGRpZmYudHZfc2VjICsgMTsKICAgIHJldHVybiAgZGlmZi50dl9zZWM7Cn0KCiNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCi8qCiAqIG9ubHkgZ2xpYmMyIGhhcyB0aGlzLgogKi8KY2hhciAgICAgICAgICAgKgpzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpCnsKICAgIGNvbnN0IGNoYXIgICAgICpjcDEgPSBoYXlzdGFjaywgKmNwMiA9IG5lZWRsZTsKICAgIGNvbnN0IGNoYXIgICAgICpjeDsKICAgIGludCAgICAgICAgICAgICB0c3RjaDEsIHRzdGNoMjsKCiAgICAvKgogICAgICogcHJpbnRmKCJsb29raW5nIGZvciAnJXMnIGluICclcydcbiIsIG5lZWRsZSwgaGF5c3RhY2spOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiBjcDIgJiYgKmNwMSAmJiAqY3AyKQogICAgICAgIGZvciAoY3AxID0gaGF5c3RhY2ssIGNwMiA9IG5lZWRsZTsgKmNwMTspIHsKICAgICAgICAgICAgY3ggPSBjcDE7CiAgICAgICAgICAgIGNwMiA9IG5lZWRsZTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiVCclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAoISpjcDIpIHsgICAgLyogZm91bmQgdGhlIG5lZWRsZSAqLwogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogcHJpbnRmKCJcbmZvdW5kICclcycgaW4gJyVzJ1xuIiwgbmVlZGxlLCBjeCk7IAogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGN4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghKmNwMSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICB0c3RjaDEgPSB0b3VwcGVyKCpjcDEpOwogICAgICAgICAgICAgICAgdHN0Y2gyID0gdG91cHBlcigqY3AyKTsKICAgICAgICAgICAgICAgIGlmICh0c3RjaDEgIT0gdHN0Y2gyKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIHByaW50ZigiTSclYycgIiwgKmNwMSk7IAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICAgICAgICAgIGNwMisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlICgxKTsKICAgICAgICAgICAgaWYgKCpjcDEpCiAgICAgICAgICAgICAgICBjcDErKzsKICAgICAgICB9CiAgICAvKgogICAgICogcHJpbnRmKCJcbiIpOyAKICAgICAqLwogICAgaWYgKGNwMSAmJiAqY3AxKQogICAgICAgIHJldHVybiBORVRTTk1QX1JFTU9WRV9DT05TVChjaGFyICosIGNwMSk7CgogICAgcmV0dXJuIE5VTEw7Cn0KI2VuZGlmCgppbnQKbWtkaXJoaWVyKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBtb2RlX3QgbW9kZSwgaW50IHNraXBsYXN0KQp7CiAgICBzdHJ1Y3Qgc3RhdCAgICAgc2J1ZjsKICAgIGNoYXIgICAgICAgICAgICpvdXJjb3B5ID0gc3RyZHVwKHBhdGhuYW1lKTsKICAgIGNoYXIgICAgICAgICAgICplbnRyeTsKICAgIGNoYXIgICAgICAgICAgICpidWYgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgKnN0ID0gTlVMTDsKICAgIGludCAgICAgICAgICAgICByZXM7CgogICAgcmVzID0gU05NUEVSUl9HRU5FUlI7CiAgICBpZiAoIW91cmNvcHkpCiAgICAgICAgZ290byBvdXQ7CgogICAgYnVmID0gbWFsbG9jKHN0cmxlbihwYXRobmFtZSkgKyAyKTsKICAgIGlmICghYnVmKQogICAgICAgIGdvdG8gb3V0OwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKiBjb252ZXJ0IGJhY2tzbGFzaCB0byBmb3J3YXJkIHNsYXNoICovCiAgICBmb3IgKGVudHJ5ID0gb3VyY29weTsgKmVudHJ5OyBlbnRyeSsrKQogICAgICAgIGlmICgqZW50cnkgPT0gJ1xcJykKICAgICAgICAgICAgKmVudHJ5ID0gJy8nOwojZW5kaWYKCiAgICBlbnRyeSA9IHN0cnRva19yKG91cmNvcHksICIvIiwgJnN0KTsKCiAgICBidWZbMF0gPSAnXDAnOwoKI2lmIGRlZmluZWQgKFdJTjMyKSB8fCBkZWZpbmVkIChjeWd3aW4pCiAgICAvKgogICAgICogQ2hlY2sgaWYgZmlyc3QgZW50cnkgY29udGFpbnMgYSBkcml2ZS1sZXR0ZXIKICAgICAqICAgZS5nICAiYzovcGF0aCIKICAgICAqLwogICAgaWYgKChlbnRyeSkgJiYgKCc6JyA9PSBlbnRyeVsxXSkgJiYKICAgICAgICAoKCdcMCcgPT0gZW50cnlbMl0pIHx8ICgnLycgPT0gZW50cnlbMl0pKSkgewogICAgICAgIHN0cmNhdChidWYsIGVudHJ5KTsKICAgICAgICBlbnRyeSA9IHN0cnRva19yKE5VTEwsICIvIiwgJnN0KTsKICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIGNoZWNrIHRvIHNlZSBpZiBmaWxlbmFtZSBpcyBhIGRpcmVjdG9yeSAKICAgICAqLwogICAgd2hpbGUgKGVudHJ5KSB7CiAgICAgICAgc3RyY2F0KGJ1ZiwgIi8iKTsKICAgICAgICBzdHJjYXQoYnVmLCBlbnRyeSk7CiAgICAgICAgZW50cnkgPSBzdHJ0b2tfcihOVUxMLCAiLyIsICZzdCk7CiAgICAgICAgaWYgKGVudHJ5ID09IE5VTEwgJiYgc2tpcGxhc3QpCiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGlmIChzdGF0KGJ1ZiwgJnNidWYpIDwgMCkgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBETkUsIG1ha2UgaXQgCiAgICAgICAgICAgICAqLwojaWZkZWYgV0lOMzIKICAgICAgICAgICAgaWYgKENyZWF0ZURpcmVjdG9yeShidWYsIE5VTEwpID09IDApCiNlbHNlCiAgICAgICAgICAgIGlmIChta2RpcihidWYsIG1vZGUpID09IC0xKQojZW5kaWYKICAgICAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIkNyZWF0ZWQgZGlyZWN0b3J5OiAlc1xuIiwgYnVmKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBleGlzdHMsIGlzIGl0IGEgZmlsZT8gCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoKHNidWYuc3RfbW9kZSAmIFNfSUZESVIpID09IDApIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBhY2shIGNhbid0IG1ha2UgYSBkaXJlY3Rvcnkgb24gdG9wIG9mIGEgZmlsZSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXMgPSBTTk1QRVJSX1NVQ0NFU1M7Cm91dDoKICAgIGZyZWUoYnVmKTsKICAgIGZyZWUob3VyY29weSk7CiAgICByZXR1cm4gcmVzOwp9CgovKioKICogbmV0c25tcF9ta3RlbXAgY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIGJhc2VkIG9uIHRoZQogKiAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0ZW1wRmlsZVBhdHRlcm4KICoKICogQHJldHVybiBmaWxlIGRlc2NyaXB0b3IKICovCmNvbnN0IGNoYXIgICAgICoKbmV0c25tcF9ta3RlbXAodm9pZCkKewojaWZkZWYgUEFUSF9NQVgKICAgIHN0YXRpYyBjaGFyICAgICBuYW1lW1BBVEhfTUFYXTsKI2Vsc2UKICAgIHN0YXRpYyBjaGFyICAgICBuYW1lWzI1Nl07CiNlbmRpZgogICAgaW50ICAgICAgICAgICAgIGZkID0gLTE7CgogICAgc3RybGNweShuYW1lLCBnZXRfdGVtcF9maWxlX3BhdHRlcm4oKSwgc2l6ZW9mKG5hbWUpKTsKI2lmZGVmIEhBVkVfTUtTVEVNUAogICAgewogICAgICAgIG1vZGVfdCBvbGRtYXNrID0gdW1hc2sofihTX0lSVVNSIHwgU19JV1VTUikpOwogICAgICAgIG5ldHNubXBfYXNzZXJ0KG9sZG1hc2sgIT0gKG1vZGVfdCkoLTEpKTsKICAgICAgICBmZCA9IG1rc3RlbXAobmFtZSk7CiAgICAgICAgdW1hc2sob2xkbWFzayk7CiAgICB9CiNlbHNlCiAgICBpZiAobWt0ZW1wKG5hbWUpKSB7CiMgaWZuZGVmIFdJTjMyCiAgICAgICAgZmQgPSBvcGVuKG5hbWUsIE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX1dST05MWSwgU19JUlVTUiB8IFNfSVdVU1IpOwojIGVsc2UKICAgICAgICAvKgogICAgICAgICAqIFdpbjMyIG5lZWRzIF9TX0lSRUFEIHwgX1NfSVdSSVRFIHRvIHNldCBwZXJtaXNzaW9ucyBvbiBmaWxlCiAgICAgICAgICogYWZ0ZXIgY2xvc2luZwogICAgICAgICAqLwogICAgICAgIGZkID0gX29wZW4obmFtZSwgX09fQ1JFQVQgfCBfT19FWENMIHwgX09fV1JPTkxZLCBfU19JUkVBRCB8IF9TX0lXUklURSk7CiMgZW5kaWYKICAgIH0KI2VuZGlmCiAgICBpZiAoZmQgPj0gMCkgewogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBERUJVR01TR1RMKCgibmV0c25tcF9ta3RlbXAiLCAidGVtcCBmaWxlIGNyZWF0ZWQ6ICVzXG4iLAogICAgICAgICAgICAgICAgICAgIG5hbWUpKTsKICAgICAgICByZXR1cm4gbmFtZTsKICAgIH0KICAgIHNubXBfbG9nKExPR19FUlIsICJuZXRzbm1wX21rdGVtcDogZXJyb3IgY3JlYXRpbmcgZmlsZSAlc1xuIiwKICAgICAgICAgICAgIG5hbWUpOwogICAgcmV0dXJuIE5VTEw7Cn0KCi8qCiAqIFRoaXMgZnVuY3Rpb24gd2FzIGNyZWF0ZWQgdG8gZGlmZmVyZW50aWF0ZSBhY3Rpb25zCiAqIHRoYXQgYXJlIGFwcHJvcHJpYXRlIGZvciBMaW51eCAyLjQga2VybmVscywgYnV0IG5vdCBsYXRlciBrZXJuZWxzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHRlc3Qga2VybmVscyBvbiBhbnkgcGxhdGZvcm0gdGhhdCBzdXBwb3J0cyB1bmFtZSgpLgogKgogKiBJZiBub3QgcnVubmluZyBhIHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgdW5hbWUoKSwgcmV0dXJuIC0xLgogKgogKiBJZiBvc3BuYW1lIG1hdGNoZXMsIGFuZCB0aGUgcmVsZWFzZSBtYXRjaGVzIHVwIHRocm91Z2ggdGhlIHByZWZpeCwKICogIHJldHVybiAwLgogKiBJZiB0aGUgcmVsZWFzZSBpcyBvcmRlcmVkIGhpZ2hlciwgcmV0dXJuIDEuCiAqIEJlIGF3YXJlIHRoYXQgIm9yZGVyZWQgaGlnaGVyIiBpcyBub3QgYSBndWFyYW50ZWUgb2YgY29ycmVjdG5lc3MuCiAqLwppbnQKbmV0c25tcF9vc19wcmVtYXRjaChjb25zdCBjaGFyICpvc3BtbmFtZSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpvc3BtcmVscHJlZml4KQp7CiNpZiBIQVZFX1NZU19VVFNOQU1FX0gKc3RhdGljIGludCBwcmludE9Tb25jZSA9IDE7CiAgc3RydWN0IHV0c25hbWUgdXRzYnVmOwogIGlmICggMCAhPSB1bmFtZSgmdXRzYnVmKSkKICAgIHJldHVybiAtMTsKCiAgaWYgKHByaW50T1NvbmNlKSB7CiAgICBwcmludE9Tb25jZSA9IDA7CiAgICAvKiBzaG93IHRoZSBmb3VyIGVsZW1lbnRzIHRoYXQgdGhlIGtlcm5lbCBjYW4gYmUgc3VyZSBvZiAqLwogIERFQlVHTVNHVCgoImRhZW1vbml6ZSIsInN5c25hbWUgJyVzJyxcbnJlbGVhc2UgJyVzJyxcbnZlcnNpb24gJyVzJyxcbm1hY2hpbmUgJyVzJ1xuIiwKICAgICAgdXRzYnVmLnN5c25hbWUsIHV0c2J1Zi5yZWxlYXNlLCB1dHNidWYudmVyc2lvbiwgdXRzYnVmLm1hY2hpbmUpKTsKICB9CiAgaWYgKDAgIT0gc3RyY2FzZWNtcCh1dHNidWYuc3lzbmFtZSwgb3NwbW5hbWUpKSByZXR1cm4gLTE7CgogIC8qIFJlcXVpcmVkIHRvIG1hdGNoIG9ubHkgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyAqLwogIHJldHVybiBzdHJuY2FzZWNtcCh1dHNidWYucmVsZWFzZSwgb3NwbXJlbHByZWZpeCwgc3RybGVuKG9zcG1yZWxwcmVmaXgpKTsKCiNlbHNlCgogIHJldHVybiAtMTsKCiNlbmRpZiAvKiBIQVZFX1NZU19VVFNOQU1FX0ggKi8KfQoKLyoqCiAqIG5ldHNubXBfb3Nfa2VybmVsX3dpZHRoIGRldGVybWluZXMga2VybmVsIHdpZHRoIGF0IHJ1bnRpbWUKICogQ3VycmVudGx5IGltcGxlbWVudGVkIGZvciBJUklYLCBBSVggYW5kIFRydTY0IFVuaXgKICoKICogQHJldHVybiBrZXJuZWwgd2lkdGggKHVzdWFsbHkgMzIgb3IgNjQpIG9uIHN1Y2Nlc3MsIC0xIG9uIGVycm9yCiAqLwppbnQKbmV0c25tcF9vc19rZXJuZWxfd2lkdGgodm9pZCkKewojaWZkZWYgaXJpeDYKICBjaGFyIGJ1Zls4XTsKICBzeXNpbmZvKF9NSVBTX1NJX09TX05BTUUsIGJ1ZiwgNyk7CiAgaWYgKHN0cm5jbXAoIklSSVg2NCIsIGJ1ZiwgNikgPT0gMCkgewogICAgcmV0dXJuIDY0OwogIH0gZWxzZSBpZiAoc3RybmNtcCgiSVJJWCIsIGJ1ZiwgNCkgPT0gMCkgewogICAgcmV0dXJuIDMyOwogIH0gZWxzZSB7CiAgICByZXR1cm4gLTE7CiAgfQojZWxpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KQogIHJldHVybiAoX19LRVJORUxfMzIoKSA/IDMyIDogKF9fS0VSTkVMXzY0KCkgPyA2NCA6IC0xKSk7CiNlbGlmIGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2Y1KSB8fCBkZWZpbmVkKF9fYWxwaGEpCiAgcmV0dXJuIDY0OyAvKiBBbHBoYSBpcyBhbHdheXMgNjRiaXQgKi8KI2Vsc2UKICAvKiBrZXJuZWwgd2lkdGggZGV0ZWN0aW9uIG5vdCBpbXBsZW1lbnRlZCAqLwogIHJldHVybiAtMTsKI2VuZGlmCn0KCmludCBuZXRzbm1wX3N0cl90b191aWQoY29uc3QgY2hhciAqdXNlcm9ydWlkKSB7CiAgICBpbnQgdWlkOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICBzdHJ1Y3QgcGFzc3dkICpwd2Q7CiNlbmRpZgoKICAgIHVpZCA9IGF0b2kodXNlcm9ydWlkKTsKCiAgICBpZiAoIHVpZCA9PSAwICkgewojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgcHdkID0gZ2V0cHduYW0oIHVzZXJvcnVpZCApOwogICAgICAgIGlmIChwd2QpCiAgICAgICAgICAgIHVpZCA9IHB3ZC0+cHdfdWlkOwogICAgICAgIGVsc2UKI2VuZGlmCiAgICAgICAgICAgIHNubXBfbG9nKExPR19XQVJOSU5HLCAiQ2FuJ3QgaWRlbnRpZnkgdXNlciAoJXMpLlxuIiwgdXNlcm9ydWlkKTsKICAgIH0KICAgIHJldHVybiB1aWQ7CiAgICAKfQoKaW50IG5ldHNubXBfc3RyX3RvX2dpZChjb25zdCBjaGFyICpncm91cG9yZ2lkKSB7CiAgICBpbnQgZ2lkOwojaWYgSEFWRV9HRVRHUk5BTSAmJiBIQVZFX0dSUF9ICiAgICBzdHJ1Y3QgZ3JvdXAgICpncnA7CiNlbmRpZgoKICAgIGdpZCA9IGF0b2koZ3JvdXBvcmdpZCk7CgogICAgaWYgKCBnaWQgPT0gMCApIHsKI2lmIEhBVkVfR0VUR1JOQU0gJiYgSEFWRV9HUlBfSAogICAgICAgIGdycCA9IGdldGdybmFtKCBncm91cG9yZ2lkICk7CiAgICAgICAgaWYgKGdycCkKICAgICAgICAgICAgZ2lkID0gZ3JwLT5ncl9naWQ7CiAgICAgICAgZWxzZQojZW5kaWYKICAgICAgICAgICAgc25tcF9sb2coTE9HX1dBUk5JTkcsICJDYW4ndCBpZGVudGlmeSBncm91cCAoJXMpLlxuIiwKICAgICAgICAgICAgICAgICAgICAgZ3JvdXBvcmdpZCk7CiAgICB9CgogICAgcmV0dXJuIGdpZDsKfQo=