Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGZkZm9ybWF0LmMgIC0gIExvdy1sZXZlbCBmb3JtYXRzIGEgZmxvcHB5IGRpc2sgLSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KCi8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gbW9yZSBpMThuL25scyB0cmFuc2xhdGFibGUgc3RyaW5ncyBtYXJrZWQKICoKICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlICJidXN5Ym94LmgiCgoKLyogU3R1ZmYgZXh0cmFjdGVkIGZyb20gbGludXgvZmQuaCAqLwpzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7Cgl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KCQkJc2VjdCwJCS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCgkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLwoJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLwoJCQlzdHJldGNoOwkvKiAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCiNkZWZpbmUgRkRfU1RSRVRDSCAxCiNkZWZpbmUgRkRfU1dBUFNJREVTIDIKCgl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLwoKCQkJcmF0ZSwJCS8qIGRhdGEgcmF0ZS4gfD0gMHg0MCBmb3IgcGVycGVuZGljdWxhciAqLwojZGVmaW5lIEZEXzJNIDB4NAojZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CiNkZWZpbmUgRkRfU0laRUNPREUoZmxvcHB5KSAoKCgoKGZsb3BweSktPnJhdGUmRkRfU0laRUNPREVNQVNLKT4+IDMpKyAyKSAlOCkKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCiNkZWZpbmUgRkRfUEVSUCAweDQwCgoJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KCQkJZm10X2dhcDsJLyogZ2FwMiBzaXplICovCgljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KfTsKc3RydWN0IGZvcm1hdF9kZXNjciB7Cgl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cn07CiNkZWZpbmUgRkRGTVRCRUcgX0lPKDIsMHg0NykKI2RlZmluZQlGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQojZGVmaW5lIEZER0VUUFJNIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpCiNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KCnN0YXRpYyB2b2lkIHByaW50X2FuZF9mbHVzaChjb25zdCBjaGFyICogX19yZXN0cmljdCBmb3JtYXQsIC4uLikKewoJdmFfbGlzdCBhcmc7CgoJdmFfc3RhcnQoYXJnLCBmb3JtYXQpOwoJYmJfdmZwcmludGYoc3Rkb3V0LCBmb3JtYXQsIGFyZyk7Cgl2YV9lbmQoYXJnKTsKCWJiX3hmZmx1c2hfc3Rkb3V0KCk7Cn0KCnN0YXRpYyB2b2lkIGJiX3hpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpzdHJpbmcpCnsKCWlmIChpb2N0bCAoZmQsIHJlcXVlc3QsIGFyZ3ApIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShzdHJpbmcpOwoJfQp9CgppbnQgZmRmb3JtYXRfbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKewoJaW50IGZkLCBuLCBjeWwsIHJlYWRfYnl0ZXMsIHZlcmlmeTsKCXVuc2lnbmVkIGNoYXIgKmRhdGE7CglzdHJ1Y3Qgc3RhdCBzdDsKCXN0cnVjdCBmbG9wcHlfc3RydWN0IHBhcmFtOwoJc3RydWN0IGZvcm1hdF9kZXNjciBkZXNjcjsKCglpZiAoYXJnYyA8IDIpIHsKCQliYl9zaG93X3VzYWdlKCk7Cgl9Cgl2ZXJpZnkgPSAhYmJfZ2V0b3B0X3VsZmxhZ3MoYXJnYywgYXJndiwgIm4iKTsKCWFyZ3YgKz0gb3B0aW5kOwoKCS8qIFJfT0sgaXMgbmVlZGVkIGZvciB2ZXJpZnlpbmcgKi8KCWlmIChzdGF0KCphcmd2LCZzdCkgPCAwIHx8IGFjY2VzcygqYXJndixXX09LIHwgUl9PSyApIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCphcmd2KTsKCX0KCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgewoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwqYXJndik7CgkJLyogZG8gbm90IHRlc3QgbWFqb3IgLSBwZXJoYXBzIHRoaXMgd2FzIGFuIFVTQiBmbG9wcHkgKi8KCX0KCgoJLyogT19SRFdSIGZvciBmb3JtYXR0aW5nIGFuZCB2ZXJpZnlpbmcgKi8KCWZkID0gYmJfeG9wZW4oKmFyZ3YsT19SRFdSICk7CgoJYmJfeGlvY3RsKGZkLCBGREdFVFBSTSwgJnBhcmFtLCAiRkRHRVRQUk0iKTsvKm9yaWdpbmFsIG1lc3NhZ2Ugd2FzOiAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IGZvcm1hdCB0eXBlIiAqLwoKCXByaW50X2FuZF9mbHVzaCgiJXMtc2lkZWQsICVkIHRyYWNrcywgJWQgc2VjL3RyYWNrLiBUb3RhbCBjYXBhY2l0eSAlZCBrQi5cbiIsCgkJKHBhcmFtLmhlYWQgPT0gMikgPyAiRG91YmxlIiA6ICJTaW5nbGUiLAoJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOwoKCS8qIEZPUk1BVCAqLwoJcHJpbnRfYW5kX2ZsdXNoKCJGb3JtYXR0aW5nIC4uLiAiLCBOVUxMKTsKCWJiX3hpb2N0bChmZCwgRkRGTVRCRUcsTlVMTCwiRkRGTVRCRUciKTsKCgkvKiBuID09IHRyYWNrICovCglmb3IgKG4gPSAwOyBuIDwgcGFyYW0udHJhY2s7IG4rKykKCXsKCSAgICBkZXNjci5oZWFkID0gMDsKCSAgICBkZXNjci50cmFjayA9IG47CgkgICAgYmJfeGlvY3RsKGZkLCBGREZNVFRSSywmZGVzY3IsIkZERk1UVFJLIik7CgkgICAgcHJpbnRfYW5kX2ZsdXNoKCIlM2RcYlxiXGIiLCBuKTsKCSAgICBpZiAocGFyYW0uaGVhZCA9PSAyKSB7CgkJZGVzY3IuaGVhZCA9IDE7CgkJYmJfeGlvY3RsKGZkLCBGREZNVFRSSywmZGVzY3IsIkZERk1UVFJLIik7CgkgICAgfQoJfQoKCWJiX3hpb2N0bChmZCxGREZNVEVORCxOVUxMLCJGREZNVEVORCIpOwoJcHJpbnRfYW5kX2ZsdXNoKCJkb25lXG4iLCBOVUxMKTsKCgkvKiBWRVJJRlkgKi8KCWlmKHZlcmlmeSkgewoJCS8qIG4gPT0gY3lsX3NpemUgKi8KCQluID0gcGFyYW0uc2VjdCpwYXJhbS5oZWFkKjUxMjsKCgkJZGF0YSA9IHhtYWxsb2Mobik7CgkJcHJpbnRfYW5kX2ZsdXNoKCJWZXJpZnlpbmcgLi4uICIsIE5VTEwpOwoJCWZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0udHJhY2s7IGN5bCsrKSB7CgkJCXByaW50X2FuZF9mbHVzaCgiJTNkXGJcYlxiIiwgY3lsKTsKCQkJaWYoKHJlYWRfYnl0ZXMgPSBzYWZlX3JlYWQoZmQsZGF0YSxuKSkhPSBuICkgewoJCQkJaWYocmVhZF9ieXRlcyA8IDApIHsKCQkJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKCQkJCX0KCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJQcm9ibGVtIHJlYWRpbmcgY3lsaW5kZXIgJWQsIGV4cGVjdGVkICVkLCByZWFkICVkIiwgY3lsLCBuLCByZWFkX2J5dGVzKTsKCQkJfQoJCQkvKiBDaGVjayBiYWNrd2FyZHMgc28gd2UgZG9uJ3QgbmVlZCBhIGNvdW50ZXIgKi8KCQkJd2hpbGUoLS1yZWFkX2J5dGVzPj0wKSB7CgkJCQlpZiggZGF0YVtyZWFkX2J5dGVzXSAhPSBGRF9GSUxMX0JZVEUpIHsKCQkJCQkgcHJpbnRfYW5kX2ZsdXNoKCJiYWQgZGF0YSBpbiBjeWwgJWRcbkNvbnRpbnVpbmcgLi4uICIsY3lsKTsKCQkJCX0KCQkJfQoJCX0KCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQoJCWFsbCBvZiB0aGUgcHJvZ3JhbSdzIHNwYWNlIGlzIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIHRoZSBwcm9jZXNzCgkJdGVybWluYXRlcy4qLwoKCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZGF0YSk7CgoJCXByaW50X2FuZF9mbHVzaCgiZG9uZVxuIiwgTlVMTCk7Cgl9CgoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CgoJLyogRG9uJ3QgYm90aGVyIGNsb3NpbmcuICBFeGl0IGRvZXMKCSAqIHRoYXQsIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==