ZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXJyYXkgYi9pbmNsdWRlL2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ1ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FycmF5CkBAIC0wLDAgKzEsMjk2IEBACisvLyAtKi0gQysrIC0qLQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFycmF5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyDKysrKysrKysrKysrKysrKysrKylRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfTElCQ1BQX0FSUkFZCisjZGVmaW5lIF9MSUJDUFBfQVJSQVkKKworLyoKKyAgICBhcnJheSBzeW5vcHNpcworCituYW1lc3BhY2Ugc3RkCit7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4gPiAKK3N0cnVjdCBhcnJheQoreyAKKyAgICAvLyB0eXBlczogCisgICAgdHlwZWRlZiBUICYgcmVmZXJlbmNlOyAKKyAgICB0eXBlZGVmIGNvbnN0IFQgJiBjb25zdF9yZWZlcmVuY2U7IAorICAgIHR5cGVkZWYgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBpdGVyYXRvcjsgCisgICAgdHlwZWRlZiBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGNvbnN0X2l0ZXJhdG9yOyAKKyAgICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7IAorICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsgCisgICAgdHlwZWRlZiBUIHZhbHVlX3R5cGU7IAorICAgIHR5cGVkZWYgVCogcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IFQqIGNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7IAorICAgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOyAKKworICAgIC8vIE5vIGV4cGxpY2l0IGNvbnN0cnVjdC9jb3B5L2Rlc3Ryb3kgZm9yIGFnZ3JlZ2F0ZSB0eXBlIAorICAgIHZvaWQgZmlsbChjb25zdCBUJiB1KTsgCisgICAgdm9pZCBzd2FwKGFycmF5JiBhKTsKKworICAgIC8vIGl0ZXJhdG9yczogCisgICAgaXRlcmF0b3IgYmVnaW4oKTsgCisgICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsgCisgICAgaXRlcmF0b3IgZW5kKCk7IAorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OyAKKworICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCk7IAorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3Q7IAorICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpOyAKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdDsgCisKKyAgICBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdDsgCisgICAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0OyAKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdDsKKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyZW5kKCkgY29uc3Q7IAorCisgICAgLy8gY2FwYWNpdHk6IAorICAgIGNvbnN0ZXhwciBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0OyAKKyAgICBjb25zdGV4cHIgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3Q7IAorICAgIGJvb2wgZW1wdHkoKSBjb25zdDsgCisKKyAgICAvLyBlbGVtZW50IGFjY2VzczogCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIG4pOyAKKyAgICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgbikgY29uc3Q7IAorICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgbikgY29uc3Q7IAorICAgIHJlZmVyZW5jZSBhdChzaXplX3R5cGUgbik7IAorCisgICAgcmVmZXJlbmNlIGZyb250KCk7IAorICAgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0OyAKKyAgICByZWZlcmVuY2UgYmFjaygpOyAKKyAgICBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0OyAKKworICAgIFQqIGRhdGEoKTsgCisgICAgY29uc3QgVCogZGF0YSgpIGNvbnN0OyAKK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsgCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc2l6ZV90IE4+IAorICBib29sIG9wZXJhdG9yIT0oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiAKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiAKKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgYXJyYXk8VCxOPiYgeCwgY29uc3QgYXJyYXk8VCxOPiYgeSk7IAordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiAKKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGFycmF5PFQsTj4mIHgsIGNvbnN0IGFycmF5PFQsTj4mIHkpOyAKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTj4gCisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBhcnJheTxULE4+JiB4LCBjb25zdCBhcnJheTxULE4+JiB5KTsgCisKK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgTiA+IAorICB2b2lkIHN3YXAoYXJyYXk8VCxOPiYgeCwgYXJyYXk8VCxOPiYgeSk7IAorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgdHVwbGVfc2l6ZTsgCit0ZW1wbGF0ZSA8aW50IEksIGNsYXNzIFQ+IGNsYXNzIHR1cGxlX2VsZW1lbnQ7IAordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBOPiBzdHJ1Y3QgdHVwbGVfc2l6ZTxhcnJheTxULCBOPj47Cit0ZW1wbGF0ZSA8aW50IEksIGNsYXNzIFQsIHNpemVfdCBOPiBzdHJ1Y3QgdHVwbGVfZWxlbWVudDxJLCBhcnJheTxULCBOPj47IAordGVtcGxhdGUgPGludCBJLCBjbGFzcyBULCBzaXplX3QgTj4gVCYgZ2V0KGFycmF5PFQsIE4+Jik7IAordGVtcGxhdGUgPGludCBJLCBjbGFzcyBULCBzaXplX3QgTj4gY29uc3QgVCYgZ2V0KGNvbnN0IGFycmF5PFQsIE4+Jik7IAorCit9ICAvLyBzdGQKKworKi8KKworI2luY2x1ZGUgPF9fY29uZmlnPgorI2luY2x1ZGUgPF9fdHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkZXhjZXB0PgorI2lmIGRlZmluZWQoX0xJQkNQUF9OT19FWENFUFRJT05TKQorICAgICNpbmNsdWRlIDxjYXNzZXJ0PgorI2VuZGlmCisKKyNwcmFnbWEgR0NDIHN5c3RlbV9oZWFkZXIKKworX0xJQkNQUF9CRUdJTl9OQU1FU1BBQ0VfU1RECisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4gCitzdHJ1Y3QgYXJyYXkKK3sKKyAgICAvLyB0eXBlczoKKyAgICB0eXBlZGVmIGFycmF5IF9fc2VsZjsKKyAgICB0eXBlZGVmIF9UcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZTsgCisgICAgdHlwZWRlZiB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsgCisgICAgdHlwZWRlZiBjb25zdCB2YWx1ZV90eXBlJiAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZTsgCisgICAgdHlwZWRlZiB2YWx1ZV90eXBlKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogICAgICAgICAgICAgICAgICAgICBjb25zdF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcjsKKyAgICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqICAgICAgICAgICAgICAgICAgICAgY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlOyAKKyAgICB0eXBlZGVmIHB0cmRpZmZfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW5jZV90eXBlOyAKKyAgICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gICAgICAgcmV2ZXJzZV9pdGVyYXRvcjsgCisgICAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7IAorCisgICAgdmFsdWVfdHlwZSBfX2VsZW1zX1tfU2l6ZSA+IDAgPyBfU2l6ZSA6IDFdOworCisgICAgLy8gTm8gZXhwbGljaXQgY29uc3RydWN0L2NvcHkvZGVzdHJveSBmb3IgYWdncmVnYXRlIHR5cGUgCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIGZpbGwoY29uc3QgdmFsdWVfdHlwZSYgX191KSB7X1NURDo6ZmlsbF9uKF9fZWxlbXNfLCBfU2l6ZSwgX191KTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSB2b2lkIHN3YXAoYXJyYXkmIF9fYSkge19TVEQ6OnN3YXBfcmFuZ2VzKF9fZWxlbXNfLCBfX2VsZW1zXyArIF9TaXplLCBfX2EuX19lbGVtc18pO30KKworICAgIC8vIGl0ZXJhdG9yczogCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpdGVyYXRvciBiZWdpbigpICAgICAgICAgICAgIHtyZXR1cm4gaXRlcmF0b3IoX19lbGVtc18pO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Qge3JldHVybiBjb25zdF9pdGVyYXRvcihfX2VsZW1zXyk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaXRlcmF0b3IgZW5kKCkgICAgICAgICAgICAgICB7cmV0dXJuIGl0ZXJhdG9yKF9fZWxlbXNfICsgX1NpemUpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICAge3JldHVybiBjb25zdF9pdGVyYXRvcihfX2VsZW1zXyArIF9TaXplKTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgICAgICAgICAgICAge3JldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHtyZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgICAgICAgICAgICAgICB7cmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgICB7cmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCAgICAgICAgICB7cmV0dXJuIGJlZ2luKCk7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0ICAgICAgICAgICAge3JldHVybiBlbmQoKTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNyYmVnaW4oKSBjb25zdCB7cmV0dXJuIHJiZWdpbigpO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY3JlbmQoKSBjb25zdCAgIHtyZXR1cm4gcmVuZCgpO30KKworICAgIC8vIGNhcGFjaXR5OiAKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIC8qY29uc3RleHByKi8gc2l6ZV90eXBlIHNpemUoKSBjb25zdCAgICAgIHtyZXR1cm4gX1NpemU7fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgLypjb25zdGV4cHIqLyBzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCAge3JldHVybiBfU2l6ZTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBib29sIGVtcHR5KCkgY29uc3QgICAgICAgICAgICAgICAgICAgIHtyZXR1cm4gX1NpemUgPT0gMDt9CisKKyAgICAvLyBlbGVtZW50IGFjY2VzczogCisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgX19uKSAgICAgICAgICAgICB7cmV0dXJuIF9fZWxlbXNfW19fbl07fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oc2l6ZV90eXBlIF9fbikgY29uc3Qge3JldHVybiBfX2VsZW1zX1tfX25dO30KKyAgICByZWZlcmVuY2UgYXQoc2l6ZV90eXBlIF9fbik7IAorICAgIGNvbnN0X3JlZmVyZW5jZSBhdChzaXplX3R5cGUgX19uKSBjb25zdDsgCisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHJlZmVyZW5jZSBmcm9udCgpICAgICAgICAgICAgIHtyZXR1cm4gX19lbGVtc19bMF07fQorICAgIF9MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3Qge3JldHVybiBfX2VsZW1zX1swXTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSByZWZlcmVuY2UgYmFjaygpICAgICAgICAgICAgICB7cmV0dXJuIF9fZWxlbXNfW19TaXplID4gMCA/IF9TaXplLTEgOiAwXTt9CisgICAgX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBjb25zdF9yZWZlcmVuY2UgYmFjaygpIGNvbnN0ICB7cmV0dXJuIF9fZWxlbXNfW19TaXplID4gMCA/IF9TaXplLTEgOiAwXTt9CisKKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIHZhbHVlX3R5cGUqIGRhdGEoKSAgICAgICAgICAgICB7cmV0dXJuIF9fZWxlbXNfO30KKyAgICBfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGNvbnN0IHZhbHVlX3R5cGUqIGRhdGEoKSBjb25zdCB7cmV0dXJuIF9fZWxlbXNfO30gCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IAordHlwZW5hbWUgYXJyYXk8X1RwLCBfU2l6ZT46OnJlZmVyZW5jZQorYXJyYXk8X1RwLCBfU2l6ZT46OmF0KHNpemVfdHlwZSBfX24pCit7CisgICAgaWYgKF9fbiA+PSBfU2l6ZSkKKyNpZm5kZWYgX0xJQkNQUF9OT19FWENFUFRJT05TCisgICAgICAgIHRocm93IG91dF9vZl9yYW5nZSgiYXJyYXk6OmF0Iik7CisjZWxzZQorICAgICAgICBhc3NlcnQoISJhcnJheTo6YXQgb3V0X29mX3JhbmdlIik7CisjZW5kaWYKKyAgICByZXR1cm4gX19lbGVtc19bX19uXTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKK3R5cGVuYW1lIGFycmF5PF9UcCwgX1NpemU+Ojpjb25zdF9yZWZlcmVuY2UKK2FycmF5PF9UcCwgX1NpemU+OjphdChzaXplX3R5cGUgX19uKSBjb25zdAoreworICAgIGlmIChfX24gPj0gX1NpemUpCisjaWZuZGVmIF9MSUJDUFBfTk9fRVhDRVBUSU9OUworICAgICAgICB0aHJvdyBvdXRfb2ZfcmFuZ2UoImFycmF5OjphdCIpOworI2Vsc2UKKyAgICAgICAgYXNzZXJ0KCEiYXJyYXk6OmF0IG91dF9vZl9yYW5nZSIpOworI2VuZGlmCisgICAgcmV0dXJuIF9fZWxlbXNfW19fbl07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4gCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I9PShjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX194LCBjb25zdCBhcnJheTxfVHAsIF9TaXplPiYgX195KQoreworICAgIHJldHVybiBfU1REOjplcXVhbChfX3guX19lbGVtc18sIF9feC5fX2VsZW1zXyArIF9TaXplLCBfX3kuX19lbGVtc18pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgX1RwLCBzaXplX3QgX1NpemU+IAorX0xJQkNQUF9JTkxJTkVfVklTSUJJTElUWSBpbmxpbmUKK2Jvb2wKK29wZXJhdG9yIT0oY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKK3sKKyAgICByZXR1cm4gIShfX3ggPT0gX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjwoY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4mIF9feSkKK3sKKyAgICByZXR1cm4gX1NURDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoX194Ll9fZWxlbXNfLCBfX3guX19lbGVtc18gKyBfU2l6ZSwgX195Ll9fZWxlbXNfLCBfX3kuX19lbGVtc18gKyBfU2l6ZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4gCitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorYm9vbAorb3BlcmF0b3I+KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuIF9feSA8IF9feDsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcjw9KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX195IDwgX194KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCitib29sCitvcGVyYXRvcj49KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgcmV0dXJuICEoX194IDwgX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPiAKK19MSUJDUFBfSU5MSU5FX1ZJU0lCSUxJVFkgaW5saW5lCit2b2lkCitzd2FwKGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3gsIGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX3kpCit7CisgICAgX194LnN3YXAoX195KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIF9UcCwgc2l6ZV90IF9TaXplPgorICBjbGFzcyB0dXBsZV9zaXplPGFycmF5PF9UcCwgX1NpemU+ID4gOiBwdWJsaWMgaW50ZWdyYWxfY29uc3RhbnQ8c2l6ZV90LCBfU2l6ZT4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBfVHAsIHNpemVfdCBfU2l6ZT4KKyAgY2xhc3MgdHVwbGVfc2l6ZTxjb25zdCBhcnJheTxfVHAsIF9TaXplPiA+IDogcHVibGljIGludGVncmFsX2NvbnN0YW50PHNpemVfdCwgX1NpemU+IHt9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitjbGFzcyB0dXBsZV9lbGVtZW50PF9JcCwgYXJyYXk8X1RwLCBfU2l6ZT4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitjbGFzcyB0dXBsZV9lbGVtZW50PF9JcCwgY29uc3QgYXJyYXk8X1RwLCBfU2l6ZT4gPgoreworcHVibGljOgorICAgIHR5cGVkZWYgY29uc3QgX1RwIHR5cGU7Cit9OworCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorX1RwJgorZ2V0KGFycmF5PF9UcCwgX1NpemU+JiBfX2EpCit7CisgICAgcmV0dXJuIF9fYVtfSXBdOworfQorCit0ZW1wbGF0ZSA8c2l6ZV90IF9JcCwgY2xhc3MgX1RwLCBzaXplX3QgX1NpemU+CitfTElCQ1BQX0lOTElORV9WSVNJQklMSVRZIGlubGluZQorY29uc3QgX1RwJgorZ2V0KGNvbnN0IGFycmF5PF9UcCwgX1NpemU+JiBfX2EpCit7CisgICAgcmV0dXJuIF9fYVtfSXBdOworfQorCitfTElCQ1BQX0VORF9OQU1FU1BBQ0VfU1RECisKKyNlbmRpZiAgLy8gX0xJQkNQUF9BUlJBWQo=