IyBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQuICBTZWUKIyB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwojIHRoYXQgbWF5IGFwcGx5OgojCiMgUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKIyBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIyBVc2UgaXMgc3ViamVjdCB0byBsaWNlbnNlIHRlcm1zIHNwZWNpZmllZCBpbiB0aGUgQ09QWUlORyBmaWxlCiMgZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KIwoKIwojIE1ha2VmaWxlIGZvciBzbm1wbGliCiMKCnRvcF9idWlsZGRpcj0uLgoKIyB1c2UgR05VIHZwYXRoLCBpZiBhdmFpbGFibGUsIHRvIG9ubHkgc2V0IGEgcGF0aCBmb3Igc291cmNlIGFuZCBoZWFkZXJzCiMgVlBBVEggd2lsbCBwaWNrIHVwIG9iamVjdHMgdG9vLCB3aGljaCBpcyBiYWQgaWYgeW91IGFyZSBzaGFyaW5nIGEKIyBzb3VyY2UgZGlyLi4uCkBHTlVfdnBhdGhAICUuaCAkKHNyY2RpcikKQEdOVV92cGF0aEAgJS5jICQoc3JjZGlyKQpAR05VX3ZwYXRoQCAlLnJjICQoc3JjZGlyKQojIGZhbGxiYWNrIHRvIHJlZ3VsYXIgVlBBVEggZm9yIG5vbi1nbnUuLi4KQE5PTl9HTlVfVlBBVEhAICQoc3JjZGlyKQoKCiMKIyBUaGluZ3MgdG8gaW5zdGFsbAojCgojIGhlYWRlcnMKSU5TVEFMTEhFQURFUlM9XAoJbmV0LXNubXAtaW5jbHVkZXMuaCBcCgljb25maWdfYXBpLmggIFwKCW1pYl9hcGkuaCAgICAgXAoJb3V0cHV0X2FwaS5oICBcCglwZHVfYXBpLmggICAgIFwKCXNlc3Npb25fYXBpLmggXAoJc25tcHYzX2FwaS5oICBcCgl2YXJiaW5kX2FwaS5oIFwKCXR5cGVzLmggICAgICAgXAoJdXRpbGl0aWVzLmggICBcCgl2ZXJzaW9uLmggICAgIFwKCWRlZmluaXRpb25zLmgKCklOQ0xVREVTVUJESVI9bGlicmFyeQpJTkNMVURFU1VCRElSSEVBREVSUz1SRUFETUUgXAoJYXNuMS5oIFwKCWNhbGxiYWNrLmggXAoJY2VydF91dGlsLmggXAoJY29udGFpbmVyLmggXAoJY29udGFpbmVyX2JpbmFyeV9hcnJheS5oIFwKCWNvbnRhaW5lcl9saXN0X3NzbGwuaCBcCgljb250YWluZXJfaXRlcmF0b3IuaCBcCgljb250YWluZXJfbnVsbC5oIFwKCWZhY3RvcnkuaCBcCglkYXRhX2xpc3QuaCBcCglkZWZhdWx0X3N0b3JlLmggXAoJZGlyX3V0aWxzLmggXAoJZmRfZXZlbnRfbWFuYWdlci5oIFwKCWZpbGVfdXRpbHMuaCBcCglpbnQ2NC5oIFwKCWtleXRvb2xzLmggXAoJbWliLmggXAoJbWQ1LmggXAoJcGFyc2UuaCBcCglyZWFkX2NvbmZpZy5oIFwKCXNjYXBpLmggXAoJc25tcC5oIFwKCXNubXBfYWxhcm0uaCBcCglzbm1wX2FwaS5oIFwKCWxhcmdlX2ZkX3NldC5oIFwKCXNubXBfYXNzZXJ0LmggXAoJc25tcF9jbGllbnQuaCBcCglzbm1wX2RlYnVnLmggXAoJc25tcF9pbXBsLmggXAoJc25tcF9sb2dnaW5nLmggXAoJc25tcF9wYXJzZV9hcmdzLmggXAoJc25tcF9zZXJ2aWNlLmggXAoJc25tcC10Yy5oIFwKCXNubXB2My5oIFwKCXN5c3RlbS5oIFwKCXRleHRfdXRpbHMuaCBcCgl0b29scy5oIFwKCXRyYW5zZm9ybV9vaWRzLmggXAoJdHlwZXMuaCBcCiAgICAgICAgY211X2NvbXBhdC5oIFwKICAgICAgICBnZXRvcHQuaCBcCiAgICAgICAgbGNkX3RpbWUuaCBcCiAgICAgICAgbXRfc3VwcG9ydC5oIFwKICAgICAgICBvaWQuaCBcCiAgICAgICAgb2lkX3N0YXNoLmggXAogICAgICAgIHNubXBfZW51bS5oIFwKICAgICAgICBzbm1wX3NlY21vZC5oIFwKICAgICAgICB1Y2RfY29tcGF0LmggXAogICAgICAgIHZhY20uaCBcCgljaGVja192YXJiaW5kLmggXAoJc25tcF90cmFuc3BvcnQuaCBcCgl3aW5waXBlLmggXAoJd2luc2VydmljZS5oIFwKCUB0cmFuc3BvcnRfaGRyX2xpc3RAIFwKCUBzZWN1cml0eV9oZHJfbGlzdEAKCklOU1RBTExCVUlMVFNVQkRJUkhFQURFUlM9Li4vaW5jbHVkZS9uZXQtc25tcC9saWJyYXJ5L3NubXB2My1zZWN1cml0eS1pbmNsdWRlcy5oCklOU1RBTExCVUlMVFNVQkRJUj1saWJyYXJ5CgoKSU5TVEFMTFVDREhFQURFUlM9IGFzbjEuaCBcCgljYWxsYmFjay5oCVwKCWRlZmF1bHRfc3RvcmUuaAlcCglpbnQ2NC5oCQlcCglrZXl0b29scy5oCVwKCW1pYi5oCQlcCglwYXJzZS5oCQlcCglyZWFkX2NvbmZpZy5oCVwKCXNjYXBpLmgJCVwKCXNubXBfYWxhcm0uaAlcCglzbm1wX2FwaS5oCVwKCWxhcmdlX2ZkX3NldC5oCVwKCXNubXBfY2xpZW50LmgJXAoJc25tcF9kZWJ1Zy5oCVwKCXNubXAuaAkJXAoJc25tcF9pbXBsLmgJXAoJc25tcF9sb2dnaW5nLmgJXAoJc25tcF9wYXJzZV9hcmdzLmggXAoJc25tcC10Yy5oCVwKCXNubXB1c20uaAlcCglzbm1wdjMuaAlcCglzbm1wX3ZhcnMuaAlcCglzdHJ1Y3QuaAlcCglzeXN0ZW0uaAlcCgl0b29scy5oCQlcCgl0cmFuc2Zvcm1fb2lkcy5oCgojIGxpYnJhcmllcwpJTlNUQUxMTElCUz1saWJuZXRzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQpJTlNUQUxMVUNETElCUz1saWJzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKQoKIwojIFRoaW5ncyB0byBidWlsZAojCkNTUkNTPQlzbm1wX2NsaWVudC5jIG1pYi5jIHBhcnNlLmMgc25tcF9hcGkuYyBzbm1wLmMgCQlcCglsYXJnZV9mZF9zZXQuYyBjZXJ0X3V0aWwuYwkJCQlcCglzbm1wX2F1dGguYyBhc24xLmMgbWQ1LmMgc25tcF9wYXJzZV9hcmdzLmMJCVwKCXN5c3RlbS5jIHZhY20uYyBpbnQ2NC5jIHJlYWRfY29uZmlnLmMgcGtjcy5jCQlcCglzbm1wX2RlYnVnLmMgdG9vbHMuYyAgc25tcF9sb2dnaW5nLmMgdGV4dF91dGlscy5jCVwKCXNubXB2My5jIGxjZF90aW1lLmMga2V5dG9vbHMuYyBmaWxlX3V0aWxzLmMgZGlyX3V0aWxzLmMgXAoJc2NhcGkuYyBjYWxsYmFjay5jIGRlZmF1bHRfc3RvcmUuYyBzbm1wX2FsYXJtLmMJCVwKCWRhdGFfbGlzdC5jIG9pZF9zdGFzaC5jIGZkX2V2ZW50X21hbmFnZXIuYyAJCVwKCW10X3N1cHBvcnQuYyBzbm1wX2VudW0uYyBzbm1wLXRjLmMgc25tcF9zZXJ2aWNlLmMJXAoJc25wcmludGYuYwkJCQkJCVwKCXNubXBfdHJhbnNwb3J0LmMgQHRyYW5zcG9ydF9zcmNfbGlzdEAJCQlcCglzbm1wX3NlY21vZC5jIEBzZWN1cml0eV9zcmNfbGlzdEAgc25tcF92ZXJzaW9uLmMgICAgICAgIFwKCWNoZWNrX3ZhcmJpbmQuYyBjb250YWluZXIuYyBjb250YWluZXJfYmluYXJ5X2FycmF5LmMJXAoJY29udGFpbmVyX251bGwuYyBjb250YWluZXJfbGlzdF9zc2xsLmMgY29udGFpbmVyX2l0ZXJhdG9yLmMgXAoJY211X2NvbXBhdC5jIHVjZF9jb21wYXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCglzbm1wX29wZW5zc2wuYyBAb3RoZXJfc3JjX2xpc3RAIEBjcnlwdG9fZmlsZXNfY0AKCk9CSlM9CXNubXBfY2xpZW50Lm8gbWliLm8gcGFyc2UubyBzbm1wX2FwaS5vIHNubXAubyAJCVwKCWxhcmdlX2ZkX3NldC5vIGNlcnRfdXRpbC5vCQkJCVwKCXNubXBfYXV0aC5vIGFzbjEubyBtZDUubyBzbm1wX3BhcnNlX2FyZ3MubwkJXAoJc3lzdGVtLm8gdmFjbS5vIGludDY0Lm8gcmVhZF9jb25maWcubyBwa2NzLm8gCQlcCglzbm1wX2RlYnVnLm8gdG9vbHMubyAgc25tcF9sb2dnaW5nLm8gdGV4dF91dGlscy5vCVwKCXNubXB2My5vIGxjZF90aW1lLm8ga2V5dG9vbHMubyBmaWxlX3V0aWxzLm8gZGlyX3V0aWxzLm8gXAoJc2NhcGkubyBjYWxsYmFjay5vIGRlZmF1bHRfc3RvcmUubyBzbm1wX2FsYXJtLm8JCVwKCWRhdGFfbGlzdC5vIG9pZF9zdGFzaC5vIGZkX2V2ZW50X21hbmFnZXIubwkJXAoJbXRfc3VwcG9ydC5vIHNubXBfZW51bS5vIHNubXAtdGMubyBzbm1wX3NlcnZpY2UubwlcCglzbnByaW50Zi5vCQkJCQkJXAoJc25tcF90cmFuc3BvcnQubyBAdHJhbnNwb3J0X29ial9saXN0QCAgICAgICAgICAgICAgICAgICBcCglzbm1wX3NlY21vZC5vIEBzZWN1cml0eV9vYmpfbGlzdEAgc25tcF92ZXJzaW9uLm8gICAgICAgIFwKCWNoZWNrX3ZhcmJpbmQubyBjb250YWluZXIubyBjb250YWluZXJfYmluYXJ5X2FycmF5Lm8JXAoJY29udGFpbmVyX251bGwubyBjb250YWluZXJfbGlzdF9zc2xsLm8gY29udGFpbmVyX2l0ZXJhdG9yLm8gXAoJY211X2NvbXBhdC5vIHVjZF9jb21wYXQubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc25tcF9vcGVuc3NsLm8gQGNyeXB0b19maWxlc19vQCBAb3RoZXJfb2Jqc19saXN0QCBATElCT0JKU0AKCkxPQkpTPQlzbm1wX2NsaWVudC5sbyBtaWIubG8gcGFyc2UubG8gc25tcF9hcGkubG8gc25tcC5sbyAJXAoJbGFyZ2VfZmRfc2V0LmxvIGNlcnRfdXRpbC5sbwkJCQlcCglzbm1wX2F1dGgubG8gYXNuMS5sbyBtZDUubG8gc25tcF9wYXJzZV9hcmdzLmxvCQlcCglzeXN0ZW0ubG8gdmFjbS5sbyBpbnQ2NC5sbyByZWFkX2NvbmZpZy5sbyBwa2NzLmxvCVwKCXNubXBfZGVidWcubG8gdG9vbHMubG8gIHNubXBfbG9nZ2luZy5sbwkgdGV4dF91dGlscy5sbwlcCglzbm1wdjMubG8gbGNkX3RpbWUubG8ga2V5dG9vbHMubG8gZmlsZV91dGlscy5sbyBkaXJfdXRpbHMubG8gXAoJc2NhcGkubG8gY2FsbGJhY2subG8gZGVmYXVsdF9zdG9yZS5sbyBzbm1wX2FsYXJtLmxvCQlcCglkYXRhX2xpc3QubG8gb2lkX3N0YXNoLmxvIGZkX2V2ZW50X21hbmFnZXIubG8JCVwKCW10X3N1cHBvcnQubG8gc25tcF9lbnVtLmxvIHNubXAtdGMubG8gc25tcF9zZXJ2aWNlLmxvCVwKCXNucHJpbnRmLmxvCQkJCQkJXAoJc25tcF90cmFuc3BvcnQubG8gQHRyYW5zcG9ydF9sb2JqX2xpc3RAICAgICAgICAgICAgICAgICBcCglzbm1wX3NlY21vZC5sbyBAc2VjdXJpdHlfbG9ial9saXN0QCBzbm1wX3ZlcnNpb24ubG8gICAgIFwKCWNoZWNrX3ZhcmJpbmQubG8gY29udGFpbmVyLmxvIGNvbnRhaW5lcl9iaW5hcnlfYXJyYXkubG8JXAoJY29udGFpbmVyX251bGwubG8gY29udGFpbmVyX2xpc3Rfc3NsbC5sbyBjb250YWluZXJfaXRlcmF0b3IubG8gXAoJY211X2NvbXBhdC5sbyB1Y2RfY29tcGF0LmxvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgc25tcF9vcGVuc3NsLmxvIEBjcnlwdG9fZmlsZXNfbG9AIEBvdGhlcl9sb2Jqc19saXN0QCBATFRMSUJPQkpTQAoKIyBqdXN0IGluIGNhc2Ugc29tZW9uZSB3YW50cyB0byByZW1vdmUgbGlidG9vbCwgY2hhbmdlIHRoaXMgdG8gT0JKUy4KVE9CSlM9JChMT0JKUykKCiMgCkNQUEZMQUdTID0gJChUT1BfSU5DTFVERVMpIC1JLiAJJChTTk1QTElCX0lOQ0xVREVTKSBAQ1BQRkxBR1NACgphbGw6IHN0YW5kYXJkYWxsCgojIGhvdyB0byBidWlsZCB0aGUgbGlicmFyaWVzLgpsaWJuZXRzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKTogICAgJChUT0JKUykKCSQoTElCX0xEX0NNRCkgJEAgJChUT0JKUykgQExEX05PX1VOREVGSU5FREAgJChMREZMQUdTKSBATE5FVFNOTVBMSUJTQAoJJChSQU5MSUIpICRACgpsaWJzbm1wLiQoTElCX0VYVEVOU0lPTikkKExJQl9WRVJTSU9OKTogICAgJChUT0JKUykKCSQoTElCX0xEX0NNRCkgJEAgJChUT0JKUykgQExEX05PX1VOREVGSU5FREAgJChMREZMQUdTKSBATE5FVFNOTVBMSUJTQAoJJChSQU5MSUIpICRACgojCiMgaW50ZXJuYWwgdGVzdCBvYmplY3RzCiMKcGFyc2U6ICBtaWIubyBwYXJzZS5jCgkkKENDKSAkKENGTEFHUykgLURURVNUIHBhcnNlLmMgLW8gJEAgXAoJCWAkKHRvcF9zcmNkaXIpL25ldC1zbm1wLWNvbmZpZyAtLWxpYnNgCgp0ZXN0X2JpbmFyeV9hcnJheTogdGVzdF9iaW5hcnlfYXJyYXkuYwoJJChDQykgJChDRkxBR1MpIHRlc3RfYmluYXJ5X2FycmF5LmMgLW8gJEAgXAoJCWAkKHRvcF9zcmNkaXIpL25ldC1zbm1wLWNvbmZpZyAtLWxpYnNgCg==