LyoKICogIGNwdSB0byB1bmFtZSBtYWNoaW5lIG5hbWUgbWFwCiAqCiAqICBDb3B5cmlnaHQgKGMpIDIwMDkgTG/vYyBNaW5pZXIKICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCiAqLwoKI2luY2x1ZGUgPHN0ZGlvLmg+CgojaW5jbHVkZSAicWVtdS5oIgovLyNpbmNsdWRlICJxZW11LWNvbW1vbi5oIgojaW5jbHVkZSAiY3B1LXVuYW1lLmgiCgovKiByZXR1cm4gaGlnaGVzdCB1dHNuYW1lIG1hY2hpbmUgbmFtZSBmb3IgZW11bGF0ZWQgaW5zdHJ1Y3Rpb24gc2V0CiAqCiAqIE5COiB0aGUgZGVmYXVsdCBlbXVsYXRlZCBDUFUgKCJhbnkiKSBtaWdodCBub3QgbWF0Y2ggYW55IGV4aXN0aW5nIENQVSwgZS5nLgogKiBvbiBBUk0gaXQgaGFzIGFsbCBmZWF0dXJlcyB0dXJuZWQgb24sIHNvIHRoZXJlIGlzIG5vIHBlcmZlY3QgYXJjaCBzdHJpbmcgdG8KICogcmV0dXJuIGhlcmUgKi8KY29uc3QgY2hhciAqY3B1X3RvX3VuYW1lX21hY2hpbmUodm9pZCAqY3B1X2VudikKewojaWZkZWYgVEFSR0VUX0FSTQogICAgLyogdXRzbmFtZSBtYWNoaW5lIG5hbWUgb24gbGludXggYXJtIGlzIENQVSBhcmNoIG5hbWUgKyBlbmRpYW5uZXNzLCBlLmcuCiAgICAgKiBhcm12N2w7IHRvIGdldCBhIGxpc3Qgb2YgQ1BVIGFyY2ggbmFtZXMgZnJvbSB0aGUgbGludXggc291cmNlLCB1c2U6CiAgICAgKiAgICAgZ3JlcCBhcmNoX25hbWU6IC1BMSBsaW51eC9hcmNoL2FybS9tbS9wcm9jLSouUwogICAgICogc2VlIGFyY2gvYXJtL2tlcm5lbC9zZXR1cC5jOiBzZXR1cF9wcm9jZXNzb3IoKQogICAgICoKICAgICAqIHRvIHRlc3QgYnkgQ1BVIGlkLCBjb21wYXJlIGNwdV9lbnYtPmNwMTUuYzBfY3B1aWQgdG8gQVJNX0NQVUlEXyoKICAgICAqIGRlZmluZXMgYW5kIHRvIHRlc3QgYnkgQ1BVIGZlYXR1cmUsIHVzZSBhcm1fZmVhdHVyZShjcHVfZW52LAogICAgICogQVJNX0ZFQVRVUkVfKikgKi8KCiAgICAvKiBpbiB0aGVvcnksIGVuZGlhbm5lc3MgaXMgY29uZmlndXJhYmxlIG9uIHNvbWUgQVJNIENQVXMsIGJ1dCB0aGlzIGlzbid0CiAgICAgKiB1c2VkIGluIHVzZXIgbW9kZSBlbXVsYXRpb24gKi8KI2lmZGVmIFRBUkdFVF9XT1JEU19CSUdFTkRJQU4KI2RlZmluZSB1dHNuYW1lX3N1ZmZpeCAiYiIKI2Vsc2UKI2RlZmluZSB1dHNuYW1lX3N1ZmZpeCAibCIKI2VuZGlmCiAgICBpZiAoYXJtX2ZlYXR1cmUoY3B1X2VudiwgQVJNX0ZFQVRVUkVfVjcpKQogICAgICAgIHJldHVybiAiYXJtdjciIHV0c25hbWVfc3VmZml4OwogICAgaWYgKGFybV9mZWF0dXJlKGNwdV9lbnYsIEFSTV9GRUFUVVJFX1Y2KSkKICAgICAgICByZXR1cm4gImFybXY2IiB1dHNuYW1lX3N1ZmZpeDsKICAgIC8qIGVhcmxpZXN0IGVtdWxhdGVkIENQVSBpcyBBUk12NVRFOyBxZW11IGNhbiBlbXVsYXRlIHRoZSAxMDI2LCBidXQgbm90IGl0cwogICAgICogSmF6ZWxsZSBzdXBwb3J0ICovCiAgICByZXR1cm4gImFybXY1dGUiIHV0c25hbWVfc3VmZml4OwojZWxpZiBkZWZpbmVkKFRBUkdFVF9YODZfNjQpCiAgICByZXR1cm4gIng4Ni02NCI7CiNlbGlmIGRlZmluZWQoVEFSR0VUX0kzODYpCiAgICAvKiBzZWUgYXJjaC94ODYva2VybmVsL2NwdS9idWdzLmM6IGNoZWNrX2J1Z3MoKSwgMzg2LCA0ODYsIDU4NiwgNjg2ICovCiAgICB1aW50MzJfdCBjcHVpZF92ZXJzaW9uID0gKChDUFVYODZTdGF0ZSAqKWNwdV9lbnYpLT5jcHVpZF92ZXJzaW9uOwogICAgaW50IGZhbWlseSA9ICgoY3B1aWRfdmVyc2lvbiA+PiA4KSAmIDB4MGYpICsgKChjcHVpZF92ZXJzaW9uID4+IDIwKSAmIDB4ZmYpOwogICAgaWYgKGZhbWlseSA9PSA0KQogICAgICAgIHJldHVybiAiaTQ4NiI7CiAgICBpZiAoZmFtaWx5ID09IDUpCiAgICAgICAgcmV0dXJuICJpNTg2IjsKICAgIHJldHVybiAiaTY4NiI7CiNlbHNlCiAgICAvKiBkZWZhdWx0IGlzICNkZWZpbmUtZCBpbiBlYWNoIGFyY2gvIHN1YmRpciAqLwogICAgcmV0dXJuIFVOQU1FX01BQ0hJTkU7CiNlbmRpZgp9Cg==