LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICogQ29weXJpZ2h0IDIwMDQgUGlvdHIgQ2FiYW4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogTWVudSAqLwoKTUFJTl9NRU5VIE1FTlUgTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVAp7CiBQT1BVUCAiJlBsaWsiIHsKICBNRU5VSVRFTSAiJk90d/NyeiIsIE1OSURfRklMRV9PUEVOCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZEcnVrdWoiLCBNTklEX0ZJTEVfUFJJTlQKICBNRU5VSVRFTSAiJlVzdGF3aWVuaWEgZHJ1a2Fya2kuLi4iLCBNTklEX0ZJTEVfU0VUVVAKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZXeWqcY2llIiwgTU5JRF9GSUxFX0VYSVQKIH0KIFBPUFVQICImRWR5Y2phIiB7CiAgIE1FTlVJVEVNICImS29waXVqLi4uIiwgTU5JRF9FRElUX0NPUFlETEcKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImU2tvbWVudHVqLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJlpha7NhZGthIiB7CiAgIE1FTlVJVEVNICImWmRlZmluaXVqLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIiZPcHRpb25zIiB7CiAgIFBPUFVQCSJIZWxwIGFsd2F5cyB2aXNpYmxlIgogICBCRUdJTgogICAgIE1FTlVJVEVNICJEZWZhdWx0IiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJWaXNpYmxlIiwJTU5JRF9PUFRTX0hFTFBfVklTSUJMRQogICAgIE1FTlVJVEVNICJOb24gdmlzaWJsZSIsCU1OSURfT1BUU19IRUxQX05PTlZJU0lCTEUKICBFTkQKICBNRU5VSVRFTSAiSGlzdG9yeSIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJGb250cyIKICBCRUdJTgogICAgTUVOVUlURU0gIlNtYWxsIiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbCIsICAgIAlNTklEX09QVFNfRk9OVFNfTk9STUFMCiAgICBNRU5VSVRFTSAiTGFyZ2UiLCAgICAgCU1OSURfT1BUU19GT05UU19MQVJHRQogIEVORAogIE1FTlVJVEVNICJVc2Ugc3lzdGVtIGNvbG9ycyIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiUG9tbyZjIiB7CiAgIE1FTlVJVEVNICImUG9tb2MiLCBNTklEX0hFTFBfSEVMUE9OCiAgIE1FTlVJVEVNICImWmF3c3plIG5hIHdpZXJ6Y2h1IiwgTU5JRF9IRUxQX0hFTFBUT1AKICAgTUVOVUlURU0gU0VQQVJBVE9SCiAgIE1FTlVJVEVNICImTyBwcm9ncmFtaWUuLi4iLCBNTklEX0hFTFBfQUJPVVQKI2lmZGVmIFdJTkVMSUIKICAgTUVOVUlURU0gIiZPIHByb2dyYW1pZSBXSU5FIiwgTU5JRF9IRUxQX1dJTkUKI2VuZGlmCiB9Cn0KCklERF9JTkRFWCBESUFMT0cgRElTQ0FSREFCTEUgMCwgMCwgMjAwLCAxOTAgTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJJbmRla3MiCnsKICAgIExJU1RCT1ggSURDX0lOREVYTElTVCwgMTAsIDEwLCAxODAsIDE1MCwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBXU19WU0NST0xMIHwgV1NfQk9SREVSCn0KCi8qIFN0cmluZ3MgKi8KU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUgTEFOR1VBR0UgTEFOR19QT0xJU0gsIFNVQkxBTkdfREVGQVVMVAp7ClNUSURfV0lORV9IRUxQLCAJIldJTkUgLSBQb21vYyIKU1RJRF9XSEVSUk9SLCAJCSJCo6VEIgpTVElEX1dBUk5JTkcsICAJCSJPU1RSWkWvRU5JRSIKU1RJRF9JTkZPLCAgCQkiSW5mb3JtYWNqYSIKU1RJRF9OT1RfSU1QTEVNRU5URUQsIAkiTmllIHphaW1wbGVtZW50b3dhbmUiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkKzuWQgdyB0cmFrY2llIG9kY3p5dHUgcGxpa3UgcG9tb2N5IGAlcyciClNUSURfSU5ERVgsIAkJIiZaYXdhcnRvnOYiClNUSURfQ09OVEVOVFMsIAkJIiZTenVrYWoiClNUSURfQkFDSywgCQkiJldzdGVjeiIKU1RJRF9BTExfRklMRVMsIAkiV3N6eXN0a2llIHBsaWtpICgqLiopIgpTVElEX0hFTFBfRklMRVNfSExQLCAJIlBsaWtpIHBvbW9jeSAoKi5obHApIgpTVElEX0ZJTEVfTk9UX0ZPVU5EX3MJIk5pZSB6bmFsZXppb25vIHBsaWt1ICclcycuIEN6eSBjaGNlc3ogcG9zenVrYeYgdGVnbyBwbGlrdSBzYW1vZHppZWxuaWU/IgpTVElEX05PX1JJQ0hFRElUCSJOaWUgdWRhs28gc2nqIHpuYWxln+YgbW9kdbN1IHJpY2hlZGl0Li4uIFd5nHdpZXRsZW5pZSBwb21vY3kgbmllIGplc3QgbW+/bGl3ZSIKU1RJRF9QU0hfSU5ERVgsCQkiSGVscCB0b3BpY3M6ICIKfQoKCkNPTlRFWFRfTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfUE9MSVNILCBTVUJMQU5HX0RFRkFVTFQKQkVHSU4KCVBPUFVQICIiCglCRUdJTgoJCU1FTlVJVEVNICJBZG5vdGFjamEuLi4iLCAgICAgICBNTklEX0NUWFRfQU5OT1RBVEUKCQlNRU5VSVRFTSAiS29waXVqIiwgICAgICAgICAgICAgICAgTU5JRF9DVFhUX0NPUFkKCQlNRU5VSVRFTSAiRHJ1a3VqLi4uIiwgICAgICAgICAgICBNTklEX0NUWFRfUFJJTlQKCQlQT1BVUCAgICAiQ3pjaW9ua2EiCgkJQkVHSU4KCQkJTUVOVUlURU0gIk1hs2EiLCAgICAgICBNTklEX0NUWFRfRk9OVFNfU01BTEwKCQkJTUVOVUlURU0gIk5vcm1hbG5hIiwgICAgICBNTklEX0NUWFRfRk9OVFNfTk9STUFMCgkJCU1FTlVJVEVNICJEdb9hIiwgICAgICAgTU5JRF9DVFhUX0ZPTlRTX0xBUkdFCgkJRU5ECgkJUE9QVVAgICAiUG9tb2MgemF3c3plIHdpZG9jem5hIgoJCUJFR0lOCgkJCU1FTlVJVEVNICJEb215nGxuaWUiLCAgICAgTU5JRF9DVFhUX0hFTFBfREVGQVVMVAoJCQlNRU5VSVRFTSAiV2lkb2N6bmEiLCAgICAgTU5JRF9DVFhUX0hFTFBfVklTSUJMRQoJCQlNRU5VSVRFTSAiTmlld2lkb2N6bmEiLCBNTklEX0NUWFRfSEVMUF9OT05WSVNJQkxFCgkJRU5ECgkJTUVOVUlURU0gIlW/eWoga29sb3LzdyBzeXN0ZW1vd3ljaCIsICAgTU5JRF9DVFhUX1NZU1RFTV9DT0xPUlMKCUVORApFTkQK