LyoKICogQ29weXJpZ2h0IDIwMTcgTlhQCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKICovCgojaW5jbHVkZSAiZnNsX3RtdS5oIgojaW5jbHVkZSAiZnNsX2RlYnVnX2NvbnNvbGUuaCIKI2luY2x1ZGUgImJvYXJkLmgiCgojaW5jbHVkZSAicGluX211eC5oIgojaW5jbHVkZSAiY2xvY2tfY29uZmlnLmgiCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIERlZmluaXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgREVNT19UTVVfQkFTRSAgICAgICAgICAgICAgIFRNVQojZGVmaW5lIERFTU9fVE1VX0lNTUVESUFURV9USFJFU09MRCAwVQojZGVmaW5lIERFTU9fVE1VX0lOVEVSVkFMX1ZBTFVFICAgICA4VQojZGVmaW5lIERFTU9fVE1VX0lSUSAgICAgICAgICAgICAgICBURU1QTU9OX0lSUW4KI2RlZmluZSBERU1PX1RNVV9JUlFfSEFORExFUl9GVU5DICAgVEVNUE1PTl9JUlFIYW5kbGVyCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBQcm90b3R5cGVzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBWYXJpYWJsZXMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kdm9sYXRpbGUgdG11X2ludGVycnVwdF9zdGF0dXNfdCBnX3RtdUludGVycnVwdFN0YXVzU3RydWN0OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQ29kZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiEKICogQGJyaWVmIFRNVSBJU1IuCiAqLwp2b2lkIERFTU9fVE1VX0lSUV9IQU5ETEVSX0ZVTkModm9pZCkKewogICAgdWludDMyX3QgdGVtcDsKCiAgICBUTVVfR2V0SW50ZXJydXB0U3RhdHVzRmxhZ3MoREVNT19UTVVfQkFTRSwgKHRtdV9pbnRlcnJ1cHRfc3RhdHVzX3QgKikmZ190bXVJbnRlcnJ1cHRTdGF1c1N0cnVjdCk7CiAgICBUTVVfQ2xlYXJJbnRlcnJ1cHRTdGF0dXNGbGFncyhERU1PX1RNVV9CQVNFLCBnX3RtdUludGVycnVwdFN0YXVzU3RydWN0LmludGVycnVwdERldGVjdE1hc2spOwogICAgaWYgKDBVICE9IChnX3RtdUludGVycnVwdFN0YXVzU3RydWN0LmludGVycnVwdERldGVjdE1hc2sgJiBrVE1VX0ltbWVkaWF0ZVRlbXBlcmF0dXJlU3RhdHVzRmxhZ3MpKQogICAgewogICAgICAgIC8qIEZvciBzaXRlMC4gKi8KICAgICAgICBpZiAoMFUgIT0gKGdfdG11SW50ZXJydXB0U3RhdXNTdHJ1Y3QuaW1tZWRpYXRlSW50ZXJydXB0c1NpdGVNYXNrICYga1RNVV9Nb25pdG9yU2l0ZTApKQogICAgICAgIHsKICAgICAgICAgICAgVE1VX0dldEltbWVkaWF0ZVRlbXBlcmF0dXJlKFRNVSwgMFUsICZ0ZW1wKTsKICAgICAgICAgICAgUFJJTlRGKCJzaXRlIDAgaW1tZWRpYXRlIHRlbXBlcmF0dXJlIGlzIHRvbyBoaWdoLiAlZKHjQ1xyXG4iLCB0ZW1wKTsKICAgICAgICB9CiAgICAgICAgLyogRm9yIHNpdGUxLiAqLwogICAgICAgIGlmICgwVSAhPSAoZ190bXVJbnRlcnJ1cHRTdGF1c1N0cnVjdC5pbW1lZGlhdGVJbnRlcnJ1cHRzU2l0ZU1hc2sgJiBrVE1VX01vbml0b3JTaXRlMSkpCiAgICAgICAgewogICAgICAgICAgICBUTVVfR2V0SW1tZWRpYXRlVGVtcGVyYXR1cmUoVE1VLCAxVSwgJnRlbXApOwogICAgICAgICAgICBQUklOVEYoInNpdGUgMSBpbW1lZGlhdGUgdGVtcGVyYXR1cmUgaXMgdG9vIGhpZ2guICVkoeNDXHJcbiIsIHRlbXApOwogICAgICAgIH0KICAgIH0KICAgIF9fRFNCKCk7Cn0KCi8qIQogKiBAYnJpZWYgTWFpbiBmdW5jdGlvbgogKi8KaW50IG1haW4odm9pZCkKewogICAgdG11X2NvbmZpZ190IGtfdG11Q29uZmlnOwogICAgdG11X3RocmVzb2xkX2NvbmZpZ190IGtfdG11VGhyZXNvbGRDb25maWc7CgogICAgLyogQm9hcmQgc3BlY2lmaWMgUkRDIHNldHRpbmdzICovCiAgICBCT0FSRF9SZGNJbml0KCk7CgogICAgQk9BUkRfSW5pdFBpbnMoKTsKICAgIEJPQVJEX0Jvb3RDbG9ja1JVTigpOwogICAgQk9BUkRfSW5pdERlYnVnQ29uc29sZSgpOwogICAgQk9BUkRfSW5pdE1lbW9yeSgpOwoKICAgIFBSSU5URigiVE1VIG1vbml0b3IgcmVwb3J0IGV4YW1wbGUuXHJcbiIpOwoKICAgIC8qIEluaXRpYWxpemUgdGhlIFRNVSBtb2RlLiAqLwogICAga190bXVDb25maWcubW9uaXRvckludGVydmFsID0gREVNT19UTVVfSU5URVJWQUxfVkFMVUU7CiAgICBrX3RtdUNvbmZpZy5tb25pdG9yU2l0ZVNlbGVjdGlvbiA9CiAgICAgICAga1RNVV9Nb25pdG9yU2l0ZTAgfCBrVE1VX01vbml0b3JTaXRlMTsgLyogTW9uaXRvciB0ZW1wZXJhdHVyZSBvZiBzaXRlIDAgYW5kIHNpdGUgMS4gKi8KICAgIGtfdG11Q29uZmlnLmF2ZXJhZ2VMUEYgPSBrVE1VX0F2ZXJhZ2VMb3dQYXNzRmlsdGVyMV8wOwogICAgVE1VX0luaXQoREVNT19UTVVfQkFTRSwgJmtfdG11Q29uZmlnKTsKCiAgICAvKiBTZXQgdGhlIHRlbXBlcmF0dXJlIHRocmVzaG9sZC4gKi8KICAgIGtfdG11VGhyZXNvbGRDb25maWcuaW1tZWRpYXRlVGhyZXNvbGRFbmFibGUgICAgICAgPSB0cnVlOwogICAga190bXVUaHJlc29sZENvbmZpZy5BdmVyYWdlVGhyZXNvbGRFbmFibGUgICAgICAgICA9IGZhbHNlOwogICAga190bXVUaHJlc29sZENvbmZpZy5BdmVyYWdlQ3JpdGljYWxUaHJlc29sZEVuYWJsZSA9IGZhbHNlOwogICAga190bXVUaHJlc29sZENvbmZpZy5pbW1lZGlhdGVUaHJlc29sZFZhbHVlICAgICAgICA9IERFTU9fVE1VX0lNTUVESUFURV9USFJFU09MRDsKICAgIGtfdG11VGhyZXNvbGRDb25maWcuYXZlcmFnZVRocmVzb2xkVmFsdWUgICAgICAgICAgPSAwVTsKICAgIGtfdG11VGhyZXNvbGRDb25maWcuYXZlcmFnZUNyaXRpY2FsVGhyZXNvbGRWYWx1ZSAgPSAwVTsKICAgIFRNVV9TZXRIaWdoVGVtcGVyYXR1cmVUaHJlc29sZChERU1PX1RNVV9CQVNFLCAma190bXVUaHJlc29sZENvbmZpZyk7CgogICAgLyogRW5hYmxlIHRoZSBJbW1lZGlhdGUgdGVtcGVyYXR1cmUgdGhyZXNob2xkIGV4Y2VlZGVkIGludGVycnVwdC4gKi8KICAgIFRNVV9FbmFibGVJbnRlcnJ1cHRzKERFTU9fVE1VX0JBU0UsIGtUTVVfSW1tZWRpYXRlVGVtcGVyYXR1cmVJbnRlcnJ1cHRFbmFibGUpOwogICAgRW5hYmxlSVJRKERFTU9fVE1VX0lSUSk7CgogICAgLyogRW5hYmxlIHRoZSBtb25pdG9yIG1vZGUuICovCiAgICBUTVVfRW5hYmxlKERFTU9fVE1VX0JBU0UsIHRydWUpOwoKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgfQp9Cg==