Li4gTWV0YWZ1bmN0aW9ucy9Mb2dpY2FsIE9wZXJhdGlvbnMvL2FuZF8gfDEwCgphbmRcXwo9PT09PQoKU3lub3BzaXMKLS0tLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgdGVtcGxhdGU8IAogICAgICAgICAgdHlwZW5hbWUgRjEKICAgICAgICAsIHR5cGVuYW1lIEYyCiAgICAgICAgfC4uLnwKICAgICAgICAsIHR5cGVuYW1lIEZcICpuKiA9IHx1bnNwZWNpZmllZHwKICAgICAgICA+CiAgICBzdHJ1Y3QgYW5kXF8KICAgIHsKICAgICAgICB0eXBlZGVmIHx1bnNwZWNpZmllZHwgdHlwZTsKICAgIH07CgoKCkRlc2NyaXB0aW9uCi0tLS0tLS0tLS0tCgpSZXR1cm5zIHRoZSByZXN1bHQgb2Ygc2hvcnQtY2lyY3VpdCAqbG9naWNhbCBhbmQqIChgYCYmYGApIG9wZXJhdGlvbiBvbiBpdHMgYXJndW1lbnRzLgoKCkhlYWRlcgotLS0tLS0KCi4uIHBhcnNlZC1saXRlcmFsOjoKICAgIAogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9hbmQuaHBwPgogICAgI2luY2x1ZGUgPGJvb3N0L21wbC9sb2dpY2FsLmhwcD4KCgpQYXJhbWV0ZXJzCi0tLS0tLS0tLS0KCistLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwp8IFBhcmFtZXRlciAgICAgfCBSZXF1aXJlbWVudCAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKz09PT09PT09PT09PT09PSs9PT09PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0rCnwgfEYxLi4uRm58ICAgICB8IE51bGxhcnkgfE1ldGFmdW5jdGlvbnwgICAgfCBPcGVyYXRpb24ncyBhcmd1bWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCgpFeHByZXNzaW9uIHNlbWFudGljcwotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRm9yIGFyYml0cmFyeSBudWxsYXJ5IHxNZXRhZnVuY3Rpb258XCBzIHxmMS4uLmZufDoKCi4uIHBhcnNlZC1saXRlcmFsOjoKCiAgICB0eXBlZGVmIGFuZF88ZjEsZjIsXCB8Li4ufFwgLGZcICpuKlw+Ojp0eXBlIHI7Cgo6UmV0dXJuIHR5cGU6CiAgICB8SW50ZWdyYWwgQ29uc3RhbnR8LgoKOlNlbWFudGljczoKICAgIGBgcmBgIGlzIGBgZmFsc2VfYGAgaWYgZWl0aGVyIG9mIGBgZjE6OnR5cGU6OnZhbHVlYGAsIGBgZjI6OnR5cGU6OnZhbHVlYGAsLi4uIAogICAgYGBmbjo6dHlwZTo6dmFsdWVgYCBleHByZXNzaW9ucyBldmFsdWF0ZXMgdG8gYGBmYWxzZWBgLCBhbmQgYGB0cnVlX2BgIG90aGVyd2lzZTsgCiAgICBndWFyYW50ZWVzIGxlZnQtdG8tcmlnaHQgZXZhbHVhdGlvbjsgdGhlIG9wZXJhbmRzIHN1YnNlcXVlbnQgdG8gdGhlIGZpcnN0IAogICAgYGBmYGBcICppKiBtZXRhZnVuY3Rpb24gdGhhdCBldmFsdWF0ZXMgdG8gYGBmYWxzZWBgIGFyZSBub3QgZXZhbHVhdGVkLiAKCgouLiAuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLgoKLi4gcGFyc2VkLWxpdGVyYWw6OgoKICAgIHR5cGVkZWYgYW5kXzxmMSxmMixcIHwuLi58XCAsZlwgKm4qXD4gcjsKCjpSZXR1cm4gdHlwZToKICAgIHxJbnRlZ3JhbCBDb25zdGFudHwuCgo6U2VtYW50aWNzOgogICAgRXF1aXZhbGVudCB0byAKCiAgICAuLiBwYXJzZWQtbGl0ZXJhbDo6CiAgICAKICAgICAgICBzdHJ1Y3QgciA6IGFuZF88ZjEsZjIsXCB8Li4ufFwgLGZcICpuKlw+Ojp0eXBlIHt9OwoKCkV4YW1wbGUKLS0tLS0tLQoKLi4gcGFyc2VkLWxpdGVyYWw6OgogICAgCiAgICBzdHJ1Y3QgdW5rbm93bjsKCiAgICBCT09TVF9NUExfQVNTRVJUKCggYW5kXzwgdHJ1ZVxfLHRydWVcXyA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBhbmRfPCBmYWxzZVxfLHRydWVcXyA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBhbmRfPCB0cnVlXF8sZmFsc2VcXyA+ICkpOwogICAgQk9PU1RfTVBMX0FTU0VSVF9OT1QoKCBhbmRfPCBmYWxzZVxfLGZhbHNlXF8gPiApKTsKICAgIEJPT1NUX01QTF9BU1NFUlRfTk9UKCggYW5kXzwgZmFsc2VcXyx1bmtub3duID4gKSk7IC8vIE9LCiAgICBCT09TVF9NUExfQVNTRVJUX05PVCgoIGFuZF88IGZhbHNlXF8sdW5rbm93bix1bmtub3duID4gKSk7IC8vIE9LIHRvbwoKClNlZSBhbHNvCi0tLS0tLS0tCgp8TWV0YWZ1bmN0aW9uc3wsIHxMb2dpY2FsIE9wZXJhdGlvbnN8LCB8b3JffCwgfG5vdF98CgoKLi4gY29weXJpZ2h0OjogQ29weXJpZ2h0IKkgIDIwMDEtMjAwOSBBbGVrc2V5IEd1cnRvdm95IGFuZCBEYXZpZCBBYnJhaGFtcwogICBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuIChTZWUgYWNjb21wYW55aW5nCiAgIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQo=