Li4gU2VxdWVuY2VzL0ludHJpbnNpYyBNZXRhZnVuY3Rpb25zLy9rZXlfdHlwZQoKa2V5X3R5cGUKPT09PT09PT0KClN5bm9wc2lzCi0tLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgIHRlbXBsYXRlPAogICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2UKICAgICAgICAsIHR5cGVuYW1lIFgKICAgICAgICA+CiAgICBzdHJ1Y3Qga2V5X3R5cGUKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSB8a2V5fCB0aGF0IHdvdWxkIGJlIHVzZWQgdG8gaWRlbnRpZnkgYGBYYGAgaW4gYGBTZXF1ZW5jZWBgLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9rZXlfdHlwZS5ocHA+CgoKTW9kZWwgb2YKLS0tLS0tLS0KCnxUYWcgRGlzcGF0Y2hlZCBNZXRhZnVuY3Rpb258CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgU2VxdWVuY2VgYCAgfCB8QXNzb2NpYXRpdmUgU2VxdWVuY2V8ICAgIHwgQSBzZXF1ZW5jZSB0byBxdWVyeS4gICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCnwgYGBYYGAgICAgICAgICB8IEFueSB0eXBlICAgICAgICAgICAgICAgICAgfCBUaGUgdHlwZSB0byBnZXQgdGhlIHxrZXl8IGZvci4gICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFueSB8QXNzb2NpYXRpdmUgU2VxdWVuY2V8IGBgc2BgLCBpdGVyYXRvcnMgYGBwb3MxYGAgYW5kIGBgcG9zMmBgIGluIGBgc2BgLCBhbmQgYW4gCmFydGlicmFyeSB0eXBlIGBgeGBgOgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYga2V5X3R5cGU8cyx4Pjo6dHlwZSBrOyAKCjpSZXR1cm4gdHlwZToKICAgIEEgdHlwZS4KICAgIAo6UHJlY29uZGl0aW9uOgogICAgYGB4YGAgY2FuIGJlIHB1dCBpbiBgYHNgYC4gCgo6U2VtYW50aWNzOgogICAgYGBrYGAgaXMgdGhlIHxrZXl8IHRoYXQgd291bGQgYmUgdXNlZCB0byBpZGVudGlmeSBgYHhgYCBpbiBgYHNgYC4KCjpQb3N0Y29uZGl0aW9uOgogICAgSWYgYGBrZXlfdHlwZTwgcyxkZXJlZjxwb3MxPjo6dHlwZSA+Ojp0eXBlYGAgaXMgaWRlbnRpY2FsIHRvCiAgICBgYGtleV90eXBlPCBzLGRlcmVmPHBvczI+Ojp0eXBlID46OnR5cGVgYCB0aGVuIGBgcG9zMWBgIGlzIGlkZW50aWNhbCB0byBgYHBvczJgYC4KCgoKQ29tcGxleGl0eQotLS0tLS0tLS0tCgpBbW9ydGl6ZWQgY29uc3RhbnQgdGltZS4KCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdHlwZWRlZiBrZXlfdHlwZTwgbWFwPD4scGFpcjxpbnQsdW5zaWduZWQ+ID46OnR5cGUgazE7CiAgICB0eXBlZGVmIGtleV90eXBlPCBzZXQ8PixwYWlyPGludCx1bnNpZ25lZD4gPjo6dHlwZSBrMjsKCiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgazEsaW50ID4gKSk7CiAgICBCT09TVF9NUExfQVNTRVJUKCggaXNfc2FtZTwgazIscGFpcjxpbnQsdW5zaWduZWQ+ID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxBc3NvY2lhdGl2ZSBTZXF1ZW5jZXwsIHx2YWx1ZV90eXBlfCwgfGhhc19rZXl8LCB8c2V0fCwgfG1hcHwKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==