LyoqKgogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIGF2YWhpLgoKICBhdmFoaSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CiAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZQogIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogIGF2YWhpIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiAgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZCiAgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIExlc3NlciBHZW5lcmFsCiAgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogIExpY2Vuc2UgYWxvbmcgd2l0aCBhdmFoaTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcKICBVU0EuCioqKi8KCiNpZmRlZiBIQVZFX0NPTkZJR19ICiNpbmNsdWRlIDxjb25maWcuaD4KI2VuZGlmCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CgojaW5jbHVkZSAiZG9tYWluLmgiCiNpbmNsdWRlICJtYWxsb2MuaCIKCmludCBtYWluKEFWQUhJX0dDQ19VTlVTRUQgaW50IGFyZ2MsIEFWQUhJX0dDQ19VTlVTRUQgY2hhciAqYXJndltdKSB7CiAgICBjaGFyICpzOwogICAgY2hhciB0WzI1Nl0sIHJbMjU2XTsKICAgIGNvbnN0IGNoYXIgKnA7CiAgICBzaXplX3Qgc2l6ZTsKICAgIGNoYXIgbmFtZVs2NF0sIHR5cGVbQVZBSElfRE9NQUlOX05BTUVfTUFYXSwgZG9tYWluW0FWQUhJX0RPTUFJTl9OQU1FX01BWF07CgogICAgcHJpbnRmKCIlc1xuIiwgcyA9IGF2YWhpX25vcm1hbGl6ZV9uYW1lX3N0cmR1cCgiZm9vLmZvb1xcMDQ2LiIpKTsKICAgIGF2YWhpX2ZyZWUocyk7CgogICAgcHJpbnRmKCIlc1xuIiwgcyA9IGF2YWhpX25vcm1hbGl6ZV9uYW1lX3N0cmR1cCgiZm9vLmZvb1xcLmZvby4iKSk7CiAgICBhdmFoaV9mcmVlKHMpOwoKCiAgICBwcmludGYoIiVzXG4iLCBzID0gYXZhaGlfbm9ybWFsaXplX25hbWVfc3RyZHVwKCJmb1xcXFxvXFwuLmYgb28uIikpOwogICAgYXZhaGlfZnJlZShzKTsKCiAgICBwcmludGYoIiVpXG4iLCBhdmFoaV9kb21haW5fZXF1YWwoIlxcMDY1YWEgYmJiXFwuXFwwNDZjYy5jY1xcXFwuZGVlLmZmZi4iLCAiQWFhIEJCQlxcLlxcLmNjLmNjXFxcXC5kZWUuZmZmIikpOwogICAgcHJpbnRmKCIlaVxuIiwgYXZhaGlfZG9tYWluX2VxdWFsKCJBIiwgImEiKSk7CgogICAgcHJpbnRmKCIlaVxuIiwgYXZhaGlfZG9tYWluX2VxdWFsKCJhIiwgImFhYSIpKTsKCiAgICBwcmludGYoIiV1ID0gJXVcbiIsIGF2YWhpX2RvbWFpbl9oYXNoKCJjY2NcXDA2NWFhLmFhXFwuYlxcXFwuIiksIGF2YWhpX2RvbWFpbl9oYXNoKCJjY2NBYWEuYWFcXC5iXFxcXCIpKTsKCgogICAgYXZhaGlfc2VydmljZV9uYW1lX2pvaW4odCwgc2l6ZW9mKHQpLCAiZm9vLmZvby5mb28gXFwuIiwgIl9odHRwLl90Y3AiLCAidGVzdC5sb2NhbCIpOwogICAgcHJpbnRmKCI8JXM+XG4iLCB0KTsKCiAgICBhdmFoaV9zZXJ2aWNlX25hbWVfc3BsaXQodCwgbmFtZSwgc2l6ZW9mKG5hbWUpLCB0eXBlLCBzaXplb2YodHlwZSksIGRvbWFpbiwgc2l6ZW9mKGRvbWFpbikpOwogICAgcHJpbnRmKCJuYW1lOiA8JXM+OyB0eXBlOiA8JXM+OyBkb21haW4gPCVzPlxuIiwgbmFtZSwgdHlwZSwgZG9tYWluKTsKCiAgICBhdmFoaV9zZXJ2aWNlX25hbWVfam9pbih0LCBzaXplb2YodCksIE5VTEwsICJfaHR0cC5fdGNwIiwgIm9uZS50d29cXC4gLmxvY2FsIik7CiAgICBwcmludGYoIjwlcz5cbiIsIHQpOwoKICAgIGF2YWhpX3NlcnZpY2VfbmFtZV9zcGxpdCh0LCBOVUxMLCAwLCB0eXBlLCBzaXplb2YodHlwZSksIGRvbWFpbiwgc2l6ZW9mKGRvbWFpbikpOwogICAgcHJpbnRmKCJuYW1lOiA8PjsgdHlwZTogPCVzPjsgZG9tYWluIDwlcz5cbiIsIHR5cGUsIGRvbWFpbik7CgoKICAgIHAgPSAiLS06LS0tXFxcXFxcMTIzXFwwNjVf5Pb8XFwwNjRcXC5cXFxcc2r29mRmaGguc2Rmamhza2pkZiI7CiAgICBwcmludGYoInVuZXNjYXBlZDogPCVzPiwgcmVzdDogJXNcbiIsIGF2YWhpX3VuZXNjYXBlX2xhYmVsKCZwLCB0LCBzaXplb2YodCkpLCBwKTsKCiAgICBzaXplID0gc2l6ZW9mKHIpOwogICAgcyA9IHI7CgogICAgcHJpbnRmKCJlc2NhcGVkOiA8JXM+XG4iLCBhdmFoaV9lc2NhcGVfbGFiZWwodCwgc3RybGVuKHQpLCAmcywgJnNpemUpKTsKCiAgICBwID0gcjsKICAgIHByaW50ZigidW5lc2NhcGVkOiA8JXM+XG4iLCBhdmFoaV91bmVzY2FwZV9sYWJlbCgmcCwgdCwgc2l6ZW9mKHQpKSk7CgogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX3NlcnZpY2VfdHlwZV9nZW5lcmljKCJfZm9vLl9iYXIuX3dhbGRvIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3R5cGVfc3RyaWN0KCJfZm9vLl9iYXIuX3dhbGRvIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3N1YnR5cGUoIl9mb28uX2Jhci5fd2FsZG8iKSk7CgogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX3NlcnZpY2VfdHlwZV9nZW5lcmljKCJfZm9vLl90Y3AiKSk7CiAgICBhc3NlcnQoYXZhaGlfaXNfdmFsaWRfc2VydmljZV90eXBlX3N0cmljdCgiX2Zvby5fdGNwIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3N1YnR5cGUoIl9mb28uX3RjcCIpKTsKCiAgICBhc3NlcnQoIWF2YWhpX2lzX3ZhbGlkX3NlcnZpY2VfdHlwZV9nZW5lcmljKCJfZm9vLl9iYXIud2FsZG8iKSk7CiAgICBhc3NlcnQoIWF2YWhpX2lzX3ZhbGlkX3NlcnZpY2VfdHlwZV9zdHJpY3QoIl9mb28uX2Jhci53YWxkbyIpKTsKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfc2VydmljZV9zdWJ0eXBlKCJfZm9vLl9iYXIud2FsZG8iKSk7CgogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3R5cGVfZ2VuZXJpYygiIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3R5cGVfc3RyaWN0KCIiKSk7CiAgICBhc3NlcnQoIWF2YWhpX2lzX3ZhbGlkX3NlcnZpY2Vfc3VidHlwZSgiIikpOwoKICAgIGFzc2VydChhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3R5cGVfZ2VuZXJpYygiX2Zvby5fc3ViLl9iYXIuX3RjcCIpKTsKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfc2VydmljZV90eXBlX3N0cmljdCgiX2Zvby5fc3ViLl9iYXIuX3RjcCIpKTsKICAgIGFzc2VydChhdmFoaV9pc192YWxpZF9zZXJ2aWNlX3N1YnR5cGUoIl9mb28uX3N1Yi5fYmFyLl90Y3AiKSk7CgogICAgcHJpbnRmKCIlc1xuIiwgYXZhaGlfZ2V0X3R5cGVfZnJvbV9zdWJ0eXBlKCJfZm9vLl9zdWIuX2Jhci5fdGNwIikpOwoKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfaG9zdF9uYW1lKCJzZi5vb28uIikpOwogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX2hvc3RfbmFtZSgic2Zvb28uIikpOwogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX2hvc3RfbmFtZSgic2Zvb28iKSk7CgogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX2RvbWFpbl9uYW1lKCIuIikpOwogICAgYXNzZXJ0KGF2YWhpX2lzX3ZhbGlkX2RvbWFpbl9uYW1lKCIiKSk7CgogICAgYXNzZXJ0KGF2YWhpX25vcm1hbGl6ZV9uYW1lKCIuIiwgdCwgc2l6ZW9mKHQpKSk7CiAgICBhc3NlcnQoYXZhaGlfbm9ybWFsaXplX25hbWUoIiIsIHQsIHNpemVvZih0KSkpOwoKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfZnFkbigiLiIpKTsKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfZnFkbigiIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9mcWRuKCJmb28iKSk7CiAgICBhc3NlcnQoYXZhaGlfaXNfdmFsaWRfZnFkbigiZm9vLmJhciIpKTsKICAgIGFzc2VydChhdmFoaV9pc192YWxpZF9mcWRuKCJmb28uYmFyLiIpKTsKICAgIGFzc2VydChhdmFoaV9pc192YWxpZF9mcWRuKCJnbnVyei5mb28uYmFyLiIpKTsKICAgIGFzc2VydCghYXZhaGlfaXNfdmFsaWRfZnFkbigiMTkyLjE2OC41MC4xIikpOwogICAgYXNzZXJ0KCFhdmFoaV9pc192YWxpZF9mcWRuKCI6OjEiKSk7CiAgICBhc3NlcnQoIWF2YWhpX2lzX3ZhbGlkX2ZxZG4oIi4xOTIuMTY4LjUwLjEuIikpOwoKICAgIHJldHVybiAwOwp9Cg==