Li4gTWV0YWZ1bmN0aW9ucy9Db21wYXJpc29ucy8vZ3JlYXRlcl9lcXVhbCB8NDAKCmdyZWF0ZXJfZXF1YWwKPT09PT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBUMQogICAgICAgICwgdHlwZW5hbWUgVDIKICAgICAgICA+CiAgICBzdHJ1Y3QgZ3JlYXRlcl9lcXVhbAogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSB0cnVlLXZhbHVlZCB8SW50ZWdyYWwgQ29uc3RhbnR8IGlmIGBgVDFgYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYGBUMmBgLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9ncmVhdGVyX2VxdWFsLmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9tcGwvY29tcGFyaXNvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxOdW1lcmljIE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBUMWBgLCBgYFQyYGB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCnxOb3RlOnwgfG51bWVyaWMgbWV0YWZ1bmN0aW9uIG5vdGV8IHwtLSBlbmQgbm90ZXwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkZvciBhbnkgfEludGVncmFsIENvbnN0YW50fFwgcyBgYGMxYGAgYW5kIGBgYzJgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGdyZWF0ZXJfZXF1YWw8YzEsYzI+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgYm9vbF88IChjMTo6dmFsdWUgPCBjMjo6dmFsdWUpID4gcjsKCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgZ3JlYXRlcl9lcXVhbDxjMSxjMj4gcjsgCgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICAgc3RydWN0IHIgOiBncmVhdGVyX2VxdWFsPGMxLGMyPjo6dHlwZSB7fTsKCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGdyZWF0ZXJfZXF1YWw8IGludF88MTA+LCBpbnRfPDA+ID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGdyZWF0ZXJfZXF1YWw8IGxvbmdfPDA+LCBpbnRfPDEwPiA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVCgoIGdyZWF0ZXJfZXF1YWw8IGxvbmdfPDEwPiwgaW50XzwxMD4gPiApKTsKCgpTZWUgYWxzbwotLS0tLS0tLQoKfENvbXBhcmlzb25zfCwgfE51bWVyaWMgTWV0YWZ1bmN0aW9ufCwgfG51bWVyaWNfY2FzdHwsIHxncmVhdGVyfCwgfGxlc3N8LCB8ZXF1YWxfdG98CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=