LyoKICogIE5vdGVwYWQgKEZpbm5pc2ggcmVzb3VyY2VzKQogKgogKiAgQ29weXJpZ2h0IDE5OTkgYnkgSnVra2EgSWl2b25lbiA8aWl2b25lbkBpa2kuZmk+CiAqICBDb3B5cmlnaHQgMjAwMiBTeWx2YWluIFBldHJlb2xsZSA8c3BldHJlb2xsZUB5YWhvby5mcj4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKTEFOR1VBR0UgTEFOR19GSU5OSVNILCBTVUJMQU5HX0RFRkFVTFQKCk1BSU5fTUVOVSBNRU5VCnsKIFBPUFVQICImVGllZG9zdG8iIHsKICBNRU5VSVRFTSAiJlV1c2lcdEN0cmwrTiIsCQlDTURfTkVXCiAgTUVOVUlURU0gIiZBdmFhLi4uXHRDdHJsK08iLAkJQ01EX09QRU4KICBNRU5VSVRFTSAiVGEmbGxldGFcdEN0cmwrUyIsCQlDTURfU0FWRQogIE1FTlVJVEVNICJUYWxsZXRhICZuaW1lbGzkLi4uIiwJQ01EX1NBVkVfQVMKICBNRU5VSVRFTSAiVCZ1bG9zdGEuLi5cdEN0cmwrUCIsCQlDTURfUFJJTlQKICBNRU5VSVRFTSAiJlNpdnVuIGFzZXR1a3NldC4uLiIsCUNNRF9QQUdFX1NFVFVQCiAgTUVOVUlURU0gIiZLaXJqb2l0dGltZW4gYXNldHVrc2V0Li4uIiwJQ01EX1BSSU5URVJfU0VUVVAKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlBvaXN0dSIsCQlDTURfRVhJVAogfQpQT1BVUCAiJk11b2trYWEiIHsKICBNRU5VSVRFTSAiJlBhbGF1dGFcdEN0cmwrWiIsCUNNRF9VTkRPCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIiZMZWlra2FhXHRDdHJsK1giLAlDTURfQ1VUCiAgTUVOVUlURU0gIiZLb3Bpb2lcdEN0cmwrQyIsCUNNRF9DT1BZCiAgTUVOVUlURU0gIkwmaWl05Fx0Q3RybCtWIiwJQ01EX1BBU1RFCiAgTUVOVUlURU0gIlAmb2lzdGFcdERlbCIsCUNNRF9ERUxFVEUKICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlZhbGl0c2Uga2Fpa2tpIiwJQ01EX1NFTEVDVF9BTEwKICBNRU5VSVRFTSAiJkFpa2EvUORpduRt5ORy5Fx0RjUiLAlDTURfVElNRV9EQVRFCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgTUVOVUlURU0gIkthJnRrYWlzZSBwaXRr5CByaXZpIiwJQ01EX1dSQVAKIH0KUE9QVVAgIiZFdHNpIiB7CiAgTUVOVUlURU0gIkV0c2kuLi4iLAkJQ01EX1NFQVJDSAogIE1FTlVJVEVNICJFdHNpICZzZXVyYWF2YVx0RjMiLAlDTURfU0VBUkNIX05FWFQKIH0KUE9QVVAgIiZBcHVhIiB7CiAgTUVOVUlURU0gIiZTaXPkbHT2IiwJCUNNRF9IRUxQX0NPTlRFTlRTCiAgTUVOVUlURU0gIiZFdHNpLi4uIiwJCUNNRF9IRUxQX1NFQVJDSAogIE1FTlVJVEVNICJBcHVhICZPcGFzdHVrc2VzdGEiLAlDTURfSEVMUF9PTl9IRUxQCiAgTUVOVUlURU0gU0VQQVJBVE9SCiAgUE9QVVAgIkluZiZvIiB7CiAgIE1FTlVJVEVNICImTGlzZW5zc2kuLi4iLAlDTURfTElDRU5TRQogICBNRU5VSVRFTSAiJkVJIFRBS1VVVEEuLi4iLAlDTURfTk9fV0FSUkFOVFkKICAgTUVOVUlURU0gIiZUaWV0b2phIFdpbmU6aXN0YS4uLiIsCUNNRF9BQk9VVF9XSU5FCiAgfQogfQp9CgovKiBEaWFsb2cgYFBhZ2Ugc2V0dXAnICovCgpESUFMT0dfUEFHRVNFVFVQIERJQUxPRyAwLCAwLCAyMjUsIDk1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIlNpdnVuIGFzZXR1a3NldCIKewpMVEVYVCAgICAiJlls5G90c2lra286IiwgIDB4MTQwLCAgIDEwLCAwNywgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQxLCAgICAgICA2MCwgMDUsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUApMVEVYVCAgICAiQWxhbyZ0c2lra286IiwgIDB4MTQyLCAgIDEwLCAyNCwgNDAsIDE1CkVESVRURVhUICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTQzLCAgICAgICA2MCwgMjIsMTEwLCAxMiwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAoKR1JPVVBCT1ggIiZNYXJnaW5hYWxpOiIsICAgICAgMHgxNDQsICAgICAxMCwgNDMsMTYwLCA0NQpMVEVYVCAgICAiJlZhc2VuOiIsICAgICAgICAweDE0NSwgICAyMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX0xFRlRWQUxVRSwqLyAgIDB4MTQ3LCAgICAgICA1MCwgNTUsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICJZJmzkOiIsICAgICAgICAgMHgxNDgsICAgIDIwLCA3MywgMzAsIDEwLCBXU19DSElMRApFRElUVEVYVCAvKlNUUklOR19QQUdFU0VUVVBfVE9QVkFMVUUsKi8gICAgMHgxNEEsICAgICAgICA1MCwgNzMsIDM1LCAxMSwgV1NfQ0hJTEQgfCBXU19CT1JERVIgfCBXU19UQUJTVE9QCkxURVhUICAgICImT2lrZWE6IiwgICAgICAgMHgxNEIsIDEwMCwgNTUsIDMwLCAxMCwgV1NfQ0hJTEQKRURJVFRFWFQgLypTVFJJTkdfUEFHRVNFVFVQX1JJR0hUVkFMVUUsKi8gIDB4MTRELCAgICAgMTMwLCA1NSwgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKTFRFWFQgICAgIiZBbGE6IiwgICAgICAweDE0RSwxMDAsIDczLCAzMCwgMTAsIFdTX0NISUxECkVESVRURVhUIC8qU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwqLyAweDE1MCwgICAgMTMwLCA3MywgMzUsIDExLCBXU19DSElMRCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKCkRFRlBVU0hCVVRUT04gIk9LIiwgICAgICAgICBJRE9LLCAgICAgICAgICAgICAgICAgICAxODAsICAzLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiUGVydXV0YSIsICAgICBJRENBTkNFTCwgICAgICAgICAgICAgICAxODAsIDIxLCA0MCwgMTUsIFdTX1RBQlNUT1AKUFVTSEJVVFRPTiAgICAiJkFwdWEiLCAgICAgICBJREhFTFAsICAgICAgICAgICAgICAgIDE4MCwgMzksIDQwLCAxNSwgV1NfVEFCU1RPUAp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7ClNUUklOR19QQUdFU0VUVVBfSEVBREVSVkFMVUUsCSImbiIgICAgICAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfRk9PVEVSVkFMVUUsCSJTaXZ1ICZzIiAgIC8qIEZJWE1FICovClNUUklOR19QQUdFU0VUVVBfTEVGVFZBTFVFLAkJIjIwIG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9SSUdIVFZBTFVFLAkiMjAgbW0iICAgICAvKiBGSVhNRSAqLwpTVFJJTkdfUEFHRVNFVFVQX1RPUFZBTFVFLAkJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KU1RSSU5HX1BBR0VTRVRVUF9CT1RUT01WQUxVRSwJIjI1IG1tIiAgICAgLyogRklYTUUgKi8KClNUUklOR19OT1RFUEFELAkJCQkJIk5vdGVwYWQiClNUUklOR19FUlJPUiwJCQkJCSJWSVJIRSIKU1RSSU5HX1dBUk5JTkcsCQkJCQkiVkFST0lUVVMiClNUUklOR19JTkZPLAkJCQkJIlRpZWRvaXR1cyIKClNUUklOR19VTlRJVExFRCwJCQkJIihvdHNpa29pbWF0b24pIgoKU1RSSU5HX0FMTF9GSUxFUywJCQkJIkthaWtraSB0aWVkb3N0b3QgKCouKikiClNUUklOR19URVhUX0ZJTEVTX1RYVCwJCQkiVGVrc3RpIHRpZWRvc3RvdCAoKi50eHQpIgoKU1RSSU5HX1RPT0xBUkdFLAkJCQkiVGllZG9zdG8gJyVzJyBvbiBsaWlhbiBzdXVyaS5cbiBcClBsZWFzZSB1c2UgYSBkaWZmZXJlbnQgZWRpdG9yLiIKU1RSSU5HX05PVEVYVCwJCQkJCSJFdCBzefZ0dORueXQgbGFpbmthYW4gdGVrc3Rp5C4gXApcbktpcmpvaXRhIGpvdGFpbiBqYSB5cml05CB1dWRlbGxlZW4iClNUUklOR19ET0VTTk9URVhJU1QsCQkJCSJGaWxlICclcydcbmRvZXMgbm90IGV4aXN0XG5cbiBcCkRvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlID8iClNUUklOR19OT1RTQVZFRCwJCQkJIkZpbGUgJyVzJ1xuaGFzIGJlZW4gbW9kaWZpZWRcblxuIFwKV291bGQgeW91IGxpa2UgdG8gc2F2ZSB0aGUgY2hhbmdlcyA/IgpTVFJJTkdfTk9URk9VTkQsCQkJCQkiJyVzJyBlaSBs9nlkeS4iClNUUklOR19PVVRfT0ZfTUVNT1JZLAkJCSJNdWlzdGlhIGVpIG9sZSByaWl0dOR25HN0aSB05G3kbiBcClxudGVodOR25G4gdGVrZW1pc2Vrc2kuIFN1bGplIGpva2luIHNvdmVsbHVzIHZhcGF1dHRhYWtzZXNpXG4gXAptdWlzdGlhLiIKCn0K