IyEvdXNyL2Jpbi9lbnYgcGVybAojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIyBXcml0dGVuIGJ5IEFuZHkgUG9seWFrb3YgPGFwcHJvQG9wZW5zc2wub3JnPiBmb3IgdGhlIE9wZW5TU0wKIyBwcm9qZWN0LiBUaGUgbW9kdWxlIGlzLCBob3dldmVyLCBkdWFsIGxpY2Vuc2VkIHVuZGVyIE9wZW5TU0wgYW5kCiMgQ1JZUFRPR0FNUyBsaWNlbnNlcyBkZXBlbmRpbmcgb24gd2hlcmUgeW91IG9idGFpbiBpdC4gRm9yIGZ1cnRoZXIKIyBkZXRhaWxzIHNlZSBodHRwOi8vd3d3Lm9wZW5zc2wub3JnL35hcHByby9jcnlwdG9nYW1zLy4KIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgR0hBU0ggZm9yIEFSTXY4IENyeXB0byBFeHRlbnNpb24sIDY0LWJpdCBwb2x5bm9taWFsIG11bHRpcGxpY2F0aW9uLgojCiMgSnVuZSAyMDE0CiMKIyBJbml0aWFsIHZlcnNpb24gd2FzIGRldmVsb3BlZCBpbiB0aWdodCBjb29wZXJhdGlvbiB3aXRoIEFyZAojIEJpZXNoZXV2ZWwgPGFyZC5iaWVzaGV1dmVsQGxpbmFyby5vcmc+IGZyb20gYml0cy1uLXBpZWNlcyBmcm9tCiMgb3RoZXIgYXNzZW1ibHkgbW9kdWxlcy4gSnVzdCBsaWtlIGFlc3Y4LWFybXgucGwgdGhpcyBtb2R1bGUKIyBzdXBwb3J0cyBib3RoIEFBcmNoMzIgYW5kIEFBcmNoNjQgZXhlY3V0aW9uIG1vZGVzLgojCiMgSnVseSAyMDE0CiMKIyBJbXBsZW1lbnQgMnggYWdncmVnYXRlZCByZWR1Y3Rpb24gW3NlZSBnaGFzaC14ODYucGwgZm9yIGJhY2tncm91bmQKIyBpbmZvcm1hdGlvbl0uCiMKIyBDdXJyZW50IHBlcmZvcm1hbmNlIGluIGN5Y2xlcyBwZXIgcHJvY2Vzc2VkIGJ5dGU6CiMKIwkJUE1VTExbMl0JMzItYml0IE5FT04oKikKIyBBcHBsZSBBNwkwLjkyCQk1LjYyCiMgQ29ydGV4LUE1MwkxLjAxCQk4LjM5CiMgQ29ydGV4LUE1NwkxLjE3CQk3LjYxCiMgRGVudmVyCTAuNzEJCTYuMDIKIwojICgqKQlwcmVzZW50ZWQgZm9yIHJlZmVyZW5jZS9jb21wYXJpc29uIHB1cnBvc2VzOwoKJGZsYXZvdXIgPSBzaGlmdDsKJG91dHB1dCAgPSBzaGlmdDsKCiQwID1+IG0vKC4qW1wvXFxdKVteXC9cXF0rJC87ICRkaXI9JDE7CiggJHhsYXRlPSIke2Rpcn1hcm0teGxhdGUucGwiIGFuZCAtZiAkeGxhdGUgKSBvcgooICR4bGF0ZT0iJHtkaXJ9Li4vLi4vcGVybGFzbS9hcm0teGxhdGUucGwiIGFuZCAtZiAkeGxhdGUpIG9yCmRpZSAiY2FuJ3QgbG9jYXRlIGFybS14bGF0ZS5wbCI7CgpvcGVuIE9VVCwifCBcIiReWFwiICR4bGF0ZSAkZmxhdm91ciAkb3V0cHV0IjsKKlNURE9VVD0qT1VUOwoKJFhpPSJ4MCI7CSMgYXJndW1lbnQgYmxvY2sKJEh0Ymw9IngxIjsKJGlucD0ieDIiOwokbGVuPSJ4MyI7CgokaW5jPSJ4MTIiOwoKewpteSAoJFhsLCRYbSwkWGgsJElOKT1tYXAoInEkXyIsKDAuLjMpKTsKbXkgKCR0MCwkdDEsJHQyLCR4QzIsJEgsJEhobCwkSDIpPW1hcCgicSRfIiwoOC4uMTQpKTsKCiRjb2RlPTw8X19fOwojaW5jbHVkZSAiYXJtX2FyY2guaCIKCi50ZXh0Cl9fXwokY29kZS49Ii5hcmNoCWFybXY4LWErY3J5cHRvXG4iCWlmICgkZmxhdm91ciA9fiAvNjQvKTsKJGNvZGUuPSIuZnB1CW5lb25cbi5jb2RlCTMyXG4iCWlmICgkZmxhdm91ciAhfiAvNjQvKTsKCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdm9pZCBnY21faW5pdF92OCh1MTI4IEh0YWJsZVsxNl0sY29uc3QgdTY0IEhbMl0pOwojCiMgaW5wdXQ6CTEyOC1iaXQgSCAtIHNlY3JldCBwYXJhbWV0ZXIgRShLLDBeMTI4KQojIG91dHB1dDoJcHJlY29tcHV0ZWQgdGFibGUgZmlsbGVkIHdpdGggZGVncmVlcyBvZiB0d2lzdGVkIEg7CiMJCUggaXMgdHdpc3RlZCB0byBoYW5kbGUgcmV2ZXJzZSBiaXRuZXNzIG9mIEdIQVNIOwojCQlvbmx5IGZldyBvZiAxNiBzbG90cyBvZiBIdGFibGVbMTZdIGFyZSB1c2VkOwojCQlkYXRhIGlzIG9wYXF1ZSB0byBvdXRzaWRlIHdvcmxkICh3aGljaCBhbGxvd3MgdG8KIwkJb3B0aW1pemUgdGhlIGNvZGUgaW5kZXBlbmRlbnRseSk7CiMKJGNvZGUuPTw8X19fOwouZ2xvYmFsCWdjbV9pbml0X3Y4Ci50eXBlCWdjbV9pbml0X3Y4LCVmdW5jdGlvbgouYWxpZ24JNApnY21faW5pdF92ODoKCXZsZDEuNjQJCXskdDF9LFt4MV0JCUAgbG9hZCBpbnB1dCBICgl2bW92Lmk4CQkkeEMyLCMweGUxCgl2c2hsLmk2NAkkeEMyLCR4QzIsIzU3CQlAIDB4YzIuMAoJdmV4dC44CQkkSU4sJHQxLCR0MSwjOAoJdnNoci51NjQJJHQyLCR4QzIsIzYzCgl2ZHVwLjMyCQkkdDEsJHt0MX1bMV0KCXZleHQuOAkJJHQwLCR0MiwkeEMyLCM4CQlAIHQwPTB4YzIuLi4uMDEKCXZzaHIudTY0CSR0MiwkSU4sIzYzCgl2c2hyLnMzMgkkdDEsJHQxLCMzMQkJQCBicm9hZGNhc3QgY2FycnkgYml0Cgl2YW5kCQkkdDIsJHQyLCR0MAoJdnNobC5pNjQJJElOLCRJTiwjMQoJdmV4dC44CQkkdDIsJHQyLCR0MiwjOAoJdmFuZAkJJHQwLCR0MCwkdDEKCXZvcnIJCSRJTiwkSU4sJHQyCQlAIEg8PDw9MQoJdmVvcgkJJEgsJElOLCR0MAkJQCB0d2lzdGVkIEgKCXZzdDEuNjQJCXskSH0sW3gwXSwjMTYJCUAgc3RvcmUgSHRhYmxlWzBdCgoJQCBjYWxjdWxhdGUgSF4yCgl2ZXh0LjgJCSR0MCwkSCwkSCwjOAkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZwbXVsbC5wNjQJJFhsLCRILCRICgl2ZW9yCQkkdDAsJHQwLCRICgl2cG11bGwyLnA2NAkkWGgsJEgsJEgKCXZwbXVsbC5wNjQJJFhtLCR0MCwkdDAKCgl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXZlb3IJCSR0MiwkWGwsJFhoCgl2ZW9yCQkkWG0sJFhtLCR0MQoJdmVvcgkJJFhtLCRYbSwkdDIKCXZwbXVsbC5wNjQJJHQyLCRYbCwkeEMyCQlAIDFzdCBwaGFzZQoKCXZtb3YJCSRYaCNsbywkWG0jaGkJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAoJdm1vdgkJJFhtI2hpLCRYbCNsbwkJQCBYbSBpcyByb3RhdGVkIFhsCgl2ZW9yCQkkWGwsJFhtLCR0MgoKCXZleHQuOAkJJHQyLCRYbCwkWGwsIzgJCUAgMm5kIHBoYXNlCgl2cG11bGwucDY0CSRYbCwkWGwsJHhDMgoJdmVvcgkJJHQyLCR0MiwkWGgKCXZlb3IJCSRIMiwkWGwsJHQyCgoJdmV4dC44CQkkdDEsJEgyLCRIMiwjOAkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZlb3IJCSR0MSwkdDEsJEgyCgl2ZXh0LjgJCSRIaGwsJHQwLCR0MSwjOAkJQCBwYWNrIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2VkCgl2c3QxLjY0CQl7JEhobC0kSDJ9LFt4MF0JCUAgc3RvcmUgSHRhYmxlWzEuLjJdCgoJcmV0Ci5zaXplCWdjbV9pbml0X3Y4LC4tZ2NtX2luaXRfdjgKX19fCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMgdm9pZCBnY21fZ211bHRfdjgodTY0IFhpWzJdLGNvbnN0IHUxMjggSHRhYmxlWzE2XSk7CiMKIyBpbnB1dDoJWGkgLSBjdXJyZW50IGhhc2ggdmFsdWU7CiMJCUh0YWJsZSAtIHRhYmxlIHByZWNvbXB1dGVkIGluIGdjbV9pbml0X3Y4OwojIG91dHB1dDoJWGkgLSBuZXh0IGhhc2ggdmFsdWUgWGk7CiMKJGNvZGUuPTw8X19fOwouZ2xvYmFsCWdjbV9nbXVsdF92OAoudHlwZQlnY21fZ211bHRfdjgsJWZ1bmN0aW9uCi5hbGlnbgk0CmdjbV9nbXVsdF92ODoKCXZsZDEuNjQJCXskdDF9LFskWGldCQlAIGxvYWQgWGkKCXZtb3YuaTgJCSR4QzIsIzB4ZTEKCXZsZDEuNjQJCXskSC0kSGhsfSxbJEh0YmxdCUAgbG9hZCB0d2lzdGVkIEgsIC4uLgoJdnNobC51NjQJJHhDMiwkeEMyLCM1NwojaWZuZGVmIF9fQVJNRUJfXwoJdnJldjY0LjgJJHQxLCR0MQojZW5kaWYKCXZleHQuOAkJJElOLCR0MSwkdDEsIzgKCgl2cG11bGwucDY0CSRYbCwkSCwkSU4JCUAgSC5sb7dYaS5sbwoJdmVvcgkJJHQxLCR0MSwkSU4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2cG11bGwyLnA2NAkkWGgsJEgsJElOCQlAIEguaGm3WGkuaGkKCXZwbXVsbC5wNjQJJFhtLCRIaGwsJHQxCQlAIChILmxvK0guaGkptyhYaS5sbytYaS5oaSkKCgl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXZlb3IJCSR0MiwkWGwsJFhoCgl2ZW9yCQkkWG0sJFhtLCR0MQoJdmVvcgkJJFhtLCRYbSwkdDIKCXZwbXVsbC5wNjQJJHQyLCRYbCwkeEMyCQlAIDFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KCgl2bW92CQkkWGgjbG8sJFhtI2hpCQlAIFhofFhtIC0gMjU2LWJpdCByZXN1bHQKCXZtb3YJCSRYbSNoaSwkWGwjbG8JCUAgWG0gaXMgcm90YXRlZCBYbAoJdmVvcgkJJFhsLCRYbSwkdDIKCgl2ZXh0LjgJCSR0MiwkWGwsJFhsLCM4CQlAIDJuZCBwaGFzZSBvZiByZWR1Y3Rpb24KCXZwbXVsbC5wNjQJJFhsLCRYbCwkeEMyCgl2ZW9yCQkkdDIsJHQyLCRYaAoJdmVvcgkJJFhsLCRYbCwkdDIKCiNpZm5kZWYgX19BUk1FQl9fCgl2cmV2NjQuOAkkWGwsJFhsCiNlbmRpZgoJdmV4dC44CQkkWGwsJFhsLCRYbCwjOAoJdnN0MS42NAkJeyRYbH0sWyRYaV0JCUAgd3JpdGUgb3V0IFhpCgoJcmV0Ci5zaXplCWdjbV9nbXVsdF92OCwuLWdjbV9nbXVsdF92OApfX18KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyB2b2lkIGdjbV9naGFzaF92OCh1NjQgWGlbMl0sY29uc3QgdTEyOCBIdGFibGVbMTZdLGNvbnN0IHU4ICppbnAsc2l6ZV90IGxlbik7CiMKIyBpbnB1dDoJdGFibGUgcHJlY29tcHV0ZWQgaW4gZ2NtX2luaXRfdjg7CiMJCWN1cnJlbnQgaGFzaCB2YWx1ZSBYaTsKIwkJcG9pbnRlciB0byBpbnB1dCBkYXRhOwojCQlsZW5ndGggb2YgaW5wdXQgZGF0YSBpbiBieXRlcywgYnV0IGRpdmlzaWJsZSBieSBibG9jayBzaXplOwojIG91dHB1dDoJbmV4dCBoYXNoIHZhbHVlIFhpOwojCiRjb2RlLj08PF9fXzsKLmdsb2JhbAlnY21fZ2hhc2hfdjgKLnR5cGUJZ2NtX2doYXNoX3Y4LCVmdW5jdGlvbgouYWxpZ24JNApnY21fZ2hhc2hfdjg6Cl9fXwokY29kZS49PDxfX18JCWlmICgkZmxhdm91ciAhfiAvNjQvKTsKCXZzdG1kYgkJc3AhLHtkOC1kMTV9CQlAIDMyLWJpdCBBQkkgc2F5cyBzbwpfX18KJGNvZGUuPTw8X19fOwoJdmxkMS42NAkJeyRYbH0sWyRYaV0JCUAgbG9hZCBbcm90YXRlZF0gWGkKCQkJCQkJQCAiW3JvdGF0ZWRdIiBtZWFucyB0aGF0CgkJCQkJCUAgbG9hZGVkIHZhbHVlIHdvdWxkIGhhdmUKCQkJCQkJQCB0byBiZSByb3RhdGVkIGluIG9yZGVyIHRvCgkJCQkJCUAgbWFrZSBpdCBhcHBlYXIgYXMgaW4KCQkJCQkJQCBhbG9yaXRobSBzcGVjaWZpY2F0aW9uCglzdWJzCQkkbGVuLCRsZW4sIzMyCQlAIHNlZSBpZiAkbGVuIGlzIDMyIG9yIGxhcmdlcgoJbW92CQkkaW5jLCMxNgkJQCAkaW5jIGlzIHVzZWQgYXMgcG9zdC0KCQkJCQkJQCBpbmNyZW1lbnQgZm9yIGlucHV0IHBvaW50ZXI7CgkJCQkJCUAgYXMgbG9vcCBpcyBtb2R1bG8tc2NoZWR1bGVkCgkJCQkJCUAgJGluYyBpcyB6ZXJvZWQganVzdCBpbiB0aW1lCgkJCQkJCUAgdG8gcHJlY2x1ZGUgb3ZlcnN0ZXBpbmcKCQkJCQkJQCBpbnBbbGVuXSwgd2hpY2ggbWVhbnMgdGhhdAoJCQkJCQlAIGxhc3QgYmxvY2tbc10gYXJlIGFjdHVhbGx5CgkJCQkJCUAgbG9hZGVkIHR3aWNlLCBidXQgbGFzdAoJCQkJCQlAIGNvcHkgaXMgbm90IHByb2Nlc3NlZAoJdmxkMS42NAkJeyRILSRIaGx9LFskSHRibF0sIzMyCUAgbG9hZCB0d2lzdGVkIEgsIC4uLiwgSF4yCgl2bW92Lmk4CQkkeEMyLCMweGUxCgl2bGQxLjY0CQl7JEgyfSxbJEh0YmxdCgljY2xyCQkkaW5jLGVxCQkJQCBpcyBpdCB0aW1lIHRvIHplcm8gJGluYz8KCXZleHQuOAkJJFhsLCRYbCwkWGwsIzgJCUAgcm90YXRlIFhpCgl2bGQxLjY0CQl7JHQwfSxbJGlucF0sIzE2CUAgbG9hZCBbcm90YXRlZF0gSVswXQoJdnNobC51NjQJJHhDMiwkeEMyLCM1NwkJQCBjb21wb3NlIDB4YzIuMCBjb25zdGFudAojaWZuZGVmIF9fQVJNRUJfXwoJdnJldjY0LjgJJHQwLCR0MAoJdnJldjY0LjgJJFhsLCRYbAojZW5kaWYKCXZleHQuOAkJJElOLCR0MCwkdDAsIzgJCUAgcm90YXRlIElbMF0KCWIubG8JCS5Mb2RkX3RhaWxfdjgJCUAgJGxlbiB3YXMgbGVzcyB0aGFuIDMyCl9fXwp7IG15ICgkWGxuLCRYbW4sJFhobiwkSW4pID0gbWFwKCJxJF8iLCg0Li43KSk7CgkjIyMjIyMjCgkjIFhpKzIgPVtIKihJaSsxICsgWGkrMSldIG1vZCBQID0KCSMJWyhIKklpKzEpICsgKEgqWGkrMSldIG1vZCBQID0KCSMJWyhIKklpKzEpICsgSF4yKihJaStYaSldIG1vZCBQCgkjCiRjb2RlLj08PF9fXzsKCXZsZDEuNjQJCXskdDF9LFskaW5wXSwkaW5jCUAgbG9hZCBbcm90YXRlZF0gSVsxXQojaWZuZGVmIF9fQVJNRUJfXwoJdnJldjY0LjgJJHQxLCR0MQojZW5kaWYKCXZleHQuOAkJJEluLCR0MSwkdDEsIzgKCXZlb3IJCSRJTiwkSU4sJFhsCQlAIElbaV1ePVhpCgl2cG11bGwucDY0CSRYbG4sJEgsJEluCQlAIEi3SWkrMQoJdmVvcgkJJHQxLCR0MSwkSW4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2cG11bGwyLnA2NAkkWGhuLCRILCRJbgoJYgkJLkxvb3BfbW9kMnhfdjgKCi5hbGlnbgk0Ci5Mb29wX21vZDJ4X3Y4OgoJdmV4dC44CQkkdDIsJElOLCRJTiwjOAoJc3VicwkJJGxlbiwkbGVuLCMzMgkJQCBpcyB0aGVyZSBtb3JlIGRhdGE/Cgl2cG11bGwucDY0CSRYbCwkSDIsJElOCQlAIEheMi5sb7dYaS5sbwoJY2NscgkJJGluYyxsbwkJCUAgaXMgaXQgdGltZSB0byB6ZXJvICRpbmM/CgoJIHZwbXVsbC5wNjQJJFhtbiwkSGhsLCR0MQoJdmVvcgkJJHQyLCR0MiwkSU4JCUAgS2FyYXRzdWJhIHByZS1wcm9jZXNzaW5nCgl2cG11bGwyLnA2NAkkWGgsJEgyLCRJTgkJQCBIXjIuaGm3WGkuaGkKCXZlb3IJCSRYbCwkWGwsJFhsbgkJQCBhY2N1bXVsYXRlCgl2cG11bGwyLnA2NAkkWG0sJEhobCwkdDIJCUAgKEheMi5sbytIXjIuaGkptyhYaS5sbytYaS5oaSkKCSB2bGQxLjY0CXskdDB9LFskaW5wXSwkaW5jCUAgbG9hZCBbcm90YXRlZF0gSVtpKzJdCgoJdmVvcgkJJFhoLCRYaCwkWGhuCgkgY2NscgkJJGluYyxlcQkJCUAgaXMgaXQgdGltZSB0byB6ZXJvICRpbmM/Cgl2ZW9yCQkkWG0sJFhtLCRYbW4KCgl2ZXh0LjgJCSR0MSwkWGwsJFhoLCM4CQlAIEthcmF0c3ViYSBwb3N0LXByb2Nlc3NpbmcKCXZlb3IJCSR0MiwkWGwsJFhoCgl2ZW9yCQkkWG0sJFhtLCR0MQoJIHZsZDEuNjQJeyR0MX0sWyRpbnBdLCRpbmMJQCBsb2FkIFtyb3RhdGVkXSBJW2krM10KI2lmbmRlZiBfX0FSTUVCX18KCSB2cmV2NjQuOAkkdDAsJHQwCiNlbmRpZgoJdmVvcgkJJFhtLCRYbSwkdDIKCXZwbXVsbC5wNjQJJHQyLCRYbCwkeEMyCQlAIDFzdCBwaGFzZSBvZiByZWR1Y3Rpb24KCiNpZm5kZWYgX19BUk1FQl9fCgkgdnJldjY0LjgJJHQxLCR0MQojZW5kaWYKCXZtb3YJCSRYaCNsbywkWG0jaGkJCUAgWGh8WG0gLSAyNTYtYml0IHJlc3VsdAoJdm1vdgkJJFhtI2hpLCRYbCNsbwkJQCBYbSBpcyByb3RhdGVkIFhsCgkgdmV4dC44CQkkSW4sJHQxLCR0MSwjOAoJIHZleHQuOAkJJElOLCR0MCwkdDAsIzgKCXZlb3IJCSRYbCwkWG0sJHQyCgkgdnBtdWxsLnA2NAkkWGxuLCRILCRJbgkJQCBIt0lpKzEKCXZlb3IJCSRJTiwkSU4sJFhoCQlAIGFjY3VtdWxhdGUgJElOIGVhcmx5CgoJdmV4dC44CQkkdDIsJFhsLCRYbCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCgl2cG11bGwucDY0CSRYbCwkWGwsJHhDMgoJdmVvcgkJJElOLCRJTiwkdDIKCSB2ZW9yCQkkdDEsJHQxLCRJbgkJQCBLYXJhdHN1YmEgcHJlLXByb2Nlc3NpbmcKCXZlb3IJCSRJTiwkSU4sJFhsCgkgdnBtdWxsMi5wNjQJJFhobiwkSCwkSW4KCWIuaHMJCS5Mb29wX21vZDJ4X3Y4CQlAIHRoZXJlIHdhcyBhdCBsZWFzdCAzMiBtb3JlIGJ5dGVzCgoJdmVvcgkJJFhoLCRYaCwkdDIKCXZleHQuOAkJJElOLCR0MCwkdDAsIzgJCUAgcmUtY29uc3RydWN0ICRJTgoJYWRkcwkJJGxlbiwkbGVuLCMzMgkJQCByZS1jb25zdHJ1Y3QgJGxlbgoJdmVvcgkJJFhsLCRYbCwkWGgJCUAgcmUtY29uc3RydWN0ICRYbAoJYi5lcQkJLkxkb25lX3Y4CQlAIGlzICRsZW4gemVybz8KX19fCn0KJGNvZGUuPTw8X19fOwouTG9kZF90YWlsX3Y4OgoJdmV4dC44CQkkdDIsJFhsLCRYbCwjOAoJdmVvcgkJJElOLCRJTiwkWGwJCUAgaW5wXj1YaQoJdmVvcgkJJHQxLCR0MCwkdDIJCUAgJHQxIGlzIHJvdGF0ZWQgaW5wXlhpCgoJdnBtdWxsLnA2NAkkWGwsJEgsJElOCQlAIEgubG+3WGkubG8KCXZlb3IJCSR0MSwkdDEsJElOCQlAIEthcmF0c3ViYSBwcmUtcHJvY2Vzc2luZwoJdnBtdWxsMi5wNjQJJFhoLCRILCRJTgkJQCBILmhpt1hpLmhpCgl2cG11bGwucDY0CSRYbSwkSGhsLCR0MQkJQCAoSC5sbytILmhpKbcoWGkubG8rWGkuaGkpCgoJdmV4dC44CQkkdDEsJFhsLCRYaCwjOAkJQCBLYXJhdHN1YmEgcG9zdC1wcm9jZXNzaW5nCgl2ZW9yCQkkdDIsJFhsLCRYaAoJdmVvcgkJJFhtLCRYbSwkdDEKCXZlb3IJCSRYbSwkWG0sJHQyCgl2cG11bGwucDY0CSR0MiwkWGwsJHhDMgkJQCAxc3QgcGhhc2Ugb2YgcmVkdWN0aW9uCgoJdm1vdgkJJFhoI2xvLCRYbSNoaQkJQCBYaHxYbSAtIDI1Ni1iaXQgcmVzdWx0Cgl2bW92CQkkWG0jaGksJFhsI2xvCQlAIFhtIGlzIHJvdGF0ZWQgWGwKCXZlb3IJCSRYbCwkWG0sJHQyCgoJdmV4dC44CQkkdDIsJFhsLCRYbCwjOAkJQCAybmQgcGhhc2Ugb2YgcmVkdWN0aW9uCgl2cG11bGwucDY0CSRYbCwkWGwsJHhDMgoJdmVvcgkJJHQyLCR0MiwkWGgKCXZlb3IJCSRYbCwkWGwsJHQyCgouTGRvbmVfdjg6CiNpZm5kZWYgX19BUk1FQl9fCgl2cmV2NjQuOAkkWGwsJFhsCiNlbmRpZgoJdmV4dC44CQkkWGwsJFhsLCRYbCwjOAoJdnN0MS42NAkJeyRYbH0sWyRYaV0JCUAgd3JpdGUgb3V0IFhpCgpfX18KJGNvZGUuPTw8X19fCQlpZiAoJGZsYXZvdXIgIX4gLzY0Lyk7Cgl2bGRtaWEJCXNwISx7ZDgtZDE1fQkJQCAzMi1iaXQgQUJJIHNheXMgc28KX19fCiRjb2RlLj08PF9fXzsKCXJldAouc2l6ZQlnY21fZ2hhc2hfdjgsLi1nY21fZ2hhc2hfdjgKX19fCn0KJGNvZGUuPTw8X19fOwouYXNjaXogICJHSEFTSCBmb3IgQVJNdjgsIENSWVBUT0dBTVMgYnkgPGFwcHJvXEBvcGVuc3NsLm9yZz4iCi5hbGlnbiAgMgpfX18KCmlmICgkZmxhdm91ciA9fiAvNjQvKSB7CQkJIyMjIyMjIyMgNjQtYml0IGNvZGUKICAgIHN1YiB1bnZtb3YgewoJbXkgJGFyZz1zaGlmdDsKCgkkYXJnID1+IG0vcShbMC05XSspIyhsb3xoaSksXHMqcShbMC05XSspIyhsb3xoaSkvbyAmJgoJc3ByaW50ZgkiaW5zCXYlZC5kWyVkXSx2JWQuZFslZF0iLCQxLCgkMiBlcSAibG8iKT8wOjEsJDMsKCQ0IGVxICJsbyIpPzA6MTsKICAgIH0KICAgIGZvcmVhY2goc3BsaXQoIlxuIiwkY29kZSkpIHsKCXMvY2NsclxzKyhbd3hdKShbXixdKyksXHMqKFthLXpdKykvY3NlbAkkMSQyLCQxenIsJDEkMiwkMy9vCW9yCglzL3Ztb3ZcLmk4L21vdmkvbwkJb3IJIyBmaXggdXAgbGVnYWN5IG1uZW1vbmljcwoJcy92bW92XHMrKC4qKS91bnZtb3YoJDEpL2dlbwlvcgoJcy92ZXh0XC44L2V4dC9vCQkJb3IKCXMvdnNoclwucy9zc2hyXC5zL28JCW9yCglzL3ZzaHIvdXNoci9vCQkJb3IKCXMvXihccyspdi8kMS9vCQkJb3IJIyBzdHJpcCBvZmYgdiBwcmVmaXgKCXMvXGJieFxzK2xyXGIvcmV0L287CgoJcy9cYnEoWzAtOV0rKVxiLyJ2Ii4oJDE8OD8kMTokMSs4KS4iLjE2YiIvZ2VvOwkjIG9sZC0+bmV3IHJlZ2lzdGVycwoJcy9AXHMvXC9cLy9vOwkJCQkjIG9sZC0+bmV3IHN0eWxlIGNvbW1lbnRhcnkKCgkjIGZpeCB1cCByZW1haW5pZyBsZWdhY3kgc3VmZml4ZXMKCXMvXC5bdWldPzgoXHMpLyQxL287CglzL1wuW3Vpc10/MzIvL28gYW5kIHMvXC4xNmIvXC40cy9nbzsKCW0vXC5wNjQvbyBhbmQgcy9cLjE2Yi9cLjFxL287CQkjIDFzdCBwbXVsbCBhcmd1bWVudAoJbS9sXC5wNjQvbyBhbmQgcy9cLjE2Yi9cLjFkL2dvOwkJIyAybmQgYW5kIDNyZCBwbXVsbCBhcmd1bWVudHMKCXMvXC5bdWlzcF0/NjQvL28gYW5kIHMvXC4xNmIvXC4yZC9nbzsKCXMvXC5bNDJdKFtzZF0pXFsoWzAtM10pXF0vXC4kMVxbJDJcXS9vOwoKCXByaW50ICRfLCJcbiI7CiAgICB9Cn0gZWxzZSB7CQkJCSMjIyMjIyMjIDMyLWJpdCBjb2RlCiAgICBzdWIgdW52ZHVwMzIgewoJbXkgJGFyZz1zaGlmdDsKCgkkYXJnID1+IG0vcShbMC05XSspLFxzKnEoWzAtOV0rKVxbKFswLTNdKVxdL28gJiYKCXNwcmludGYJInZkdXAuMzIJcSVkLGQlZFslZF0iLCQxLDIqJDIrKCQzPj4xKSwkMyYxOwogICAgfQogICAgc3ViIHVudnBtdWxscDY0IHsKCW15ICgkbW5lbW9uaWMsJGFyZyk9QF87CgoJaWYgKCRhcmcgPX4gbS9xKFswLTldKyksXHMqcShbMC05XSspLFxzKnEoWzAtOV0rKS9vKSB7CgkgICAgbXkgJHdvcmQgPSAweGYyYTAwZTAwfCgoJDEmNyk8PDEzKXwoKCQxJjgpPDwxOSkKCQkJCSB8KCgkMiY3KTw8MTcpfCgoJDImOCk8PDQpCgkJCQkgfCgoJDMmNyk8PDEpIHwoKCQzJjgpPDwyKTsKCSAgICAkd29yZCB8PSAweDAwMDEwMDAxCSBpZiAoJG1uZW1vbmljID1+ICIyIik7CgkgICAgIyBzaW5jZSBBUk12NyBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBlbmNvZGVkIGxpdHRsZS1lbmRpYW4uCgkgICAgIyBjb3JyZWN0IHNvbHV0aW9uIGlzIHRvIHVzZSAuaW5zdCBkaXJlY3RpdmUsIGJ1dCBvbGRlcgoJICAgICMgYXNzZW1ibGVycyBkb24ndCBpbXBsZW1lbnQgaXQ6LSgKCSAgICBzcHJpbnRmICIuYnl0ZVx0MHglMDJ4LDB4JTAyeCwweCUwMngsMHglMDJ4XHRAICVzICVzIiwKCQkJJHdvcmQmMHhmZiwoJHdvcmQ+PjgpJjB4ZmYsCgkJCSgkd29yZD4+MTYpJjB4ZmYsKCR3b3JkPj4yNCkmMHhmZiwKCQkJJG1uZW1vbmljLCRhcmc7Cgl9CiAgICB9CgogICAgZm9yZWFjaChzcGxpdCgiXG4iLCRjb2RlKSkgewoJcy9cYlt3eF0oWzAtOV0rKVxiL3IkMS9nbzsJCSMgbmV3LT5vbGQgcmVnaXN0ZXJzCglzL1xidihbMC05XSlcLlsxMjQ2OF0rW2JzZF1cYi9xJDEvZ287CSMgbmV3LT5vbGQgcmVnaXN0ZXJzCglzL1wvXC9ccz8vQCAvbzsJCQkJIyBuZXctPm9sZCBzdHlsZSBjb21tZW50YXJ5CgoJIyBmaXggdXAgcmVtYWluaWcgbmV3LXN0eWxlIHN1ZmZpeGVzCglzL1xdLCNbMC05XSsvXSEvbzsKCglzL2NjbHJccysoW14sXSspLFxzKihbYS16XSspL21vdiQyCSQxLCMwL28JCQlvcgoJcy92ZHVwXC4zMlxzKyguKikvdW52ZHVwMzIoJDEpL2dlbwkJCQlvcgoJcy92PyhwbXVsbDI/KVwucDY0XHMrKC4qKS91bnZwbXVsbHA2NCgkMSwkMikvZ2VvCQlvcgoJcy9cYnEoWzAtOV0rKSMobG98aGkpL3NwcmludGYgImQlZCIsMiokMSsoJDIgZXEgImhpIikvZ2VvCW9yCglzL14oXHMrKWJcLi8kMWIvbwkJCQkJCW9yCglzL14oXHMrKXJldC8kMWJ4XHRsci9vOwoKCXByaW50ICRfLCJcbiI7CiAgICB9Cn0KCmNsb3NlIFNURE9VVDsgIyBlbmZvcmNlIGZsdXNoCg==