Li4gTWV0YWZ1bmN0aW9ucy9NaXNjZWxsYW5lb3VzLy9pZGVudGl0eSB8MTAKCmlkZW50aXR5Cj09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwgCiAgICAgICAgICB0eXBlbmFtZSBYCiAgICAgICAgPgogICAgc3RydWN0IGlkZW50aXR5CiAgICB7CiAgICAgICAgdHlwZWRlZiBYIHR5cGU7CiAgICB9OwoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpUaGUgYGlkZW50aXR5YF9fIG1ldGFmdW5jdGlvbi4gUmV0dXJucyBgYFhgYCB1bmNoYW5nZWQuCgpfXyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0lkZW50aXR5RnVuY3Rpb24uaHRtbAoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9pZGVudGl0eS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgUGFyYW1ldGVyICAgICB8IFJlcXVpcmVtZW50ICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgWGBgICAgICAgICAgfCBBbnkgdHlwZSAgICAgICAgICB8IEFuIGFyZ3VtZW50IHRvIGJlIHJldHVybmVkLiAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFuIGFyYml0cmFyeSB0eXBlIGBgeGBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGlkZW50aXR5PHg+Ojp0eXBlIHI7Cgo6UmV0dXJuIHR5cGU6CiAgICBBIHR5cGUuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0bwogICAgCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIHggcjsKCgo6UG9zdGNvbmRpdGlvbjoKICAgIGBgaXNfc2FtZTxyLHg+Ojp2YWx1ZSA9PSB0cnVlYGAuCiAgICAKICAgIAoKRXhhbXBsZQotLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHR5cGVkZWYgYXBwbHk8IGlkZW50aXR5PF8xPiwgY2hhciA+Ojp0eXBlIHQxOwogICAgdHlwZWRlZiBhcHBseTwgaWRlbnRpdHk8XzI+LCBjaGFyLGludCA+Ojp0eXBlIHQyOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgdDEsIGNoYXIgPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBpc19zYW1lPCB0MiwgaW50ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb25zfCwgfFBsYWNlaG9sZGVyc3wsIHxUcml2aWFsIE1ldGFmdW5jdGlvbnN8LCB8YWx3YXlzfCwgfGFwcGx5fAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK