Li4gTWV0YWZ1bmN0aW9ucy9Mb2dpY2FsIE9wZXJhdGlvbnMvL25vdF8gfDMwCgpub3RcXwo9PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRgogICAgICAgID4KICAgIHN0cnVjdCBub3RcXwogICAgewogICAgICAgIHR5cGVkZWYgfHVuc3BlY2lmaWVkfCB0eXBlOwogICAgfTsKCgoKRGVzY3JpcHRpb24KLS0tLS0tLS0tLS0KClJldHVybnMgdGhlIHJlc3VsdCBvZiAqbG9naWNhbCBub3QqIChgYCFgYCkgb3BlcmF0aW9uIG9uIGl0cyBhcmd1bWVudC4KCgpIZWFkZXIKLS0tLS0tCgouLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICNpbmNsdWRlIDxib29zdC9tcGwvbm90LmhwcD4KICAgICNpbmNsdWRlIDxib29zdC9tcGwvbG9naWNhbC5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKfCBQYXJhbWV0ZXIgICAgIHwgUmVxdWlyZW1lbnQgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Cis9PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgRmBgICAgICAgICAgfCBOdWxsYXJ5IHxNZXRhZnVuY3Rpb258ICAgIHwgT3BlcmF0aW9uJ3MgYXJndW1lbnQuICAgICAgICAgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhcmJpdHJhcnkgbnVsbGFyeSB8TWV0YWZ1bmN0aW9ufCBgYGZgYDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIG5vdF88Zj46OnR5cGUgcjsKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCiAKOlNlbWFudGljczoKICAgIEVxdWl2YWxlbnQgdG8gCiAgICAKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgICAgICAKICAgICAgICB0eXBlZGVmIGJvb2xfPCAoIWY6OnR5cGU6OnZhbHVlKSA+IHI7CgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgbm90XzxmPiByOwoKOlJldHVybiB0eXBlOgogICAgfEludGVncmFsIENvbnN0YW50fC4KCjpTZW1hbnRpY3M6CiAgICBFcXVpdmFsZW50IHRvIAoKICAgIC4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgICAgIHN0cnVjdCByIDogbm90XzxmPjo6dHlwZSB7fTsKCgpFeGFtcGxlCi0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBub3RfPCB0cnVlXF8gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlQoKCBub3RfPCBmYWxzZVxfID4gKSk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxNZXRhZnVuY3Rpb25zfCwgfExvZ2ljYWwgT3BlcmF0aW9uc3wsIHxhbmRffCwgfG9yX3wKCgouLiBjb3B5cmlnaHQ6OiBDb3B5cmlnaHQgqSAgMjAwMS0yMDA5IEFsZWtzZXkgR3VydG92b3kgYW5kIERhdmlkIEFicmFoYW1zCiAgIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4gKFNlZSBhY2NvbXBhbnlpbmcKICAgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdCBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCg==