LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDQgUGlvdHIgQ2FiYW4KICogQ29weXJpZ2h0IDIwMTAgo3VrYXN6IFdvam5ps293aWN6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVAoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUKewogUE9QVVAgIiZQbGlrIiB7CiAgTUVOVUlURU0gIiZPdHfzcnoiLCBNTklEX0ZJTEVfT1BFTgogIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImRHJ1a3VqIiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIiZVc3Rhd2llbmlhIGRydWthcmtpLi4uIiwgTU5JRF9GSUxFX1NFVFVQCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogIE1FTlVJVEVNICImV3lqnGNpZSIsIE1OSURfRklMRV9FWElUCiB9CiBQT1BVUCAiJkVkeWNqYSIgewogICBNRU5VSVRFTSAiJktvcGl1ai4uLiIsIE1OSURfRURJVF9DT1BZRExHCiAgIE1FTlVJVEVNIFNFUEFSQVRPUgogICBNRU5VSVRFTSAiJlNrb21lbnR1ai4uLiIsIE1OSURfRURJVF9BTk5PVEFURQogfQogUE9QVVAgIiZaYWuzYWRrYSIgewogICBNRU5VSVRFTSAiJlpkZWZpbml1ai4uLiIsIE1OSURfQktNS19ERUZJTkUKIH0KIFBPUFVQICImT3B0aW9ucyIgewogICBQT1BVUAkiUG9tb2MgemF3c3plIHdpZG9jem5hIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJEb215nGxuaWUiLAlNTklEX09QVFNfSEVMUF9ERUZBVUxUCiAgICAgTUVOVUlURU0gIldpZG9jem5hIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJOaWV3aWRvY3puYSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yaWEiLAkJTU5JRF9PUFRTX0hJU1RPUlkKICBQT1BVUCAgICAiQ3pjaW9ua2kiCiAgQkVHSU4KICAgIE1FTlVJVEVNICJNYbNlIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbG5lIiwgICAgCU1OSURfT1BUU19GT05UU19OT1JNQUwKICAgIE1FTlVJVEVNICJEdb9lIiwgICAgIAlNTklEX09QVFNfRk9OVFNfTEFSR0UKICBFTkQKICBNRU5VSVRFTSAiVb95aiBrb2xvcvN3IHN5c3RlbW93eWNoIiwJTU5JRF9PUFRTX1NZU1RFTV9DT0xPUlMKIH0KIFBPUFVQICJQb21vJmMiIHsKICAgTUVOVUlURU0gIiZQb21vYyIsIE1OSURfSEVMUF9IRUxQT04KICAgTUVOVUlURU0gIiZaYXdzemUgbmEgd2llcnpjaHUiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZPIHByb2dyYW1pZS4uLiIsIE1OSURfSEVMUF9BQk9VVAogfQp9CgpJRERfSU5ERVggRElBTE9HIDAsIDAsIDIwMCwgMTkwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkluZGVrcyIKewogICAgTElTVEJPWCBJRENfSU5ERVhMSVNULCAxMCwgMTAsIDE4MCwgMTUwLCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IFdTX1ZTQ1JPTEwgfCBXU19CT1JERVIKfQoKSUREX1NFQVJDSCBESUFMT0cgMCwgMCwgMjAwLCAxOTAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiU3p1a2FqIgp7CiAgICBMVEVYVCAgIk5pZSB6YWltcGxlbWVudG93YW5lIiwgLTEsIDEwLCAxMCwgMTgwLCAxNTAKfQoKLyogU3RyaW5ncyAqLwpTVFJJTkdUQUJMRQp7ClNUSURfV0lORV9IRUxQLCAJIldpbmUgLSBQb21vYyIKU1RJRF9XSEVSUk9SLCAJCSJCo6VEIgpTVElEX1dBUk5JTkcsICAJCSJPU1RSWkWvRU5JRSIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYWNqYSIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTmllIHphaW1wbGVtZW50b3dhbmUiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkKzuWQgdyB0cmFrY2llIG9kY3p5dHUgcGxpa3UgcG9tb2N5IGAlcyciClNUSURfSU5ERVgsIAkJIiZaYXdhcnRvnOYiClNUSURfQ09OVEVOVFMsIAkJIiZTenVrYWoiClNUSURfQkFDSywgCQkiJldzdGVjeiIKU1RJRF9BTExfRklMRVMsIAkiV3N6eXN0a2llIHBsaWtpICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIlBsaWtpIHBvbW9jeSAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIk5pZSB6bmFsZXppb25vIHBsaWt1ICclcycuIEN6eSBjaGNlc3ogcG9zenVrYeYgdGVnbyBwbGlrdSBzYW1vZHppZWxuaWU/IgpTVElEX05PX1JJQ0hFRElUCSJOaWUgem5hbGV6aW9ubyBpbXBsZW1lbnRhY2ppIHJpY2hlZGl0Li4uIFd5nHdpZXRsZW5pZSBwb21vY3kgbmllIGplc3QgbW+/bGl3ZSIKU1RJRF9QU0hfSU5ERVgsCQkiVGVtYXR5IHBvbW9jeTogIgp9CgoKQ09OVEVYVF9NRU5VIE1FTlUKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICJBZG5vdGFjamEuLi4iLCAgICAgICBNTklEX0NUWFRfQU5OT1RBVEUKCQlNRU5VSVRFTSAiS29waXVqIiwgICAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKCQlNRU5VSVRFTSAiRHJ1a3VqLi4uIiwgICAgICAgICAgICBNTklEX0NUWFRfUFJJTlQKCQlQT1BVUCAgICAiQ3pjaW9ua2EiCgkJQkVHSU4KCQkJTUVOVUlURU0gIk1hs2EiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKCQkJTUVOVUlURU0gIk5vcm1hbG5hIiwgICAgICBNTklEX0NUWFRfRk9OVFNfTk9STUFMCgkJCU1FTlVJVEVNICJEdb9hIiwgICAgICAgTU5JRF9DVFhUX0ZPTlRTX0xBUkdFCgkJRU5ECgkJUE9QVVAgICAiUG9tb2MgemF3c3plIHdpZG9jem5hIgoJCUJFR0lOCgkJCU1FTlVJVEVNICJEb215nGxuaWUiLCAgICAgTU5JRF9DVFhUX0hFTFBfREVGQVVMVAoJCQlNRU5VSVRFTSAiV2lkb2N6bmEiLCAgICAgTU5JRF9DVFhUX0hFTFBfVklTSUJMRQoJCQlNRU5VSVRFTSAiTmlld2lkb2N6bmEiLCBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCgkJRU5ECgkJTUVOVUlURU0gIlW/eWoga29sb3LzdyBzeXN0ZW1vd3ljaCIsICAgTU5JRF9DVFhUX1NZU1RFTV9DT0xPUlMKCUVORApFTkQK