LyoKICogQ29weXJpZ2h0IDIwMDUgSmFjZWsgQ2FiYW4KICogQ29weXJpZ2h0IDIwMDUsMjAwNiwyMDA3IFl1blNvbmcgSHdhbmcKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKCkxBTkdVQUdFIExBTkdfS09SRUFOLCBTVUJMQU5HX05FVVRSQUwKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19IVE1MRElTQUJMRUQgICAgIkhUTUwgt7u09bi1wLogx/bA5yCwobTJx8/B9iC+ysC9LiIKICAgIElEU19IVE1MRE9DVU1FTlQgICAgIkhUTUwgua68rSIKICAgSURTX0RPV05MT0FESU5HICAgICAitNm/7rfOteUgwd8uLi4iCiAgIElEU19JTlNUQUxMSU5HICAgICAgIryzxKEgwd8uLi4iCn0KCklEX0RXTF9ESUFMT0cgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgIDAsIDAsIDI2MCwgODUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IERTX0NFTlRFUiB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIldpbmUgR2Vja28gvLPEoSDHrrHXuLIiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKewogICAgTFRFWFQgIsDMIL7ux8O4rsTJwMy8x8C6IEhUTUwgxuTAzMH2uKYguri/qcHWt8Gw7SDH1bTPtNkuIFdpbmXAuiDAzCDG5MDMwfa4piC6uL+pwdax4iDAp8fYuKYgICIgXAogICAgIkdlY2tvIChNb3ppbGxhIEhUTUwgv6PB+Cm4piC8s8Shx9IgsM3A1LTPtNkuIFdpbmXAzCDA2rW/wLi3ziBHZWNrb7imILTZv+63zrXlx8+w7SC8s8Shx8+x4rimIL/4x9G02bjpICIgXAogICAiW7yzxKFdufbGsMC7IMWsuK/Hz73KvcO/wCIsIElEX0RXTF9TVEFUVVMsIDEwLCAxMCwgMjQwLCAzMCwgU1NfTEVGVAogICBDT05UUk9MICLB+Mfgwd8iLCBJRF9EV0xfUFJPR1JFU1MsIFBST0dSRVNTX0NMQVNTQSwgV1NfQk9SREVSfFBCU19TTU9PVEgsIDEwLCA0MCwgMjQwLCAxMgogICBERUZQVVNIQlVUVE9OICK8s8ShKCZJKSIsIElEX0RXTF9JTlNUQUxMLCAyMDAsIDYwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAogICBQVVNIQlVUVE9OICLD67zSKCZDKSIsIElEQ0FOQ0VMLCAxNDAsIDYwLCA1MCwgMTUsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAp9CgpJRERfSFlQRVJMSU5LIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDAsIDAsIDI1MCwgNjUKU1RZTEUgRFNfQ0VOVEVSIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKQ0FQVElPTiAix8/AzMbbuLXFqSIKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgp7CglHUk9VUEJPWCAix8/AzMbbuLXFqSDBpLq4IiwgSURDX1NUQVRJQywgNSwgNSwgMTkwLCA1NQoJTFRFWFQgIsf8vcQoJlQpOiIsIElEQ19TVEFUSUMsIDEwLCAyMiwgMjQsIDEwCglDT01CT0JPWCBJRENfVFlQRSwgMzUsIDIwLCA0NSwgMTAwLCBXU19UQUJTVE9QIHwgV1NfR1JPVVAgfCBXU19WU0NST0xMIHwgQ0JTX0RST1BET1dOTElTVCB8IAlDQlNfSEFTU1RSSU5HUwoJTFRFWFQgIsHWvNIoJlUpOiIsIElEQ19TVEFUSUMsIDEwLCA0MiwgMjQsIDEwCglFRElUVEVYVCBJRENfVVJMLCAzNSwgNDAsIDE1MCwgMTQsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCglQVVNIQlVUVE9OICLIrsDOIiwgSURPSywgMjAwLCAxMCwgNDUsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCglQVVNIQlVUVE9OICLD67zSIiwgSURDQU5DRUwsIDIwMCwgMjgsIDQ1LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCn0K