LyoKICogSGVscCBWaWV3ZXIKICoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKiBTd2VkaXNoIGxhbmd1YWdlIGJ5IEthcmwgQmFja3N0cvZtIDxrYXJsX2JAZ2VvY2l0aWVzLmNvbT4KICogQ29weXJpZ2h0IDIwMDIgU3lsdmFpbiBQZXRyZW9sbGUgPHNwZXRyZW9sbGVAeWFob28uZnI+CiAqIENvcHlyaWdodCAyMDA3LCAyMDA4IERhbmllbCBOeWxhbmRlciA8cG9AZGFuaWVsbnlsYW5kZXIuc2U+CiAqIENvcHlyaWdodCAyMDA5IEFuZGVycyBKb25zc29uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCi8qIE1lbnUgKi8KCk1BSU5fTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCnsKIFBPUFVQICImQXJraXYiIHsKICBNRU5VSVRFTSAiJtZwcG5hIiwgTU5JRF9GSUxFX09QRU4KICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiJlNrcml2IHV0IiwgTU5JRF9GSUxFX1BSSU5UCiAgTUVOVUlURU0gIlNrcml2YXIma29uZmlndXJhdGlvbi4uLiIsIE1OSURfRklMRV9TRVRVUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICBNRU5VSVRFTSAiQSZ2c2x1dGEiLCBNTklEX0ZJTEVfRVhJVAogfQogUE9QVVAgIlImZWRpZ2VyYSIgewogICBNRU5VSVRFTSAiJktvcGllcmEuLi4iLCBNTklEX0VESVRfQ09QWURMRwogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZLb21tZW50ZXJhLi4uIiwgTU5JRF9FRElUX0FOTk9UQVRFCiB9CiBQT1BVUCAiJkJva23kcmtlIiB7CiAgIE1FTlVJVEVNICImRGVmaW5pZXJhLi4uIiwgTU5JRF9CS01LX0RFRklORQogfQogUE9QVVAgIkEmbHRlcm5hdGl2IiB7CiAgIFBPUFVQCSJIauRscGVuIGFsbHRpZCBzeW5saWciCiAgIEJFR0lOCiAgICAgTUVOVUlURU0gIlN0YW5kYXJkIiwJTU5JRF9PUFRTX0hFTFBfREVGQVVMVAogICAgIE1FTlVJVEVNICJTeW5saWciLAlNTklEX09QVFNfSEVMUF9WSVNJQkxFCiAgICAgTUVOVUlURU0gIkludGUgc3lubGlnIiwJTU5JRF9PUFRTX0hFTFBfTk9OVklTSUJMRQogIEVORAogIE1FTlVJVEVNICJIaXN0b3JpayIsCQlNTklEX09QVFNfSElTVE9SWQogIFBPUFVQICAgICJUeXBzbml0dCIKICBCRUdJTgogICAgTUVOVUlURU0gIkxpdGV0IiwJCU1OSURfT1BUU19GT05UU19TTUFMTAogICAgTUVOVUlURU0gIk5vcm1hbHQiLCAgICAJTU5JRF9PUFRTX0ZPTlRTX05PUk1BTAogICAgTUVOVUlURU0gIlN0b3J0IiwgICAgIAlNTklEX09QVFNfRk9OVFNfTEFSR0UKICBFTkQKICBNRU5VSVRFTSAiQW525G5kIHN5c3RlbWbkcmdlciIsCU1OSURfT1BUU19TWVNURU1fQ09MT1JTCiB9CiBQT1BVUCAiJkhq5GxwIiB7CiAgIE1FTlVJVEVNICJIauRscCAmZvZyIGhq5GxwIiwgTU5JRF9IRUxQX0hFTFBPTgogICBNRU5VSVRFTSAiQWxsdGlkICb2dmVyc3QiLCBNTklEX0hFTFBfSEVMUFRPUAogICBNRU5VSVRFTSBTRVBBUkFUT1IKICAgTUVOVUlURU0gIiZJbmZvLi4uIiwgTU5JRF9IRUxQX0FCT1VUCiNpZmRlZiBXSU5FTElCCiAgIE1FTlVJVEVNICImT20gV2luZSIsIE1OSURfSEVMUF9XSU5FCiNlbmRpZgogfQp9CgpJRERfSU5ERVggRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIwMCwgMTkwIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpGT05UIDgsICJNUyBTaGVsbCBEbGciCkNBUFRJT04gIkluZGV4Igp7CiAgICBMSVNUQk9YIElEQ19JTkRFWExJU1QsIDEwLCAxMCwgMTgwLCAxNTAsIExCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVlNDUk9MTCB8IFdTX0JPUkRFUgp9CgpJRERfU0VBUkNIIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyMDAsIDE5MCBMQU5HVUFHRSBMQU5HX1NXRURJU0gsIFNVQkxBTkdfTkVVVFJBTApTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKRk9OVCA4LCAiTVMgU2hlbGwgRGxnIgpDQVBUSU9OICJT9msiCnsKICAgIExURVhUICAiSW50ZSBpbXBsZW1lbnRlcmF0IORubnUiLCAtMSwgMTAsIDEwLCAxODAsIDE1MAp9CgovKiBTdHJpbmdzICovClNUUklOR1RBQkxFIERJU0NBUkRBQkxFIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCnsKU1RJRF9XSU5FX0hFTFAsIAkiV2luZSBIauRscCIKU1RJRF9XSEVSUk9SLCAJCSJGRUwiClNUSURfV0FSTklORywgIAkJIlZBUk5JTkciClNUSURfSU5GTywgIAkJIkluZm9ybWF0aW9uIgpTVElEX05PVF9JTVBMRU1FTlRFRCwgCSJJbnRlIGltcGxlbWVudGVyYXQiClNUSURfSExQRklMRV9FUlJPUl9zLCAJIkZlbCB2aWQgbORzbmluZyBhdiBoauRscGZpbGVuIGAlcyciClNUSURfSU5ERVgsIAkJIiZJbm5laOVsbCIKU1RJRF9DT05URU5UUywJCSJTYW1tYW5kcmFnIgpTVElEX0JBQ0ssIAkJIiZCYWvldCIKU1RJRF9BTExfRklMRVMsIAkiQWxsYSBmaWxlciAoKi4qKSIKU1RJRF9IRUxQX0ZJTEVTX0hMUCwgCSJIauRscGZpbGVyICgqLmhscCkiClNUSURfRklMRV9OT1RfRk9VTkRfcwkiS2FuIGludGUgaGl0dGEgJyVzJy4gVmlsbCBkdSBz9mthIGVmdGVyIGRlbm5hIGZpbD8iClNUSURfTk9fUklDSEVESVQJIkthbiBpbnRlIGhpdHRhIGVuIGltcGxlbWVudGF0aW9uIGF2IHJpY2hlZGl0Li4uIEF2c2x1dGFyIgpTVElEX1BTSF9JTkRFWCwJCSJIauRscHJ1YnJpa2VyOiAiCn0KCkNPTlRFWFRfTUVOVSBNRU5VIExBTkdVQUdFIExBTkdfU1dFRElTSCwgU1VCTEFOR19ORVVUUkFMCkJFR0lOCiAgICBQT1BVUCAiIgogICAgQkVHSU4KICAgICAgICBNRU5VSVRFTSAiS29tbWVudGFyLi4uIiwgICAgICAgIE1OSURfQ1RYVF9BTk5PVEFURQogICAgICAgIE1FTlVJVEVNICJLb3BpZXJhIiwgICAgICAgICAgICAgIE1OSURfQ1RYVF9DT1BZCiAgICAgICAgTUVOVUlURU0gIlNrcml2IHV0Li4uIiwgICAgICAgICBNTklEX0NUWFRfUFJJTlQKICAgICAgICBQT1BVUCAgICAiVHlwc25pdHQiCiAgICAgICAgQkVHSU4KICAgICAgICAgICAgTUVOVUlURU0gIkxpdGV0IiwgICAgICAgTU5JRF9DVFhUX0ZPTlRTX1NNQUxMCiAgICAgICAgICAgIE1FTlVJVEVNICJOb3JtYWx0IiwgICAgICBNTklEX0NUWFRfRk9OVFNfTk9STUFMCiAgICAgICAgICAgIE1FTlVJVEVNICJTdG9ydCIsICAgICAgICBNTklEX0NUWFRfRk9OVFNfTEFSR0UKICAgICAgICBFTkQKICAgICAgICBQT1BVUCAgICJIauRscCBhbGx0aWQgc3lubGlnIgogICAgICAgIEJFR0lOCiAgICAgICAgICAgIE1FTlVJVEVNICJTdGFuZGFyZCIsICAgICBNTklEX0NUWFRfSEVMUF9ERUZBVUxUCiAgICAgICAgICAgIE1FTlVJVEVNICJTeW5saWciLCAgICAgICBNTklEX0NUWFRfSEVMUF9WSVNJQkxFCiAgICAgICAgICAgIE1FTlVJVEVNICJFaiBzeW5saWciLCAgTU5JRF9DVFhUX0hFTFBfTk9OVklTSUJMRQogICAgICAgIEVORAogICAgICAgIE1FTlVJVEVNICJBbnbkbmQgc3lzdGVtZuRyZ2VyIiwgICBNTklEX0NUWFRfU1lTVEVNX0NPTE9SUwogICAgRU5ECkVORAo=