Li4gQWxnb3JpdGhtcy9UcmFuc2Zvcm1hdGlvbiBBbGdvcml0aG1zLy9yZXBsYWNlX2lmIHw1MAoKcmVwbGFjZV9pZgo9PT09PT09PT09CgpTeW5vcHNpcwotLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwKICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlCiAgICAgICAgLCB0eXBlbmFtZSBQcmVkCiAgICAgICAgLCB0eXBlbmFtZSBOZXdUeXBlCiAgICAgICAgLCB0eXBlbmFtZSBJbiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgcmVwbGFjZV9pZgogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBzZXF1ZW5jZSB3aGVyZSBldmVyeSB0eXBlIHRoYXQgc2F0aXNmaWVzIAp0aGUgcHJlZGljYXRlIGBgUHJlZGBgIGhhcyBiZWVuIHJlcGxhY2VkIHdpdGggYGBOZXdUeXBlYGAuIAoKfHRyYW5zZm9ybWF0aW9uIGFsZ29yaXRobSBkaXNjbGFpbWVyfAoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL3JlcGxhY2VfaWYuaHBwPgoKCgpNb2RlbCBvZgotLS0tLS0tLQoKfFJldmVyc2libGUgQWxnb3JpdGhtfAoKClBhcmFtZXRlcnMKLS0tLS0tLS0tLQoKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSsKfCBgYFNlcXVlbmNlYGAgIHwgfEZvcndhcmQgU2VxdWVuY2V8ICAgICAgICAgICAgICAgIHwgQW4gb3JpZ2luYWwgc2VxdWVuY2UuICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBQcmVkYGAgICAgICB8IFVuYXJ5IHxMYW1iZGEgRXhwcmVzc2lvbnwgICAgICAgICB8IEEgcmVwbGFjZW1lbnQgY29uZGl0aW9uLiAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgTmV3VHlwZWBgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBIHR5cGUgdG8gcmVwbGFjZSB3aXRoLiAgICAgICB8CistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBgYEluYGAgICAgICAgIHwgfEluc2VydGVyfCAgICAgICAgICAgICAgICAgICAgICAgIHwgQW4gaW5zZXJ0ZXIuICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnxTZW1hbnRpY3MgZGlzY2xhaW1lci4uLnwgfFJldmVyc2libGUgQWxnb3JpdGhtfC4KCkZvciBhbnkgfEZvcndhcmQgU2VxdWVuY2V8IGBgc2BgLCBhbiB1bmFyeSB8TGFtYmRhIEV4cHJlc3Npb258IGBgcHJlZGBgLAphbiB8SW5zZXJ0ZXJ8IGBgaW5gYCwgYW5kIGFyYml0cmFyeSB0eXBlIGBgeGBgOgoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIHJlcGxhY2VfaWY8cyxwcmVkLHgsaW4+Ojp0eXBlIHI7IAoKOlJldHVybiB0eXBlOgogICAgQSB0eXBlLgoKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCgogICAgLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgICAgIAogICAgICAgIHR5cGVkZWYgbGFtYmRhPHByZWQ+Ojp0eXBlIHA7CiAgICAgICAgdHlwZWRlZiB0cmFuc2Zvcm08IHMsIGlmXzwgYXBwbHlfd3JhcDE8cCxfMT4seCxfMT4sIGluID46OnR5cGUgcjsgCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpMaW5lYXIuIFBlcmZvcm1zIGV4YWN0bHkgYGBzaXplPHM+Ojp2YWx1ZWBgIGFwcGxpY2F0aW9ucyBvZiBgYHByZWRgYCwgYW5kIGF0IG1vc3QgCmBgc2l6ZTxzPjo6dmFsdWVgYCBpbnNlcnRpb25zLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwxLDQsNSwyLDcsNSwzLDU+IG51bWJlcnM7CiAgICB0eXBlZGVmIHZlY3Rvcl9jPGludCwxLDQsMCwyLDAsMCwzLDA+IGV4cGVjdGVkOwogICAgdHlwZWRlZiByZXBsYWNlX2lmPCBudW1iZXJzLCBncmVhdGVyPF8saW50Xzw0PiA+LCBpbnRfPDA+ID46OnR5cGUgcmVzdWx0OwogICAgCiAgICBCT09TVF9NUExfQVNTRVJUKCggZXF1YWw8IHJlc3VsdCxleHBlY3RlZCwgZXF1YWxfdG88XyxfPiA+ICkpOwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8VHJhbnNmb3JtYXRpb24gQWxnb3JpdGhtc3wsIHxSZXZlcnNpYmxlIEFsZ29yaXRobXwsIHxyZXZlcnNlX3JlcGxhY2VfaWZ8LCB8cmVwbGFjZXwsIHxyZW1vdmVfaWZ8LCB8dHJhbnNmb3JtfAoKCi4uIGNvcHlyaWdodDo6IENvcHlyaWdodCCpICAyMDAxLTIwMDkgQWxla3NleSBHdXJ0b3ZveSBhbmQgRGF2aWQgQWJyYWhhbXMKICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLiAoU2VlIGFjY29tcGFueWluZwogICBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0IGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkK