Li4gTWV0YWZ1bmN0aW9ucy9Db21wYXJpc29ucy8vbGVzc19lcXVhbCB8MjAKCmxlc3NfZXF1YWwKPT09PT09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8CiAgICAgICAgICB0eXBlbmFtZSBUMQogICAgICAgICwgdHlwZW5hbWUgVDIKICAgICAgICA+CiAgICBzdHJ1Y3QgbGVzc19lcXVhbAogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSB0cnVlLXZhbHVlZCB8SW50ZWdyYWwgQ29uc3RhbnR8IGlmIGBgVDFgYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYGBUMmBgLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9sZXNzX2VxdWFsLmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9tcGwvY29tcGFyaXNvbi5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxOdW1lcmljIE1ldGFmdW5jdGlvbnwKCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgYGBUMWBgLCBgYFQyYGB8IHxJbnRlZ3JhbCBDb25zdGFudHwgICAgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCnxOb3RlOnwgfG51bWVyaWMgbWV0YWZ1bmN0aW9uIG5vdGV8IHwtLSBlbmQgbm90ZXwKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKCkZvciBhbnkgfEludGVncmFsIENvbnN0YW50fFwgcyBgYGMxYGAgYW5kIGBgYzJgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGxlc3NfZXF1YWw8YzEsYzI+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHR5cGVkZWYgYm9vbF88IChjMTo6dmFsdWUgPD0gYzI6OnZhbHVlKSA+IHI7CgoKLi4gLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGxlc3NfZXF1YWw8YzEsYzI+IHI7IAoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCByIDogbGVzc19lcXVhbDxjMSxjMj46OnR5cGUge307CgoKCkNvbXBsZXhpdHkKLS0tLS0tLS0tLQoKQW1vcnRpemVkIGNvbnN0YW50IHRpbWUuCgoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBsZXNzX2VxdWFsPCBpbnRfPDA+LCBpbnRfPDEwPiA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBsZXNzX2VxdWFsPCBsb25nXzwxMD4sIGludF88MD4gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBsZXNzX2VxdWFsPCBsb25nXzwxMD4sIGludF88MTA+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxDb21wYXJpc29uc3wsIHxOdW1lcmljIE1ldGFmdW5jdGlvbnwsIHxudW1lcmljX2Nhc3R8LCB8bGVzc3wsIHxncmVhdGVyfCwgfGVxdWFsfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK