Ly8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vICAgICAgX19fXyAgICAgICAgICAgICAgICAgICAgICAgIF8gICAgICBfCi8vICAgICAvIF9fX3xfX19fIF8gICBfIF9fX18gICBfX19ffCB8X18gIHwgfAovLyAgICB8IHwgICAvIF9fX3wgfCB8IHwgIF8gIFwvIF9fX3wgIF8gIFx8IHwKLy8gICAgfCB8X19ffCB8ICB8IHxffCB8IHwgfCB8IHxfX198IHwgfCB8fF98Ci8vICAgICBcX19fX3xffCAgXF9fX19ffF98IHxffFxfX19ffF98IHxffChfKSBNZWRpYSBiZW5jaG1hcmtzCi8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi8vCSCpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uLCBsaWNlbnNlZCB1bmRlciBBcGFjaGUgMi4wIAovLwovLyAgZmlsZSA6IEFubmVhbGluZ0ZhY3Rvci5oCi8vICBhdXRob3IgOiBKZWFuLVl2ZXMgQm91Z3VldCAtIGplYW4teXZlcy5ib3VndWV0QGludGVsLmNvbQovLyAgZGVzY3JpcHRpb24gOiBFc3RpbWF0ZXMgdGhlIGFubmVhbGluZyBmYWN0b3IgbmVlZGVkCi8vCQkJCSAgZm9yIHRoZSBhbm5lYWxlZCBwYXJ0aWNsZSBmaWx0ZXIgdG8gdGFyZ2V0Ci8vCQkJCSAgYSBkZXNpcmVkIHBhcnRpY2xlIHN1cnZpdmFsIHJhdGUKLy8gIG1vZGlmaWVkIDogCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojaWYgZGVmaW5lZChIQVZFX0NPTkZJR19IKQojIGluY2x1ZGUgImNvbmZpZy5oIgojZW5kaWYKCiNpbmNsdWRlICJBbm5lYWxpbmdGYWN0b3IuaCIKI2luY2x1ZGUgPG1hdGguaD4KCi8vIENvbXB1dGVzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBhcnRpY2xlIHN1cnZpdmFsIHJhdGUgYWxwaGEgYW5kIHRoZSBkZXNpcmVkIHZhbHVlIGFscGhhX2Rlc2lyZWQKZmxvYXQgZGVsdGFfYWxwaGEoZmxvYXQgYmV0YSxzdGQ6OnZlY3RvcjxmbG9hdD4gJmV0cyxmbG9hdCBhbHBoYV9kZXNpcmVkKQp7IAoJaW50IE4gPSAoaW50KSBldHMuc2l6ZSgpOwoJZmxvYXQgQj0wOwoJZmxvYXQgRj0wOwoJZmxvYXQgZWk7Cglkb3VibGUgdjsKCglmb3IoaW50IGk9MDtpPE47aSsrKQoJewl2ID0gYmV0YSpldHNbaV07CgkJaWYodj5MT0dfTUFYX0ZMT0FUKSByZXR1cm4gKC1hbHBoYV9kZXNpcmVkKTsgLy8gZXhpdCB0aGUgZnVuY3Rpb24gaXMgdGhlIHZhbHVlIGlzIHRvbyBsYXJnZS4gUmV0dXJuIHRoZSBsaW1pdCB2YWx1ZQoJCWVpID0gKGZsb2F0KWV4cCh2KTsKCQlCICs9IGVpOwoJCUYgKz0gKGVpKmVpKTsKCX0KCXJldHVybiAoKChCKkIvRikvTikgLSBhbHBoYV9kZXNpcmVkKTsKfTsKCgovLyBFc3RpbWF0ZXMgdGhlIG9wdGltYWwgYmV0YSBjb2VmZmljaWVudCB0byBhY2hpZXZlIGEgcGFydGljbGUgc3Vydml2YWwgcmF0ZSBvZiBhbHBoYV9kZXNpcmVkCmZsb2F0IEJldGFBbm5lYWxpbmdGYWN0b3Ioc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZldHMsZmxvYXQgYWxwaGFfZGVzaXJlZCwgZmxvYXQgYmV0YV9taW4sIGZsb2F0IGJldGFfbWF4ICkKewoJaW50IG5faXRlcmF0aW9ucyA9IDA7CgoJLy8gY29ucHV0ZSB0aGUgdmFsdWVzIGF0IHRoZSByYW5nZSBleHRyZW1hczoKCWZsb2F0IGRlbHRhX2FscGhhX21pbiA9IGRlbHRhX2FscGhhKGJldGFfbWluLGV0cyxhbHBoYV9kZXNpcmVkKTsKCWZsb2F0IGRlbHRhX2FscGhhX21heCA9IGRlbHRhX2FscGhhKGJldGFfbWF4LGV0cyxhbHBoYV9kZXNpcmVkKTsKCgkvLyBNYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBhIHplcm8gY3Jvc3Npbmcgd2l0aGluIHRoZSByYW5nZS4gT3RoZXJ3aXNlLCByZXR1cm4gMS4wIChpLmUuIGVxdWl2YWxlbnQgdG8gbm8gc2NhbGluZykKCWlmICgoKGRlbHRhX2FscGhhX21pbj4wKSYmKGRlbHRhX2FscGhhX21heD4wKSl8fCgoZGVsdGFfYWxwaGFfbWluPDApJiYoZGVsdGFfYWxwaGFfbWF4PDApKSkgcmV0dXJuIDEuMGY7CgoJZmxvYXQgYmV0YSA9IChiZXRhX21pbiArIGJldGFfbWF4KS8yOwoJZmxvYXQgZGVsdGFfYWxwaGFfYmV0YSA9IGRlbHRhX2FscGhhKGJldGEsZXRzLGFscGhhX2Rlc2lyZWQpOwoKCXdoaWxlKCgoZGVsdGFfYWxwaGFfYmV0YTwwLjAgPyAtZGVsdGFfYWxwaGFfYmV0YSA6IGRlbHRhX2FscGhhX2JldGEpPkFMUEhBX1BSRUNJU0lPTikgJiYgKG5faXRlcmF0aW9ucyA8IE5fSVRFUl9NQVgpKQoJewlpZigoKGRlbHRhX2FscGhhX21pbj4wKSYmKGRlbHRhX2FscGhhX2JldGE+MCkpIHx8ICgoZGVsdGFfYWxwaGFfbWluPD0wKSYmKGRlbHRhX2FscGhhX2JldGE8MCkpKQoJCXsgICBiZXRhX21pbiA9IGJldGE7CgkJCWRlbHRhX2FscGhhX21pbiA9IGRlbHRhX2FscGhhX2JldGE7CgkJfQoJCWVsc2UKCQl7CWJldGFfbWF4ID0gYmV0YTsKCQkJZGVsdGFfYWxwaGFfbWF4ID0gZGVsdGFfYWxwaGFfYmV0YTsKCQl9CgkJYmV0YSA9IChiZXRhX21pbiArIGJldGFfbWF4KS8yOwoJCWRlbHRhX2FscGhhX2JldGEgPSBkZWx0YV9hbHBoYShiZXRhLGV0cyxhbHBoYV9kZXNpcmVkKTsKCQluX2l0ZXJhdGlvbnMrKzsKCX0KCXJldHVybiBiZXRhOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqICBGVU5DVElPTlMgRk9SIERFQlVHIFBVUlBPU0VTICoqKioqKioqKioqKioqKioqKioqKioqLwoKLy8gU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHZlY3RvciBldHMgZm9yIGRlYnVnIHB1cnBvc2VzOgp2b2lkIHNldF9ldHMoc3RkOjp2ZWN0b3I8ZmxvYXQ+ICZldHMpCnsKCS8vZmxvYXQgdmFsc1syNV0gPSB7CgkvLwk0LjMxMjg3Mjg2OTVmLDAuMDAwMDAwMDAwMGYsMTguOTA1MzU5NjI3M2YsMTMuMTQyNTEzNDc2MmYsMTcuNDQ4NDA5MTI1MWYsMTcuMjQ2MTE4MjM5NGYsMTYuNjU2NjY2MzU3OWYsMTAuMDg1MDY3ODU1OWYsCgkvLwkxNS43MDAxMDI3MTQxZiwxNC42OTMyMTA0MTIzZiw5LjQxOTQ2NjcxNjJmLDguNzM4NDM1NDQzN2YsMTAuMTEzOTQyOTAwOWYsMTQuMDE5MTQ5NDIwNGYsOS40NDEyNjMyNDQ5ZiwxNy40NzExNDY2NDE4ZiwKCS8vCTguNjE0OTk5MzEzNWYsMTcuNDQ3Njc5ODc3NmYsMTguODE5MjU0MDY0MmYsOC40NTQwNDIzNzI2ZiwxNC4xNjMwMzA2NDA0ZiwxNy4yMjY1MDIzODA5ZiwzLjUzMjQzNjExMDFmLDE5LjE5Mjc2NTIzMjlmLAoJLy8JMTIuNTUwNDU3NzI1NWZ9OwoKCWZsb2F0IHZhbHNbMjVdID0gewoJCTAuMDQzMTI4NzI4N2YsMC4wMDAwMDAwMDAwZiwwLjE4OTA1MzU5NjNmLDAuMTMxNDI1MTM0OGYsMC4xNzQ0ODQwOTEzZiwwLjE3MjQ2MTE4MjRmLDAuMTY2NTY2NjYzNmYsMC4xMDA4NTA2Nzg2ZiwKCQkwLjE1NzAwMTAyNzFmLDAuMTQ2OTMyMTA0MWYsMC4wOTQxOTQ2NjcyZiwwLjA4NzM4NDM1NDRmLDAuMTAxMTM5NDI5MGYsMC4xNDAxOTE0OTQyZiwwLjA5NDQxMjYzMjRmLDAuMTc0NzExNDY2NGYsCgkJMC4wODYxNDk5OTMxZiwwLjE3NDQ3Njc5ODhmLDAuMTg4MTkyNTQwNmYsMC4wODQ1NDA0MjM3ZiwwLjE0MTYzMDMwNjRmLDAuMTcyMjY1MDIzOGYsMC4wMzUzMjQzNjExZiwwLjE5MTkyNzY1MjNmLAoJCTAuMTI1NTA0NTc3M2Z9OwoKCWV0cy5yZXNpemUoMjUpOwoJZm9yKGludCBpPTA7aTwyNTtpKyspCgkJZXRzW2ldID0gdmFsc1tpXTsKfQo=