Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyBzaW11bF9lZnVuLmMgLS0gc2ltdWwgZWZ1bidzCi8vCi8vICRJZDogc2ltdWxfZWZ1bi5jIDc0MDggMjAxMC0wMi0wNiAwMDoyNzoyNVogWmVzc3RyYSAkCiNwcmFnbWEgc3RyaWN0X3R5cGVzLHNhdmVfdHlwZXMscnR0X2NoZWNrcwojcHJhZ21hIG5vX2Nsb25lLG5vX3NoYWRvdyxub19pbmhlcml0CiNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCiNwcmFnbWEgd2Fybl9lbXB0eV9jYXN0cyx3YXJuX21pc3NpbmdfcmV0dXJuLHdhcm5fZnVuY3Rpb25faW5jb25zaXN0ZW50CgovLyBBYnNvbHV0ZSBQZmFkZSBlcmZvcmRlcmxpY2ggLSB6dW0gWmVpdHB1bmt0LCB3byBkZXIgTWFzdGVyIGdlbGFkZW4KLy8gd2lyZCwgc2luZCBub2NoIGtlaW5lIEluY2x1ZGUtUGZhZGUgZGEgLi4uCgojZGVmaW5lIFNOT09QTE9HRklMRSAiU05PT1AiCiNkZWZpbmUgQVNOT09QTE9HRklMRSAiQVJDSC9TTk9PUCIKCiNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgojaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKI2luY2x1ZGUgIi9zeXMvc25vb3BpbmcuaCIKI2luY2x1ZGUgIi9zeXMvbGFuZ3VhZ2UuaCIKI2luY2x1ZGUgIi9zeXMvdGhpbmcvcHJvcGVydGllcy5oIgojaW5jbHVkZSAiL3N5cy93aXpsaXN0LmgiCiNpbmNsdWRlICIvc3lzL2VycS5oIgojaW5jbHVkZSAiL3N5cy9scGN0eXBlcy5oIgojaW5jbHVkZSAiL3N5cy9kYWVtb24uaCIKI2luY2x1ZGUgIi9zeXMvcGxheWVyL2Jhc2UuaCIKI2luY2x1ZGUgIi9zeXMvdGhpbmcvZGVzY3JpcHRpb24uaCIKI2luY2x1ZGUgIi9zeXMvY29udGFpbmVyLmgiCiNpbmNsdWRlICIvc3lzL2RlZmluZXMuaCIKI2luY2x1ZGUgIi9zeXMvdGVsbmV0LmgiCiNpbmNsdWRlICIvc3lzL29iamVjdGluZm8uaCIKI2luY2x1ZGUgIi9zeXMvZmlsZXMuaCIKI2luY2x1ZGUgIi9zeXMvc3RyaW5ncy5oIgojaW5jbHVkZSAiL3N5cy90aW1lLmgiCiNpbmNsdWRlICIvc3lzL2xwY3R5cGVzLmgiCiNpbmNsdWRlICIvc3lzL25vdGlmeV9mYWlsLmgiCiNpbmNsdWRlICIvc3lzL3Rscy5oIgojaW5jbHVkZSAiL3N5cy9pbnB1dF90by5oIgojaW5jbHVkZSAiL3N5cy9vYmplY3RfaW5mby5oIgoKLyogZnVuY3Rpb24gcHJvdG90eXBlcwogKi8Kc3RyaW5nIGR0aW1lKGludCB3YW5uKTsKdmFyYXJncyBpbnQgbG9nX2ZpbGUoc3RyaW5nIGZpbGUsIHN0cmluZyB0eHQsIGludCBzaXplX3RvX2JyZWFrKTsKaW50IHF1ZXJ5X3dpel9sZXZlbChtaXhlZCBwbGF5ZXIpOwpub21hc2sgdmFyYXJncyBpbnQgc25vb3Aob2JqZWN0IG1lLCBvYmplY3QgeW91KTsKdmFyYXJncyBzdHJpbmcgY291bnRyeShtaXhlZCBpcCwgc3RyaW5nIG51bSk7CmludCBxdWVyeV93aXpfZ3JwKG1peGVkIHdpeik7CnB1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKTsKbm9tYXNrIGludCBzZWN1cmVfbGV2ZWwoKTsKbm9tYXNrIHN0cmluZyBzZWN1cmVfZXVpZCgpOwpwdWJsaWMgbm9tYXNrIGludCBwcm9jZXNzX2NhbGwoKTsKbm9tYXNrIG1peGVkIF9fY3JlYXRlX3BsYXllcl9kdW1teShzdHJpbmcgbmFtZSk7CnZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpOwoKCi8vcmVwbGFjZW1lbnRzIGZvciBkcm9wcGVkIGVmdW5zIGluIExECiNpZiAhX19FRlVOX0RFRklORURfXyhleHRyYWN0KQp2YXJhcmdzIHN0cmluZyBleHRyYWN0KHN0cmluZyBzdHIsIGludCBmcm9tLCBpbnQgdG8pOwojZW5kaWYKI2lmICFfX0VGVU5fREVGSU5FRF9fKHNsaWNlX2FycmF5KQp2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKTsKI2VuZGlmCiNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCmludCBtZW1iZXJfYXJyYXkobWl4ZWQgaXRlbSwgbWl4ZWQgYXJyYXlzdHJpbmcpOwojZW5kaWYKCi8vIEluY2x1ZGUgdGhlIGRpZmZlcmVudCBzdWIgJ21vZHVsZXMnIG9mIHRoZSBzaW11bF9lZnVuCiNpbmNsdWRlIF9fRElSX18iZGVidWdfaW5mby5jIgojaW5jbHVkZSBfX0RJUl9fImVuYWJsZV9jb21tYW5kcy5jIgojaW5jbHVkZSBfX0RJUl9fImhhc2guYyIKI2luY2x1ZGUgX19ESVJfXyJvYmplY3RfaW5mby5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2VkaXRpbmcuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9pZGxlLmMiCiNpbmNsdWRlIF9fRElSX18icXVlcnlfaW5wdXRfcGVuZGluZy5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X2lwX25hbWUuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9saW1pdHMuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9sb2FkX2F2ZXJhZ2UuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9tdWRfcG9ydC5jIgojaW5jbHVkZSBfX0RJUl9fInF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUuYyIKI2luY2x1ZGUgX19ESVJfXyJxdWVyeV9zbm9vcC5jIgojaW5jbHVkZSBfX0RJUl9fInNldF9oZWFydF9iZWF0LmMiCiNpZiBfX0JPT1RfVElNRV9fIDwgMTQ1NjI2MTg1OQojaW5jbHVkZSBfX0RJUl9fInNldF9wcm9tcHQuYyIKI2VuZGlmCiNpbmNsdWRlIF9fRElSX18ic2hhZG93LmMiCiNpbmNsdWRlIF9fRElSX18ibGl2aW5ncy5jIgojaW5jbHVkZSBfX0RJUl9fImNvbW0uYyIKCiNkZWZpbmUgVE8gICAgICAgIGVmdW46OnRoaXNfb2JqZWN0KCkKI2RlZmluZSBUSSAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCiNkZWZpbmUgVFAgICAgICAgIGVmdW46OnRoaXNfcGxheWVyKCkKI2RlZmluZSBQTyAgICAgICAgZWZ1bjo6cHJldmlvdXNfb2JqZWN0KDApCiNkZWZpbmUgTEVWRUwoeCkgcXVlcnlfd2l6X2xldmVsKHgpCiNkZWZpbmUgTkFNRSh4KSAgY2FwaXRhbGl6ZShnZXR1aWQoeCkpCgojZGVmaW5lIERFQlVHKHgpIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKSBcCiAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoInplc3N0cmEiKSx4KQoKbWl4ZWQgZHRpbWVfY2FjaGUgPSAoey0xLCIifSk7CgojaWZkZWYgSU9TVEFUUwpzdHJ1Y3QgaW9zdGF0X3MgewogIHN0cmluZyBvbmFtZTsKICBpbnQgdGltZTsKICBpbnQgc2l6ZTsKfTsKbWl4ZWQgc2F2ZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLCAwKSB9KTsKbWl4ZWQgcmVzdG9yZW9fc3RhdCA9ICh7IDAsYWxsb2NhdGUoMjAwLDApIH0pOwovL21peGVkIHdyaXRlZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKLy9taXhlZCByZWFkZmlsZV9zdGF0ID0gKHsgMCxhbGxvY2F0ZSgxMDAsKDxpb3N0YXRfcz4pKSB9KTsKLy9taXhlZCBsb2dfc3RhdCA9ICh7IDAsYWxsb2NhdGUoMTAwLCg8aW9zdGF0X3M+KSkgfSk7CgptaXhlZCBfX19pb3N0YXRzKGludCB0eXBlKSB7CiAgc3dpdGNoKHR5cGUpIHsKICAgIGNhc2UgMToKICAgICAgcmV0dXJuIHNhdmVvX3N0YXQ7CiAgICBjYXNlIDI6CiAgICAgIHJldHVybiByZXN0b3Jlb19zdGF0OwovKiAgICBjYXNlIDM6CiAgICAgIHJldHVybiB3cml0ZWZpbGVfc3RhdDsKICAgIGNhc2UgNDoKICAgICAgcmV0dXJuIHJlYWRmaWxlX3N0YXQ7CiAgICBjYXNlIDU6CiAgICAgIHJldHVybiBsb2dfc3RhdDsKICAgICAgKi8KICB9CiAgcmV0dXJuIDA7Cn0KI2VuZGlmCgovLyBOaWNodCBqZWRlciBNYWdpZXIgbXVzcyBkaWUgc2ltdWxfZWZ1biBlbnRzb3JnZW4ga29lbm5lbi4Kc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKICAgIGlmKCAoY2FsbGVyIT10aGlzX29iamVjdCgpICYmICFBUkNIX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKICAgICAgcmV0dXJuICJEdSBkYXJmc3QgZGFzIHNpbXVsX2VmdW4gT2JqZWt0IG5pY2h0IHplcnN0b2VyZW4hXG4iOwogICAgfQogICAgcmV0dXJuIDA7Cn0KCnB1YmxpYyBub21hc2sgdm9pZCByZW1vdmVfaW50ZXJhY3RpdmUoIG9iamVjdCBvYiApCnsKICAgIGlmICggb2JqZWN0cChvYikgJiYgcHJldmlvdXNfb2JqZWN0KCkKICAgICAgICAmJiBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSlbMC4uN10gIT0gIi9zZWN1cmUvIgogICAgICAgICYmICgocHJldmlvdXNfb2JqZWN0KCkgIT0gb2IKICAgICAgICAgICAgICYmIChvYiAhPSB0aGlzX3BsYXllcigpIHx8IG9iICE9IHRoaXNfaW50ZXJhY3RpdmUoKSkpCiAgICAgICAgICAgIHx8IChwcmV2aW91c19vYmplY3QoKSA9PSBvYgogICAgICAgICAgICAgICAmJiAodGhpc19wbGF5ZXIoKSAmJiB0aGlzX3BsYXllcigpICE9IG9iCiAgICAgICAgICAgICAgICAgICB8fCB0aGlzX2ludGVyYWN0aXZlKCkgJiYgdGhpc19pbnRlcmFjdGl2ZSgpICE9IG9iKSkgKSApCgogICAgICAgbG9nX2ZpbGUoICJQTEFZRVJERVNUIiwKICAgICAgICAgICAgICAgIHNwcmludGYoICIlczogJU8gYXVzZ2Vsb2dndCB2b24gUE8gJU8sIFRJICVPLCBUUCAlT1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwgb2IsIHByZXZpb3VzX29iamVjdCgpLAogICAgICAgICAgICAgICAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCksIHRoaXNfcGxheWVyKCkgKSApOwoKICAgIGVmdW46OnJlbW92ZV9pbnRlcmFjdGl2ZShvYik7Cn0KCgp2b2lkIF9fX3VwZG1hc3RlcigpCnsKICAgIG9iamVjdCBvYjsKCiAgICAvL3NvbGx0ZSBuaWNodCBqZWRlciBkdWVyZmVuLgogICAgaWYgKHByb2Nlc3NfY2FsbCgpIHx8ICFBUkNIX1NFQ1VSSVRZKQogICAgICByYWlzZV9lcnJvcigiSWxsZWdhbCB1c2Ugb2YgX19fdXBkbWFzdGVyKCkhIik7CgogICAgd3JpdGUoIlJlbW92aW5nIG9sZCBtYXN0ZXIgLi4uICIpOwogICAgZm9yZWFjaChzdHJpbmcgZmlsZTogCiAgICAgICAgZ2V0X2RpcigiL3NlY3VyZS9tYXN0ZXIvKi5jIixHRVRESVJfTkFNRVN8R0VURElSX1VOU09SVEVEfEdFVERJUl9QQVRIKSkgewogICAgICBpZiAob2IgPSBmaW5kX29iamVjdChmaWxlKSkKICAgICAgIGVmdW46OmRlc3RydWN0KG9iKTsKICAgIH0KICAgIGVmdW46OmRlc3RydWN0KGVmdW46OmZpbmRfb2JqZWN0KCIvc2VjdXJlL21hc3RlciIpKTsKICAgIHdyaXRlKCJkb25lLlxuTG9hZGluZyBhZ2FpbiAuLi4gIik7CiAgICBsb2FkX29iamVjdCgiL3NlY3VyZS9tYXN0ZXIiKTsKCiAgICB3cml0ZSgiZG9uZS5cbiIpOwp9Cgp2YXJhcmdzIHN0cmluZyBjb3VudHJ5KG1peGVkIGlwLCBzdHJpbmcgbnVtKSB7CiAgbWl4ZWQgcmV0OwoKICBpZihyZXQgPSAoc3RyaW5nKSIvcC9kYWVtb24vaXBsb29rdXAiLT5jb3VudHJ5KG51bSB8fCBpcCkpIHsKICAgIHJldHVybiByZXQ7CiAgfSBlbHNlIHJldHVybiAiPz8/IjsKfQoKCi8vICogU25vb3BlbiB1bmQgd2FzIGRhenVnZWhvZXJ0CnN0YXRpYyBvYmplY3QgZmluZF9zbm9vcGVkKG9iamVjdCB3aG8pCnsKICBvYmplY3QgKnU7CiAgaW50IGk7CgogIGZvciAoaT1zaXplb2YodT11c2VycygpKS0xO2k+PTA7aS0tKQogICAgaWYgKHdobz09ZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh1W2ldLCBJSV9TTk9PUF9ORVhUKSkKICAgICAgcmV0dXJuIHVbaV07CiAgcmV0dXJuIDA7Cn0KCnByaXZhdGUgc3RyaW5nIExjdXQoc3RyaW5nIHN0cikgewogIHJldHVybiBzdHJbNS4uMTFdK3N0clsxOC4uXTsKfQoKbm9tYXNrIHZhcmFyZ3MgaW50IHNub29wKCBvYmplY3QgbWUsIG9iamVjdCB5b3UgKQp7CiAgICBpbnQgcmV0OwogICAgb2JqZWN0IHNub29wZXIwLCBzbm9vcGVyLCBzbm9vcGVyMiwgc25vb3BlcjM7CgogICAgaWYoICFvYmplY3RwKG1lKSB8fCBtZSA9PSB5b3UgfHwgIVBPICkKICAgICAgIHJldHVybiAwOwoKICAgIHNub29wZXIwID0gZmluZF9zbm9vcGVkKG1lKTsKCiAgICAgaWYoeW91KXsKICAgICAgICBpZiAoIFBPICE9IG1lICYmIHF1ZXJ5X3dpel9ncnAobWUpID49IHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpICkKICAgICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIGlmICggcXVlcnlfd2l6X2dycChtZSkgPD0gcXVlcnlfd2l6X2dycCh5b3UpICYmCiAgICAgICAgICAgICAhKHlvdS0+UXVlcnlBbGxvd1Nub29wKG1lKSkgKQogICAgICAgICAgICBpZiAoICFJU19ERVBVVFkobWUpIHx8IElTX0FSQ0goeW91KSApCiAgICAgICAgICAgICAgIHJldHVybiAwOwoKICAgICAgICBpZiAoIChzbm9vcGVyID0gZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpKSAmJgogICAgICAgICAgICAgcXVlcnlfd2l6X2dycChzbm9vcGVyKSA+PSBxdWVyeV93aXpfZ3JwKG1lKSApewogICAgICAgICAgICBpZiAoIChpbnQpc25vb3Blci0+UXVlcnlQcm9wKFBfU05PT1BGTEFHUykgJiBTRl9MT0NLRUQgKQogICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgICAgIHRlbGxfb2JqZWN0KCBzbm9vcGVyLCBzcHJpbnRmKCAiJXMgc25vb3BlZCBqZXR6dCAlcy5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLT5uYW1lKFdFUiksIHlvdS0+bmFtZShXRVIpICkgKTsKCiAgICAgICAgICAgIHNub29wZXIyID0gbWU7CgogICAgICAgICAgICB3aGlsZSAoIHNub29wZXIzID0gaW50ZXJhY3RpdmVfaW5mbyhzbm9vcGVyMiwgSUlfU05PT1BfTkVYVCkgKXsKICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoICIlcyB3aXJkIHNlaW5lcnNlaXRzIHZvbiAlcyBnZXNub29wZWQuXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHNub29wZXIyLT5uYW1lKFdFUiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjMtPm5hbWUoV0VNKSApICk7CiAgICAgICAgICAgICAgIHNub29wZXIyID0gc25vb3BlcjM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGVmdW46OnNub29wKCBzbm9vcGVyLCBzbm9vcGVyMiApOwoKICAgICAgICAgICAgaWYgKCBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKHNub29wZXIyLCBJSV9TTk9PUF9ORVhUKSAhPSBzbm9vcGVyICkKICAgICAgICAgICAgICAgdGVsbF9vYmplY3QoIHNub29wZXIsIHNwcmludGYoICJEdSBrYW5uc3QgJXMgbmljaHQgc25vb3Blbi5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLT5uYW1lKFdFTikgKSApOwogICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICB0ZWxsX29iamVjdCggc25vb3Blciwgc3ByaW50ZiggIkR1IHNub29wc3QgamV0enQgJXMuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMi0+bmFtZShXRU4pICkgKTsKICAgICAgICAgICAgICAgaWYgKCAhSVNfREVQVVRZKHNub29wZXIpICl7CiAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggU05PT1BMT0dGSUxFLCBzcHJpbnRmKCIlczogJU8gJU8gJU9cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHRpbWUodGltZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNub29wZXIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CiAgICAgICAgICAgICAgICAgICBpZiAoc25vb3BlcjApCiAgICAgICAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCggIlNub29wIiwgc25vb3BlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiVzICpPRkYqICVzICglTykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChzbm9vcGVyMCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApICk7CgogICAgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIHNub29wZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIiVzIC0+ICVzICglTykiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIyKSkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICBsb2dfZmlsZSggQVNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0aW1lKHRpbWUoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMikgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwMDAwMCApOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBpZiAoc25vb3BlcikKICAgICAgICAgICAgICAgaWYgKCAhbWUtPlF1ZXJ5UHJvcChQX1NOT09QRkxBR1MpICYgU0ZfTE9DS0VEICl7CiAgICAgICAgICAgICAgICAgICBwcmludGYoICIlcyB3aXJkIGJlcmVpdHMgdm9uICVzIGdlc25vb3BlZC4gQmVudXR6ZSBkYXMgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJcImZcIi1GbGFnLCB3ZW5uIGR1IGRlbm5vY2ggc25vb3BlbiB3aWxsc3QuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIHlvdS0+bmFtZShXRVIpLCBzbm9vcGVyLT5uYW1lKFdFTSkgKTsKICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICB9CgogICAgICAgIHJldCA9IGVmdW46OnNub29wKCBtZSwgeW91ICk7CgogICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgJiYgZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lKXsKICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlT1xuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lLCB5b3UsIGVudmlyb25tZW50KHlvdSkgKSwKICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CgogICAgICAgICAgICBpZiAoc25vb3BlcjApCiAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCAiU25vb3AiLCBtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQobWUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHNub29wZXIwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOwoKICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLCBzcHJpbnRmKCAiJXMgLT4gJXMgKCVPKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZChtZSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKGdldHVpZCh5b3UpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQoeW91KSApICk7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICAgIGlmICggZWZ1bjo6aW50ZXJhY3RpdmVfaW5mbyh5b3UsIElJX1NOT09QX05FWFQpID09IG1lICl7CiAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZSwgeW91LCBlbnZpcm9ubWVudCh5b3UpICksCiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMCApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJldCAmJiBxdWVyeV93aXpfZ3JwKG1lKSA8PSBxdWVyeV93aXpfZ3JwKHlvdSkgJiYKICAgICAgICAgICAgICFJU19ERVBVVFkobWUpICkKICAgICAgICAgICAgdGVsbF9vYmplY3QoIHlvdSwgIioqKiAiICsgTkFNRShtZSkgKyAiIHNub29wdCBEaWNoIVxuIiApOwoKICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KICAgICBlbHNlIHsKICAgICAgICBpZiAoIChtZSA9PSBQTyB8fAogICAgICAgICAgICAgIHF1ZXJ5X3dpel9ncnAoZ2V0ZXVpZChQTykpID4gcXVlcnlfd2l6X2dycChtZSkgfHwKICAgICAgICAgICAgICAocXVlcnlfd2l6X2dycChnZXRldWlkKFBPKSkgPT0gcXVlcnlfd2l6X2dycChtZSkgJiYKICAgICAgICAgICAgICBlZnVuOjppbnRlcmFjdGl2ZV9pbmZvKFBPLCBJSV9TTk9PUF9ORVhUKSA9PSBtZSkpICYmIHNub29wZXIwICl7CiAgICAgICAgICAgIGlmICggIUlTX0RFUFVUWShtZSkgKXsKICAgICAgICAgICAgICAgbG9nX2ZpbGUoIFNOT09QTE9HRklMRSwgc3ByaW50ZiggIiVzOiAlTyAlTyAlTyAqT0ZGKlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm9vcGVyMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSwKICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwICk7CgogICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoICJTbm9vcCIsIG1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCAiJXMgKk9GRiogJXMgKCVPKS4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKG1lKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcjApKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudChzbm9vcGVyMCkgKSApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgIGxvZ19maWxlKCBBU05PT1BMT0dGSUxFLCBzcHJpbnRmKCAiJXM6ICVPICVPICVPICpPRkYqXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMY3V0KGR0aW1lKHRpbWUoKSkpLCBtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc25vb3BlcjAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50KHNub29wZXIwKSApLAogICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIGVmdW46OnNub29wKG1lKTsKICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwp9CgoKCi8vICogRW11bGF0aW9uIGRlcyAnYWx0ZW4nIGV4cGxvZGUgZHVyY2ggZGFzIG5ldWUKc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKSB7CiAgaW50IHMsIHQ7CiAgc3RyaW5nICpzdHJzOwoKICBpZiAoIXN0cmluZ3Aoc3RyKSkgewogICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAogICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAxIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKICAgICAgICAgIiUuMzBPXG4iLHN0cikpOwogIH0KICBpZiAoIXN0cmluZ3AoZGVsKSkgewogICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgICByYWlzZV9lcnJvcihzcHJpbnRmKAogICAgICAgICAiSW52YWxpZCBhcmd1bWVudCAyIHRvIG9sZF9leHBsb2RlKCkhIEV4cGVjdGVkIDxzdHJpbmc+LCBnb3Q6ICIKICAgICAgICAgIiUuMzBPXG4iLGRlbCkpOwogIH0KICBpZihkZWwgPT0gIiIpCiAgICByZXR1cm4gKHtzdHJ9KTsKICBzdHJzPWVmdW46OmV4cGxvZGUoc3RyLCBkZWwpOwogIHQ9c2l6ZW9mKHN0cnMpLTE7CiAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpO3MtLTsKICB3aGlsZSh0Pj0wICYmIHN0cnNbdC0tXSA9PSAiIik7dCsrOwogIGlmKHM8PXQpCiAgICByZXR1cm4gc3Ryc1tzLi50XTsKICByZXR1cm4gKHt9KTsKfQoKaW50IGZpbGVfdGltZShzdHJpbmcgcGF0aCkgewogIG1peGVkICp2OwoKICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogIGlmIChzaXplb2Yodj1nZXRfZGlyKHBhdGgsR0VURElSX0RBVEVTKSkpIHJldHVybiB2WzBdOwogIHJldHVybigwKTsgLy9zb25zdAp9CgovLyAqIEJlaSA1MGsgR3JvZXNzZSBMb2ctRmlsZSByb3RpZXJlbgp2YXJhcmdzIGludCBsb2dfZmlsZShzdHJpbmcgZmlsZSwgc3RyaW5nIHR4dCwgaW50IHNpemVfdG9fYnJlYWspIHsKICBtaXhlZCAqc3Q7CgogIGZpbGU9Ii9sb2cvIitmaWxlOwogIGZpbGU9aW1wbG9kZSgoZWZ1bjo6ZXhwbG9kZShmaWxlLCIvIiktKHsiLi4ifSkpLCIvIik7Ci8vICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigiam9mIiksc3ByaW50ZigiTE9HIEZJTEU6ICVPIC0+ICVPXG4iLHByZXZpb3VzX29iamVjdCgpLGZpbGUpKTsKICBpZiAoIWZ1bmNhbGwoYmluZF9sYW1iZGEoIydlZnVuOjpjYWxsX290aGVyLFBPKSwic2VjdXJlL21hc3RlciIsLy8nKQogICAgICAgICAgICAgICJ2YWxpZF93cml0ZSIsZmlsZSxnZXRldWlkKFBPKSwibG9nX2ZpbGUiLFBPKSkKICAgICAgcmV0dXJuIDA7CiAgaWYgKCBzaXplX3RvX2JyZWFrID49IDAgJiAoCiAgICAgIHNpemVvZihzdCA9IGdldF9kaXIoZmlsZSwyKSApICYmIHN0WzBdID49IChzaXplX3RvX2JyZWFrfE1BWF9MT0dfU0laRSkpKQogICAgICBjYXRjaChyZW5hbWUoZmlsZSwgZmlsZSArICIub2xkIik7cHVibGlzaCk7IC8qIE5vIHBhbmljIGlmIGZhaWx1cmUgKi8KICByZXR1cm4od3JpdGVfZmlsZShmaWxlLHR4dCkpOwp9CgovLyAqIE1hZ2llci1MZXZlbCBhYmZyYWdlbgppbnQgcXVlcnlfd2l6X2xldmVsKG1peGVkIHBsYXllcikgewogIHJldHVybiAoaW50KSIvc2VjdXJlL21hc3RlciItPnF1ZXJ5X3dpel9sZXZlbChwbGF5ZXIpOwp9CgojaWZkZWYgX19BTElTVFNfXwovLyAqIEVsZW1lbnQgYXVzIEFsaXN0IGxvZXNjaGVuIChieSBrZXkpCm1peGVkICpyZW1vdmVfYWxpc3QobWl4ZWQga2V5LG1peGVkICphbGlzdCkKewogIGludCBpLGo7CgogIGlmICghcG9pbnRlcnAoYWxpc3QpIHx8ICFzaXplb2YoYWxpc3QpKQogICAgcmV0dXJuIGFsaXN0OwogIGlmICghcG9pbnRlcnAoYWxpc3RbMF0pKQogIHsKICAgIGlmICgoaT1hc3NvYyhrZXksYWxpc3QpKTwwKQogICAgICByZXR1cm4gYWxpc3Q7CiAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CiAgfQogIGkgPSBhc3NvYyhrZXksYWxpc3RbMF0pOwogIGlmICgoaT1hc3NvYyhrZXksYWxpc3RbMF0pKTwwKQogICAgcmV0dXJuIGFsaXN0OwogIGFsaXN0PWFsaXN0WzAuLl07CiAgZm9yIChqPXNpemVvZihhbGlzdCktMTtqPj0wO2otLSkKICAgIGFsaXN0W2pdPWFsaXN0W2pdWzAuLmktMV0rYWxpc3Rbal1baSsxLi5dOwogIHJldHVybiBhbGlzdDsKfQoKLy8gKiBFbGVtZW50IGF1cyBBbGlzdCBsb2VzY2hlbiAoYnkgcG9zKQptaXhlZCAqZXhjbHVkZV9hbGlzdChpbnQgaSxtaXhlZCAqYWxpc3QpCnsKICBpbnQgajsKICBpZiAoIXBvaW50ZXJwKGFsaXN0KSB8fCAhc2l6ZW9mKGFsaXN0KSB8fCBpPDApCiAgICByZXR1cm4gYWxpc3Q7CiAgaWYgKCFwb2ludGVycChhbGlzdFswXSkpCiAgICByZXR1cm4gYWxpc3RbMC4uaS0xXSthbGlzdFtpKzEuLl07CiAgYWxpc3Q9YWxpc3RbMC4uXTsgLyogQ3JlYXRlIFBIWVNJQ0FMIGNvcHkgb2YgYWxpc3QgKi8KICBmb3IgKGo9c2l6ZW9mKGFsaXN0KS0xO2o+PTA7ai0tKQogICAgYWxpc3Rbal09YWxpc3Rbal1bMC4uaS0xXSthbGlzdFtqXVtpKzEuLl07CiAgcmV0dXJuIGFsaXN0OyAvKiBvcmRlcl9hbGlzdCBpcyBOT1QgbmVjZXNzYXJ5IC0gc2VlIC9kb2MvTFBDL2FsaXN0ICovCn0KI2VuZGlmIC8vIF9fQUxJU1RTX18KCi8vICogR2VybWFuIHZlcnNpb24gb2YgY3RpbWUoKQojZGVmaW5lIFRBR0UgKHsiU29uIiwiTW9uIiwiRGllIiwiTWl0IiwiRG9uIiwiRnJlIiwiU2FtIn0pCiNkZWZpbmUgTU9OQVRFICh7IkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1haSIsIkp1biIsIkp1bCIsIkF1ZyIsXAogICAgICAgICAgICAgICAgICJTZXAiLCJPa3QiLCJOb3YiLCJEZXoifSkKc3RyaW5nIGR0aW1lKGludCB3YW5uKSB7CiAgCiAgaWYgKHdhbm4gPT0gZHRpbWVfY2FjaGVbMF0pCiAgICByZXR1cm4oZHRpbWVfY2FjaGVbMV0pOwoKICBpbnQgKmx0ID0gbG9jYWx0aW1lKHdhbm4pOwogIHJldHVybiBzcHJpbnRmKCIlcywgJTJkLiAlcyAlZCwgJTAyZDolMDJkOiUwMmQiLAogICAgICBUQUdFW2x0W1RNX1dEQVldXSwgbHRbVE1fTURBWV0sIE1PTkFURVtsdFtUTV9NT05dXSwgCiAgICAgIGx0W1RNX1lFQVJdLGx0W1RNX0hPVVJdLCBsdFtUTV9NSU5dLCBsdFtUTV9TRUNdKTsKfQoKLy8gd2VubiBzdHJmdGltZSBpbSBEcml2ZXIgbmljaHQgZXhpc3RpZXJ0LCBpc3QgZGllcyBoaWVyIGVpbiBBbGlhcyBhdWYgZHRpbWUoKSwKLy8gendhciBzdGltbXQgZGFzIEZvcm1hdCBkYW5uIG5pY2h0LCBhYmVyIGRpZSBNdWRsaWIgYnVnZ3QgbmljaHQgdW5kIHNjaHJlaWJ0Ci8vIGVpbiBvcmRlbnRsaWNoZXMgRGF0dW0vVWhyemVpdC4KI2lmICFfX0VGVU5fREVGSU5FRF9fKHN0cmZ0aW1lKQp2YXJhcmdzIHN0cmluZyBzdHJmdGltZShtaXhlZCBmbXQsIGludCBjbG9jaywgaW50IGxvY2FsaXplZCkgewogIGlmIChpbnRwKGNsb2NrKSAmJiBjbG9jayA+PSAwKQogICAgcmV0dXJuIGR0aW1lKGNsb2NrKTsKICBlbHNlIGlmIChpbnRwKGZtdCkgJiYgZm10ID49IDApCiAgICByZXR1cm4gZHRpbWUoZm10KTsKICAKICByZXR1cm4gZHRpbWUodGltZSgpKTsKfQojZW5kaWYgLy8hX19FRlVOX0RFRklORURfXyhzdHJmdGltZSkKCi8vICogU2h1dGRvd24gbWl0IHp1c2FldHpsaWNoZW0gbG9nZ2luZwpub21hc2sgaW50IHNodXRkb3duKHN0cmluZyByZWFzb24pCnsKICBzdHJpbmcgbmFtZTsKICBzdHJpbmcgb2JuYW1lOwogIHN0cmluZyBvdXRwdXQ7CgogIGlmICghcmVhc29uKQogICAgcmV0dXJuIDA7CiAgaWYgKCAhQVJDSF9TRUNVUklUWSAmJiBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpIT1ST09USUQgJiYKICAgICAgICAgIG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSE9Ii9vYmovc2h1dCIgKQogIHsKICAgIHdyaXRlKCJZb3UgaGF2ZSBubyBwZXJtaXNzaW9uIHRvIHNodXQgZG93biB0aGUgZ2FtZWRyaXZlciFcbiIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmICgodGhpc19pbnRlcmFjdGl2ZSgpKSYmKG5hbWU9Z2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKQogIHsKICAgIG5hbWU9Y2FwaXRhbGl6ZShuYW1lKTsKICAgIGZpbHRlcih1c2VycygpLCMndGVsbF9vYmplY3QsLy8nCiAgICAgICAgICAgICAgIGNhcGl0YWxpemUobmFtZSkrIiBmYWVocnQgZGFzIFNwaWVsIGhlcnVudGVyIVxuIik7CiAgfQogIGVsc2UKICAgIG5hbWU9IkFOT05ZTU9VUyI7CiAgaWYgKHByZXZpb3VzX29iamVjdCgpKSBvYm5hbWU9Y2FwaXRhbGl6ZShnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKTsKICBvdXRwdXQ9bmFtZTsKICBpZiAob2JuYW1lICYmIG5hbWUhPW9ibmFtZSkgb3V0cHV0PW91dHB1dCsiICgiK29ibmFtZSsiKSI7CiAgaWYgKHByZXZpb3VzX29iamVjdCgpJiZvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk9PSIvb2JqL3NodXQiKXsKICAgIG91dHB1dCs9IiBmYWVocnQgZGFzIFNwaWVsIHZpYSBBcm1hZ2VkZG9uIGhlcnVudGVyLlxuIjsKICAgIG91dHB1dD1kdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0OwogICAgbG9nX2ZpbGUoIkdBTUVfTE9HIixvdXRwdXQrIlxuIiwtMSk7CiAgICBlZnVuOjpzaHV0ZG93bigpOwogICAgcmV0dXJuIDE7CiAgfQogIG91dHB1dD1jdGltZSh0aW1lKCkpKyI6ICIrb3V0cHV0KyIgZmFlaHJ0IGRhcyBTcGllbCBoZXJ1bnRlci5cbiI7CiAgb3V0cHV0Kz0iICAgIEdydW5kOiAiK3JlYXNvbjsKICBsb2dfZmlsZSgiR0FNRV9MT0ciLG91dHB1dCsiXG4iLC0xKTsKICBlZnVuOjpzaHV0ZG93bigpOwogIHJldHVybiAxOwp9CgovLyAqIGxvd2VyY2hhcgoKaW50IGxvd2VyY2hhcihpbnQgY2hhcikgewogIGlmIChjaGFyPCdBJyB8fCBjaGFyPidaJykgcmV0dXJuIGNoYXI7CiAgcmV0dXJuIGNoYXIrMzI7Cn0KCi8vICogdXBwZXJzdHJpbmcKCnN0cmluZyB1cHBlcnN0cmluZyhzdHJpbmcgcykKewojaWYgX19FRlVOX0RFRklORURfXyh1cHBlcl9jYXNlKQogIHJldHVybih1cHBlcl9jYXNlKHMpKTsKI2Vsc2UKICBpbnQgaTsKICBpZiAoIXN0cmluZ3AocykpIHJldHVybiAwOwogIGZvciAoaT1zaXplb2YocyktMTtpPj0wO2ktLSkgc1tpXT0oKHNbaV08J2EnfHxzW2ldPid6Jyk/c1tpXTpzW2ldLTMyKTsKICByZXR1cm4gczsKI2VuZGlmCn0KCi8vICogbG93ZXJzdHJpbmcKCnN0cmluZyBsb3dlcnN0cmluZyhzdHJpbmcgcykKewogIGlmICghc3RyaW5ncChzKSkgcmV0dXJuIDA7CiAgcmV0dXJuIGxvd2VyX2Nhc2Uocyk7Cn0KCgovLyAqIEdEIHZlcnNpb24Kc3RyaW5nIHZlcnNpb24oKQp7CiAgcmV0dXJuIF9fVkVSU0lPTl9fOwp9CgovLyAqIGJyZWFrX3N0cmluZwovLyBzdHJldGNoKCkgLS0gc3RyZXRjaCBhIGxpbmUgdG8gZmlsbCBhIGdpdmVuIHdpZHRoIApwcml2YXRlIHN0cmluZyBzdHJldGNoKHN0cmluZyBzLCBpbnQgd2lkdGgpIHsKICBpbnQgbGVuPXNpemVvZihzKTsKICBpZiAobGVuPT13aWR0aCkgcmV0dXJuIHM7CgogIC8vIHJlaW5lIExlZXJ6ZWlsZW4sIGRpcmVrdCB6dXJ1ZWNrZ2ViZW4KICBzdHJpbmcgdHJpbW1lZD10cmltKHMsVFJJTV9MRUZULCIgIik7CiAgaWYgKHRyaW1tZWQ9PSIiKSByZXR1cm4gczsgCiAgaW50IHN0YXJ0X3NwYWNlcyA9IGxlbiAtIHNpemVvZih0cmltbWVkKTsKCiAgc3RyaW5nKiB3b3JkcyA9IGV4cGxvZGUodHJpbW1lZCwgIiAiKTsKICAvLyBkZXIgbGV0enRlIGtyaWVndCBrZWluZSBTcGFjZXMKICBpbnQgd29yZF9jb3VudD1zaXplb2Yod29yZHMpIC0gMTsKICAvLyB3ZW5uIFplaWxlIG51ciBhdXMgZWluZW0gV29ydCwgd2lyZCBkYXMgV29ydCB6dXJ1ZWNrZ2VnZWJlbgogIGlmICghd29yZF9jb3VudCkKICAgIHJldHVybiAiICIqc3RhcnRfc3BhY2VzICsgd29yZHNbMF07CgogIGludCBzcGFjZV9jb3VudCA9IHdpZHRoIC0gbGVuOwoKICBpbnQgc3BhY2VfcGVyX3dvcmQ9KHdvcmRfY291bnQrc3BhY2VfY291bnQpIC8gd29yZF9jb3VudDsKICAvLyBBbnouV29lcnRlciBtaXQgWnVzYXR6LVNwYWNlCiAgaW50IHJlc3Q9KHdvcmRfY291bnQrc3BhY2VfY291bnQpICUgd29yZF9jb3VudDsgCiAgLy8gUmVzdC1TcGFjZXMgVmVydGVpbGVuCiAgZm9yZWFjaCAoaW50IHBvcyA6IHJlc3QpIHdvcmRzW3Bvc10rPSIgIjsKICByZXR1cm4gKCIgIipzdGFydF9zcGFjZXMpICsgaW1wbG9kZSggd29yZHMsICIgIipzcGFjZV9wZXJfd29yZCApOwp9CgovLyBhdXMgR2VzY2h3aW5kaWdrZWl0c2dydWVuZGVuIGhhdCBkZXIgQmxvY2tzYXR6IGZ1ZXIgYnJlYWtfc3RyaW5nIGVpbmUKLy8gZWlnZW5lIEZ1bmt0aW9uIGJla29tbWVuOgpwcml2YXRlIHZhcmFyZ3Mgc3RyaW5nIGJsb2NrX3N0cmluZyhzdHJpbmcgcywgaW50IHdpZHRoLCBpbnQgZmxhZ3MpIHsKICAvLyB3ZW5uIEJTX0xFQVZFX01ZX0xGUywgYWJlciBrZWluIEJTX05PX1BBUklOREVOVCwgZGFubiB3ZXJkZW4gWmVpbGVuIG1pdAogIC8vIGVpbmVtIExlZXJ6ZWljaGVuIGJlZ29ubmVuLgogIC8vIEJUVzogV2VubiAhQlNfTEVBVkVfTVlfTEZTLCBoYXQgZGVyIEF1ZnJ1ZmVyIGJlcmVpdHMgYWxsZSBcbiBkdXJjaCAiICIKICAvLyBlcnNldHp0LgogIGlmICggKGZsYWdzICYgQlNfTEVBVkVfTVlfTEZTKQogICAgICAmJiAhKGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSkKICB7CiAgICAgIHMgPSAiICIrcmVncmVwbGFjZShzLCJcbiIsIlxuICIsMSk7CiAgfQoKICAvLyBzcHJpbnRmIGZ1ZWxsdCBkaWUgbGV0enRlIFplaWxlIGF1ZiBkaWUgRmVsZGJyZWl0ZSAoaGllciBhbHNvCiAgLy8gWmVpbGVuYnJlaXRlKSBtaXQgRnVlbGx6ZWljaGVuIGF1Ziwgd2VubiBzaWUgTklDSFQgbWl0IFxuIHVtZ2Vicm9jaGVuCiAgLy8gaXN0LiBFcyB3aXJkIGFuIGRpZSBsZXR6dGUgWmVpbGUgYWJlciBrZWluIFplaWxlbnVtYnJ1Y2ggYW5nZWhhZW5ndC4KICAvLyBFaWdlbnRsaWNoIGlzdCBkYXMgQXVmZnVlbGxlbiBkb29mLCBhYmVyIHZlcm11dGxpY2ggaXN0IGVzIHVubm9ldGlnLCBlcwogIC8vIHdpZWRlciBydWVja2dhZW5naWcgenUgbWFjaGVuLgogIHMgPSBzcHJpbnRmKCAiJS0qPXMiLCB3aWR0aCwgcyk7CgogIHN0cmluZyAqdG1wPWV4cGxvZGUocywgIlxuIik7CiAgLy8gTnVyIHdlbm4gcyBtZWhyemVpbGlnIGlzdCwgQmxvY2tzYXR6IGRyYXVzIG1hY2hlbi4gRGllIGxldHp0ZSBaZWlsZSB3aXJkCiAgLy8gbmF0dWVybGljaCBuaWNodCBnZWRlaG50LiBTaWUgaXN0IGRhZnVlciBzY2hvbiB2b24gc3ByaW50ZigpIGF1ZmdlZnVlbGx0CiAgLy8gd29yZGVuLiBCVFc6IERpZSBsZXR6dGUgWmVpbGUgZW5kZXQgdS5VLiBub2NoIG5pY2h0IG1pdCBlaW5lbSBcbiAoYnp3LgogIC8vIG51ciBkYW5uLCB3ZW5uIEJTX0xFQVZFX01ZX0xGUyB1bmQgZGVyIHVlYmVyZ2ViZW5lIFRleHQgc2Nob24gbmVuIFxuIGFtCiAgLy8gRW5kZSBkZXIgbGV0enRlbiBaZWlsZSBoYXQpLCBkYXMgbWFjaHQgZGVyIEF1ZnJ1ZmVyLi4uCiAgaWYgKHNpemVvZih0bXApID4gMSkKICAgIHJldHVybiBpbXBsb2RlKCBtYXAoIHRtcFswLi48Ml0sICMnc3RyZXRjaC8qJyovLCB3aWR0aCApLCAiXG4iICkgCiAgICAgICsgIlxuIiArIHRtcFs8MV07CgogIHJldHVybiBzOwp9CgpwdWJsaWMgdmFyYXJncyBzdHJpbmcgYnJlYWtfc3RyaW5nKHN0cmluZyBzLCBpbnQgdywgbWl4ZWQgaW5kZW50LCBpbnQgZmxhZ3MpCnsKICAgIGlmICggIXMgfHwgcyA9PSAiIiApIHJldHVybiAiIjsKCiAgICBpZiAoICF3ICkgdz03ODsKCiAgICBpZiggaW50cChpbmRlbnQpICkKICAgICAgIGluZGVudCA9IGluZGVudCA/ICIgIippbmRlbnQgOiAiIjsKCiAgICBpbnQgaW5kZW50bGVuPXN0cmluZ3AoaW5kZW50KSA/IHNpemVvZihpbmRlbnQpIDogMDsKCiAgICBpZiAoaW5kZW50bGVuPncpIHsKICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiYnJlYWtfc3RyaW5nOiBpbmRlbnQgbG9uZ2VyICVkIHRoYW4gd2lkdGggJWRcbiIsCiAgICAgICAgICAgICAgICAgIGluZGVudGxlbix3KSk7CiAgICAgIC8vIHc9KChpbmRlbnRsZW4vdykrMSkqdzsKICAgIH0KCiAgICBpZiAoIShmbGFncyAmIEJTX0xFQVZFX01ZX0xGUykpIAogICAgICBzPXJlZ3JlcGxhY2UoIHMsICJcbiIsICIgIiwgMSApOwoKICAgIGlmICggZmxhZ3MgJiBCU19TSU5HTEVfU1BBQ0UgKQogICAgICAgcyA9IHJlZ3JlcGxhY2UoIHMsICIoXnxcbnwgKSAgKiIsICJcXDEiLCAxICk7CiAKICAgIHN0cmluZyBwcmVmaXg9IiI7CiAgICBpZiAoaW5kZW50bGVuICYmIGZsYWdzICYgQlNfUFJFUEVORF9JTkRFTlQpIHsKICAgICAgaWYgKGluZGVudGxlbitzaXplb2YocykgPiB3IHx8IAogICAgICAgICAoZmxhZ3MgJiBCU19MRUFWRV9NWV9MRlMpICYmIHN0cnN0cihzLCJcbiIpPi0xKSB7CiAgICAgICBwcmVmaXg9aW5kZW50KyJcbiI7CiAgICAgICBpbmRlbnQ9KGZsYWdzICYgQlNfTk9fUEFSSU5ERU5UKSA/ICIiIDogIiAiOwogICAgICAgaW5kZW50bGVuPXNpemVvZihpbmRlbnQpOwogICAgICB9CiAgICB9CgogICAgaWYgKCBmbGFncyAmIEJTX0JMT0NLICkgewogICAgICAvKgogICAgICAgICAgIHMgPSBpbXBsb2RlKCBtYXAoIGV4cGxvZGUoIHMsICJcbiIgKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMnYmxvY2tfc3RyaW5nLCB3LCBpbmRlbnRsZW4sIGZsYWdzKSwKICAgICAgICAgICAgICAgICAgICAgICIiICk7CiAgICAgICovCiAgICAgIHMgPSBibG9ja19zdHJpbmcoIHMgLCB3IC0gaW5kZW50bGVuLCBmbGFncyApOwogICAgfQogICAgZWxzZSB7CiAgICAgIHMgPSBzcHJpbnRmKCIlLTEuKj1zIix3LWluZGVudGxlbixzKTsKICAgIH0KICAgIGlmICggc1s8MV0gIT0gJ1xuJyApIHMgKz0gIlxuIjsKCiAgICBpZiAoICFpbmRlbnRsZW4gKSByZXR1cm4gcHJlZml4ICsgczsKICAgIAogICAgc3RyaW5nIGluZGVudDIgPSAoIGZsYWdzICYgQlNfSU5ERU5UX09OQ0UgKSA/ICgiICIqaW5kZW50bGVuKSA6aW5kZW50OwogICAgICAKICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyAKICAgICAgcmVncmVwbGFjZSggc1swLi48Ml0sICJcbiIsICJcbiIraW5kZW50MiwgMSApICsgIlxuIjsKICAgICAgLyoKICAgICAgIHN0cmluZyAqYnVmOwoKICAgICAgIGJ1ZiA9IGV4cGxvZGUoIHMsICJcbiIgKTsKICAgICAgIHJldHVybiBwcmVmaXggKyBpbmRlbnQgKyBpbXBsb2RlKCBidWZbMC4uPDJdLCAiXG4iK2luZGVudDIgKSArIGJ1Zls8MV0gKyAiXG4iOwogICAgICAqLwp9CgovLyAqIEVsZW1lbnRlIGF1cyBtYXBwaW5nIGxvZXNjaGVuIC0gbWFwcGluZyB2b3JoZXIga29waWVyZW4KCm1hcHBpbmcgbV9jb3B5X2RlbGV0ZShtYXBwaW5nIG0sIG1peGVkIGtleSkgewogIHJldHVybiBtX2RlbGV0ZShjb3B5KG0pLCBrZXkpOwp9CgovLyAqIHRpbWVzCmludCBsYXN0X3JlYm9vdF90aW1lKCkKewogIHJldHVybiBfX0JPT1RfVElNRV9fOwp9CgppbnQgZmlyc3RfYm9vdF90aW1lKCkKewogIHJldHVybiA3MDE1MTc2MDA7Cn0KCmludCBleGlzdF9kYXlzKCkKewogIHJldHVybiAoKCh0aW1lKCktZmlyc3RfYm9vdF90aW1lKCkpLzg2NDApKzUpLzEwOwp9CgovLyAqIHVwdGltZSA6KQpzdHJpbmcgdXB0aW1lKCkKewogIGludCB0OwogIGludCB0bXA7CiAgc3RyaW5nIHM7CgogIHQ9dGltZSgpLV9fQk9PVF9USU1FX187CiAgcz0iIjsKICBpZiAodD49ODY0MDApCiAgICBzKz1zcHJpbnRmKCIlZCBUYWclcywgIix0bXA9dC84NjQwMCwodG1wPT0xPyIiOiJlIikpOwogIGlmICh0Pj0zNjAwKQogICAgcys9c3ByaW50ZigiJWQgU3R1bmRlJXMsICIsdG1wPSh0PXQlODY0MDApLzM2MDAsKHRtcD09MT8iIjoibiIpKTsKICBpZiAodD42MCkKICAgIHMrPXNwcmludGYoIiVkIE1pbnV0ZSVzIHVuZCAiLHRtcD0odD10JTM2MDApLzYwLCh0bXA9PTE/IiI6Im4iKSk7CiAgcmV0dXJuIHMrc3ByaW50ZigiJWQgU2VrdW5kZSVzIix0PXQlNjAsKHQ9PTE/IiI6Im4iKSk7Cn0KCi8vICogV2FzIHR1biBiZWkgJ2RhbmdsaW5nJyBsZnVuLWNsb3N1cmVzID8Kdm9pZCBkYW5nbGluZ19sZnVuX2Nsb3N1cmUoKSB7CiAgcmFpc2VfZXJyb3IoImRhbmdsaW5nIGxmdW4gY2xvc3VyZVxuIik7Cn0KCi8vICogU3BlcnJlbiBhdXNzZXIgZnVlciBtYXN0ZXIvc2ltdWxfZWZ1bgoKI2lmIF9fRUZVTl9ERUZJTkVEX18oc2V0X2Vudmlyb25tZW50KQpub21hc2sgdm9pZCBzZXRfZW52aXJvbm1lbnQob2JqZWN0IG8xLCBvYmplY3QgbzIpIHsKICByYWlzZV9lcnJvcigiQXZhaWxhYmxlIG9ubHkgZm9yIHJvb3RcbiIpOwp9CiNlbmRpZgoKbm9tYXNrIHZvaWQgc2V0X3RoaXNfcGxheWVyKG9iamVjdCBwbCkgewogIHJhaXNlX2Vycm9yKCJBdmFpbGFibGUgb25seSBmb3Igcm9vdFxuIik7Cn0KCiNpZiBfX0VGVU5fREVGSU5FRF9fKGV4cG9ydF91aWQpCm5vbWFzayB2b2lkIGV4cG9ydF91aWQob2JqZWN0IG9iKSB7CiAgcmFpc2VfZXJyb3IoIkF2YWlsYWJsZSBvbmx5IGZvciByb290XG4iKTsKfQojZW5kaWYKCi8vICogSmV0enQgYXVjaCBjbG9zdXJlcwppbnQgcHJvY2Vzc19mbGFnOwoKcHVibGljIG5vbWFzayBpbnQgcHJvY2Vzc19jYWxsKCkKewogIGlmIChwcm9jZXNzX2ZsYWc+MCkKICAgIHJldHVybiBwcm9jZXNzX2ZsYWc7CiAgZWxzZSByZXR1cm4oMCk7Cn0KCnByaXZhdGUgbm9tYXNrIHN0cmluZyBfcHJvY2Vzc19zdHJpbmcoc3RyaW5nIHN0cixvYmplY3QgcG8pIHsKICAgICAgICAgICAgICBzZXRfdGhpc19vYmplY3QocG8pOwogICAgICAgICAgICAgIHJldHVybihlZnVuOjpwcm9jZXNzX3N0cmluZyhzdHIpKTsKfQoKbm9tYXNrIHN0cmluZyBwcm9jZXNzX3N0cmluZyggbWl4ZWQgc3RyICkKewogIHN0cmluZyB0bXAsIGVycjsKICBpbnQgZmxhZzsgCgogIGlmICggY2xvc3VyZXAoc3RyKSApIHsKICAgICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOwogICAgICByZXR1cm4gZnVuY2FsbChzdHIpOwogIH0KICBlbHNlIGlmIChzdHI9PTApCiAgICAgIHJldHVybigoc3RyaW5nKXN0cik7CiAgZWxzZSBpZiAoICFzdHJpbmdwKHN0cikgKSB7CiAgICAgIHJldHVybiB0b19zdHJpbmcoc3RyKTsKICB9CgogIGlmICggIShmbGFnID0gcHJvY2Vzc19mbGFnID4gdGltZSgpIC0gNjApKSAgICAgICAgICAgICAgICAgICAgIAogICAgICBwcm9jZXNzX2ZsYWc9dGltZSgpOwoKICBlcnIgPSBjYXRjaCh0bXAgPSBmdW5jYWxsKCMnX3Byb2Nlc3Nfc3RyaW5nLHN0cixwcmV2aW91c19vYmplY3QoKSk7IHB1Ymxpc2gpOwoKICBpZiAoICFmbGFnICkKICAgIHByb2Nlc3NfZmxhZz0wOwoKICBpZiAoZXJyKSB7CiAgICAvLyBWZXJhcmJlaXR1bmcgYWJicmVjaGVuCiAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgcmFpc2VfZXJyb3IoZXJyKTsKICB9CiAgcmV0dXJuIHRtcDsKfQoKLy8gJ21rZGlyIC1wJyAtIGVyemV1Z3QgZWluZSBrb21wbGV0dGUgSGllcmFyY2hpZSB2b24gVmVyemVpY2huaXNzZW4uCi8vIHdlbm4gZGFzIFZlcnplaWNobmlzIGFuZ2VsZWd0IHd1cmRlIG9kZXIgc2Nob24gZXhpc3RpZXJ0LCB3aXJkIDEKLy8genVydWVja2dlbGllZmVydCwgc29uc3QgMC4KLy8gV2lyZnQgZWluZW4gRmVobGVyLCB3ZW5uIGRhcyBhbmdlYmVuZSBWZXJ6ZWljaG5pcyBuaWNodCBhYnNvbHV0IGlzdCEKcHVibGljIGludCBta2RpcnAoc3RyaW5nIGRpcikgewogIC8vIHdlbm4gZXMgbnVyIGtlaW5lbiBmdWVocmVuZGVuIC8gZ2lidCwgaXN0IGRhcyBlaW4gRmVobGVyLgogIGlmIChzdHJzdHIoZGlyLCAiLyIpICE9IDApCiAgICByYWlzZV9lcnJvcigibWtkaXJwKCk6IFBmYWQgaXN0IG5pY2h0IGFic29sdXRlLlxuIik7CiAgLy8gY3V0IG9mZiB0cmFpbGluZyAvLi4uCiAgaWYgKGRpcls8MV09PScvJykKICAgICAgZGlyID0gZGlyWzAuLjwyXTsKCiAgaW50IGZzdGF0ID0gZmlsZV9zaXplKGRpcik7CiAgLy8gd2VubiBlcyBzY2hvbiBleGlzdGllcnQsIHR1biB3aXIgZWluZmFjaCBzbywgYWxzIGhhZXR0ZW4gd2lyIGVzIGFuZ2VsZWd0LgogIGlmIChmc3RhdCA9PSBGU0laRV9ESVIpCiAgICByZXR1cm4gMTsKICAvLyB3ZW5uIHNjaG9uIG5lIERhdGVpIGV4aXN0aWVydCwgZ2VodCBlcyBuaWNodC4KICBpZiAoZnN0YXQgIT0gRlNJWkVfTk9GSUxFKQogICAgcmV0dXJuIDA7CiAgLy8gd2VubiBlcyBudXIgZWluZW4gLyBnaWJ0IChkZW4gZnVlaHJlbmRlbiksIGRhbm4gaXN0IGVzIGVpbgogIC8vIHRvcGxldmVsLXZlcnplaWNobmlzLCB3YXMgZGlyZWt0IGFuZ2VsZWd0IHdpcmQuCiAgaWYgKHN0cnJzdHIoZGlyLCIvIik9PTApIHsKICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKICB9CgogIC8vIG1rZGlyKCkgbmljaHQgZGlyZWt0IHJ1ZmVuLCBzb25kZXJuIHZvcmhlciBhbHMgY2xvc3VyZSBhbnMgYXVmcnVmZW5kZQogIC8vIE9iamVrdCBiaW5kZW4uIFNvbnN0IGxhZXVmdCBkaWUgUmVjaHRlcHJ1ZWZ1bmcgaW4gdmFsaWRfd3JpdGUoKSBpbSBNYXN0ZXIKICAvLyB1bnRlciBkZXIgQW5uYWhtZSwgZGFzcyBkaWUgc2ltdWxfZWZ1bi5jIG1pdCBpaHJlciByb290IGlkIHdhcyB3aWxsLgoKICAvLyBqZXR6dCByZWt1cnNpdiBkaWUgVmVyemVpY2huaXNoaWVyYXJjaGllIGFubGVnZW4uIFdlbm4gZGFzIGVyZm9sZ3JlaWNoCiAgLy8gaXN0LCBkYW5uIGtvZW5uZW4gd2lyIGpldHp0IG1pdCBta2RpciBkYXMgdGllZnN0ZSBWZXJ6ZWljaG5pcyBhbmxlZ2VuCiAgaWYgKG1rZGlycChkaXJbMC4uc3RycnN0cihkaXIsIi8iKS0xXSkgPT0gMSkKICAgIHJldHVybiBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6bWtkaXIsIHByZXZpb3VzX29iamVjdCgpKSwgZGlyKTsKfQoKCi8vICogUHJvcGVydGllcyBnZ2ZzLiBtaXRzcGVpY2hlcm4KbWl4ZWQgc2F2ZV9vYmplY3QobWl4ZWQgbmFtZSkKewogIG1hcHBpbmcgcHJvcGVydGllczsKICBtYXBwaW5nIHNhdmU7CiAgbWl4ZWQgaW5kZXgsIHJlczsKICBpbnQgaTsKCiAgLy8gbnVyIFN0cmluZ3MgdW5kIDAgenVsYXNzZW4KICBpZiAoKCFzdHJpbmdwKG5hbWUpIHx8ICFzaXplb2YobmFtZSkpICYmIAogICAgICAoIWludHAobmFtZSkgfHwgbmFtZSE9MCkpIHsKICAgICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKICAgICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigKICAgICAgICAgIk9ubHkgbm9uLWVtcHR5IHN0cmluZ3MgYW5kIDAgbWF5IGJlIHVzZWQgYXMgZmlsZW5hbWUgaW4gIgogICAgICAgICAic2VmdW46OnNhdmVfb2JqZWN0KCkhIEFyZ3VtZW50IHdhcyAlT1xuIixuYW1lKSk7CiAgfQoKICBzYXZlID0gbV9hbGxvY2F0ZSgwLCAyKTsKICBwcm9wZXJ0aWVzID0gKG1hcHBpbmcpcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcGVydGllcygpOwoKICBpZihtYXBwaW5ncChwcm9wZXJ0aWVzKSkKICB7CiAgICAvLyBkZWxldGUgYWxsIGVudHJpZXMgaW4gbWFwcGluZyBwcm9wZXJ0aWVzIHdpdGhvdXQgU0FWRSBmbGFnIQogICAgaW5kZXggPSBtX2luZGljZXMocHJvcGVydGllcyk7CiAgICBmb3IoaSA9IHNpemVvZihpbmRleCktMTsgaT49MDtpLS0pCiAgICB7CiAgICAgIGlmKHByb3BlcnRpZXNbaW5kZXhbaV0sIEZfTU9ERV0gJiBTQVZFKQogICAgICB7CiAgICAgICBzYXZlW2luZGV4W2ldXSA9IHByb3BlcnRpZXNbaW5kZXhbaV1dOwogICAgICAgc2F2ZVtpbmRleFtpXSwgRl9NT0RFXSA9CiAgICAgICBwcm9wZXJ0aWVzW2luZGV4W2ldLCBGX01PREVdICYKICAgICAgICAgICAgICAgICAgICAofihTRVRNTk9URk9VTkR8UVVFUllNTk9URk9VTkR8UVVFUllDQUNIRUR8U0VUQ0FDSEVEKSk7CiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSBzYXZlID0gKFtdKTsKCiAgLy8gc2F2ZSBvYmplY3QhCiAgcHJldmlvdXNfb2JqZWN0KCktPl9zZXRfc2F2ZV9kYXRhKHNhdmUpOwogIC8vIGZvcm1hdDogd2llIGRlZmluaWVydCBpbiBjb25maWcuaAogIGlmIChzdHJpbmdwKG5hbWUpKQogICAgcmVzID0gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OnNhdmVfb2JqZWN0LCBwcmV2aW91c19vYmplY3QoKSksIG5hbWUsCiAgICAgICBfX0xJQl9fU0FWRV9GT1JNQVRfVkVSU0lPTl9fKTsKICBlbHNlCiAgICByZXMgPSBmdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6c2F2ZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwKICAgICAgIF9fTElCX19TQVZFX0ZPUk1BVF9WRVJTSU9OX18pOwogIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKCiNpZmRlZiBJT1NUQVRTCiAgLy8gU3RhdHMuLi4KICBzdHJ1Y3QgaW9zdGF0X3Mgc3RhdCA9ICg8aW9zdGF0X3M+KTsKICBzdGF0LT5vbmFtZSA9IG9iamVjdF9uYW1lKHByZXZpb3VzX29iamVjdCgpKTsKICBzdGF0LT50aW1lID0gdGltZSgpOwogIC8vc3RhdC0+c2l6ZSA9IChpbnQpb2JqZWN0X2luZm8ocHJldmlvdXNfb2JqZWN0KCksT0lORk9fTUVNT1JZLAogIC8vICAgIE9JTV9UT1RBTF9EQVRBX1NJWkUpOwogIGlmIChzdHJpbmdwKG5hbWUpKQogICAgICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKICBlbHNlCiAgICAgIHN0YXQtPnNpemVvZihyZXMpOwogIC8vZGVidWdfbWVzc2FnZSgic2F2ZW86ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKICBzYXZlb19zdGF0WzFdW3NhdmVvX3N0YXRbMF1dID0gc3RhdDsKICBzYXZlb19zdGF0WzBdID0gKHNhdmVvX3N0YXRbMF0gKyAxKSAlIHNpemVvZihzYXZlb19zdGF0WzFdKTsKICAvL2RlYnVnX21lc3NhZ2UoInNhdmVvIDI6ICIrc2F2ZW9fc3RhdFswXSsiXG4iKTsKI2VuZGlmCgogIHJldHVybiByZXM7Cn0KCi8vICogQXVjaCBQcm9wZXJ0aWVzIGxhZGVuCmludCByZXN0b3JlX29iamVjdChzdHJpbmcgbmFtZSkKewogIGludCByZXN1bHQ7CiAgbWl4ZWQgaW5kZXg7CiAgbWl4ZWQgc2F2ZTsKICBtYXBwaW5nIHByb3BlcnRpZXM7CiAgaW50IGk7CiAgY2xvc3VyZSBjbDsKCiAgLy8gZ2V0IGFjdHVhbCBwcm9wZXJ0eSBzZXR0aW5ncyAoYnkgY3JlYXRlKCkpCiAgcHJvcGVydGllcyA9IChtYXBwaW5nKXByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3BlcnRpZXMoKTsKCi8vICBERUJVRyhzcHJpbnRmKCJSRVNUT1JFICVPXG4iLG5hbWUpKTsKICAvLyByZXN0b3JlIG9iamVjdAogIHJlc3VsdD1mdW5jYWxsKGJpbmRfbGFtYmRhKCMnZWZ1bjo6cmVzdG9yZV9vYmplY3QsIHByZXZpb3VzX29iamVjdCgpKSwgbmFtZSk7CiAgLy8nKSkKICAvL19nZXRfc2F2ZV9kYXRhIGxpZWZlcnQgdGF0c2FlY2hsaWNoIG1peGVkIHp1cnVlY2ssIHdlbm4gZGFzIGF1Y2ggaW1tZXIgZWluIAogIC8vbWFwcGluZyBzZWluIHNvbGx0ZS4KICBzYXZlID0gKG1peGVkKXByZXZpb3VzX29iamVjdCgpLT5fZ2V0X3NhdmVfZGF0YSgpOwogIGlmKG1hcHBpbmdwKHNhdmUpKQogIHsKICAgIGluZGV4ID0gbV9pbmRpY2VzKHNhdmUpOwogICAgZm9yKGkgPSBzaXplb2YoaW5kZXgpLTE7IGk+PTA7IGktLSkKICAgIHsKICAgICAgcHJvcGVydGllc1tpbmRleFtpXV0gPSBzYXZlW2luZGV4W2ldXTsKICAgICAgcHJvcGVydGllc1tpbmRleFtpXSwgRl9NT0RFXSA9IHNhdmVbaW5kZXhbaV0sIEZfTU9ERV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ+KFNFVENBQ0hFRHxRVUVSWUNBQ0hFRCk7CiAgICB9CiAgfQogIGVsc2UgcHJvcGVydGllcyA9IChbXSk7CgogIC8vIHJlc3RvcmUgcHJvcGVydGllcwogIGZ1bmNhbGwoCiAgICAgICAgICBiaW5kX2xhbWJkYSgKICAgICAgICAgICAgICAgICAgICAgdW5ib3VuZF9sYW1iZGEoKHsnYXJnfSksIC8vJ30pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoeyMnY2FsbF9vdGhlciwoeyMndGhpc19vYmplY3R9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZXRQcm9wZXJ0aWVzIiwnYXJnfSkpLC8vJykKICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLHByb3BlcnRpZXMpOwogIHByZXZpb3VzX29iamVjdCgpLT5fc2V0X3NhdmVfZGF0YSgwKTsKCiNpZmRlZiBJT1NUQVRTCiAgLy8gU3RhdHMuLi4KICAvL2RlYnVnX21lc3NhZ2UoInJlc3RvcmVvOiAiK3Jlc3RvcmVvX3N0YXRbMF0rIlxuIik7CiAgc3RydWN0IGlvc3RhdF9zIHN0YXQgPSAoPGlvc3RhdF9zPik7CiAgc3RhdC0+b25hbWUgPSBvYmplY3RfbmFtZShwcmV2aW91c19vYmplY3QoKSk7CiAgc3RhdC0+dGltZSA9IHRpbWUoKTsKICAvL3N0YXQtPnNpemUgPSAoaW50KW9iamVjdF9pbmZvKHByZXZpb3VzX29iamVjdCgpLE9JTkZPX01FTU9SWSwKICAvLyAgICBPSU1fVE9UQUxfREFUQV9TSVpFKTsKICBzdGF0LT5zaXplID0gZmlsZV9zaXplKG5hbWUgKyAiLm8iKTsKICByZXN0b3Jlb19zdGF0WzFdW3Jlc3RvcmVvX3N0YXRbMF1dID0gc3RhdDsKCiAgcmVzdG9yZW9fc3RhdFswXSA9IChyZXN0b3Jlb19zdGF0WzBdICsgMSkgJSBzaXplb2YocmVzdG9yZW9fc3RhdFsxXSk7CiNlbmRpZgoKICByZXR1cm4gcmVzdWx0Owp9CgovLyAqIEhCIGVpbmVzIE9iamVrdGVzIGVpbi9hdXNzY2hhbHRlbgppbnQgc2V0X29iamVjdF9oZWFydF9iZWF0KG9iamVjdCBvYiwgaW50IGZsYWcpCnsKICBpZiAob2JqZWN0cChvYikpCiAgICByZXR1cm4gZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46OmNvbmZpZ3VyZV9vYmplY3Qsb2IpLCBvYiwgT0NfSEVBUlRfQkVBVCwgZmxhZyk7Cn0KCi8vICogTWFnaWVybGV2ZWxncnVwcGVuIGVybWl0dGVsbgppbnQgcXVlcnlfd2l6X2dycChtaXhlZCB3aXopCnsKICBpbnQgbGV2OwoKICBsZXY9cXVlcnlfd2l6X2xldmVsKHdpeik7CiAgaWYgKGxldjxTRUVSX0xWTCkgcmV0dXJuIDA7CiAgaWYgKGxldj49R09EX0xWTCkgcmV0dXJuIGxldjsKICBpZiAobGV2Pj1BUkNIX0xWTCkgcmV0dXJuIEFSQ0hfR1JQOwogIGlmIChsZXY+PUVMREVSX0xWTCkgcmV0dXJuIEVMREVSX0dSUDsKICBpZiAobGV2Pj1MT1JEX0xWTCkgcmV0dXJuIExPUkRfR1JQOwogIGlmIChsZXY+PVNQRUNJQUxfTFZMKSByZXR1cm4gU1BFQ0lBTF9HUlA7CiAgaWYgKGxldj49RE9NQUlOTUVNQkVSX0xWTCkgcmV0dXJuIERPTUFJTk1FTUJFUl9HUlA7CiAgaWYgKGxldj49V0laQVJEX0xWTCkgcmV0dXJuIFdJWkFSRF9HUlA7CiAgaWYgKGxldj49TEVBUk5FUl9MVkwpIHJldHVybiBMRUFSTkVSX0dSUDsKICByZXR1cm4gU0VFUl9HUlA7Cn0KCm1peGVkICp3aXpsaXN0X2luZm8oKQp7CiAgaWYgKEFSQ0hfU0VDVVJJVFkgfHwgIWV4dGVybl9jYWxsKCkpCiAgICAgICAgICAgIHJldHVybiBlZnVuOjp3aXpsaXN0X2luZm8oKTsKICByZXR1cm4gMDsKfQoKLy8gKiB3aXpsaXN0IGF1c2dlYmVuCnZhcmFyZ3Mgdm9pZCB3aXpsaXN0KHN0cmluZyBuYW1lLCBpbnQgc29ydGtleSApIHsKCiAgaWYgKCFuYW1lKQogIHsKICAgIGlmICh0aGlzX3BsYXllcigpKQogICAgICBuYW1lID0gZ2V0dWlkKHRoaXNfcGxheWVyKCkpOwogICAgaWYgKCFuYW1lKQogICAgICByZXR1cm47CiAgfQoKICAvLyBTY2hsdWVzc2VsIGRhcmYgbnVyIGluIGVpbmVtIGd1ZWx0aWdlbiBCZXJlaWNoIHNlaW4KICBpZiAoc29ydGtleTxXTF9OQU1FIHx8IHNvcnRrZXk+PVdMX1NJWkUpIHNvcnRrZXk9V0xfQ09TVDsKCiAgbWl4ZWQqKiB3bCA9IGVmdW46Ondpemxpc3RfaW5mbygpOwogIC8vIG5hY2ggPHNvcnRrZXk+IHNvcnRpZXJlbgogIHdsID0gc29ydF9hcnJheSh3bCwgZnVuY3Rpb24gaW50IChtaXhlZCBhLCBtaXhlZCBiKQogICAgICB7cmV0dXJuIGFbc29ydGtleV0gPCBiW3NvcnRrZXldOyB9ICk7CgogIC8vIFN1bW1lIHVlYmVyIGFsbGUgS29tbWFuZG9zIGVybWl0dGVsbi4KICBpbnQgdG90YWxfY21kLCBpOwogIGludCBwb3M9LTE7CiAgZm9yZWFjaChtaXhlZCBlbnRyeSA6IHdsKQogIHsKICAgIHRvdGFsX2NtZCArPSBlbnRyeVtXTF9DT01NQU5EU107CiAgICBpZiAoZW50cnlbV0xfTkFNRV0gPT0gbmFtZSkKICAgICAgcG9zID0gaTsKICAgICsraTsKICB9CgogIGlmIChwb3MgPCAwICYmIG5hbWUgIT0gIkFMTCIgJiYgbmFtZSAhPSAiVE9QMTAwIikKICAgIHJldHVybjsKCiAgaWYgKG5hbWUgPT0gIlRPUDEwMCIpCiAgewogICAgaWYgKHNpemVvZih3bCkgPiAxMDApCiAgICAgIHdsID0gd2xbMC4uMTAwXTsKICAgIGVsc2UKICAgICAgd2wgPSB3bDsKICB9CiAgLy8gdW0gbmFtZSBoZXJ1bSBzY2huZWlkZW4KICBlbHNlIGlmIChuYW1lICE9ICJBTEwiKQogIHsKICAgIGlmIChzaXplb2Yod2wpIDw9IDIxKQogICAgICB3bCA9IHdsOwogICAgZWxzZSBpZiAocG9zICsgMTAgPCBzaXplb2Yod2wpICYmIHBvcyAtIDEwID4gMCkKICAgICAgd2wgPSB3bFtwb3MtMTAuLnBvcysxMF07CiAgICBlbHNlIGlmIChwb3MgPD0yMSkKICAgICAgd2wgPSB3bFswLi4yMF07CiAgICBlbHNlIGlmIChwb3MgPj0gc2l6ZW9mKHdsKSAtIDIxKQogICAgICB3bCA9IHdsWzwyMS4uXTsKICAgIGVsc2UKICAgICAgd2wgPSB3bDsKICB9CgogIHdyaXRlKCJcbldpemFyZCB0b3Agc2NvcmUgbGlzdFxuXG4iKTsKICBpZiAodG90YWxfY21kID09IDApCiAgICB0b3RhbF9jbWQgPSAxOwogIHByaW50ZigiJS0yMHMgJS02cyAlLTNzICUtMTdzICUtNnMgJS02cyAlLTZzXG4iLAogICAgICAgICAiRVVJRCIsICJjbWRzIiwgIiUiLCAiQ29zdHMiLCAiSEIiLCAiQXJyYXlzIiwiTWFwcC4iKTsKICBmb3JlYWNoKG1peGVkIGU6IHdsKQogIHsKICAgIHByaW50ZigiJS06MjBzICU6NmQgJToyZCUlIFslOjZkaywlOjZkR10gJTo2ZCAlOjZkICU6NmRcbiIsCiAgICAgICAgICBlW1dMX05BTUVdLCBlW1dMX0NPTU1BTkRTXSwgZVtXTF9DT01NQU5EU10gKiAxMDAgLyB0b3RhbF9jbWQsCiAgICAgICAgICBlW1dMX0NPU1RdIC8gMTAwMCwgZVtXTF9UT1RBTF9HSUdBQ09TVF0sCiAgICAgICAgICBlW1dMX0hFQVJUX0JFQVRTXSwgZVtXTF9BUlJBWV9UT1RBTF0sIGVbV0xfTUFQUElOR19UT1RBTF0KICAgICAgICAgICk7CiAgfQogIHByaW50ZigiXG5Ub3RhbCAgICAgICAgICU3ZCAgICAgICAgICglZClcblxuIiwgdG90YWxfY21kLCBzaXplb2Yod2wpKTsKfQoKCi8vIEFiIGhpZXIgZm9sZ2VuIEhpbGZzZnVua3Rpb25lbiBmdWVyIGNhbGxfb3V0KCkgYnp3LiBmdWVyIGRlcmVuIEJlZ3Jlbnp1bmcKCi8vIGVybWl0dGVsdCBkYXMgT2JqZWt0IGRlcyBDYWxsb3V0cy4KcHJpdmF0ZSBvYmplY3QgX2NhbGxfb3V0X29iaiggbWl4ZWQgY2FsbF9vdXQgKSB7CiAgICByZXR1cm4gcG9pbnRlcnAoY2FsbF9vdXQpID8gY2FsbF9vdXRbMF0gOiAwOwp9Cgpwcml2YXRlIHZvaWQgX3NhbWVfb2JqZWN0KCBvYmplY3Qgb2IsIG1hcHBpbmcgbSApIHsKICAvLyBpc3QgbmljaHQgc28gYmxvZWQsIHdpZSBlcyBhdXNzaWVodCwgcy4gbmFjaGZvbGdlZGUgVmVyd2VuZHVuZyB2b24gbQogIGlmICggbVtvYl0gKQogICAgbVtvYl0gKz0gKHsgb2IgfSk7CiAgZWxzZQogICAgbVtvYl0gPSAoeyBvYiB9KTsgCn0KCi8vIGFsbGUgT2JqZWt0ZSBpbSBNYXBwaW5nIG0genVzYW1tZW5mYXNzZW4sIGRpZSBkZW4gZ2xlaWNoZW4gTG9hZG5hbWUgKE5hbWUgZGVyCi8vIEJsdWVwcmludCkgaGFiZW4sIGFsc28gYWxsZSBDbG9uZXMgZGVyIEJQLCBkaWUgQ2FsbG91dHMgbGF1ZmVuIGhhYmVuLgovLyBPYmpla3RlIHdlcmRlbiBhdWNoIG1laHJmYWNoIGVyZmFzc3QsIGplIG5hY2ggQW56YWhsIGlocmVyIENhbGxvdXRzLgpwcml2YXRlIHZvaWQgX3NhbWVfcGF0aCggb2JqZWN0IGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSApIHsKICBzdHJpbmcgcGF0aDsKICBpZiAoIW9iamVjdHAoa2V5KSB8fCAhcG9pbnRlcnAob2JzKSkgcmV0dXJuOwoKICBwYXRoID0gbG9hZF9uYW1lKGtleSk7CgogIGlmICggbVtwYXRoXSApCiAgICBtW3BhdGhdICs9IG9iczsKICBlbHNlCiAgICBtW3BhdGhdID0gb2JzOwp9CgovLyBrZXkga2FubiBvYmplY3Qgb2RlciBzdHJpbmcgc2Vpbi4KcHJpdmF0ZSBpbnQgX3Rvb19tYW55KCBtaXhlZCBrZXksIG1hcHBpbmcgbSwgaW50IGkgKSB7CiAgICByZXR1cm4gc2l6ZW9mKG1ba2V5XSkgPj0gaTsKfQoKLy8gYWxsZSBPYmpla3RlIGluIG9icyB6ZXJzdG9lcmVuIHVuZCBGZWhsZXJtZWxkdW5nIGF1c2dlYmVuLiBBQ0hUVU5HOiBEaWUKLy8gT2JqZWt0ZSB3ZXJkZW4gaWRSIHp1IGVpbmVyIEJQIGdlaG9lcmVuLCBtdWVzc2VuIGFiZXIgbmljaHQhIEluIGRlbSBGYWxsCi8vIHdpcmQgYXVmIGRlciBFYmVuZSBhYmVyIG51ciBlaW4gT2JqZWt0IGluIGRlciBGZWhsZXJtZWxkdW5nIGVyd2FlaG50Lgpwcml2YXRlIHZvaWQgX2Rlc3Ryb3koIG1peGVkIGtleSwgb2JqZWN0ICpvYnMsIHN0cmluZyB0ZXh0LCBpbnQgdWlkICkgewogICAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm47CiAgICAvLyBBcnJheSBtaXQgdW5pcXVlIEVpbnRyYWVnZSBlcnpldWdlbi4KICAgIG9icyA9IG1faW5kaWNlcyggbWttYXBwaW5nKG9icykgKTsKICAgIC8vIEZlaGxlcm1lbGR1bmcgYXVmIGRlciBFYmVuZSBhdXNnZWJlbiwgaW0gY2F0Y2goKSBtaXQgcHVibGlzaCwgZGFtaXQgZXMKICAgIC8vIGF1ZiBkZXIgRWJlbmUgZGlyZWt0IHNjcm9sbHQsIGRlciBiYWNrdHJhY2UgdmVyZnVlZ2JhciBpc3QgKGltCiAgICAvLyBnZWdlbnNhdHogenVyIExvZXN1bmcgbWl0dGVscyBDYWxsb3V0KSwgZGllIEF1c2Z1ZWhydW5nIGFiZXIgd2VpdGVyCiAgICAvLyBsYWV1ZnQuCiAgICBjYXRjaCggZWZ1bjo6cmFpc2VfZXJyb3IoICAgICAgICAgICAKICAgICAgICAgc3ByaW50ZiggdGV4dCwgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgdWlkID8gKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGtleSkgOiBrZXksICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgIHNpemVvZihvYnMpLCBvYmplY3RfbmFtZShvYnNbPDFdKSApICk7cHVibGlzaCk7CiAgICAvLyBVbmQgd2VnIG1pdCBkZW0gS3JhbS4uLgogICAgZmlsdGVyKCBvYnMsICMnZWZ1bjo6ZGVzdHJ1Y3QvKicqLyApOwp9CgovLyBBbGxlIE9iamVrdCBlaW5lciBVSUQgaW0gTWFwcGluZyBtIG1pdCBVSUQgYWxzIEtFeXMgenVzYW1tZW5mYXNzZW4uIE9iamVrdAovLyBzaW5kIGRhYmVpIG5pY2h0IHVuaXF1ZS4KcHJpdmF0ZSB2b2lkIF9zYW1lX3VpZCggc3RyaW5nIGtleSwgb2JqZWN0ICpvYnMsIG1hcHBpbmcgbSwgY2xvc3VyZSBjZiApIHsKICBzdHJpbmcgdWlkOwoKICBpZiAoICFwb2ludGVycChvYnMpIHx8ICFzaXplb2Yob2JzKSApCiAgICByZXR1cm47CgogIHVpZCA9IGZ1bmNhbGwoIGNmLCBrZXkgKTsKCiAgaWYgKCBtW3VpZF0gKQogICAgbVt1aWRdICs9IG9iczsgLy8gb2JzIGlzdCBuZW4gQXJyYXkKICBlbHNlCiAgICBtW3VpZF0gPSBvYnM7Cn0KCnByaXZhdGUgaW50IF9sb2dfY2FsbF9vdXQobWl4ZWQgY28pCnsKICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAogICAgICBzcHJpbnRmKCIlczo6JU8gKCVkKVxuIixvYmplY3RfbmFtZShjb1swXSksY29bMV0sY29bMl0pLAogICAgICAyMDAwMDApOwogIHJldHVybiAwOwp9Cgpwcml2YXRlIGludCBsYXN0X2NhbGxvdXRfbG9nPTA7Cgpub21hc2sgdmFyYXJncyB2b2lkIGNhbGxfb3V0KCB2YXJhcmdzIG1peGVkICphcmdzICkKewogICAgbWl4ZWQgdG1wLCAqY2FsbF9vdXRzOwoKICAgIC8vIEJlaSA+NjAwIENhbGxvdXRzIGFsbGUgT2JqZWt0ZSBraWxsZW4sIGRpZSBtZWhyIGFscyAzMCBDYWxsb3V0cyBsYXVmZW4KICAgIC8vIGhhYmVuLgogICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gNjAwCiAgICAgICAgJiYgZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElEICkKICAgIHsKICAgICAgIC8vIExvZyBlcnpldWdlbi4uLgogICAgICAgaWYgKGxhc3RfY2FsbG91dF9sb2cgPAogICAgICAgICAgIGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9IRUFSVEJFQVRfVE9UQUxfQ1lDTEVTKSAtIDEwCiAgICAgICAgICAgJiYgZ2V0X2V2YWxfY29zdCgpID4gMjAwMDAwKQogICAgICAgewogICAgICAgICBsYXN0X2NhbGxvdXRfbG9nID0gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOwogICAgICAgICBsb2dfZmlsZSgiVE9PX01BTllfQ0FMTE9VVFMiLAogICAgICAgICAgICAgc3ByaW50ZigiXG4lczogIyMjIyMjIyMjIyMjIFRvbyBtYW55IGNhbGxvdXRzOiAlZCAjIyMjIyMjIyMjIyMjI1xuIiwKICAgICAgICAgICAgICAgICAgICAgc3RyZnRpbWUoIiV5JW0lZC0lSCVNJVMiKSwKICAgICAgICAgICAgICAgICAgICAgZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0NBTExPVVRTKSkpOwogICAgICAgICBmaWx0ZXIoZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19sb2dfY2FsbF9vdXQpOwogICAgICAgfQogICAgICAgLy8gT2JqZWt0ZSBhbGxlciBDYWxsb3V0cyBlcm1pdHRlbG4KICAgICAgIGNhbGxfb3V0cyA9IG1hcCggZWZ1bjo6Y2FsbF9vdXRfaW5mbygpLCAjJ19jYWxsX291dF9vYmogKTsKICAgICAgIG1hcHBpbmcgb2JqZWN0bWFwID0gKFtdKTsKICAgICAgIGZpbHRlciggY2FsbF9vdXRzLCAjJ19zYW1lX29iamVjdCwgJm9iamVjdG1hcCApOwogICAgICAgLy8gTWFzdGVyIG5pY2h0IGdyaWxsZW4uLi4KICAgICAgIGVmdW46Om1fZGVsZXRlKCBvYmplY3RtYXAsIG1hc3RlcigxKSApOwogICAgICAgLy8gYWxsZSBPYmpla3RlIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCiAgICAgICBtYXBwaW5nIHJlcyA9IGZpbHRlcl9pbmRpY2VzKCBvYmplY3RtYXAsICMnX3Rvb19tYW55LCBvYmplY3RtYXAsIDI5ICk7CiAgICAgICAvLyB1bmQgdWViZXIgYWxsZSBLZXlzIGdlaGVuLCBhbiBfZGVzdHJveSgpIHdlcmRlbiBLZXkgdW5kIEFycmF5IG1pdAogICAgICAgLy8gT2JqZWt0ZW4gdWViZXJnZWJlbiAoaW4gZGllc2VtIEZhbGwgc2luZCBLZXlzIHVuZCBBcnJheSBtaXQKICAgICAgIC8vIE9iamVrdGVuIGpld2VpbHMgZGFzIGdsZWljaGUgT2JqZWt0KS4KICAgICAgIGlmICggc2l6ZW9mKHJlcykgKSAgICAgICAKICAgICAgICAgICB3YWxrX21hcHBpbmcocmVzLCAjJ19kZXN0cm95LCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgc2luZ2xlICIgICAgICAgICAgICAgCiAgICAgICAgICAgICAgIm9iamVjdCBbJU9dLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKCiAgICAgICAvLyBCZWkgKGF1Y2ggbmFjaCBkZW0gZXJzdGVuIEF1ZnJhZXVtZW4gbm9jaCkgPjgwMCBDYWxsb3V0cyBhbGxlCiAgICAgICAvLyBPYmpla3RlIGtpbGxlbiwgZGllIG1laHIgYWxzIDUwIENhbGxvdXRzIGxhdWZlbiBoYWJlbiAtIHVuZAogICAgICAgLy8gZGllc21hbCB6YWVobGVuIENsb25lcyBuaWNodCBlaWdlbnN0YWVuZGlnISBELmguIGVzIHdlcmRlbiBhbGxlCiAgICAgICAvLyBDbG9uZXMgZWluZXIgQlAgZ2VraWxsdCwgZGllIENhbGxvdXRzIGxhdWZlbiBoYWJlbiwgZmFsbHMgYWxsZQogICAgICAgLy8gZGllc2UgT2JqZWt0ZSBfenVzYW1tZW5fIG1laHIgYWxzIDUwIENhbGxvdXRzIGhhYmVuIQogICAgICAgaWYgKCBlZnVuOjpkcml2ZXJfaW5mbyhESV9OVU1fQ0FMTE9VVFMpID4gODAwICkgewogICAgICAgICAgIC8vIHplcnN0b2VydGUgT2JqZWt0ZSB2b24gZGVyIGxldHp0ZW4gQWt0aW9uIHNpbmQgaW4gb2JqZWN0bWFwIG5pY2h0CiAgICAgICAgICAgLy8gbWVociBkcmluLCBkYSBzaWUgZG9ydCBhbHMgS2V5cyB2ZXJ3ZW5kZXQgd3VyZGVuLgogICAgICAgICAgIG1hcHBpbmcgcGF0aG1hcD0oW10pOwogICAgICAgICAgIC8vIGFsbGUgT2JqZWt0IGVpbmVyIEJQIGluIHJlcyBzb3J0aWVyZW4sIEJQLU5hbWUgYWxzIEtleSwgQXJyYXlzCiAgICAgICAgICAgLy8gdm9uIE9iamVrdGVuIGFscyBXZXJ0ZS4KICAgICAgICAgICB3YWxrX21hcHBpbmcoIG9iamVjdG1hcCwgIydfc2FtZV9wYXRoLCAmcGF0aG1hcCk7CiAgICAgICAgICAgLy8gYWxsZSBCUHMgKHVuZCBpaHJlIE9iamVrdGUpIHJhdXNzdWNoZW4sIGRpZSB6dXZpZWxlIGhhYmVuLi4uCiAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHBhdGhtYXAsICMnX3Rvb19tYW55LyonKi8sIHBhdGhtYXAsIDUwICk7CiAgICAgICAgICAgLy8gdW5kIHVlYmVyIGFsbGUgS2V5cyBnZWhlbiwgYW4gX2Rlc3Ryb3koKSB3ZXJkZW4gZGllIENsb25lcwogICAgICAgICAgIC8vIHVlYmVyZ2ViZW4sIGRpZSBDYWxsb3V0cyBoYWJlbi4KICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHJlcywgIydfZGVzdHJveS8qJyovLCAiQ0FMTF9PVVQgb3ZlcmZsb3cgYnkgZmlsZSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICInJXMnLiBEZXN0cnVjdGVkICVkIG9iamVjdHMuIFslc11cbiIsIDAgKTsKCiAgICAgICAgICAgLy8gV2VubiBiZWlkZSBBdWZyYWV1bWFyYmVpdGVuIG5pY2h0cyBnZWJyYWNodCBoYWJlbiB1bmQgaW1tZXIKICAgICAgICAgICAvLyBub2NoID4xMDAwIENhbGxvdXRzIGxhdWZlbiwgd2VyZGVuIGRpZXNtYWwgYWxsZSBDYWxsb3V0cwogICAgICAgICAgIC8vIGVpbmVyIFVJRCB6dXNhbW1lbmdlemFlaGx0LgogICAgICAgICAgIC8vIEFsbGUgT2JqZWt0ZSBlaW5lciBVSUQsIGRpZSBlcyBpbiBTdW1tZSBhbGxlciBpaHJlciBPYmpla3QgbWl0CiAgICAgICAgICAgLy8gQ2FsbG91dHMgYXVmIG1laHIgYWxzIDEwMCBDYWxsb3V0cyBicmluZ3QsIHdlcmRlbiBnZXJvZXN0ZXQuCiAgICAgICAgICAgaWYgKGVmdW46OmRyaXZlcl9pbmZvKERJX05VTV9DQUxMT1VUUykgPiAxMDAwKQogICAgICAgICAgIHsKICAgICAgICAgICAgICAvLyBkYXMgbmFjaCBCUC1OYW1lbiB2b3JnZWZpbHRlcnRlIE1hcHBpbmcgamV0enQgbmFjaCBVSURzCiAgICAgICAgICAgICAgLy8genVzYW1tZW5zb3J0aWVyZW4uIFplcnN0b2VydGUgQ2xvbmVzIGZpbHRlciBfc2FtZV91aWQoKQogICAgICAgICAgICAgIC8vIHJhdXMuCiAgICAgICAgICAgICAgbWFwcGluZyB1aWRtYXA9KFtdKTsKICAgICAgICAgICAgICB3YWxrX21hcHBpbmcoIHBhdGhtYXAsICMnX3NhbWVfdWlkLCAmdWlkbWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xfZnVuY3Rpb24oICJjcmVhdG9yX2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL3NlY3VyZS9tYXN0ZXIiICkgKTsKICAgICAgICAgICAgICAvLyBJbiByZXMgbnVuIFVJRHMgYWxzIEtleXMgdW5kIEFycmF5cyB2b24gT2JqZWt0ZW4gYWxzIFdlcnRlLgogICAgICAgICAgICAgIC8vIERpZSByYXVzZmlsdGVybiwgZGllIG1laHIgYWxzIDEwMCBPYmpla3RlIChub24tdW5pcXVlLCBkLmguCiAgICAgICAgICAgICAgLy8gMTAwIENhbGxvdXRzISkgaGFiZW4uCiAgICAgICAgICAgICAgcmVzID0gZmlsdGVyX2luZGljZXMoIHVpZG1hcCwgIydfdG9vX21hbnksIHVpZG1hcCwgMTAwICk7CiAgICAgICAgICAgICAgLy8gdW5kIGVybmV1dCB1ZWJlciBkaWUgS2V5cyBsYXVmZW4gdW5kIGpld2VpbHMgZGllIEFycmF5cyBtaXQKICAgICAgICAgICAgICAvLyBkZW4gT2JqZWt0ZW4genVyIFplcnN0b2VydW5nIGFuIF9kZXN0cm95KCkuLi4KICAgICAgICAgICAgICBpZiAoIHNpemVvZihyZXMpICkKICAgICAgICAgICAgICAgICAgd2Fsa19tYXBwaW5nKCByZXMsICMnX2Rlc3Ryb3ksICJDQUxMX09VVCBvdmVyZmxvdyBieSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVSUQgJyVzJy4gRGVzdHJ1Y3RlZCAlZCBvYmplY3RzLiBbJXNdXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICk7CiAgICAgICAgICAgfQogICAgICAgfQogICAgfQoKICAgIC8vIEZhbGxzIGRhcyBhdWZydWZlbmRlIE9iamVrdCB6ZXJzdG9lcnQgd3VyZGUgYmVpbSBBdWZyYWV1bWVuCiAgICBpZiAoICFwcmV2aW91c19vYmplY3QoKSApCiAgICAgICByZXR1cm47CgogICAgc2V0X3RoaXNfb2JqZWN0KCBwcmV2aW91c19vYmplY3QoKSApOwogICAgYXBwbHkoICMnZWZ1bjo6Y2FsbF9vdXQsIGFyZ3MgKTsKICAgIHJldHVybjsKfQoKbWl4ZWQgY2FsbF9vdXRfaW5mbygpIHsKICAKICBvYmplY3QgcG8gPSBwcmV2aW91c19vYmplY3QoKTsKICBtaXhlZCBjb2kgPSBlZnVuOjpjYWxsX291dF9pbmZvKCk7CgogIC8vIHVuZ2VmaWx0ZXJ0ZW4gT3V0cHV0IG51ciBmdWVyIGJlc3RpbW10ZSBPYmpla3RlLCBPYmpla3RlIGluIC9zdGQgb2RlcgogIC8vIC9vYmogaGFiZW4gZGllIEJhY2tib25lSUQuCiAgaWYgKHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQocG8pKSA+PSBBUkNIX0xWTAogICAgICAgfHwgKHN0cmluZyltYXN0ZXIoKS0+Y3JlYXRvcl9maWxlKGxvYWRfbmFtZShwbykpID09IEJBQ0tCT05FSUQgKSB7CiAgICAgIHJldHVybiBjb2k7CiAgfQogIGVsc2UgewogICAgICByZXR1cm4gZmlsdGVyKGNvaSwgZnVuY3Rpb24gbWl4ZWQgKG1peGVkIGFycikgewogICAgICAgICAgICAgIGlmIChwb2ludGVycChhcnIpICYmIGFyclswXT09cG8pCiAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgZWxzZSByZXR1cm4gMDsgfSk7CiAgfQp9CgovLyAqIFp1IGVpbmVyIGNsb3N1cmUgZGFzIE9iamVrdCwgYW4gZGFzIHNpZSBnZWJ1bmRlbiBpc3QsIHN1Y2hlbgovLyBOSUNIVCBkYXMgT2JqZWt0LCB3YXMgZ2dmLiBkaWUgbGZ1biBkZWZpbmllcnQhCm1peGVkIHF1ZXJ5X2Nsb3N1cmVfb2JqZWN0KGNsb3N1cmUgYykgewogIHJldHVybgogICAgQ0xPU1VSRV9JU19VTkJPVU5EX0xBTUJEQShnZXRfdHlwZV9pbmZvKGMsIDEpKSA/CiAgICAgIDAgOgogICh0b19vYmplY3QoYykgfHwgLTEpOwp9CgovLyAqIFdpciB3b2xsZW4gbnVyIEVJTiBBcmd1bWVudCAuLi4gYXVzc2VyZGVtIGNoZWNrcyBmdWVyIGRlbiBOZXR6dG90ZW5yYXVtCnZhcmFyZ3Mgdm9pZCBtb3ZlX29iamVjdChtaXhlZCB3aGF0LCBtaXhlZCB3aGVyZSkKewogIG9iamVjdCBwbyx0bXA7CgogIHBvPXByZXZpb3VzX29iamVjdCgpOwogIGlmICghd2hlcmUpCiAgewogICAgd2hlcmU9d2hhdDsKICAgIHdoYXQ9cG87CiAgfQogIGlmICgoKHN0cmluZ3Aod2hlcmUpICYmIHdoZXJlPT1ORVRERUFEX1JPT00gKSB8fAogICAgICAgKG9iamVjdHAod2hlcmUpICYmIHdoZXJlPT1maW5kX29iamVjdChORVRERUFEX1JPT00pKSkgJiYKICAgICAgIG9iamVjdHAod2hhdCkgJiYgb2JqZWN0X25hbWUod2hhdCkhPSIvb2JqL3NwZXJyZXIiKQogIHsKICAgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh3aGF0KSkKICAgIHsKICAgICAgd2hhdC0+cmVtb3ZlKCk7CiAgICAgIGlmICh3aGF0KSBkZXN0cnVjdCh3aGF0KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGxpdmluZyh3aGF0KSB8fCBpbnRlcmFjdGl2ZSh3aGF0KSkKICAgIHsKICAgICAgbG9nX2ZpbGUoIk5ERUFEMiIsc3ByaW50ZigiVFJZRUQgVE8gTU9WRSBUTyBORVRERUFEOiAlT1xuIix3aGF0KSk7CiAgICAgIHJldHVybjsKICAgIH0KICAgIHNldF9vYmplY3RfaGVhcnRfYmVhdCh3aGF0LDApOwogIH0KICB0bXA9d2hhdDsKICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCiAgICAgIC8vIEphLiBNYW4gcnVmdCBkaWUgX3NldF94eHgoKS1GdW5rdGlvbmVuIGVpZ2VudGxpY2ggbmljaHQgZGlyZWt0IGF1Zi4KICAgICAgLy8gQWJlciBkYXMgTGljaHRzeXN0ZW0gaXN0IHNjaG9uICpzbyogcmVjaGVuaW50ZW5zaXYgdW5kIGdlcmFkZSBkZXIKICAgICAgLy8gUF9MQVNUX0NPTlRFTlRfQ0hBTkdFLUNhY2hlIHdpcmQgKnNvKiBvZnQgYmVub2V0aWd0LCBkYXNzIGVzIG1pcgogICAgICAvLyBkYSB1bSBqZWRlcyBiaXNzY2hlbiBSZWNoZW56ZWl0IGdlaHQuCiAgICAgIC8vIERlciBad2VjayBoZWlsaWd0IGphIGJla2FubnRsaWNoIGRpZSBNaXR0ZWwuIDstKQogICAgICAvLwogICAgICAvLyBUaWFtYWsKICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7CiAgZnVuY2FsbChiaW5kX2xhbWJkYSgjJ2VmdW46Om1vdmVfb2JqZWN0LHBvKSx3aGF0LHdoZXJlKTsKICBpZiAodG1wPXdoYXQpCiAgICB3aGlsZSAodG1wPWVudmlyb25tZW50KHRtcCkpCiAgICAgIHRtcC0+X3NldF9sYXN0X2NvbnRlbnRfY2hhbmdlKCk7Cn0KCgp2b2lkIHN0YXJ0X3NpbXVsX2VmdW4oKSB7CiAgbWl4ZWQgKmluZm87CgogIC8vIEZhbGxzIG5vY2ggbmljaHQgZ2V0YW4sIGV4dHJhX3dpemluZm8gaW5pdGlhbGlzaWVyZW4KICBpZiAoICFwb2ludGVycChpbmZvID0gZ2V0X2V4dHJhX3dpemluZm8oMCkpICkKICAgIHNldF9leHRyYV93aXppbmZvKDAsIGluZm8gPSBhbGxvY2F0ZShCQUNLQk9ORV9XSVpJTkZPX1NJWkUpKTsKCiAgSW5pdExpdmluZ0RhdGEoaW5mbyk7CgogIHNldF9uZXh0X3Jlc2V0KDEwKTsgLy8gZGlyZWt0IG1hbCBhdWZyYWV1bWVuCn0KCnByb3RlY3RlZCB2b2lkIHJlc2V0KCkgewogIHNldF9uZXh0X3Jlc2V0KDcyMDApOwogIENsZWFuTGl2aW5nRGF0YSgpOwp9CgojaWYgIV9fRUZVTl9ERUZJTkVEX18oYWJzb2x1dGVfaGJfY291bnQpCmludCBhYnNvbHV0ZV9oYl9jb3VudCgpIHsKICByZXR1cm4gZWZ1bjo6ZHJpdmVyX2luZm8oRElfTlVNX0hFQVJUQkVBVF9UT1RBTF9DWUNMRVMpOwp9CiNlbmRpZgoKdm9pZCBfX3NldF9lbnZpcm9ubWVudChvYmplY3Qgb2IsIG1peGVkIHRhcmdldCkKewogIHN0cmluZyBwYXRoOwogIG9iamVjdCBvYmo7CgogIGlmICghb2JqZWN0cChvYikpCiAgICByZXR1cm47CiAgaWYgKCFJU19BUkNIKGdldGV1aWQocHJldmlvdXNfb2JqZWN0KCkpKSB8fCAhQVJDSF9TRUNVUklUWSApCiAgICByZXR1cm47CiAgaWYgKG9iamVjdHAodGFyZ2V0KSkKICB7CiAgICBlZnVuOjpzZXRfZW52aXJvbm1lbnQob2IsdGFyZ2V0KTsKICAgIHJldHVybjsKICB9CiAgcGF0aD0oc3RyaW5nKU1BU1RFUi0+X2dldF9wYXRoKHRhcmdldCx0aGlzX2ludGVyYWN0aXZlKCkpOwogIGlmIChzdHJpbmdwKHBhdGgpICYmIGZpbGVfc2l6ZShwYXRoKyIuYyIpPj0wICYmCiAgICAgICFjYXRjaChsb2FkX29iamVjdChwYXRoKTtwdWJsaXNoKSApCiAgewogICAgb2JqPWZpbmRfb2JqZWN0KHBhdGgpOwogICAgZWZ1bjo6c2V0X2Vudmlyb25tZW50KG9iLG9iaik7CiAgICByZXR1cm47CiAgfQp9Cgp2b2lkIF9kdW1wX3dpemxpc3Qoc3RyaW5nIGZpbGUsIGludCBzb3J0YnkpIHsKICBpbnQgaTsKICBtaXhlZCAqYTsKCiAgaWYgKCFMT1JEX1NFQ1VSSVRZKQogICAgcmV0dXJuOwogIGlmICghbWFzdGVyKCktPnZhbGlkX3dyaXRlKGZpbGUsZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSksIndyaXRlX2ZpbGUiKSkKICB7CiAgICB3cml0ZSgiTk8gV1JJVEUgUEVSTUlTU0lPTlxuIik7CiAgICByZXR1cm47CiAgfQogIGEgPSB3aXpsaXN0X2luZm8oKTsKICBhID0gc29ydF9hcnJheShhLCBsYW1iZGEoICh7J2EsJ2J9KSwKICAgICAgICAgICAgICAgICAgICAgICAgKHsjJzwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Esc29ydGJ5fSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHsjJ1ssJ2Isc29ydGJ5fSkKICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgcm0oZmlsZSk7CiAgZm9yIChpPXNpemVvZihhKS0xO2k+PTA7aS0tKQogICAgd3JpdGVfZmlsZShmaWxlLHNwcmludGYoIiUtMTFzOiBldmFsPSUtOGQgY21kcz0lLTZkIEhCcz0lLTVkIGFycmF5PSUtNWQgbWFwcGluZz0lLTdkXG4iLAogICAgICBhW2ldW1dMX05BTUVdLGFbaV1bV0xfVE9UQUxfQ09TVF0sYVtpXVtXTF9DT01NQU5EU10sYVtpXVtXTF9IRUFSVF9CRUFUU10sCiAgICAgIGFbaV1bV0xfQVJSQVlfVE9UQUxdLGFbaV1bV0xfQ0FMTF9PVVRdKSk7Cn0KCnB1YmxpYyB2YXJhcmdzIG9iamVjdCBkZWVwX3ByZXNlbnQobWl4ZWQgd2hhdCwgb2JqZWN0IG9iKSB7CgogIGlmKCFvYmplY3RwKG9iKSkKICAgIG9iPXByZXZpb3VzX29iamVjdCgpOwogIC8vIFdlbm4gZWluIE9iamVrdCBnZXN1Y2h0IHdpcmQ6IEFsbGUgRW52cyBkaWVzZXMgT2JqZWt0cyBlcm1pdHRlbG4gdW5kCiAgLy8gc2NoYXVlbiwgb2IgaW4gZGllc2VuIG9iIHZvcmtvbW10LiBEYW5uIGlzdCB3aGF0IGluIG9iIGVudGhhbHRlbi4KICBpZihvYmplY3RwKHdoYXQpKSB7CiAgICBvYmplY3QgKmVudnM9YWxsX2Vudmlyb25tZW50KHdoYXQpOwogICAgLy8gd2VubiBvYiBrZWluIEVudmlyb25tZW50IGhhdCwgaXN0IGVzIG9mZmVuc2ljaHRsaWNoIG5pY2h0IGluIHdoYXQKICAgIC8vIGVudGhhbHRlbi4KICAgIGlmICghcG9pbnRlcnAoZW52cykpIHJldHVybiAwOwogICAgaWYgKG1lbWJlcihlbnZzLCBvYikgIT0gLTEpIHJldHVybiB3aGF0OwogIH0KICAvLyBzb25zdCB3aXJkcyB0ZXVyZXIsIHVlYmVyIGFsbGUgT2JqZWt0ZSBpbSAoZGVlcCkgSW52IGxhdWZlbiB1bmQgcGVyIGlkKCkKICAvLyB0ZXN0ZW4uIERhYmVpIG11c3MgYWJlciBkaWUgZ2V3dWVuc2NodGUgTnIuICgiZmxhc2NoZSAzIikgYWJnZXNjaG5pdHRlbgogIC8vIHdlcmRlbiB1bmQgc2VsYmVyIGdlemFlaGx0IHdlcmRlbiwgd2VsY2hlIGRhcyBlbnRzcHJlY2hlbmRlIE9iamVrdCBpc3QuCiAgZWxzZSBpZiAoc3RyaW5ncCh3aGF0KSkgewogICAgICBpbnQgY250OwogICAgICBzdHJpbmcgbmV3d2hhdDsKICAgICAgaWYoc3NjYW5mKHdoYXQsIiVzICVkIixuZXd3aGF0LGNudCkhPTIpCiAgICAgICBjbnQ9MTsKICAgICAgZWxzZQogICAgICAgd2hhdD1uZXd3aGF0OwogICAgICBmb3JlYWNoKG9iamVjdCBpbnZvYjogZGVlcF9pbnZlbnRvcnkob2IpKSB7CiAgICAgICBpZiAoaW52b2ItPmlkKHdoYXQpICYmICEtLWNudCkKICAgICAgICAgICByZXR1cm4gaW52b2I7CiAgICAgIH0KICB9CiAgZWxzZSB7CiAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgcmFpc2VfZXJyb3Ioc3ByaW50ZigiV3JvbmcgYXJndW1lbnQgMSB0byBkZWVwX3ByZXNlbnQoKS4gIgogICAgICAgICAiRXhwZWN0ZWQgXCJvYmplY3RcIiBvciBcInN0cmluZ1wiLCBnb3QgJS41ME8uXG4iLAogICAgICAgICB3aGF0KSk7CiAgfQogIHJldHVybiAwOwp9CgptYXBwaW5nIGR1bXBfaXBfbWFwcGluZygpCnsKICByZXR1cm4gMDsKfQoKbm9tYXNrIHZvaWQgc3dhcChvYmplY3Qgb2JqKQp7CiAgd3JpdGUoIllvdXIgYXJlIG5vdCBhbGxvd2VkIHRvIHN3YXAgb2JqZWN0cyBieSBoYW5kIVxuIik7CiAgcmV0dXJuOwp9Cgpub21hc2sgdmFyYXJncyB2b2lkIGdhcmJhZ2VfY29sbGVjdGlvbihzdHJpbmcgc3RyKQp7CiAgaWYocHJldmlvdXNfb2JqZWN0KCk9PTAgfHwgIUlTX0FSQ0goZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSkpIAogICAgICB8fCAhQVJDSF9TRUNVUklUWSkKICB7CiAgICB3cml0ZSgiQ2FsbCBHQyBub3cgYW5kIHRoZSBtdWQgd2lsbCBjcmFzaCBpbiA1LTYgaG91cnMuIERPTlQgRE8gSVQhXG4iKTsKICAgIHJldHVybjsKICB9CiAgZWxzZSBpZiAoc3RyaW5ncChzdHIpKQogIHsKICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oc3RyKTsKICB9CiAgZWxzZSAKICAgIHJldHVybiBlZnVuOjpnYXJiYWdlX2NvbGxlY3Rpb24oKTsKfQoKdmFyYXJncyB2b2lkIG5vdGlmeV9mYWlsKG1peGVkIG5mLCBpbnQgcHJpbykgewogIG9iamVjdCBwbyxvbGRvOwogIGludCBvbGRwcmlvOwogIAogIGlmICghUEwgfHwgIW9iamVjdHAocG89cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CiAgaWYgKCFzdHJpbmdwKG5mKSAmJiAhY2xvc3VyZXAobmYpKSB7CiAgICAgIHNldF90aGlzX29iamVjdChwbyk7CiAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoCiAgICAgICAgICJPbmx5IHN0cmluZ3MgYW5kIGNsb3N1cmVzIGFsbG93ZWQgZm9yIG5vdGlmeV9mYWlsISAiCiAgICAgICAgICJBcmd1bWVudCB3YXM6ICUuNTBPLi4uXG4iLG5mKSk7CiAgfQoKICAvLyBmYWxscyBlaW4gT2JqZWt0IGJlcmVpdHMgbmVuIG5vdGlmeV9mYWlsKCkgc2V0enRlLCBQcmlvcml0YWV0ZW4gYWJzY2hhZXR6ZW4KICAvLyB1bmQgdmVyZ2xlaWNoZW4uCiAgaWYgKG9iamVjdHAob2xkbz1xdWVyeV9ub3RpZnlfZmFpbCgxKSkgJiYgcG8hPW9sZG8pIHsKICAgIGlmICghcHJpbykgeyAgICAgICAKICAgICAgLy9Qcmlvcml0YWV0IGRpZXNlcyBub3RpZnlfZmFpbCgpICdhYnNjaGFldHplbicKICAgICAgaWYgKHBvPT1QTCkgLy8gU3BpZWxlci1pbnRlcm5lIChzb3VsLWNtZHMpCiAgICAgICAgcHJpbz1ORl9OTF9PV047CiAgICAgIGVsc2UgaWYgKGxpdmluZyhwbykpCiAgICAgICAgcHJpbz1ORl9OTF9MSVZJTkc7CiAgICAgIGVsc2UgaWYgKChpbnQpcG8tPklzUm9vbSgpKQogICAgICAgIHByaW89TkZfTkxfUk9PTTsKICAgICAgZWxzZQogICAgICAgIHByaW89TkZfTkxfVEhJTkc7CiAgICB9CiAgICAvL1ByaW9yaXRhZXQgZGVzIGFsdGVuIFNldHplcnMgYWJzY2hhZXR6ZW4KICAgIGlmIChvbGRvPT1QTCkKICAgICAgb2xkcHJpbz1ORl9OTF9PV047CiAgICBlbHNlIGlmIChsaXZpbmcob2xkbykpCiAgICAgIG9sZHByaW89TkZfTkxfTElWSU5HOwogICAgZWxzZSBpZiAoKGludClvbGRvLT5Jc1Jvb20oKSkKICAgICAgb2xkcHJpbz1ORl9OTF9ST09NOwogICAgZWxzZQogICAgICBvbGRwcmlvPU5GX05MX1RISU5HOwogIH0KICBlbHNlIC8vIHdlbm4gZXMgbm9jaCBrZWluIE5vdGlmeV9mYWlsIGdpYnQ6CiAgICBvbGRwcmlvPU5GX05MX05PTkU7CgogIC8vdmVyZ2xlaWNoZW4gdW5kIGdnZi4gc2V0emVuCiAgaWYgKHByaW8gPj0gb2xkcHJpbykgeyAKICAgIHNldF90aGlzX29iamVjdChwbyk7CiAgICBlZnVuOjpub3RpZnlfZmFpbChuZik7CiAgfQoKICByZXR1cm47Cn0KCnZvaWQgX25vdGlmeV9mYWlsKHN0cmluZyBzdHIpCnsKICAvL3F1ZXJ5X25vdGlmeV9mYWlsKCkgYmVudXR6ZW4sIHVtIGRhcyBPYmpla3QKICAvL2RlcyBsZXR6dGVuIG5vdGlmeV9mYWlsKCkgenUgZXJtaXR0ZWxuCiAgb2JqZWN0IG87CiAgaWYgKChvPXF1ZXJ5X25vdGlmeV9mYWlsKDEpKSAmJiBvIT1wcmV2aW91c19vYmplY3QoKSkKICAgIHJldHVybjsKICAvL25vY2gga2VpbiBub3RpZnlfZmFpbCgpIGZ1ZXIgZGllc2VzIEtvbW1hbmRvIGdlc2V0enQsIGF1ZiBnZWh0cy4KICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogIGVmdW46Om5vdGlmeV9mYWlsKHN0cik7CiAgcmV0dXJuOwp9CgpzdHJpbmcgdGltZTJzdHJpbmcoIHN0cmluZyBmb3JtYXQsIGludCB6ZWl0ICkKewogIGludCBpLGNoLG1heHVuaXQsZHVtbXk7CiAgc3RyaW5nICpwYXJ0cywgZm10OwoKICBpbnQgc2VjcyA9IHplaXQ7CiAgaW50IG1pbnMgPSAoemVpdC82MCk7CiAgaW50IGhvdXJzID0gKHplaXQvMzYwMCk7CiAgaW50IGRheXMgPSAoemVpdC84NjQwMCk7CiAgaW50IHdlZWtzID0gICh6ZWl0LzYwNDgwMCk7CiAgaW50IG1vbnRocyA9ICh6ZWl0LzI0MTkyMDApOwogIGludCBhYmJyID0gMDsKCiAgcGFydHMgPSByZWdleHBsb2RlKCBmb3JtYXQsICJcKCVcKC18XClbMC05XSpbbndkaG1zeE5XREhNU1hdXCl8XCglJVwpIiApOwoKICBmb3IoIGk9MTsgaTxzaXplb2YocGFydHMpOyBpKz0yICkKICB7CiAgICBjaCA9IHBhcnRzW2ldWzwxXTsKICAgIHN3aXRjaCggcGFydHNbaV1bPDFdICkKICAgIHsKICAgIGNhc2UgJ3gnOiBjYXNlICdYJzoKICAgICAgIGFiYnIgPSBzc2NhbmYoIHBhcnRzW2ldLCAiJSUlZCIsIGR1bW15ICkgJiYgZHVtbXk9PTA7CiAgICAgICAvLyBOTyBicmVhayAhCiAgICBjYXNlICduJzogY2FzZSAnTic6CiAgICAgICBtYXh1bml0IHw9IDMxOwogICAgICAgYnJlYWs7CiAgICBjYXNlICd3JzogY2FzZSAnVyc6CiAgICAgICBtYXh1bml0IHw9IDE1OwogICAgICAgYnJlYWs7CiAgICBjYXNlICdkJzogY2FzZSAnRCc6CiAgICAgICBtYXh1bml0IHw9IDc7CiAgICAgICBicmVhazsKICAgIGNhc2UgJ2gnOiBjYXNlICdIJzoKICAgICAgIG1heHVuaXQgfD0gMzsKICAgICAgIGJyZWFrOwogICAgY2FzZSAnbSc6IGNhc2UgJ00nOgogICAgICAgbWF4dW5pdCB8PSAxOwogICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGlmKCBtYXh1bml0ICYgMTYgKSB3ZWVrcyAlPSA0OwogIGlmKCBtYXh1bml0ICYgOCApIGRheXMgJT0gNzsKICBpZiggbWF4dW5pdCAmIDQgKSBob3VycyAlPSAyNDsKICBpZiggbWF4dW5pdCAmIDIgKSBtaW5zICU9IDYwOwogIGlmKCBtYXh1bml0ICkgc2VjcyAlPSA2MDsKCiAgZm9yKCBpPTE7IGk8c2l6ZW9mKHBhcnRzKTsgaSs9MiApCiAgewogICAgZm10ID0gcGFydHNbaV1bMC4uPDJdOwogICAgY2ggPSBwYXJ0c1tpXVs8MV07CiAgICBpZiggY2g9PSd4JyApCiAgICB7CiAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nbic7CiAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0ndyc7CiAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdkJzsKICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdoJzsgCiAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ20nOwogICAgICBlbHNlIGNoID0gJ3MnOwogICAgfQogICAgZWxzZSBpZiggY2g9PSdYJyApCiAgICB7CiAgICAgIGlmIChtb250aHMgPiAwKSBjaD0nTic7CiAgICAgIGVsc2UgaWYoIHdlZWtzPjAgKSBjaD0nVyc7CiAgICAgIGVsc2UgaWYoIGRheXM+MCApIGNoPSdEJzsKICAgICAgZWxzZSBpZiggaG91cnM+MCApIGNoPSdIJzsgCiAgICAgIGVsc2UgaWYobWlucyA+IDApIGNoID0gJ00nOwogICAgICBlbHNlIGNoID0gJ1MnOwogICAgfQogICAgCiAgICBzd2l0Y2goIGNoICkKICAgIHsKICAgICAgY2FzZSAnbic6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgbW9udGhzICk7IGJyZWFrOwogICAgICBjYXNlICd3JzogcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrImQiLCB3ZWVrcyApOyBicmVhazsKICAgICAgY2FzZSAnZCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgZGF5cyApOyBicmVhazsKICAgICAgY2FzZSAnaCc6IHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJkIiwgaG91cnMgKTsgYnJlYWs7CiAgICAgIGNhc2UgJ20nOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIG1pbnMgKTsgYnJlYWs7CiAgICAgIGNhc2UgJ3MnOiBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsiZCIsIHNlY3MgKTsgYnJlYWs7CiAgICAgIGNhc2UgJ04nOgogICAgICAgaWYoYWJicikgcGFydHNbaV0gPSAiTSI7CiAgICAgICBlbHNlIHBhcnRzW2ldID0gc3ByaW50ZiggZm10KyJzIiwgKG1vbnRocz09MSkgPyAiTW9uYXQiIDogIk1vbmF0ZSIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICdXJzoKICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gInciOyBlbHNlCiAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsICh3ZWVrcz09MSkgPyAiV29jaGUiIDogIldvY2hlbiIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICdEJzoKICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gImQiOyBlbHNlCiAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChkYXlzPT0xKSA/ICJUYWciIDogIlRhZ2UiICk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSAnSCc6CiAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJoIjsgZWxzZQogICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoaG91cnM9PTEpID8gIlN0dW5kZSIgOiAiU3R1bmRlbiIgKTsKICAgICAgIGJyZWFrOwogICAgICBjYXNlICdNJzoKICAgICAgIGlmKGFiYnIpIHBhcnRzW2ldID0gIm0iOyBlbHNlCiAgICAgICBwYXJ0c1tpXSA9IHNwcmludGYoIGZtdCsicyIsIChtaW5zPT0xKSA/ICJNaW51dGUiIDogIk1pbnV0ZW4iICk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSAnUyc6CiAgICAgICBpZihhYmJyKSBwYXJ0c1tpXSA9ICJzIjsgZWxzZQogICAgICAgcGFydHNbaV0gPSBzcHJpbnRmKCBmbXQrInMiLCAoc2Vjcz09MSkgPyAiU2VrdW5kZSIgOiAiU2VrdW5kZW4iICk7CiAgICAgICBicmVhazsKICAgICAgY2FzZSAnJSc6CiAgICAgICBwYXJ0c1tpXSA9ICIlIjsKICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaW1wbG9kZSggcGFydHMsICIiICk7Cn0KCm5vbWFzayBtaXhlZCBfX2NyZWF0ZV9wbGF5ZXJfZHVtbXkoc3RyaW5nIG5hbWUpCnsKICBzdHJpbmcgZXJyOwogIG9iamVjdCBvYjsKICBtaXhlZCBtOwogIC8vaGF0IG5lbiBTY2hlcnprZWtzIGRpZSBCbHVlcHJpbnQgYmV3ZWd0PwogIGlmICgob2I9ZmluZF9vYmplY3QoIi9zZWN1cmUvbG9naW4iKSkgJiYgZW52aXJvbm1lbnQob2IpKQogICAgICBjYXRjaChkZXN0cnVjdChvYik7cHVibGlzaCk7CiAgZXJyID0gY2F0Y2gob2IgPSBjbG9uZV9vYmplY3QoInNlY3VyZS9sb2dpbiIpO3B1Ymxpc2gpOwogIGlmIChlcnIpCiAgewogICAgd3JpdGUoIkZlaGxlciBiZWltIExhZGVuIHZvbiAvc2VjdXJlL2xvZ2luLmNcbiIrZXJyKyJcbiIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChvYmplY3RwKG09KG1peGVkKW9iLT5uZXdfbG9nb24obmFtZSkpKSBuZXRkZWFkW25hbWVdPW07CiAgcmV0dXJuIG07Cn0KCm5vbWFzayBpbnQgc2VjdXJlX2xldmVsKCkKewogIGludCAqbGV2ZWw7CiAgLy9rZXR0ZSBkZXIgQ2FsbGVyIGR1cmNobGF1ZmVuLCBkZW4gbmllZHJpZ3N0ZW4gTGV2ZWwgaW4gZGVyIEtldHRlCiAgLy96dXJ1ZWNrZ2ViZW4uIFplcnN0b2VydGUgT2JqZWt0ZSAoU2VsYnN0emVyc3RvZXJlcikgZnVlaHJlbiB6dXIgUnVlY2tnYWJlCiAgLy92b24gMC4KICAvL2NhbGxlcl9zdGFjaygxKSBmdWVndCBkZW0gUnVlY2tnYWJlYXJyYXkgdGhpc19pbnRlcmFjdGl2ZSgpIGhpbnp1IGJ6dy4gMCwKICAvL3dlbm4gZXMga2VpbmVuIEludGVyYWN0aXZlIGdpYnQuIERpZSAwIGZ1ZWhydCBkYW5uIHdpZSBiZWkgemVyc3RvZXJ0ZW4KICAvL09iamVrdGVuIHp1ciBSdWVja2dhYmUgdm9uIDAsIHdhcyBnZXd1ZW5zY2h0IGlzdCwgZGEgZXMgaGllciBlaW5lbgogIC8vSU50ZXJhY3RpdmUgZ2ViZW4gbXVzcy4KICBsZXZlbD1tYXAoY2FsbGVyX3N0YWNrKDEpLGZ1bmN0aW9uIGludCAob2JqZWN0IGNhbGxlcikKICAgICAge2lmIChvYmplY3RwKGNhbGxlcikpCiAgICAgICByZXR1cm4ocXVlcnlfd2l6X2xldmVsKGdldGV1aWQoY2FsbGVyKSkpOwogICAgICAgcmV0dXJuKDApOyAvLyBrZWluIE9iamVrdCBkYSwgMC4KICAgICAgfSApOwogIHJldHVybihtaW4obGV2ZWwpKTsgLy9kZW4ga2xlaW5zdGVuIFdlcnQgaW0gQXJyYXkgenVydWVja2dlYmVuIChnZ2YuIDApCn0KCm5vbWFzayBzdHJpbmcgc2VjdXJlX2V1aWQoKQp7CiAgc3RyaW5nIGV1aWQ7CgogIGlmICghdGhpc19pbnRlcmFjdGl2ZSgpKSAvLyBFcyBtdXNzIGVpbmVuIGludGVyYWN0aXZlIGdlYmVuCiAgICAgcmV0dXJuIDA7CiAgZXVpZD1nZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk7CiAgLy8gdWViZXIgYWxsZSBDYWxsZXIgaXRlcmllcmVuLiBXZW5uIGVpbmVzIGRhdm9uIGVpbmUgYW5kZXJlIGV1aWQgaGF0IGFscwogIC8vIGRlciBJbnRlcmFjdGl2ZSB1bmQgZGllc2UgbmljaHQgZGllIFJPT1RJRCBpc3QsIHdpcmQgMCB6dXJ1ZWNrZ2ViZW4uCiAgLy8gRWJlbnNvLCBmYWxscyBlaW4gU2VsYnN0emVyc3RvZXJlciBpcmdlbmR3byBpbiBkZXIgS2V0dGUgaXN0LgogIGZvcmVhY2gob2JqZWN0IGNhbGxlcjogY2FsbGVyX3N0YWNrKCkpIHsKICAgICAgaWYgKCFvYmplY3RwKGNhbGxlcikgfHwKICAgICAgIChnZXRldWlkKGNhbGxlcikhPWV1aWQgJiYgZ2V0ZXVpZChjYWxsZXIpIT1ST09USUQpKQogICAgICAgICByZXR1cm4gMDsKICB9CiAgcmV0dXJuIGV1aWQ7IC8vICdzaWNoZXJlJyBldWlkIHp1cnVlY2tnZWJlbgp9CgovLyBJTlBVVF9QUk9NUFQgdW5kIG5lbiBMZWVycHJvbXB0IGhpbnp1ZnVlZ2VuLCB3ZW5uIGtlaW5zIHVlYmVyZ2ViZW4gd2lyZC4KLy8gRGFzIHNvbGwgZGF6dSBkaWVuZW4sIGRhc3MgYWxsZSBnZ2YuIGVpbiBFT1IgYW0gUHJvbXB0ZW5kZSBrcmllZ2VuLi4uCi8vI2lmIF9fQk9PVF9USU1FX18gPCAxMzYwMDE3MjEzCnZhcmFyZ3Mgdm9pZCBpbnB1dF90byggbWl4ZWQgZnVuLCBpbnQgZmxhZ3MsIHZhcmFyZ3MgbWl4ZWQgKmFyZ3MgKQp7CiAgICBtaXhlZCAqYXJyOwogICAgaW50IGk7CgogICAgaWYgKCAhdGhpc19wbGF5ZXIoKSB8fCAhcHJldmlvdXNfb2JqZWN0KCkgKQogICAgICAgcmV0dXJuOwoKICAgIC8vIFRPRE86IGlucHV0X3RvKC4uLixJTlBVVF9QUk9NUFQsICIiLCAuLi4pLCB3ZW5uIGtlaW4gSU5QVVRfUFJPTVBUCiAgICAvLyB2b3Jrb21tdC4uLgogICAgaWYgKCBmbGFncyZJTlBVVF9QUk9NUFQgKSB7ICAgIAogICAgICAgIGFyciA9ICh7IGZ1biwgZmxhZ3MgfSkgKyBhcmdzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgLy8gZ2dmLiBlaW4gSU5QVVRfUFJPTVBUIGhpbnp1ZnVlZ2VuIHVuZCBuZW4gTGVlcnN0cmluZyBhbHMgUHJvbXB0LgogICAgICAgIGZsYWdzIHw9IElOUFVUX1BST01QVDsKICAgICAgICBhcnIgPSAoeyBmdW4sIGZsYWdzLCAiIiB9KSArIGFyZ3M7CiAgICB9CgogICAgLy8gQXJyYXlzIGdlZ2VuIGZsYXR0ZW4gcXVvdGVuLgogICAgZm9yICggaSA9IHNpemVvZihhcnIpIC0gMTsgaSA+IDE7IGktLSApCiAgICAgICBpZiAoIHBvaW50ZXJwKGFycltpXSkgKQogICAgICAgICAgIGFycltpXSA9IHF1b3RlKGFycltpXSk7CgogICAgYXBwbHkoIGJpbmRfbGFtYmRhKCB1bmJvdW5kX2xhbWJkYSggKHt9KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh7ICMnZWZ1bjo6aW5wdXRfdG8vKicqLyB9KSArIGFyciApLAogICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpICkgKTsKfQovLyNlbmRpZgoKbm9tYXNrIGludCBzZXRfbGlnaHQoaW50IGkpCi8vIGVyaG9laHQgZGFzIExpY2h0bGV2ZWwgZWluZXMgT2JqZWt0cyB1bSBpCi8vIHJlc3VsdDogZGFzIExpY2h0bGV2ZWwgaW5uZXJoYWxiIGRlcyBPYmpla3RzCnsKICAgIG9iamVjdCBvYiwgKmludjsKICAgIGludCBsYWxsLCBsaWdodCwgZGFyaywgdG1wOwoKICAgIGlmICghKG9iPXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7IC8vIG9obmUgZGFzIGdlaHRzIG5pY2h0LgoKICAgIC8vIGF1cyBrb21wYXRpYmlsaXRhZXRzZ3J1ZW5kZW4ga2FubiBtYW4gYXVjaCBkZW4gTGljaHRsZXZlbCBub2NoIHNldHplbgogICAgaWYgKGkhPTApIG9iLT5TZXRQcm9wKFBfTElHSFQsIG9iLT5RdWVyeVByb3AoUF9MSUdIVCkraSk7CgogICAgLy8gTGljaHRiZXJlY2hudW5nIGZpbmRldCBlaWdlbnRsaWNoIGluIGRlciBNdWRsaWIgc3RhdHQuCiAgICByZXR1cm4gKGludClvYi0+UXVlcnlQcm9wKFBfSU5UX0xJR0hUKTsKfQoKCnB1YmxpYyBzdHJpbmcgaXNvMmFzY2lpKCBzdHJpbmcgc3RyICkKewogICAgaWYgKCAhc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSApCiAgICAgICByZXR1cm4gIiI7CgogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi5CIsICJhZSIsIDEgKTsKICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIvYiLCAib2UiLCAxICk7CiAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICL8IiwgInVlIiwgMSApOwogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAixCIsICJBZSIsIDEgKTsKICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgItYiLCAiT2UiLCAxICk7CiAgICBzdHIgPSByZWdyZXBsYWNlKCBzdHIsICLcIiwgIlVlIiwgMSApOwogICAgc3RyID0gcmVncmVwbGFjZSggc3RyLCAi3yIsICJzcyIsIDEgKTsKICAgIHN0ciA9IHJlZ3JlcGxhY2UoIHN0ciwgIlteIC1+XSIsICI/IiwgMSApOwoKICAgIHJldHVybiBzdHI7Cn0KCgpwdWJsaWMgdmFyYXJncyBzdHJpbmcgQ291bnRVcCggc3RyaW5nICpzLCBzdHJpbmcgc2VwLCBzdHJpbmcgbGFzdHNlcCApCnsKICAgIHN0cmluZyByZXQ7CgogICAgaWYgKCAhcG9pbnRlcnAocykgKQogICAgICAgcmV0dXJuICIiOwogICAgCiAgICBpZiAoIXNlcCkgc2VwID0gIiwgIjsKICAgIGlmICghbGFzdHNlcCkgbGFzdHNlcCA9ICIgdW5kICI7CgogICAgc3dpdGNoIChzaXplb2YocykpICB7CiAgICAgICBjYXNlIDA6IHJldD0iIjsgYnJlYWs7CiAgICAgICBjYXNlIDE6IHJldD1zWzBdOyBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgcmV0ID0gaW1wbG9kZShzWzAuLjwyXSwgc2VwKTsKICAgICAgICAgICAgICByZXQgKz0gbGFzdHNlcCArIHNbPDFdOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKbm9tYXNrIHZhcmFyZ3MgaW50IHF1ZXJ5X25leHRfcmVzZXQob2JqZWN0IG9iKSB7CgogICAgLy8gVHlwcHJ1ZWZ1bmc6IGV0d2FzIGFuZGVyZXMgYWxzIE9iamVrdGUgb2RlciAwIHNvbGxlbiBGZWhsZXIgc2Vpbi4KICAgIGlmIChvYiAmJiAhb2JqZWN0cChvYikpCiAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmcgMSB0byBxdWVyeV9uZXh0X3Jlc2V0KCk6IGdvdCAlLjIwTywgIgogICAgICAgICAgICJleHBlY3RlZCBvYmplY3QuXG4iLG9iKSk7CgogICAgLy8gRGVmYXVsdG9iamVrdCBQTywgd2VubiAwIHVlYmVyZ2ViZW4uCiAgICBpZiAoICFvYmplY3RwKG9iKSApCiAgICAgIG9iID0gcHJldmlvdXNfb2JqZWN0KCk7CgogICAgcmV0dXJuIGVmdW46Om9iamVjdF9pbmZvKG9iLCBPSV9ORVhUX1JFU0VUX1RJTUUpOwp9CgoKI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvcHlfZmlsZSkKI2RlZmluZSBNQVhMRU4gNTAwMDAKbm9tYXNrIGludCBjb3B5X2ZpbGUoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QpCnsKCiAgaW50IHB0cjsKICBzdHJpbmcgYnl0ZXM7CgogIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgaWYgKCFzaXplb2Yoc291cmNlKXx8IXNpemVvZihkZXN0KXx8c291cmNlPT1kZXN0fHwoZmlsZV9zaXplKHNvdXJjZSk9PS0xKXx8CiAgICAgICghY2FsbF9vdGhlcihtYXN0ZXIoKSwidmFsaWRfcmVhZCIsc291cmNlLAogICAgICAgICAgICAgICAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKXx8CiAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCkpLCJyZWFkX2ZpbGUiLHByZXZpb3VzX29iamVjdCgpKSl8fAogICAgICAoIWNhbGxfb3RoZXIobWFzdGVyKCksInZhbGlkX3JlYWQiLHNvdXJjZSwKICAgICAgICAgICAgICAgICAgIGdldHVpZCh0aGlzX2ludGVyYWN0aXZlKCl8fAogICAgICAgICAgICAgICAgIHByZXZpb3VzX29iamVjdCgpKSwid3JpdGVfZmlsZSIscHJldmlvdXNfb2JqZWN0KCkpKSkKICAgIHJldHVybiAxOwogIHN3aXRjaCAoZmlsZV9zaXplKGRlc3QpKQogIHsKICBjYXNlIC0xOgogICAgYnJlYWs7CiAgY2FzZSAtMjoKICAgIGlmIChkZXN0WzwxXSE9Jy8nKSBkZXN0Kz0iLyI7CiAgICBkZXN0Kz1lZnVuOjpleHBsb2RlKHNvdXJjZSwiLyIpWzwxXTsKICAgIGlmIChmaWxlX3NpemUoZGVzdCk9PS0yKSByZXR1cm4gMTsKICAgIGlmIChmaWxlX3NpemUoZGVzdCkhPS0xKSBicmVhazsKICBkZWZhdWx0OgogICAgaWYgKCFybShkZXN0KSkgcmV0dXJuIDE7CiAgICBicmVhazsKICB9CiAgZG8KICB7CiAgICBieXRlcyA9IHJlYWRfYnl0ZXMoc291cmNlLCBwdHIsIE1BWExFTik7IHB0ciArPSBNQVhMRU47CiAgICBpZiAoIWJ5dGVzKSBieXRlcz0iIjsKICAgIHdyaXRlX2ZpbGUoZGVzdCwgYnl0ZXMpOwogIH0KICB3aGlsZShzaXplb2YoYnl0ZXMpID09IE1BWExFTik7CiAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8vIV9fRUZVTl9ERUZJTkVEX18oY29weV9maWxlKQoKCi8vICMjIyBFcnNhdHphdWZsb2VzdW5nIGluIFN0cmluZ3MgIyMjCnZhcmFyZ3Mgc3RyaW5nIHJlcGxhY2VfcGVyc29uYWwoc3RyaW5nIHN0ciwgbWl4ZWQgKm9icywgaW50IGNhcHMpIHsKICBpbnQgaTsKICBzdHJpbmcgKnBhcnRzOwoKICBwYXJ0cyA9IHJlZ2V4cGxvZGUoc3RyLCAiQFdFW0EtU1VdKlswLTldIik7CiAgaSA9IHNpemVvZihwYXJ0cyk7CgogIGlmIChpPjEpIHsKICAgIGludCBqLCB0OwogICAgY2xvc3VyZSAqbmFtZV9jbHM7CgogICAgdCA9IGogPSBzaXplb2Yob2JzKTsKCiAgICBuYW1lX2NscyAgPSAgYWxsb2NhdGUoaik7CiAgICB3aGlsZSAoai0tKQogICAgICBpZiAob2JqZWN0cChvYnNbal0pKQogICAgICAgIG5hbWVfY2xzW2pdID0gc3ltYm9sX2Z1bmN0aW9uKCJuYW1lIiwgb2JzW2pdKTsKICAgICAgZWxzZSBpZiAoc3RyaW5ncChvYnNbal0pKQogICAgICAgIG5hbWVfY2xzW2pdID0gb2JzW2pdOwoKICAgIHdoaWxlICgoaS09IDIpPjApIHsKICAgICAgaW50IG9iX25yOwogICAgICAvLyB6dSBlcnNldHplbmRlcyBUb2tlbiBpbiBGYWxsIHVuZCBPYmpla3RpbmRleCBhdWZzcGFsdGVuCiAgICAgIG9iX25yID0gcGFydHNbaV1bPDFdLScxJzsKICAgICAgaWYgKG9iX25yPDAgfHwgb2JfbnI+PXQpIHsKICAgICAgICBzZXRfdGhpc19vYmplY3QocHJldmlvdXNfb2JqZWN0KCkpOwogICAgICAgIHJhaXNlX2Vycm9yKHNwcmludGYoInJlcGxhY2VfcGVyc29uYWw6IHVzaW5nIHdyb25nIG9iamVjdCBpbmRleCAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBvYl9ucikpOwogICAgICAgIHJldHVybiBpbXBsb2RlKHBhcnRzLCAiIik7CiAgICAgIH0KCiAgICAgIC8vIGNhc3VzIGthbm4gbWFuIHNjaG9uIGhpZXIgZW50c2NoZWlkZW4KICAgICAgaW50IGNhc3VzOwogICAgICBzdHJpbmcgcGFydCA9IHBhcnRzW2ldOwogICAgICBzd2l0Y2ggKHBhcnRbM10pIHsKICAgICAgICBjYXNlICdSJzogY2FzdXMgPSBXRVI7ICAgIGJyZWFrOwogICAgICAgIGNhc2UgJ1MnOiBjYXN1cyA9IFdFU1NFTjsgYnJlYWs7CiAgICAgICAgY2FzZSAnTSc6IGNhc3VzID0gV0VNOyAgICBicmVhazsKICAgICAgICBjYXNlICdOJzogY2FzdXMgPSBXRU47ICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6ICBjb250aW51ZTsgLy8gcGFzc3Qgc2Nob24gamV0enQgbmljaHQgaW4gZGFzIEhhdXB0bXVzdGVyCiAgICAgIH0KCiAgICAgIC8vIHVuZCBqZXR6dCBkaWUgZWluemVsbmVuIEtleXdvcmRzIG9obmUgZnVlaHJlbmRlcyAiQFdFIiwgYmVlbmRlbmRlIElkCiAgICAgIG1peGVkIHRtcDsKICAgICAgc3dpdGNoIChwYXJ0WzMuLjwyXSkgewogICAgICAgIGNhc2UgIlIiOiBjYXNlICJTU0VOIjogY2FzZSAiTSI6IGNhc2UgIk4iOiAgICAgICAgICAgICAgIC8vIE5hbWUKICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzLCAxKTsgIGJyZWFrOwogICAgICAgIGNhc2UgIlJVIjogY2FzZSAiU1NFTlUiOiBjYXNlICJNVSI6IGNhc2UgIk5VIjogICAgICAgICAgIC8vIHVuYmVzdGltbXQKICAgICAgICAgIHBhcnRzW2ldID0gZnVuY2FsbChuYW1lX2Nsc1tvYl9ucl0sIGNhc3VzKTsgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJRUCI6IGNhc2UgIlNTRU5RUCI6IGNhc2UgIk1RUCI6IGNhc2UgIk5RUCI6ICAgICAgIC8vIFByb25vdW4KICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVByb25vdW4oY2FzdXMpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFBIjogY2FzZSAiU1NFTlFBIjogY2FzZSAiTVFBIjogY2FzZSAiTlFBIjogICAgICAgLy8gQXJ0aWNsZQogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHRtcCA9IChzdHJpbmcpdG1wLT5RdWVyeUFydGljbGUoY2FzdXMsIDEsIDEpOwogICAgICAgICAgaWYgKHN0cmluZ3AodG1wKSAmJiAhKHRtcFs8MV1eJyAnKSkgCiAgICAgICAgICAgIHRtcCA9IHRtcFswLi48Ml07ICAgICAgICAgICAgICAgIC8vIEV4dHJhLVNwYWNlIHdpZWRlciBsb2VzY2hlbgogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQUE1TIjogY2FzZSAiU1NFTlFQUE1TIjogY2FzZSAiTVFQUE1TIjogY2FzZSAiTlFQUE1TIjoKICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsIGNhc3VzLCBTSU5HVUxBUik7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICJSUVBQRlMiOiBjYXNlICJTU0VOUVBQRlMiOiBjYXNlICJNUVBQRlMiOiBjYXNlICJOUVBQRlMiOgogICAgICAgICAgaWYgKG9iamVjdHAodG1wID0gb2JzW29iX25yXSkpCiAgICAgICAgICAgIHBhcnRzW2ldID0gKHN0cmluZyl0bXAtPlF1ZXJ5UG9zc1Byb25vdW4oRkVNQUxFLCBjYXN1cywgU0lOR1VMQVIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQUE5TIjogY2FzZSAiU1NFTlFQUE5TIjogY2FzZSAiTVFQUE5TIjogY2FzZSAiTlFQUE5TIjoKICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFNJTkdVTEFSKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJRUFBNUCI6IGNhc2UgIlNTRU5RUFBNUCI6IGNhc2UgIk1RUFBNUCI6IGNhc2UgIk5RUFBNUCI6CiAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihNQUxFLCBjYXN1cywgUExVUkFMKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgIlJRUFBGUCI6IGNhc2UgIlNTRU5RUFBGUCI6IGNhc2UgIk1RUFBGUCI6IGNhc2UgIk5RUFBGUCI6CiAgICAgICAgICBpZiAob2JqZWN0cCh0bXAgPSBvYnNbb2JfbnJdKSkKICAgICAgICAgICAgcGFydHNbaV0gPSAoc3RyaW5nKXRtcC0+UXVlcnlQb3NzUHJvbm91bihGRU1BTEUsIGNhc3VzLCBQTFVSQUwpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAiUlFQUE5QIjogY2FzZSAiU1NFTlFQUE5QIjogY2FzZSAiTVFQUE5QIjogY2FzZSAiTlFQUE5QIjoKICAgICAgICAgIGlmIChvYmplY3RwKHRtcCA9IG9ic1tvYl9ucl0pKQogICAgICAgICAgICBwYXJ0c1tpXSA9IChzdHJpbmcpdG1wLT5RdWVyeVBvc3NQcm9ub3VuKE5FVVRFUiwgY2FzdXMsIFBMVVJBTCk7CiAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgCiAgICAgIC8vIHdlbm4gdG1wIGVpbiBTdHJpbmcgd2FyLCB3ZWlzZW4gd2lyIGVzIGhpZXIgcGF1c2NoYWwgenUKICAgICAgaWYgKHN0cmluZ3AodG1wKSkKICAgICAgICBwYXJ0c1tpXSA9IHRtcDsKCiAgICAgIC8vIGF1ZiBXdW5zY2ggd2lyZCBuYWNoIFNhdHplbmRlbiBncm9zcyBnZXNjaHJpZWJlbgogICAgICBpZiAoY2FwcykKICAgICAgICBzd2l0Y2ggKHBhcnRzW2ktMV1bPDIuLl0pIHsKICAgICAgICAgIGNhc2UgIi4gIjogIGNhc2UgIiEgIjogIGNhc2UgIj8gIjoKICAgICAgICAgIGNhc2UgIi4iOiAgIGNhc2UgIiEiOiAgIGNhc2UgIj8iOgogICAgICAgICAgY2FzZSAiLlxuIjogY2FzZSAiIVxuIjogY2FzZSAiP1xuIjoKICAgICAgICAgIGNhc2UgIlwiICI6IGNhc2UgIlwiXG4iOgogICAgICAgICAgICBwYXJ0c1tpXSA9IGNhcGl0YWxpemUocGFydHNbaV0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gaW1wbG9kZShwYXJ0cywgIiIpOwogIH0KICByZXR1cm4gc3RyOwp9CgoKLy9yZXBsYWNlbWVudHMgZm9yIGRyb3BwZWQgZWZ1bnMgaW4gTEQKI2lmICFfX0VGVU5fREVGSU5FRF9fKGV4dHJhY3QpCmRlcHJlY2F0ZWQgdmFyYXJncyBzdHJpbmcgZXh0cmFjdChzdHJpbmcgc3RyLCBpbnQgZnJvbSwgaW50IHRvKSB7CgogIGlmKCFzdHJpbmdwKHN0cikpIHsKICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBleHRyYWN0KCk6ICVPIixzdHIpKTsKICB9CiAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQogICAgICByZXR1cm4oc3RyW2Zyb20gLi4gdG9dKTsKICAgIGVsc2UgaWYgKGZyb20+PTAgJiYgdG88MCkKICAgICAgcmV0dXJuKHN0cltmcm9tIC4uIDxhYnModG8pXSk7CiAgICBlbHNlIGlmIChmcm9tPDAgJiYgdG8+PTApCiAgICAgIHJldHVybihzdHJbPGFicyhmcm9tKSAuLiB0b10pOwogICAgZWxzZQogICAgICByZXR1cm4oc3RyWzxhYnMoZnJvbSkgLi4gPGFicyh0byldKTsKICB9CiAgZWxzZSBpZiAoaW50cChmcm9tKSkgewogICAgaWYgKGZyb20+PTApCiAgICAgIHJldHVybihzdHJbZnJvbSAuLiBdKTsKICAgIGVsc2UKICAgICAgcmV0dXJuKHN0cls8YWJzKGZyb20pIC4uIF0pOwogIH0KICBlbHNlIHsKICAgIHJldHVybihzdHIpOwogIH0KfQojZW5kaWYgLy8gIV9fRUZVTl9ERUZJTkVEX18oZXh0cmFjdCkKCiNpZiAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKZGVwcmVjYXRlZCB2YXJhcmdzIG1peGVkIHNsaWNlX2FycmF5KG1peGVkIGFycmF5LCBpbnQgZnJvbSwgaW50IHRvKSB7CgogIGlmKCFwb2ludGVycChhcnJheSkpIHsKICAgIHNldF90aGlzX29iamVjdChwcmV2aW91c19vYmplY3QoKSk7CiAgICByYWlzZV9lcnJvcihzcHJpbnRmKCJCYWQgYXJndW1lbnQgMSB0byBzbGljZV9hcnJheSgpOiAlTyIsYXJyYXkpKTsKICB9CiAgaWYgKGludHAoZnJvbSkgJiYgaW50cCh0bykpIHsKICAgIGlmIChmcm9tPj0wICYmIHRvPj0wKQogICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiB0b10pOwogICAgZWxzZSBpZiAoZnJvbT49MCAmJiB0bzwwKQogICAgICByZXR1cm4oYXJyYXlbZnJvbSAuLiA8YWJzKHRvKV0pOwogICAgZWxzZSBpZiAoZnJvbTwwICYmIHRvPj0wKQogICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiB0b10pOwogICAgZWxzZQogICAgICByZXR1cm4oYXJyYXlbPGFicyhmcm9tKSAuLiA8YWJzKHRvKV0pOwogIH0KICBlbHNlIGlmIChpbnRwKGZyb20pKSB7CiAgICBpZiAoZnJvbT49MCkKICAgICAgcmV0dXJuKGFycmF5W2Zyb20gLi4gXSk7CiAgICBlbHNlCiAgICAgIHJldHVybihhcnJheVs8YWJzKGZyb20pIC4uIF0pOwogIH0KICBlbHNlIHsKICAgIHJldHVybihhcnJheSk7CiAgfQp9CiNlbmRpZiAvLyAhX19FRlVOX0RFRklORURfXyhzbGljZV9hcnJheSkKCiNpZiAhX19FRlVOX0RFRklORURfXyhtZW1iZXJfYXJyYXkpCmRlcHJlY2F0ZWQgaW50IG1lbWJlcl9hcnJheShtaXhlZCBpdGVtLCBtaXhlZCBhcnJheXN0cmluZykgewoKICBpZiAocG9pbnRlcnAoYXJyYXlzdHJpbmcpKSB7CiAgICByZXR1cm4oZWZ1bjo6bWVtYmVyKGFycmF5c3RyaW5nLGl0ZW0pKTsKICB9CiAgZWxzZSBpZiAoc3RyaW5ncChhcnJheXN0cmluZykpIHsKICAgIHJldHVybihlZnVuOjptZW1iZXIoYXJyYXlzdHJpbmcsdG9faW50KGl0ZW0pKSk7CiAgfQogIGVsc2UgewogICAgc2V0X3RoaXNfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpKTsKICAgIHJhaXNlX2Vycm9yKHNwcmludGYoIkJhZCBhcmd1bWVudCAxIHRvIG1lbWJlcl9hcnJheSgpOiAlTyIsYXJyYXlzdHJpbmcpKTsKICB9Cn0KI2VuZGlmIC8vICFfX0VGVU5fREVGSU5FRF9fKG1lbWJlcl9hcnJheSkKCi8vIFRoZSBkaWdpdCBhdCB0aGUgaSd0aCBwb3NpdGlvbiBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0IGluICdpJy4Kc3RyaW5nIGNvdW50X3RhYmxlID0KICAgICIwMTEyMTIyMzEyMjMyMzM0MTIyMzIzMzQyMzM0MzQ0NTEyMjMyMzM0MjMzNDM0NDUyMzM0MzQ0NTM0NDU0NTU2IjsKaW50IGJyb2tlbl9jb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKICAgIGludCBpLCByZXM7CiAgICBpZiggIXN0cmluZ3AocykgfHwgIShpPXNpemVvZihzKSkgKSByZXR1cm4gMDsKICAgIGZvciggOyBpLS0+MDsgKSB7CiAgICAgICAgLy8gV2UgYXJlIGNvdW50aW5nIDYgYml0cyBhdCBhIHRpbWUgdXNpbmcgYSBwcmVjb21waWxlZCB0YWJsZS4KICAgICAgICByZXMgKz0gY291bnRfdGFibGVbKHNbaV0tJyAnKSY2M10tJzAnOwogICAgfQogICAgcmV0dXJuIHJlczsKfQoKI2lmICFfX0VGVU5fREVGSU5FRF9fKGNvdW50X2JpdHMpCmludCBjb3VudF9iaXRzKCBzdHJpbmcgcyApIHsKICAgIHJldHVybihicm9rZW5fY291bnRfYml0cyhzKSk7Cn0KI2VuZGlmCgoKLy8gKiBUZWlsZSBhdXMgZWluZW0gQXJyYXkgZW50ZmVybmVuICoqKiBPQlNPTEVURQpkZXByZWNhdGVkIG1peGVkICpleGNsdWRlX2FycmF5KG1peGVkICphcnIsaW50IGZyb20saW50IHRvKQp7CiAgaWYgKHRvPGZyb20pCiAgICB0byA9IGZyb207CiAgcmV0dXJuIGFyclswLi5mcm9tLTFdK2Fyclt0bysxLi5dOwp9Cgo=