Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9jbGVhcgoKY2xlYXIKPT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICA+CiAgICBzdHJ1Y3QgY2xlYXIKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIGFuIGVtcHR5IHNlcXVlbmNlIHxjb25jZXB0LWlkZW50aWNhbHwgdG8gYGBTZXF1ZW5jZWBgLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9jbGVhci5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgb3IgICAgICAgICAgfCBBIHNlcXVlbmNlIHRvIGdldCBhbiBlbXB0eSAiY29weSIgb2YuIHwKfCAgICAgICAgICAgICAgIHwgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKCkV4cHJlc3Npb24gc2VtYW50aWNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tCgpGb3IgYW55IHxFeHRlbnNpYmxlIFNlcXVlbmNlfCBvciB8RXh0ZW5zaWJsZSBBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwgYGBzYGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgY2xlYXI8cz46OnR5cGUgdDsgCgo6UmV0dXJuIHR5cGU6CiAgICB8RXh0ZW5zaWJsZSBTZXF1ZW5jZXwgb3IgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8LgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAgICB0eXBlZGVmIGVyYXNlPCBzLCBiZWdpbjxzPjo6dHlwZSwgZW5kPHM+Ojp0eXBlID46OnR5cGUgdDsKCgo6UG9zdGNvbmRpdGlvbjoKICAgIGBgZW1wdHk8cz46OnZhbHVlID09IHRydWVgYC4KCgpDb21wbGV4aXR5Ci0tLS0tLS0tLS0KCkFtb3J0aXplZCBjb25zdGFudCB0aW1lLiAKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiB2ZWN0b3JfYzxpbnQsMSwzLDUsNyw5LDExPiBvZGRzOwogICAgdHlwZWRlZiBjbGVhcjxvZGRzPjo6dHlwZSBub3RoaW5nOwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggZW1wdHk8bm90aGluZz4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxFeHRlbnNpYmxlIFNlcXVlbmNlfCwgfEV4dGVuc2libGUgQXNzb2NpYXRpdmUgU2VxdWVuY2V8LCB8ZXJhc2V8LCB8ZW1wdHl8LCB8YmVnaW58LCB8ZW5kfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK