Li4gTWV0YWZ1bmN0aW9ucy9CaXR3aXNlIE9wZXJhdGlvbnMvL2JpdG9yXwoKYml0b3JcXwo9PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFQxCiAgICAgICAgLCB0eXBlbmFtZSBUMgogICAgICAgICwgdHlwZW5hbWUgVDMgPSB8dW5zcGVjaWZpZWR8CiAgICAgICAgfC4uLnwKICAgICAgICAsIHR5cGVuYW1lIFRcICpuKiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgYml0b3JcXwogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHJlc3VsdCBvZiAqYml0d2lzZSBvciogKGBgfGBgKSBvcGVyYXRpb24gb2YgaXRzIGFyZ3VtZW50cy4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvYml0b3IuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9iaXR3aXNlLmhwcD4KCgpNb2RlbCBvZgotLS0tLS0tLQoKfE51bWVyaWMgTWV0YWZ1bmN0aW9ufAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCB8VDEuLi5UbnwgICAgIHwgfEludGVncmFsIENvbnN0YW50fCAgICAgICB8IE9wZXJhdGlvbidzIGFyZ3VtZW50cy4gICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKfE5vdGU6fCB8bnVtZXJpYyBtZXRhZnVuY3Rpb24gbm90ZXwgfC0tIGVuZCBub3RlfAoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxJbnRlZ3JhbCBDb25zdGFudHxcIHMgfGMxLi4uY258OgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGJpdG9yXzxjMSxcIHwuLi58XCBjXCAqbipcPjo6dHlwZSByOyAKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKICAgICAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgaW50ZWdyYWxfYzwKICAgICAgICAgICAgICB0eXBlb2YoYzE6OnZhbHVlIHwgYzI6OnZhbHVlKQogICAgICAgICAgICAsICggYzE6OnZhbHVlIHwgYzI6OnZhbHVlICkKICAgICAgICAgICAgPiBjOwogICAgICAgICAgICAKICAgICAgICB0eXBlZGVmIGJpdG9yXzxjLGMzLFwgfC4uLnxcY1wgKm4qXD46OnR5cGUgcjsgCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgYml0b3JfPGMxLFwgfC4uLnxcIGNcICpuKlw+IHI7Cgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8KICAgIAogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgICAgICBzdHJ1Y3QgciA6IGJpdG9yXzxjMSxcIHwuLi58XCBjXCAqbipcPjo6dHlwZSB7fTsKCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgaW50ZWdyYWxfYzx1bnNpZ25lZCwwPiB1MDsKICAgIHR5cGVkZWYgaW50ZWdyYWxfYzx1bnNpZ25lZCwxPiB1MTsKICAgIHR5cGVkZWYgaW50ZWdyYWxfYzx1bnNpZ25lZCwyPiB1MjsKICAgIHR5cGVkZWYgaW50ZWdyYWxfYzx1bnNpZ25lZCw4PiB1ODsKICAgIHR5cGVkZWYgaW50ZWdyYWxfYzx1bnNpZ25lZCwweGZmZmZmZmZmPiB1ZmZmZmZmZmY7CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChiaXRvcl88dTAsdTA+Ojp2YWx1ZSksID09LCAwICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0b3JfPHUxLHUwPjo6dmFsdWUpLCA9PSwgMSApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGJpdG9yXzx1MCx1MT46OnZhbHVlKSwgPT0sIDEgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIChiaXRvcl88dTAsdWZmZmZmZmZmPjo6dmFsdWUpLCA9PSwgMHhmZmZmZmZmZiApOwogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggKGJpdG9yXzx1MSx1ZmZmZmZmZmY+Ojp2YWx1ZSksID09LCAweGZmZmZmZmZmICk7CiAgICBCT09TVF9NUExfQVNTRVJUX1JFTEFUSU9OKCAoYml0b3JfPHU4LHVmZmZmZmZmZj46OnZhbHVlKSwgPT0sIDB4ZmZmZmZmZmYgKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfEJpdHdpc2UgT3BlcmF0aW9uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8Yml0YW5kX3wsIHxiaXR4b3JffCwgfHNoaWZ0X2xlZnR8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=