Li4gTWV0YWZ1bmN0aW9ucy9Db21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZy8vbGFtYmRhIHwyMAoKbGFtYmRhCj09PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgWAogICAgICAgICwgdHlwZW5hbWUgVGFnID0gfHVuc3BlY2lmaWVkfAogICAgICAgID4KICAgIHN0cnVjdCBsYW1iZGEKICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpJZiBgYFhgYCBpcyBhIHxwbGFjZWhvbGRlciBleHByZXNzaW9ufCwgdHJhbnNmb3JtcyBgYFhgYCBpbnRvIGEgY29ycmVzcG9uZGluZyAKfE1ldGFmdW5jdGlvbiBDbGFzc3wsIG90aGVyd2lzZSBgYFhgYCBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCgoKSGVhZGVyCi0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICAjaW5jbHVkZSA8Ym9vc3QvbXBsL2xhbWJkYS5ocHA+CgoKUGFyYW1ldGVycwotLS0tLS0tLS0tCgorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorPT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09Kz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Kwp8IGBgWGBgICAgICAgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgfCBBbiBleHByZXNzaW9uIHRvIHRyYW5zZm9ybS4gICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IGBgVGFnYGAgICAgICAgfCBBbnkgdHlwZSAgICAgICAgICAgICAgfCBBIHRhZyBkZXRlcm1pbmluZyB0cmFuc2Zvcm0gc2VtYW50aWNzLiAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoKRXhwcmVzc2lvbiBzZW1hbnRpY3MKLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkZvciBhcmJpdHJhcnkgdHlwZXMgYGB4YGAgYW5kIGBgdGFnYGA6CgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgbGFtYmRhPHg+Ojp0eXBlIGY7Cgo6UmV0dXJuIHR5cGU6CiAgICB8TWV0YWZ1bmN0aW9uIENsYXNzfC4KCjpTZW1hbnRpY3M6CiAgICBJZiBgYHhgYCBpcyBhIHxwbGFjZWhvbGRlciBleHByZXNzaW9ufCBpbiBhIGdlbmVyYWwgZm9ybSBgYFg8YTEsLi4uYW4+YGAsIHdoZXJlCiAgICBgYFhgYCBpcyBhIGNsYXNzIHRlbXBsYXRlIGFuZCBgYGExYGAsLi4uIGBgYW5gYCBhcmUgYXJiaXRyYXJ5IHR5cGVzLCBlcXVpdmFsZW50IAogICAgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIHByb3RlY3Q8IGJpbmQ8CiAgICAgICAgICAgICAgcXVvdGVcICpuKlwgPFg+CiAgICAgICAgICAgICwgbGFtYmRhPGExPjo6dHlwZSxcIHwuLi58IGxhbWJkYTxhXCAqbipcID46OnR5cGUKICAgICAgICAgICAgPiA+IGY7CiAgICAKICAgIG90aGVyd2lzZSwgYGBmYGAgaXMgaWRlbnRpY2FsIHRvIGBgeGBgLgoKLi4gfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CgouLiBwYXJzZWQtbGl0ZXJhbDo6CgogICAgdHlwZWRlZiBsYW1iZGE8eCx0YWc+Ojp0eXBlIGY7Cgo6UmV0dXJuIHR5cGU6CiAgICB8TWV0YWZ1bmN0aW9uIENsYXNzfC4KCjpTZW1hbnRpY3M6CiAgICBJZiBgYHhgYCBpcyBhIHxwbGFjZWhvbGRlciBleHByZXNzaW9ufCBpbiBhIGdlbmVyYWwgZm9ybSBgYFg8YTEsLi4uYW4+YGAsIHdoZXJlCiAgICBgYFhgYCBpcyBhIGNsYXNzIHRlbXBsYXRlIGFuZCBgYGExYGAsLi4uIGBgYW5gYCBhcmUgYXJiaXRyYXJ5IHR5cGVzLCBlcXVpdmFsZW50IAogICAgdG8KCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICB0eXBlZGVmIHByb3RlY3Q8IGJpbmQ8CiAgICAgICAgICAgICAgcXVvdGVcICpuKlwgPFgsdGFnPgogICAgICAgICAgICAsIGxhbWJkYTxhMSx0YWc+Ojp0eXBlLFwgfC4uLnwgbGFtYmRhPGFcICpuKlwgLHRhZz46OnR5cGUKICAgICAgICAgICAgPiA+IGY7CiAgICAKICAgIG90aGVyd2lzZSwgYGBmYGAgaXMgaWRlbnRpY2FsIHRvIGBgeGBgLgoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgTjEsIHR5cGVuYW1lIE4yID4gc3RydWN0IGludF9wbHVzCiAgICAgICAgOiBpbnRfPCggTjE6OnZhbHVlICsgTjI6OnZhbHVlICk+CiAgICB7CiAgICB9OwogICAgCiAgICB0eXBlZGVmIGxhbWJkYTwgaW50X3BsdXM8XzEsIGludF88NDI+ID4gPjo6dHlwZSBmMTsKICAgIHR5cGVkZWYgYmluZDwgcXVvdGVcIGBgMmBgXCA8aW50X3BsdXM+LCBfMSwgaW50Xzw0Mj4gPiBmMjsKCiAgICB0eXBlZGVmIGYxOjphcHBseTw0Mj46OnR5cGUgcjE7CiAgICB0eXBlZGVmIGYyOjphcHBseTw0Mj46OnR5cGUgcjI7CgogICAgQk9PU1RfTVBMX0FTU0VSVF9SRUxBVElPTiggcjE6OnZhbHVlLCA9PSwgODQgKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfUkVMQVRJT04oIHIyOjp2YWx1ZSwgPT0sIDg0ICk7CgoKU2VlIGFsc28KLS0tLS0tLS0KCnxDb21wb3NpdGlvbiBhbmQgQXJndW1lbnQgQmluZGluZ3wsIHxJbnZvY2F0aW9ufCwgfFBsYWNlaG9sZGVyc3wsIHxiaW5kfCwgfHF1b3RlfCwgfHByb3RlY3R8LCB8YXBwbHl8CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=