LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICogQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqIENvcHlyaWdodCAyMDA3LCAyMDA4IERhbmllbCBOeWxhbmRlciA8cG9AZGFuaWVsbnlsYW5kZXIuc2U+CiAqIENvcHlyaWdodCAyMDA5IEFuZGVycyBKb25zc29uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJ3aW5oZWxwX3Jlcy5oIgoKTEFOR1VBR0UgTEFOR19TV0VESVNILCBTVUJMQU5HX05FVVRSQUwKCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImQXJraXYiIHsKICBNRU5VSVRFTSAiJtZwcG5hIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNrcml2IHV0IiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIlNrcml2YXIma29uZmlndXJhdGlvbi4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQSZ2c2x1dGEiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIlImZWRpZ2VyYSIgewogICBNRU5VSVRFTSAiJktvcGllcmEuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZLb21tZW50ZXJhLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJkJva23kcmtlIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pZXJhLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIkEmbHRlcm5hdGl2IiB7CiAgIFBPUFVQCSJIauRscGVuIGFsbHRpZCBzeW5saWciCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIlN0YW5kYXJkIiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJTeW5saWciLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIkludGUgc3lubGlnIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3JpayIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJUeXBzbml0dCIKICBCRUdJTgogICAgTUVOVUlURU0gIkxpdGV0IiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbHQiLCAgICAJTU5JRF9PUFRTX0ZPTlRTX05PUk1BTAogICAgTUVOVUlURU0gIlN0b3J0IiwgICAgIAlNTklEX09QVFNfRk9OVFNfTEFSR0UKICBFTkQKICBNRU5VSVRFTSAiQW525G5kIHN5c3RlbWbkcmdlciIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiJkhq5GxwIiB7CiAgIE1FTlVJVEVNICJIauRscCAmZvZyIGhq5GxwIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiQWxsdGlkICb2dmVyc3QiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiB9Cn0KCklERF9JTkRFWCBESUFMT0cgMCwgMCwgMjAwLCAxOTAKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQ0FQVElPTiAiSW5kZXgiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCklERF9TRUFSQ0ggRElBTE9HIDAsIDAsIDIwMCwgMTkwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIlP2ayIKewogICAgTFRFWFQgICJJbnRlIGltcGxlbWVudGVyYXQg5G5udSIsIC0xLCAxMCwgMTAsIDE4MCwgMTUwCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUKewpTVElEX1dJTkVfSEVMUCwgCSJXaW5lIEhq5GxwIgpTVElEX1dIRVJST1IsIAkJIkZFTCIKU1RJRF9XQVJOSU5HLCAgCQkiVkFSTklORyIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYXRpb24iClNUSURfTk9UX0lNUExFTUVOVEVELCAJIkludGUgaW1wbGVtZW50ZXJhdCIKU1RJRF9ITFBGSUxFX0VSUk9SX3MsIAkiRmVsIHZpZCBs5HNuaW5nIGF2IGhq5GxwZmlsZW4gYCVzJyIKU1RJRF9JTkRFWCwgCQkiJklubmVo5WxsIgpTVElEX0NPTlRFTlRTLAkJIlNhbW1hbmRyYWciClNUSURfQkFDSywgCQkiJkJha+V0IgpTVElEX0FMTF9GSUxFUywgCSJBbGxhIGZpbGVyICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIkhq5GxwZmlsZXIgKCouaGxwKSIKU1RJRF9GSUxFX05PVF9GT1VORF9zCSJLYW4gaW50ZSBoaXR0YSAnJXMnLiBWaWxsIGR1IHP2a2EgZWZ0ZXIgZGVubmEgZmlsPyIKU1RJRF9OT19SSUNIRURJVAkiS2FuIGludGUgaGl0dGEgZW4gaW1wbGVtZW50YXRpb24gYXYgcmljaGVkaXQuLi4gQXZzbHV0YXIiClNUSURfUFNIX0lOREVYLAkJIkhq5GxwcnVicmlrZXI6ICIKfQoKQ09OVEVYVF9NRU5VIE1FTlUKQkVHSU4KICAgIFBPUFVQICIiCiAgICBCRUdJTgogICAgICAgIE1FTlVJVEVNICJLb21tZW50YXIuLi4iLCAgICAgICAgTU5JRF9DVFhUX0FOTk9UQVRFCiAgICAgICAgTUVOVUlURU0gIktvcGllcmEiLCAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKICAgICAgICBNRU5VSVRFTSAiU2tyaXYgdXQuLi4iLCAgICAgICAgIE1OSURfQ1RYVF9QUklOVAogICAgICAgIFBPUFVQICAgICJUeXBzbml0dCIKICAgICAgICBCRUdJTgogICAgICAgICAgICBNRU5VSVRFTSAiTGl0ZXQiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKICAgICAgICAgICAgTUVOVUlURU0gIk5vcm1hbHQiLCAgICAgIE1OSURfQ1RYVF9GT05UU19OT1JNQUwKICAgICAgICAgICAgTUVOVUlURU0gIlN0b3J0IiwgICAgICAgIE1OSURfQ1RYVF9GT05UU19MQVJHRQogICAgICAgIEVORAogICAgICAgIFBPUFVQICAgIkhq5GxwIGFsbHRpZCBzeW5saWciCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIlN0YW5kYXJkIiwgICAgIE1OSURfQ1RYVF9IRUxQX0RFRkFVTFQKICAgICAgICAgICAgTUVOVUlURU0gIlN5bmxpZyIsICAgICAgIE1OSURfQ1RYVF9IRUxQX1ZJU0lCTEUKICAgICAgICAgICAgTUVOVUlURU0gIkVqIHN5bmxpZyIsICBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCiAgICAgICAgRU5ECiAgICAgICAgTUVOVUlURU0gIkFuduRuZCBzeXN0ZW1m5HJnZXIiLCAgIE1OSURfQ1RYVF9TWVNURU1fQ09MT1JTCiAgICBFTkQKRU5ECg==