Lyogc3RhdGVtZW50LmMgLSB0aGUgc3RhdGVtZW50IHR5cGUKICoKICogQ29weXJpZ2h0IChDKSAyMDA1LTIwMTAgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgogKgogKiBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKICogd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwogKiBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgogKgogKiBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICogaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAogKiBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CiAqCiAqIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiAqICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAqICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQogKiAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgogKiAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogKiAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiAqIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCiAqLwoKI2luY2x1ZGUgInN0YXRlbWVudC5oIgojaW5jbHVkZSAiY3Vyc29yLmgiCiNpbmNsdWRlICJjb25uZWN0aW9uLmgiCiNpbmNsdWRlICJtaWNyb3Byb3RvY29scy5oIgojaW5jbHVkZSAicHJlcGFyZV9wcm90b2NvbC5oIgojaW5jbHVkZSAidXRpbC5oIgojaW5jbHVkZSAic3FsaXRlY29tcGF0LmgiCgovKiBwcm90b3R5cGVzICovCnN0YXRpYyBpbnQgcHlzcWxpdGVfY2hlY2tfcmVtYWluaW5nX3NxbChjb25zdCBjaGFyKiB0YWlsKTsKCnR5cGVkZWYgZW51bSB7CiAgICBMSU5FQ09NTUVOVF8xLAogICAgSU5fTElORUNPTU1FTlQsCiAgICBDT01NRU5UU1RBUlRfMSwKICAgIElOX0NPTU1FTlQsCiAgICBDT01NRU5URU5EXzEsCiAgICBOT1JNQUwKfSBwYXJzZV9yZW1haW5pbmdfc3FsX3N0YXRlOwoKdHlwZWRlZiBlbnVtIHsKICAgIFRZUEVfSU5ULAogICAgVFlQRV9MT05HLAogICAgVFlQRV9GTE9BVCwKICAgIFRZUEVfU1RSSU5HLAogICAgVFlQRV9VTklDT0RFLAogICAgVFlQRV9CVUZGRVIsCiAgICBUWVBFX1VOS05PV04KfSBwYXJhbWV0ZXJfdHlwZTsKCmludCBweXNxbGl0ZV9zdGF0ZW1lbnRfY3JlYXRlKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgcHlzcWxpdGVfQ29ubmVjdGlvbiogY29ubmVjdGlvbiwgUHlPYmplY3QqIHNxbCkKewogICAgY29uc3QgY2hhciogdGFpbDsKICAgIGludCByYzsKICAgIFB5T2JqZWN0KiBzcWxfc3RyOwogICAgY2hhciogc3FsX2NzdHI7CgogICAgc2VsZi0+c3QgPSBOVUxMOwogICAgc2VsZi0+aW5fdXNlID0gMDsKCiAgICBpZiAoUHlTdHJpbmdfQ2hlY2soc3FsKSkgewogICAgICAgIHNxbF9zdHIgPSBzcWw7CiAgICAgICAgUHlfSU5DUkVGKHNxbF9zdHIpOwogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2soc3FsKSkgewogICAgICAgIHNxbF9zdHIgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHNxbCk7CiAgICAgICAgaWYgKCFzcWxfc3RyKSB7CiAgICAgICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICAgICAgICAgIHJldHVybiByYzsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIHJjID0gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICAgICAgcmV0dXJuIHJjOwogICAgfQogICAgc3FsX2NzdHIgPSBQeVN0cmluZ19BU19TVFJJTkcoc3FsX3N0cik7CiAgICBpZiAoc3RybGVuKHNxbF9jc3RyKSAhPSAoc2l6ZV90KVB5U3RyaW5nX0dFVF9TSVpFKHNxbF9zdHIpKSB7CiAgICAgICAgUHlfREVDUkVGKHNxbF9zdHIpOwogICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAidGhlIHF1ZXJ5IGNvbnRhaW5zIGEgbnVsbCBjaGFyYWN0ZXIiKTsKICAgICAgICByZXR1cm4gUFlTUUxJVEVfU1FMX1dST05HX1RZUEU7CiAgICB9CgogICAgc2VsZi0+aW5fd2Vha3JlZmxpc3QgPSBOVUxMOwogICAgc2VsZi0+c3FsID0gc3FsX3N0cjsKCiAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICByYyA9IHNxbGl0ZTNfcHJlcGFyZShjb25uZWN0aW9uLT5kYiwKICAgICAgICAgICAgICAgICAgICAgICAgIHNxbF9jc3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+c3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAmdGFpbCk7CiAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgIHNlbGYtPmRiID0gY29ubmVjdGlvbi0+ZGI7CgogICAgaWYgKHJjID09IFNRTElURV9PSyAmJiBweXNxbGl0ZV9jaGVja19yZW1haW5pbmdfc3FsKHRhaWwpKSB7CiAgICAgICAgKHZvaWQpc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CiAgICAgICAgc2VsZi0+c3QgPSBOVUxMOwogICAgICAgIHJjID0gUFlTUUxJVEVfVE9PX01VQ0hfU1FMOwogICAgfQoKICAgIHJldHVybiByYzsKfQoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9iaW5kX3BhcmFtZXRlcihweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYsIGludCBwb3MsIFB5T2JqZWN0KiBwYXJhbWV0ZXIsIGludCBhbGxvd184Yml0X2NoYXJzKQp7CiAgICBpbnQgcmMgPSBTUUxJVEVfT0s7CiAgICBjb25zdCBjaGFyKiBidWZmZXI7CiAgICBjaGFyKiBzdHJpbmc7CiAgICBQeV9zc2l6ZV90IGJ1ZmxlbjsKICAgIFB5T2JqZWN0KiBzdHJpbmd2YWw7CiAgICBwYXJhbWV0ZXJfdHlwZSBwYXJhbXR5cGU7CiAgICBjaGFyKiBjOwoKICAgIGlmIChwYXJhbWV0ZXIgPT0gUHlfTm9uZSkgewogICAgICAgIHJjID0gc3FsaXRlM19iaW5kX251bGwoc2VsZi0+c3QsIHBvcyk7CiAgICAgICAgZ290byBmaW5hbDsKICAgIH0KCiAgICBpZiAoUHlJbnRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9JTlQ7CiAgICB9IGVsc2UgaWYgKFB5TG9uZ19DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0xPTkc7CiAgICB9IGVsc2UgaWYgKFB5RmxvYXRfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2tFeGFjdChwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9TVFJJTkc7CiAgICB9IGVsc2UgaWYgKFB5VW5pY29kZV9DaGVja0V4YWN0KHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX1VOSUNPREU7CiAgICB9IGVsc2UgaWYgKFB5QnVmZmVyX0NoZWNrKHBhcmFtZXRlcikpIHsKICAgICAgICBwYXJhbXR5cGUgPSBUWVBFX0JVRkZFUjsKICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfSU5UOwogICAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfTE9ORzsKICAgIH0gZWxzZSBpZiAoUHlGbG9hdF9DaGVjayhwYXJhbWV0ZXIpKSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9GTE9BVDsKICAgIH0gZWxzZSBpZiAoUHlTdHJpbmdfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfU1RSSU5HOwogICAgfSBlbHNlIGlmIChQeVVuaWNvZGVfQ2hlY2socGFyYW1ldGVyKSkgewogICAgICAgIHBhcmFtdHlwZSA9IFRZUEVfVU5JQ09ERTsKICAgIH0gZWxzZSB7CiAgICAgICAgcGFyYW10eXBlID0gVFlQRV9VTktOT1dOOwogICAgfQoKICAgIGlmIChwYXJhbXR5cGUgPT0gVFlQRV9TVFJJTkcgJiYgIWFsbG93XzhiaXRfY2hhcnMpIHsKICAgICAgICBzdHJpbmcgPSBQeVN0cmluZ19BU19TVFJJTkcocGFyYW1ldGVyKTsKICAgICAgICBmb3IgKGMgPSBzdHJpbmc7ICpjICE9IDA7IGMrKykgewogICAgICAgICAgICBpZiAoKmMgJiAweDgwKSB7CiAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIllvdSBtdXN0IG5vdCB1c2UgOC1iaXQgYnl0ZXN0cmluZ3MgdW5sZXNzIHlvdSB1c2UgYSB0ZXh0X2ZhY3RvcnkgdGhhdCBjYW4gaW50ZXJwcmV0IDgtYml0IGJ5dGVzdHJpbmdzIChsaWtlIHRleHRfZmFjdG9yeSA9IHN0cikuIEl0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHlvdSBpbnN0ZWFkIGp1c3Qgc3dpdGNoIHlvdXIgYXBwbGljYXRpb24gdG8gVW5pY29kZSBzdHJpbmdzLiIpOwogICAgICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgICAgICAgIGdvdG8gZmluYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgc3dpdGNoIChwYXJhbXR5cGUpIHsKICAgICAgICBjYXNlIFRZUEVfSU5UOiB7CiAgICAgICAgICAgIGxvbmcgbG9uZ3ZhbCA9IFB5SW50X0FzTG9uZyhwYXJhbWV0ZXIpOwogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9pbnQ2NChzZWxmLT5zdCwgcG9zLCBsb25ndmFsKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgVFlQRV9MT05HOiB7CiAgICAgICAgICAgIHNxbGl0ZV9pbnQ2NCB2YWx1ZSA9IF9weXNxbGl0ZV9sb25nX2FzX2ludDY0KHBhcmFtZXRlcik7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSAtMSAmJiBQeUVycl9PY2N1cnJlZCgpKQogICAgICAgICAgICAgICAgcmMgPSAtMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfaW50NjQoc2VsZi0+c3QsIHBvcywgKHNxbGl0ZV9pbnQ2NCl2YWx1ZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6CiAgICAgICAgICAgIHJjID0gc3FsaXRlM19iaW5kX2RvdWJsZShzZWxmLT5zdCwgcG9zLCBQeUZsb2F0X0FzRG91YmxlKHBhcmFtZXRlcikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFRZUEVfU1RSSU5HOgogICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUocGFyYW1ldGVyLCAmc3RyaW5nLCAmYnVmbGVuKTsKICAgICAgICAgICAgcmMgPSBzcWxpdGUzX2JpbmRfdGV4dChzZWxmLT5zdCwgcG9zLCBzdHJpbmcsIGJ1ZmxlbiwgU1FMSVRFX1RSQU5TSUVOVCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9VTklDT0RFOgogICAgICAgICAgICBzdHJpbmd2YWwgPSBQeVVuaWNvZGVfQXNVVEY4U3RyaW5nKHBhcmFtZXRlcik7CiAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShzdHJpbmd2YWwsICZzdHJpbmcsICZidWZsZW4pOwogICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF90ZXh0KHNlbGYtPnN0LCBwb3MsIHN0cmluZywgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgUHlfREVDUkVGKHN0cmluZ3ZhbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVFlQRV9CVUZGRVI6CiAgICAgICAgICAgIGlmIChQeU9iamVjdF9Bc0NoYXJCdWZmZXIocGFyYW1ldGVyLCAmYnVmZmVyLCAmYnVmbGVuKSA9PSAwKSB7CiAgICAgICAgICAgICAgICByYyA9IHNxbGl0ZTNfYmluZF9ibG9iKHNlbGYtPnN0LCBwb3MsIGJ1ZmZlciwgYnVmbGVuLCBTUUxJVEVfVFJBTlNJRU5UKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiY291bGQgbm90IGNvbnZlcnQgQkxPQiB0byBidWZmZXIiKTsKICAgICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBUWVBFX1VOS05PV046CiAgICAgICAgICAgIHJjID0gLTE7CiAgICB9CgpmaW5hbDoKICAgIHJldHVybiByYzsKfQoKLyogcmV0dXJucyAwIGlmIHRoZSBvYmplY3QgaXMgb25lIG9mIFB5dGhvbidzIGludGVybmFsIG9uZXMgdGhhdCBkb24ndCBuZWVkIHRvIGJlIGFkYXB0ZWQgKi8Kc3RhdGljIGludCBfbmVlZF9hZGFwdChQeU9iamVjdCogb2JqKQp7CiAgICBpZiAocHlzcWxpdGVfQmFzZVR5cGVBZGFwdGVkKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKF9QeUFueUludF9DaGVja0V4YWN0KG9iaikKICAgICAgICAgICAgfHwgUHlGbG9hdF9DaGVja0V4YWN0KG9iaikgfHwgUHlTdHJpbmdfQ2hlY2tFeGFjdChvYmopCiAgICAgICAgICAgIHx8IFB5VW5pY29kZV9DaGVja0V4YWN0KG9iaikgfHwgUHlCdWZmZXJfQ2hlY2sob2JqKSkgewogICAgICAgIHJldHVybiAwOwogICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KfQoKdm9pZCBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZiwgUHlPYmplY3QqIHBhcmFtZXRlcnMsIGludCBhbGxvd184Yml0X2NoYXJzKQp7CiAgICBQeU9iamVjdCogY3VycmVudF9wYXJhbTsKICAgIFB5T2JqZWN0KiBhZGFwdGVkOwogICAgY29uc3QgY2hhciogYmluZGluZ19uYW1lOwogICAgaW50IGk7CiAgICBpbnQgcmM7CiAgICBpbnQgbnVtX3BhcmFtc19uZWVkZWQ7CiAgICBpbnQgbnVtX3BhcmFtczsKCiAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICBudW1fcGFyYW1zX25lZWRlZCA9IHNxbGl0ZTNfYmluZF9wYXJhbWV0ZXJfY291bnQoc2VsZi0+c3QpOwogICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKCiAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHBhcmFtZXRlcnMpIHx8IFB5TGlzdF9DaGVja0V4YWN0KHBhcmFtZXRlcnMpIHx8ICghUHlEaWN0X0NoZWNrKHBhcmFtZXRlcnMpICYmIFB5U2VxdWVuY2VfQ2hlY2socGFyYW1ldGVycykpKSB7CiAgICAgICAgLyogcGFyYW1ldGVycyBwYXNzZWQgYXMgc2VxdWVuY2UgKi8KICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CiAgICAgICAgICAgIG51bV9wYXJhbXMgPSBQeVR1cGxlX0dFVF9TSVpFKHBhcmFtZXRlcnMpOwogICAgICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKICAgICAgICAgICAgbnVtX3BhcmFtcyA9IFB5TGlzdF9HRVRfU0laRShwYXJhbWV0ZXJzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBudW1fcGFyYW1zID0gUHlTZXF1ZW5jZV9TaXplKHBhcmFtZXRlcnMpOwogICAgICAgIH0KICAgICAgICBpZiAobnVtX3BhcmFtcyAhPSBudW1fcGFyYW1zX25lZWRlZCkgewogICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfUHJvZ3JhbW1pbmdFcnJvciwgIkluY29ycmVjdCBudW1iZXIgb2YgYmluZGluZ3Mgc3VwcGxpZWQuIFRoZSBjdXJyZW50IHN0YXRlbWVudCB1c2VzICVkLCBhbmQgdGhlcmUgYXJlICVkIHN1cHBsaWVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcGFyYW1zX25lZWRlZCwgbnVtX3BhcmFtcyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG51bV9wYXJhbXM7IGkrKykgewogICAgICAgICAgICBpZiAoUHlUdXBsZV9DaGVja0V4YWN0KHBhcmFtZXRlcnMpKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50X3BhcmFtID0gUHlUdXBsZV9HRVRfSVRFTShwYXJhbWV0ZXJzLCBpKTsKICAgICAgICAgICAgICAgIFB5X1hJTkNSRUYoY3VycmVudF9wYXJhbSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoUHlMaXN0X0NoZWNrRXhhY3QocGFyYW1ldGVycykpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRfcGFyYW0gPSBQeUxpc3RfR0VUX0lURU0ocGFyYW1ldGVycywgaSk7CiAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5U2VxdWVuY2VfR2V0SXRlbShwYXJhbWV0ZXJzLCBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWN1cnJlbnRfcGFyYW0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFfbmVlZF9hZGFwdChjdXJyZW50X3BhcmFtKSkgewogICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhZGFwdGVkID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7CiAgICAgICAgICAgICAgICBpZiAoYWRhcHRlZCkgewogICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSArIDEsIGFkYXB0ZWQsIGFsbG93XzhiaXRfY2hhcnMpOwogICAgICAgICAgICBQeV9ERUNSRUYoYWRhcHRlZCk7CgogICAgICAgICAgICBpZiAocmMgIT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgICAgICBpZiAoIVB5RXJyX09jY3VycmVkKCkpIHsKICAgICAgICAgICAgICAgICAgICBQeUVycl9Gb3JtYXQocHlzcWxpdGVfSW50ZXJmYWNlRXJyb3IsICJFcnJvciBiaW5kaW5nIHBhcmFtZXRlciAlZCAtIHByb2JhYmx5IHVuc3VwcG9ydGVkIHR5cGUuIiwgaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKFB5RGljdF9DaGVjayhwYXJhbWV0ZXJzKSkgewogICAgICAgIC8qIHBhcmFtZXRlcnMgcGFzc2VkIGFzIGRpY3Rpb25hcnkgKi8KICAgICAgICBmb3IgKGkgPSAxOyBpIDw9IG51bV9wYXJhbXNfbmVlZGVkOyBpKyspIHsKICAgICAgICAgICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgICAgICAgICBiaW5kaW5nX25hbWUgPSBzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX25hbWUoc2VsZi0+c3QsIGkpOwogICAgICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwogICAgICAgICAgICBpZiAoIWJpbmRpbmdfbmFtZSkgewogICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJCaW5kaW5nICVkIGhhcyBubyBuYW1lLCBidXQgeW91IHN1cHBsaWVkIGEgZGljdGlvbmFyeSAod2hpY2ggaGFzIG9ubHkgbmFtZXMpLiIsIGkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBiaW5kaW5nX25hbWUrKzsgLyogc2tpcCBmaXJzdCBjaGFyICh0aGUgY29sb24pICovCiAgICAgICAgICAgIGlmIChQeURpY3RfQ2hlY2tFeGFjdChwYXJhbWV0ZXJzKSkgewogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHBhcmFtZXRlcnMsIGJpbmRpbmdfbmFtZSk7CiAgICAgICAgICAgICAgICBQeV9YSU5DUkVGKGN1cnJlbnRfcGFyYW0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgY3VycmVudF9wYXJhbSA9IFB5TWFwcGluZ19HZXRJdGVtU3RyaW5nKHBhcmFtZXRlcnMsIChjaGFyKiliaW5kaW5nX25hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY3VycmVudF9wYXJhbSkgewogICAgICAgICAgICAgICAgUHlFcnJfRm9ybWF0KHB5c3FsaXRlX1Byb2dyYW1taW5nRXJyb3IsICJZb3UgZGlkIG5vdCBzdXBwbHkgYSB2YWx1ZSBmb3IgYmluZGluZyAlZC4iLCBpKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFfbmVlZF9hZGFwdChjdXJyZW50X3BhcmFtKSkgewogICAgICAgICAgICAgICAgYWRhcHRlZCA9IGN1cnJlbnRfcGFyYW07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhZGFwdGVkID0gcHlzcWxpdGVfbWljcm9wcm90b2NvbHNfYWRhcHQoY3VycmVudF9wYXJhbSwgKFB5T2JqZWN0KikmcHlzcWxpdGVfUHJlcGFyZVByb3RvY29sVHlwZSwgTlVMTCk7CiAgICAgICAgICAgICAgICBpZiAoYWRhcHRlZCkgewogICAgICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihjdXJyZW50X3BhcmFtKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICBhZGFwdGVkID0gY3VycmVudF9wYXJhbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmMgPSBweXNxbGl0ZV9zdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXIoc2VsZiwgaSwgYWRhcHRlZCwgYWxsb3dfOGJpdF9jaGFycyk7CiAgICAgICAgICAgIFB5X0RFQ1JFRihhZGFwdGVkKTsKCiAgICAgICAgICAgIGlmIChyYyAhPSBTUUxJVEVfT0spIHsKICAgICAgICAgICAgICAgIGlmICghUHlFcnJfT2NjdXJyZWQoKSkgewogICAgICAgICAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChweXNxbGl0ZV9JbnRlcmZhY2VFcnJvciwgIkVycm9yIGJpbmRpbmcgcGFyYW1ldGVyIDolcyAtIHByb2JhYmx5IHVuc3VwcG9ydGVkIHR5cGUuIiwgYmluZGluZ19uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgInBhcmFtZXRlcnMgYXJlIG9mIHVuc3VwcG9ydGVkIHR5cGUiKTsKICAgIH0KfQoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9yZWNvbXBpbGUocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmLCBQeU9iamVjdCogcGFyYW1zKQp7CiAgICBjb25zdCBjaGFyKiB0YWlsOwogICAgaW50IHJjOwogICAgY2hhciogc3FsX2NzdHI7CiAgICBzcWxpdGUzX3N0bXQqIG5ld19zdDsKCiAgICBzcWxfY3N0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHNlbGYtPnNxbCk7CgogICAgUHlfQkVHSU5fQUxMT1dfVEhSRUFEUwogICAgcmMgPSBzcWxpdGUzX3ByZXBhcmUoc2VsZi0+ZGIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzcWxfY3N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgIC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgJm5ld19zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICZ0YWlsKTsKICAgIFB5X0VORF9BTExPV19USFJFQURTCgogICAgaWYgKHJjID09IFNRTElURV9PSykgewogICAgICAgIC8qIFRoZSBlZmZpY2llbnQgc3FsaXRlM190cmFuc2Zlcl9iaW5kaW5ncyBpcyBvbmx5IGF2YWlsYWJsZSBpbiBTUUxpdGUKICAgICAgICAgKiB2ZXJzaW9uIDMuMi4yIG9yIGxhdGVyLiBGb3Igb2xkZXIgU1FMaXRlIHJlbGVhc2VzLCB0aGF0IG1pZ2h0IG5vdAogICAgICAgICAqIGV2ZW4gZGVmaW5lIFNRTElURV9WRVJTSU9OX05VTUJFUiwgd2UgZG8gaXQgdGhlIG1hbnVhbCB3YXkuCiAgICAgICAgICovCiAgICAgICAgI2lmZGVmIFNRTElURV9WRVJTSU9OX05VTUJFUgogICAgICAgICNpZiBTUUxJVEVfVkVSU0lPTl9OVU1CRVIgPj0gMzAwMjAwMgogICAgICAgIC8qIFRoZSBjaGVjayBmb3IgdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGlzIG5lY2Vzc2FyeSB0byBub3QgdHJpZ2dlciBhCiAgICAgICAgICogYnVnIGluIGNlcnRhaW4gU1FMaXRlIHZlcnNpb25zIChleHBlcmllbmNlZCBpbiAzLjIuOCBhbmQgMy4zLjQpLiAqLwogICAgICAgIGlmIChzcWxpdGUzX2JpbmRfcGFyYW1ldGVyX2NvdW50KHNlbGYtPnN0KSA+IDApIHsKICAgICAgICAgICAgKHZvaWQpc3FsaXRlM190cmFuc2Zlcl9iaW5kaW5ncyhzZWxmLT5zdCwgbmV3X3N0KTsKICAgICAgICB9CiAgICAgICAgI2VuZGlmCiAgICAgICAgI2Vsc2UKICAgICAgICBzdGF0ZW1lbnRfYmluZF9wYXJhbWV0ZXJzKHNlbGYsIHBhcmFtcyk7CiAgICAgICAgI2VuZGlmCgogICAgICAgICh2b2lkKXNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOwogICAgICAgIHNlbGYtPnN0ID0gbmV3X3N0OwogICAgfQoKICAgIHJldHVybiByYzsKfQoKaW50IHB5c3FsaXRlX3N0YXRlbWVudF9maW5hbGl6ZShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpCnsKICAgIGludCByYzsKCiAgICByYyA9IFNRTElURV9PSzsKICAgIGlmIChzZWxmLT5zdCkgewogICAgICAgIFB5X0JFR0lOX0FMTE9XX1RIUkVBRFMKICAgICAgICByYyA9IHNxbGl0ZTNfZmluYWxpemUoc2VsZi0+c3QpOwogICAgICAgIFB5X0VORF9BTExPV19USFJFQURTCiAgICAgICAgc2VsZi0+c3QgPSBOVUxMOwogICAgfQoKICAgIHNlbGYtPmluX3VzZSA9IDA7CgogICAgcmV0dXJuIHJjOwp9CgppbnQgcHlzcWxpdGVfc3RhdGVtZW50X3Jlc2V0KHB5c3FsaXRlX1N0YXRlbWVudCogc2VsZikKewogICAgaW50IHJjOwoKICAgIHJjID0gU1FMSVRFX09LOwoKICAgIGlmIChzZWxmLT5pbl91c2UgJiYgc2VsZi0+c3QpIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgcmMgPSBzcWxpdGUzX3Jlc2V0KHNlbGYtPnN0KTsKICAgICAgICBQeV9FTkRfQUxMT1dfVEhSRUFEUwoKICAgICAgICBpZiAocmMgPT0gU1FMSVRFX09LKSB7CiAgICAgICAgICAgIHNlbGYtPmluX3VzZSA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiByYzsKfQoKdm9pZCBweXNxbGl0ZV9zdGF0ZW1lbnRfbWFya19kaXJ0eShweXNxbGl0ZV9TdGF0ZW1lbnQqIHNlbGYpCnsKICAgIHNlbGYtPmluX3VzZSA9IDE7Cn0KCnZvaWQgcHlzcWxpdGVfc3RhdGVtZW50X2RlYWxsb2MocHlzcWxpdGVfU3RhdGVtZW50KiBzZWxmKQp7CiAgICBpZiAoc2VsZi0+c3QpIHsKICAgICAgICBQeV9CRUdJTl9BTExPV19USFJFQURTCiAgICAgICAgc3FsaXRlM19maW5hbGl6ZShzZWxmLT5zdCk7CiAgICAgICAgUHlfRU5EX0FMTE9XX1RIUkVBRFMKICAgIH0KCiAgICBzZWxmLT5zdCA9IE5VTEw7CgogICAgUHlfWERFQ1JFRihzZWxmLT5zcWwpOwoKICAgIGlmIChzZWxmLT5pbl93ZWFrcmVmbGlzdCAhPSBOVUxMKSB7CiAgICAgICAgUHlPYmplY3RfQ2xlYXJXZWFrUmVmcygoUHlPYmplY3QqKXNlbGYpOwogICAgfQoKICAgIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUoKFB5T2JqZWN0KilzZWxmKTsKfQoKLyoKICogQ2hlY2tzIGlmIHRoZXJlIGlzIGFueXRoaW5nIGxlZnQgaW4gYW4gU1FMIHN0cmluZyBhZnRlciBTUUxpdGUgY29tcGlsZWQgaXQuCiAqIFRoaXMgaXMgdXNlZCB0byBjaGVjayBpZiBzb21lYm9keSB0cmllZCB0byBleGVjdXRlIG1vcmUgdGhhbiBvbmUgU1FMIGNvbW1hbmQKICogd2l0aCBvbmUgZXhlY3V0ZSgpL2V4ZWN1dGVtYW55KCkgY29tbWFuZCwgd2hpY2ggdGhlIERCLUFQSSBhbmQgd2UgZG9uJ3QKICogYWxsb3cuCiAqCiAqIFJldHVybnMgMSBpZiB0aGVyZSBpcyBtb3JlIGxlZnQgdGhhbiBzaG91bGQgYmUuIDAgaWYgb2suCiAqLwpzdGF0aWMgaW50IHB5c3FsaXRlX2NoZWNrX3JlbWFpbmluZ19zcWwoY29uc3QgY2hhciogdGFpbCkKewogICAgY29uc3QgY2hhciogcG9zID0gdGFpbDsKCiAgICBwYXJzZV9yZW1haW5pbmdfc3FsX3N0YXRlIHN0YXRlID0gTk9STUFMOwoKICAgIGZvciAoOzspIHsKICAgICAgICBzd2l0Y2ggKCpwb3MpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IE5PUk1BTCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlICA9IExJTkVDT01NRU5UXzE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IExJTkVDT01NRU5UXzEpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0xJTkVDT01NRU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJyAnOgogICAgICAgICAgICBjYXNlICdcdCc6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnXG4nOgogICAgICAgICAgICBjYXNlIDEzOgogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IElOX0xJTkVDT01NRU5UKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBDT01NRU5UU1RBUlRfMTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVEVORF8xKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBOT1JNQUw7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IENPTU1FTlRTVEFSVF8xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnKic6CiAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gTk9STUFMKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IExJTkVDT01NRU5UXzEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gQ09NTUVOVFNUQVJUXzEpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IElOX0NPTU1FTlQ7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IElOX0NPTU1FTlQpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTU1FTlRFTkRfMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IENPTU1FTlRFTkRfMSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gSU5fQ09NTUVOVDsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fTElORUNPTU1FTlQpIHsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUgPT0gSU5fQ09NTUVOVCkgewogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHBvcysrOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpQeVR5cGVPYmplY3QgcHlzcWxpdGVfU3RhdGVtZW50VHlwZSA9IHsKICAgICAgICBQeVZhck9iamVjdF9IRUFEX0lOSVQoTlVMTCwgMCkKICAgICAgICBNT0RVTEVfTkFNRSAiLlN0YXRlbWVudCIsICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9uYW1lICovCiAgICAgICAgc2l6ZW9mKHB5c3FsaXRlX1N0YXRlbWVudCksICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzaWNzaXplICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaXRlbXNpemUgKi8KICAgICAgICAoZGVzdHJ1Y3RvcilweXNxbGl0ZV9zdGF0ZW1lbnRfZGVhbGxvYywgICAgICAgICAvKiB0cF9kZWFsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcHJpbnQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfc2V0YXR0ciAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NvbXBhcmUgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9yZXByICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfbnVtYmVyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfc2VxdWVuY2UgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9hc19tYXBwaW5nICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaGFzaCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NhbGwgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9zdHIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9nZXRhdHRybyAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX3NldGF0dHJvICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYXNfYnVmZmVyICovCiAgICAgICAgUHlfVFBGTEFHU19ERUZBVUxUIHwgUHlfVFBGTEFHU19IQVZFX1dFQUtSRUZTLCAgLyogdHBfZmxhZ3MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kb2MgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF90cmF2ZXJzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2NsZWFyICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfcmljaGNvbXBhcmUgKi8KICAgICAgICBvZmZzZXRvZihweXNxbGl0ZV9TdGF0ZW1lbnQsIGluX3dlYWtyZWZsaXN0KSwgICAvKiB0cF93ZWFrbGlzdG9mZnNldCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2l0ZXIgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9pdGVybmV4dCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX21ldGhvZHMgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9tZW1iZXJzICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZ2V0c2V0ICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfYmFzZSAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2RpY3QgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9nZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kZXNjcl9zZXQgKi8KICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0cF9kaWN0b2Zmc2V0ICovCiAgICAgICAgKGluaXRwcm9jKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfaW5pdCAqLwogICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRwX2FsbG9jICovCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfbmV3ICovCiAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHBfZnJlZSAqLwp9OwoKZXh0ZXJuIGludCBweXNxbGl0ZV9zdGF0ZW1lbnRfc2V0dXBfdHlwZXModm9pZCkKewogICAgcHlzcWxpdGVfU3RhdGVtZW50VHlwZS50cF9uZXcgPSBQeVR5cGVfR2VuZXJpY05ldzsKICAgIHJldHVybiBQeVR5cGVfUmVhZHkoJnB5c3FsaXRlX1N0YXRlbWVudFR5cGUpOwp9Cg==