IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgR0hBU0ggZm9yIEFSTXY4IENyeXB0byBFeHRlbnNpb24sIDY0LWJpdCBwb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uLgojCiMgSnVuZSAyMDE0CiMKIyBJbml0aWFsIHZlcnNpb24gd2FzIGRldmVsb3BlZCBpbiB0aWdodCBjb29wZXJhdGlvbiB3aXRoIEFyZAojIEJpZXNoZXV2ZWwgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+IGZyb20gYml0cy1uLXBpZWNlcyBmcm9tCiMgb3RoZXIgYXNzZW1ibHkgbW9kdWxlcy4gSnVzdCBsaWtlIGFlc3Y4LWFybXgucGwgdGhpcyBtb2R1bGUKIyBzdXBwb3J0cyBib3RoIEFBcmNoMzIgYW5kIEFBcmNoNjQgZXhlY3V0aW9uIG1vZGVzLgojCiMgSnVseSAyMDE0CiMKIyBJbXBsZW1lbnQgMnggYWdncmVnYXRlZCByZWR1Y3Rpb24gW3NlZSBnaGFzaC14ODYucGwgZm9yIGJhY2tncm91bmQKIyBpbmZvcm1hdGlvbl0uCiMKIyBDdXJyZW50IHBlcmZvcm1hbmNlIGluIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGU6CiMKIwkJUE1VTExbMl0JMzItYml0IE5FT04oKikKIyBBcHBsZSBBNwkwLjkyCQk1LjYyCiMgQ29ydGV4LUE1MwkxLjAxCQk4LjM5CiMgQ29ydGV4LUE1NwkxLjE3CQk3LjYxCiMgRGVudmVyCTAuNzEJCTYuMDIKIwojICgqKQlwcmVzZW50ZWQgZm9yIHJlZmVyZW5jZS9jb21wYXJpc29uIHB1cnBvc2VzOwoKJGZsYXZvdXIgPSBzaGlmdDsKJG91dHB1dCAgPSBzaGlmdDsKCiQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CiggJHhsYXRlPSIke2Rpcn1hcm0teGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgooICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS9hcm0teGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCmRpZSAiY2FuJ3QgbG9jYXRlIGFybS14bGF0ZS5wbCI7CgpvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKlNURE9VVD0qT1VUOwoKJFhpPSJ4MCI7CSMgYXJndW1lbnQgYmxvY2sKJEh0Ymw9IngxIjsKJGlucD0ieDIiOwokbGVuPSJ4MyI7CgokaW5jPSJ4MTIiOwoKewpteSAoJFhsLCRYbSwkWGgsJElOKT1tYXAoInEkXyIsKDAuLjMpKTsKbXkgKCR0MCwkdDEsJHQyLCR4QzIsJEgsJEhobCwkSDIpPW1hcCgicSRfIiwoOC4uMTQpKTsKCiRjb2RlPTw8X19fOwojaW5jbHVkZSAiYXJtX2FyY2guaCIKCi50ZXh0Cl9fXwokY29kZS49PDxfX18gaWYgKCRmbGF2b3VyID1+IC82NC8pOwojaWYgIWRlZmluZWQoX19jbGFuZ19fKQouYXJjaCAgYXJtdjgtYStjcnlwdG8KI2VuZGlmCl9fXwokY29kZS49Ii5mcHUJbmVvblxuLmNvZGUJMzJcbiIJaWYgKCRmbGF2b3VyICF+IC82NC8pOwoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyB2b2lkIGdjbV9pbml0X3Y4KHUxMjggSHRhYmxlWzE2XSxjb25zdCB1NjQgSFsyXSk7CiMKIyBpbnB1dDoJMTI4LWJpdCBIIC0gc2VjcmV0IHBhcmFtZXRlciBFKEssMF4xMjgpCiMgb3V0cHV0OglwcmVjb21wdXRlZCB0YWJsZSBmaWxsZWQgd2l0aCBkZWdyZWVzIG9mIHR3aXN0ZWQgSDsKIwkJSCBpcyB0d2lzdGVkIHRvIGhhbmRsZSByZXZlcnNlIGJpdG5lc3Mgb2YgR0hBU0g7CiMJCW9ubHkgZmV3IG9mIDE2IHNsb3RzIG9mIEh0YWJsZVsxNl0gYXJlIHVzZWQ7CiMJCWRhdGEgaXMgb3BhcXVlIHRvIG91dHNpZGUgd29ybGQgKHdoaWNoIGFsbG93cyB0bwojCQlvcHRpbWl6ZSB0aGUgY29kZSBpbmRlcGVuZGVudGx5KTsKIwokY29kZS49PDxfX187Ci5nbG9iYWwJZ2NtX2luaXRfdjgKLnR5cGUJZ2NtX2luaXRfdjgsJWZ1bmN0aW9uCi5hbGlnbgk0CmdjbV9pbml0X3Y4OgoJdmxkMS42NAkJeyR0MX0sW3gxXQkJQCBsb2FkIGlucHV0IEgKCXZtb3YuaTgJCSR4QzIsIzB4ZTEKCXZzaGwuaTY0CSR4QzIsJHhDMiwjNTcJCUAgMHhjMi4wCgl2ZXh0LjgJCSRJTiwkdDEsJHQxLCM4Cgl2c2hyLnU2NAkkdDIsJHhDMiwjNjMKCXZkdXAuMzIJCSR0MSwke3QxfVsxXQoJdmV4dC44CQkkdDAsJHQyLCR4QzIsIzgJCUAgdDA9MHhjMi4uLi4wMQoJdnNoci51NjQJJHQyLCRJTiwjNjMKCXZzaHIuczMyCSR0MSwkdDEsIzMxCQlAIGJyb2FkY2FzdCBjYXJyeSBiaXQKCXZhbmQJCSR0MiwkdDIsJHQwCgl2c2hsLmk2NAkkSU4sJElOLCMxCgl2ZXh0LjgJCSR0MiwkdDIsJHQyLCM4Cgl2YW5kCQkkdDAsJHQwLCR0MQoJdm9ycgkJJElOLCRJTiwkdDIJCUAgSDw8PD0xCgl2ZW9yCQkkSCwkSU4sJHQwCQlAIHR3aXN0ZWQgSAoJdnN0MS42NAkJeyRIfSxbeDBdLCMxNgkJQCBzdG9yZSBIdGFibGVbMF0KCglAIGNhbGN1bGF0ZSBIXjIKCXZleHQuOAkJJHQwLCRILCRILCM4CQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwoJdnBtdWxsLnA2NAkkWGwsJEgsJEgKCXZlb3IJCSR0MCwkdDAsJEgKCXZwbXVsbDIucDY0CSRYaCwkSCwkSAoJdnBtdWxsLnA2NAkkWG0sJHQwLCR0MAoKCXZleHQuOAkJJHQxLCRYbCwkWGgsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwoJdmVvcgkJJHQyLCRYbCwkWGgKCXZlb3IJCSRYbSwkWG0sJHQxCgl2ZW9yCQkkWG0sJFhtLCR0MgoJdnBtdWxsLnA2NAkkdDIsJFhsLCR4QzIJCUAgMXN0IHBoYXNlCgoJdm1vdgkJJFhoI2xvLCRYbSNoaQkJQCBYaHxYbSAtIDI1Ni1iaXQgcmVzdWx0Cgl2bW92CQkkWG0jaGksJFhsI2xvCQlAIFhtIGlzIHJvdGF0ZWQgWGwKCXZlb3IJCSRYbCwkWG0sJHQyCgoJdmV4dC44CQkkdDIsJFhsLCRYbCwjOAkJQCAybmQgcGhhc2UKCXZwbXVsbC5wNjQJJFhsLCRYbCwkeEMyCgl2ZW9yCQkkdDIsJHQyLCRYaAoJdmVvcgkJJEgyLCRYbCwkdDIKCgl2ZXh0LjgJCSR0MSwkSDIsJEgyLCM4CQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwoJdmVvcgkJJHQxLCR0MSwkSDIKCXZleHQuOAkJJEhobCwkdDAsJHQxLCM4CQlAIHBhY2sgS2FyYXRzdWJhIHByZS1wcm9jZXNzZWQKCXZzdDEuNjQJCXskSGhsLSRIMn0sW3gwXQkJQCBzdG9yZSBIdGFibGVbMS4uMl0KCglyZXQKLnNpemUJZ2NtX2luaXRfdjgsLi1nY21faW5pdF92OApfX18KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyB2b2lkIGdjbV9nbXVsdF92OCh1NjQgWGlbMl0sY29uc3QgdTEyOCBIdGFibGVbMTZdKTsKIwojIGlucHV0OglYaSAtIGN1cnJlbnQgaGFzaCB2YWx1ZTsKIwkJSHRhYmxlIC0gdGFibGUgcHJlY29tcHV0ZWQgaW4gZ2NtX2luaXRfdjg7CiMgb3V0cHV0OglYaSAtIG5leHQgaGFzaCB2YWx1ZSBYaTsKIwokY29kZS49PDxfX187Ci5nbG9iYWwJZ2NtX2dtdWx0X3Y4Ci50eXBlCWdjbV9nbXVsdF92OCwlZnVuY3Rpb24KLmFsaWduCTQKZ2NtX2dtdWx0X3Y4OgoJdmxkMS42NAkJeyR0MX0sWyRYaV0JCUAgbG9hZCBYaQoJdm1vdi5pOAkJJHhDMiwjMHhlMQoJdmxkMS42NAkJeyRILSRIaGx9LFskSHRibF0JQCBsb2FkIHR3aXN0ZWQgSCwgLi4uCgl2c2hsLnU2NAkkeEMyLCR4QzIsIzU3CiNpZm5kZWYgX19BUk1FQl9fCgl2cmV2NjQuOAkkdDEsJHQxCiNlbmRpZgoJdmV4dC44CQkkSU4sJHQxLCR0MSwjOAoKCXZwbXVsbC5wNjQJJFhsLCRILCRJTgkJQCBILmxvt1hpLmxvCgl2ZW9yCQkkdDEsJHQxLCRJTgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZwbXVsbDIucDY0CSRYaCwkSCwkSU4JCUAgSC5oabdYaS5oaQoJdnBtdWxsLnA2NAkkWG0sJEhobCwkdDEJCUAgKEgubG8rSC5oaSm3KFhpLmxvK1hpLmhpKQoKCXZleHQuOAkJJHQxLCRYbCwkWGgsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwoJdmVvcgkJJHQyLCRYbCwkWGgKCXZlb3IJCSRYbSwkWG0sJHQxCgl2ZW9yCQkkWG0sJFhtLCR0MgoJdnBtdWxsLnA2NAkkdDIsJFhsLCR4QzIJCUAgMXN0IHBoYXNlIG9mIHJlZHVjdGlvbgoKCXZtb3YJCSRYaCNsbywkWG0jaGkJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAoJdm1vdgkJJFhtI2hpLCRYbCNsbwkJQCBYbSBpcyByb3RhdGVkIFhsCgl2ZW9yCQkkWGwsJFhtLCR0MgoKCXZleHQuOAkJJHQyLCRYbCwkWGwsIzgJCUAgMm5kIHBoYXNlIG9mIHJlZHVjdGlvbgoJdnBtdWxsLnA2NAkkWGwsJFhsLCR4QzIKCXZlb3IJCSR0MiwkdDIsJFhoCgl2ZW9yCQkkWGwsJFhsLCR0MgoKI2lmbmRlZiBfX0FSTUVCX18KCXZyZXY2NC44CSRYbCwkWGwKI2VuZGlmCgl2ZXh0LjgJCSRYbCwkWGwsJFhsLCM4Cgl2c3QxLjY0CQl7JFhsfSxbJFhpXQkJQCB3cml0ZSBvdXQgWGkKCglyZXQKLnNpemUJZ2NtX2dtdWx0X3Y4LC4tZ2NtX2dtdWx0X3Y4Cl9fXwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIHZvaWQgZ2NtX2doYXNoX3Y4KHU2NCBYaVsyXSxjb25zdCB1MTI4IEh0YWJsZVsxNl0sY29uc3QgdTggKmlucCxzaXplX3QgbGVuKTsKIwojIGlucHV0Ogl0YWJsZSBwcmVjb21wdXRlZCBpbiBnY21faW5pdF92ODsKIwkJY3VycmVudCBoYXNoIHZhbHVlIFhpOwojCQlwb2ludGVyIHRvIGlucHV0IGRhdGE7CiMJCWxlbmd0aCBvZiBpbnB1dCBkYXRhIGluIGJ5dGVzLCBidXQgZGl2aXNpYmxlIGJ5IGJsb2NrIHNpemU7CiMgb3V0cHV0OgluZXh0IGhhc2ggdmFsdWUgWGk7CiMKJGNvZGUuPTw8X19fOwouZ2xvYmFsCWdjbV9naGFzaF92OAoudHlwZQlnY21fZ2hhc2hfdjgsJWZ1bmN0aW9uCi5hbGlnbgk0CmdjbV9naGFzaF92ODoKX19fCiRjb2RlLj08PF9fXwkJaWYgKCRmbGF2b3VyICF+IC82NC8pOwoJdnN0bWRiCQlzcCEse2Q4LWQxNX0JCUAgMzItYml0IEFCSSBzYXlzIHNvCl9fXwokY29kZS49PDxfX187Cgl2bGQxLjY0CQl7JFhsfSxbJFhpXQkJQCBsb2FkIFtyb3RhdGVkXSBYaQoJCQkJCQlAICJbcm90YXRlZF0iIG1lYW5zIHRoYXQKCQkJCQkJQCBsb2FkZWQgdmFsdWUgd291bGQgaGF2ZQoJCQkJCQlAIHRvIGJlIHJvdGF0ZWQgaW4gb3JkZXIgdG8KCQkJCQkJQCBtYWtlIGl0IGFwcGVhciBhcyBpbgoJCQkJCQlAIGFsb3JpdGhtIHNwZWNpZmljYXRpb24KCXN1YnMJCSRsZW4sJGxlbiwjMzIJCUAgc2VlIGlmICRsZW4gaXMgMzIgb3IgbGFyZ2VyCgltb3YJCSRpbmMsIzE2CQlAICRpbmMgaXMgdXNlZCBhcyBwb3N0LQoJCQkJCQlAIGluY3JlbWVudCBmb3IgaW5wdXQgcG9pbnRlcjsKCQkJCQkJQCBhcyBsb29wIGlzIG1vZHVsby1zY2hlZHVsZWQKCQkJCQkJQCAkaW5jIGlzIHplcm9lZCBqdXN0IGluIHRpbWUKCQkJCQkJQCB0byBwcmVjbHVkZSBvdmVyc3RlcGluZwoJCQkJCQlAIGlucFtsZW5dLCB3aGljaCBtZWFucyB0aGF0CgkJCQkJCUAgbGFzdCBibG9ja1tzXSBhcmUgYWN0dWFsbHkKCQkJCQkJQCBsb2FkZWQgdHdpY2UsIGJ1dCBsYXN0CgkJCQkJCUAgY29weSBpcyBub3QgcHJvY2Vzc2VkCgl2bGQxLjY0CQl7JEgtJEhobH0sWyRIdGJsXSwjMzIJQCBsb2FkIHR3aXN0ZWQgSCwgLi4uLCBIXjIKCXZtb3YuaTgJCSR4QzIsIzB4ZTEKCXZsZDEuNjQJCXskSDJ9LFskSHRibF0KCWNjbHIJCSRpbmMsZXEJCQlAIGlzIGl0IHRpbWUgdG8gemVybyAkaW5jPwoJdmV4dC44CQkkWGwsJFhsLCRYbCwjOAkJQCByb3RhdGUgWGkKCXZsZDEuNjQJCXskdDB9LFskaW5wXSwjMTYJQCBsb2FkIFtyb3RhdGVkXSBJWzBdCgl2c2hsLnU2NAkkeEMyLCR4QzIsIzU3CQlAIGNvbXBvc2UgMHhjMi4wIGNvbnN0YW50CiNpZm5kZWYgX19BUk1FQl9fCgl2cmV2NjQuOAkkdDAsJHQwCgl2cmV2NjQuOAkkWGwsJFhsCiNlbmRpZgoJdmV4dC44CQkkSU4sJHQwLCR0MCwjOAkJQCByb3RhdGUgSVswXQoJYi5sbwkJLkxvZGRfdGFpbF92OAkJQCAkbGVuIHdhcyBsZXNzIHRoYW4gMzIKX19fCnsgbXkgKCRYbG4sJFhtbiwkWGhuLCRJbikgPSBtYXAoInEkXyIsKDQuLjcpKTsKCSMjIyMjIyMKCSMgWGkrMiA9W0gqKElpKzEgKyBYaSsxKV0gbW9kIFAgPQoJIwlbKEgqSWkrMSkgKyAoSCpYaSsxKV0gbW9kIFAgPQoJIwlbKEgqSWkrMSkgKyBIXjIqKElpK1hpKV0gbW9kIFAKCSMKJGNvZGUuPTw8X19fOwoJdmxkMS42NAkJeyR0MX0sWyRpbnBdLCRpbmMJQCBsb2FkIFtyb3RhdGVkXSBJWzFdCiNpZm5kZWYgX19BUk1FQl9fCgl2cmV2NjQuOAkkdDEsJHQxCiNlbmRpZgoJdmV4dC44CQkkSW4sJHQxLCR0MSwjOAoJdmVvcgkJJElOLCRJTiwkWGwJCUAgSVtpXV49WGkKCXZwbXVsbC5wNjQJJFhsbiwkSCwkSW4JCUAgSLdJaSsxCgl2ZW9yCQkkdDEsJHQxLCRJbgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZwbXVsbDIucDY0CSRYaG4sJEgsJEluCgliCQkuTG9vcF9tb2QyeF92OAoKLmFsaWduCTQKLkxvb3BfbW9kMnhfdjg6Cgl2ZXh0LjgJCSR0MiwkSU4sJElOLCM4CglzdWJzCQkkbGVuLCRsZW4sIzMyCQlAIGlzIHRoZXJlIG1vcmUgZGF0YT8KCXZwbXVsbC5wNjQJJFhsLCRIMiwkSU4JCUAgSF4yLmxvt1hpLmxvCgljY2xyCQkkaW5jLGxvCQkJQCBpcyBpdCB0aW1lIHRvIHplcm8gJGluYz8KCgkgdnBtdWxsLnA2NAkkWG1uLCRIaGwsJHQxCgl2ZW9yCQkkdDIsJHQyLCRJTgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZwbXVsbDIucDY0CSRYaCwkSDIsJElOCQlAIEheMi5oabdYaS5oaQoJdmVvcgkJJFhsLCRYbCwkWGxuCQlAIGFjY3VtdWxhdGUKCXZwbXVsbDIucDY0CSRYbSwkSGhsLCR0MgkJQCAoSF4yLmxvK0heMi5oaSm3KFhpLmxvK1hpLmhpKQoJIHZsZDEuNjQJeyR0MH0sWyRpbnBdLCRpbmMJQCBsb2FkIFtyb3RhdGVkXSBJW2krMl0KCgl2ZW9yCQkkWGgsJFhoLCRYaG4KCSBjY2xyCQkkaW5jLGVxCQkJQCBpcyBpdCB0aW1lIHRvIHplcm8gJGluYz8KCXZlb3IJCSRYbSwkWG0sJFhtbgoKCXZleHQuOAkJJHQxLCRYbCwkWGgsIzgJCUAgS2FyYXRzdWJhIHBvc3QtcHJvY2Vzc2luZwoJdmVvcgkJJHQyLCRYbCwkWGgKCXZlb3IJCSRYbSwkWG0sJHQxCgkgdmxkMS42NAl7JHQxfSxbJGlucF0sJGluYwlAIGxvYWQgW3JvdGF0ZWRdIElbaSszXQojaWZuZGVmIF9fQVJNRUJfXwoJIHZyZXY2NC44CSR0MCwkdDAKI2VuZGlmCgl2ZW9yCQkkWG0sJFhtLCR0MgoJdnBtdWxsLnA2NAkkdDIsJFhsLCR4QzIJCUAgMXN0IHBoYXNlIG9mIHJlZHVjdGlvbgoKI2lmbmRlZiBfX0FSTUVCX18KCSB2cmV2NjQuOAkkdDEsJHQxCiNlbmRpZgoJdm1vdgkJJFhoI2xvLCRYbSNoaQkJQCBYaHxYbSAtIDI1Ni1iaXQgcmVzdWx0Cgl2bW92CQkkWG0jaGksJFhsI2xvCQlAIFhtIGlzIHJvdGF0ZWQgWGwKCSB2ZXh0LjgJCSRJbiwkdDEsJHQxLCM4CgkgdmV4dC44CQkkSU4sJHQwLCR0MCwjOAoJdmVvcgkJJFhsLCRYbSwkdDIKCSB2cG11bGwucDY0CSRYbG4sJEgsJEluCQlAIEi3SWkrMQoJdmVvcgkJJElOLCRJTiwkWGgJCUAgYWNjdW11bGF0ZSAkSU4gZWFybHkKCgl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4CQlAIDJuZCBwaGFzZSBvZiByZWR1Y3Rpb24KCXZwbXVsbC5wNjQJJFhsLCRYbCwkeEMyCgl2ZW9yCQkkSU4sJElOLCR0MgoJIHZlb3IJCSR0MSwkdDEsJEluCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwoJdmVvcgkJJElOLCRJTiwkWGwKCSB2cG11bGwyLnA2NAkkWGhuLCRILCRJbgoJYi5ocwkJLkxvb3BfbW9kMnhfdjgJCUAgdGhlcmUgd2FzIGF0IGxlYXN0IDMyIG1vcmUgYnl0ZXMKCgl2ZW9yCQkkWGgsJFhoLCR0MgoJdmV4dC44CQkkSU4sJHQwLCR0MCwjOAkJQCByZS1jb25zdHJ1Y3QgJElOCglhZGRzCQkkbGVuLCRsZW4sIzMyCQlAIHJlLWNvbnN0cnVjdCAkbGVuCgl2ZW9yCQkkWGwsJFhsLCRYaAkJQCByZS1jb25zdHJ1Y3QgJFhsCgliLmVxCQkuTGRvbmVfdjgJCUAgaXMgJGxlbiB6ZXJvPwpfX18KfQokY29kZS49PDxfX187Ci5Mb2RkX3RhaWxfdjg6Cgl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4Cgl2ZW9yCQkkSU4sJElOLCRYbAkJQCBpbnBePVhpCgl2ZW9yCQkkdDEsJHQwLCR0MgkJQCAkdDEgaXMgcm90YXRlZCBpbnBeWGkKCgl2cG11bGwucDY0CSRYbCwkSCwkSU4JCUAgSC5sb7dYaS5sbwoJdmVvcgkJJHQxLCR0MSwkSU4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGm3WGkuaGkKCXZwbXVsbC5wNjQJJFhtLCRIaGwsJHQxCQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKCgl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXZlb3IJCSR0MiwkWGwsJFhoCgl2ZW9yCQkkWG0sJFhtLCR0MQoJdmVvcgkJJFhtLCRYbSwkdDIKCXZwbXVsbC5wNjQJJHQyLCRYbCwkeEMyCQlAIDFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KCgl2bW92CQkkWGgjbG8sJFhtI2hpCQlAIFhofFhtIC0gMjU2LWJpdCByZXN1bHQKCXZtb3YJCSRYbSNoaSwkWGwjbG8JCUAgWG0gaXMgcm90YXRlZCBYbAoJdmVvcgkJJFhsLCRYbSwkdDIKCgl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4CQlAIDJuZCBwaGFzZSBvZiByZWR1Y3Rpb24KCXZwbXVsbC5wNjQJJFhsLCRYbCwkeEMyCgl2ZW9yCQkkdDIsJHQyLCRYaAoJdmVvcgkJJFhsLCRYbCwkdDIKCi5MZG9uZV92ODoKI2lmbmRlZiBfX0FSTUVCX18KCXZyZXY2NC44CSRYbCwkWGwKI2VuZGlmCgl2ZXh0LjgJCSRYbCwkWGwsJFhsLCM4Cgl2c3QxLjY0CQl7JFhsfSxbJFhpXQkJQCB3cml0ZSBvdXQgWGkKCl9fXwokY29kZS49PDxfX18JCWlmICgkZmxhdm91ciAhfiAvNjQvKTsKCXZsZG1pYQkJc3AhLHtkOC1kMTV9CQlAIDMyLWJpdCBBQkkgc2F5cyBzbwpfX18KJGNvZGUuPTw8X19fOwoJcmV0Ci5zaXplCWdjbV9naGFzaF92OCwuLWdjbV9naGFzaF92OApfX18KfQokY29kZS49PDxfX187Ci5hc2NpeiAgIkdIQVNIIGZvciBBUk12OCwgQ1JZUFRPR0FNUyBieSA8YXBwcm9cQG9wZW5zc2wub3JnPiIKLmFsaWduICAyCl9fXwoKaWYgKCRmbGF2b3VyID1+IC82NC8pIHsJCQkjIyMjIyMjIyA2NC1iaXQgY29kZQogICAgc3ViIHVudm1vdiB7CglteSAkYXJnPXNoaWZ0OwoKCSRhcmcgPX4gbS9xKFswLTldKykjKGxvfGhpKSxccypxKFswLTldKykjKGxvfGhpKS9vICYmCglzcHJpbnRmCSJpbnMJdiVkLmRbJWRdLHYlZC5kWyVkXSIsJDEsKCQyIGVxICJsbyIpPzA6MSwkMywoJDQgZXEgImxvIik/MDoxOwogICAgfQogICAgZm9yZWFjaChzcGxpdCgiXG4iLCRjb2RlKSkgewoJcy9jY2xyXHMrKFt3eF0pKFteLF0rKSxccyooW2Etel0rKS9jc2VsCSQxJDIsJDF6ciwkMSQyLCQzL28Jb3IKCXMvdm1vdlwuaTgvbW92aS9vCQlvcgkjIGZpeCB1cCBsZWdhY3kgbW5lbW9uaWNzCglzL3Ztb3ZccysoLiopL3Vudm1vdigkMSkvZ2VvCW9yCglzL3ZleHRcLjgvZXh0L28JCQlvcgoJcy92c2hyXC5zL3NzaHJcLnMvbwkJb3IKCXMvdnNoci91c2hyL28JCQlvcgoJcy9eKFxzKyl2LyQxL28JCQlvcgkjIHN0cmlwIG9mZiB2IHByZWZpeAoJcy9cYmJ4XHMrbHJcYi9yZXQvbzsKCglzL1xicShbMC05XSspXGIvInYiLigkMTw4PyQxOiQxKzgpLiIuMTZiIi9nZW87CSMgb2xkLT5uZXcgcmVnaXN0ZXJzCglzL0Bccy9cL1wvL287CQkJCSMgb2xkLT5uZXcgc3R5bGUgY29tbWVudGFyeQoKCSMgZml4IHVwIHJlbWFpbmlnIGxlZ2FjeSBzdWZmaXhlcwoJcy9cLlt1aV0/OChccykvJDEvbzsKCXMvXC5bdWlzXT8zMi8vbyBhbmQgcy9cLjE2Yi9cLjRzL2dvOwoJbS9cLnA2NC9vIGFuZCBzL1wuMTZiL1wuMXEvbzsJCSMgMXN0IHBtdWxsIGFyZ3VtZW50CgltL2xcLnA2NC9vIGFuZCBzL1wuMTZiL1wuMWQvZ287CQkjIDJuZCBhbmQgM3JkIHBtdWxsIGFyZ3VtZW50cwoJcy9cLlt1aXNwXT82NC8vbyBhbmQgcy9cLjE2Yi9cLjJkL2dvOwoJcy9cLls0Ml0oW3NkXSlcWyhbMC0zXSlcXS9cLiQxXFskMlxdL287CgoJcHJpbnQgJF8sIlxuIjsKICAgIH0KfSBlbHNlIHsJCQkJIyMjIyMjIyMgMzItYml0IGNvZGUKICAgIHN1YiB1bnZkdXAzMiB7CglteSAkYXJnPXNoaWZ0OwoKCSRhcmcgPX4gbS9xKFswLTldKyksXHMqcShbMC05XSspXFsoWzAtM10pXF0vbyAmJgoJc3ByaW50ZgkidmR1cC4zMglxJWQsZCVkWyVkXSIsJDEsMiokMisoJDM+PjEpLCQzJjE7CiAgICB9CiAgICBzdWIgdW52cG11bGxwNjQgewoJbXkgKCRtbmVtb25pYywkYXJnKT1AXzsKCglpZiAoJGFyZyA9fiBtL3EoWzAtOV0rKSxccypxKFswLTldKyksXHMqcShbMC05XSspL28pIHsKCSAgICBteSAkd29yZCA9IDB4ZjJhMDBlMDB8KCgkMSY3KTw8MTMpfCgoJDEmOCk8PDE5KQoJCQkJIHwoKCQyJjcpPDwxNyl8KCgkMiY4KTw8NCkKCQkJCSB8KCgkMyY3KTw8MSkgfCgoJDMmOCk8PDIpOwoJICAgICR3b3JkIHw9IDB4MDAwMTAwMDEJIGlmICgkbW5lbW9uaWMgPX4gIjIiKTsKCSAgICAjIHNpbmNlIEFSTXY3IGluc3RydWN0aW9ucyBhcmUgYWx3YXlzIGVuY29kZWQgbGl0dGxlLWVuZGlhbi4KCSAgICAjIGNvcnJlY3Qgc29sdXRpb24gaXMgdG8gdXNlIC5pbnN0IGRpcmVjdGl2ZSwgYnV0IG9sZGVyCgkgICAgIyBhc3NlbWJsZXJzIGRvbid0IGltcGxlbWVudCBpdDotKAoJICAgIHNwcmludGYgIi5ieXRlXHQweCUwMngsMHglMDJ4LDB4JTAyeCwweCUwMnhcdEAgJXMgJXMiLAoJCQkkd29yZCYweGZmLCgkd29yZD4+OCkmMHhmZiwKCQkJKCR3b3JkPj4xNikmMHhmZiwoJHdvcmQ+PjI0KSYweGZmLAoJCQkkbW5lbW9uaWMsJGFyZzsKCX0KICAgIH0KCiAgICBmb3JlYWNoKHNwbGl0KCJcbiIsJGNvZGUpKSB7CglzL1xiW3d4XShbMC05XSspXGIvciQxL2dvOwkJIyBuZXctPm9sZCByZWdpc3RlcnMKCXMvXGJ2KFswLTldKVwuWzEyNDY4XStbYnNkXVxiL3EkMS9nbzsJIyBuZXctPm9sZCByZWdpc3RlcnMKCXMvXC9cL1xzPy9AIC9vOwkJCQkjIG5ldy0+b2xkIHN0eWxlIGNvbW1lbnRhcnkKCgkjIGZpeCB1cCByZW1haW5pZyBuZXctc3R5bGUgc3VmZml4ZXMKCXMvXF0sI1swLTldKy9dIS9vOwoKCXMvY2NsclxzKyhbXixdKyksXHMqKFthLXpdKykvbW92JDIJJDEsIzAvbwkJCW9yCglzL3ZkdXBcLjMyXHMrKC4qKS91bnZkdXAzMigkMSkvZ2VvCQkJCW9yCglzL3Y/KHBtdWxsMj8pXC5wNjRccysoLiopL3VudnBtdWxscDY0KCQxLCQyKS9nZW8JCW9yCglzL1xicShbMC05XSspIyhsb3xoaSkvc3ByaW50ZiAiZCVkIiwyKiQxKygkMiBlcSAiaGkiKS9nZW8Jb3IKCXMvXihccyspYlwuLyQxYi9vCQkJCQkJb3IKCXMvXihccyspcmV0LyQxYnhcdGxyL287CgoJcHJpbnQgJF8sIlxuIjsKICAgIH0KfQoKY2xvc2UgU1RET1VUOyAjIGVuZm9yY2UgZmx1c2gK