LyoKICogS29yZWFuIGxhbmd1YWdlIHJlc291cmNlIGZpbGUgZm9yIENyZWRlbnRpYWxzIFVJCiAqCiAqIENvcHlyaWdodCAyMDA3IFJvYmVydCBTaGVhcm1hbiAoZm9yIENvZGVXZWF2ZXJzKQogKiBDb3B5cmlnaHQgMjAwNyBZdW5Tb25nIEh3YW5nLciywLG8uihoeXM1NDVAZHJlYW13aXouY29tKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0tPUkVBTiwgU1VCTEFOR19ERUZBVUxUCgpJRERfQ1JFRERJQUxPRyBESUFMT0cgRElTQ0FSREFCTEUgIDAsIDAsIDIxMywgMTQ5ClNUWUxFIERTX01PREFMRlJBTUUgfCBEU19OT0lETEVNU0cgfCBEU19DRU5URVIgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIklEU19USVRMRUZPUk1BVCIKRk9OVCA5LCAiTVMgU2hlbGwgRGxnIgpCRUdJTgogICAgQ09OVFJPTCAgICAgICAgIElEQl9CQU5ORVIsLTEsIlN0YXRpYyIsU1NfQklUTUFQIHwgU1NfQ0VOVEVSSU1BR0UsMCwKICAgICAgICAgICAgICAgICAgICAwLDIxMywzNwogICAgTFRFWFQgICAgICAgICAgICJJRFNfTUVTU0FHRUZPUk1BVCIsSURDX01FU1NBR0UsOCw0OCwxOTksOCxOT1QgV1NfR1JPVVAKICAgIExURVhUICAgICAgICAgICAiu+e/68DaIMDMuKcoJlUpOiIsLTEsOCw2Miw3MiwxMixTU19DRU5URVJJTUFHRQogICAgQ09OVFJPTCAgICAgICAgICIiLElEQ19VU0VSTkFNRSwiQ29tYm9Cb3hFeDMyIixDQlNfRFJPUERPV04gfAogICAgICAgICAgICAgICAgICAgIENCU19OT0lOVEVHUkFMSEVJR0hUIHwgV1NfVEFCU1RPUCw4MCw2MiwxMjYsODcKICAgIExURVhUICAgICAgICAgICAivs/IoygmUCk6IiwtMSw4LDgwLDcyLDEyLFNTX0NFTlRFUklNQUdFCiAgICBFRElUVEVYVCAgICAgICAgSURDX1BBU1NXT1JELDgwLDgwLDEyNiwxMixFU19QQVNTV09SRCB8IEVTX0FVVE9IU0NST0xMCiAgICBDT05UUk9MICAgICAgICAgIrO7IL7PyKMgseK+7ygmUikiLElEQ19TQVZFLCJCdXR0b24iLAogICAgICAgICAgICAgICAgICAgIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AsODAsOTgsMTI2LDEyCiAgICBERUZQVVNIQlVUVE9OICAgIsiuwM4iLElET0ssOTcsMTI4LDUwLDE0CiAgICBQVVNIQlVUVE9OICAgICAgIsPrvNIiLElEQ0FOQ0VMLDE1NiwxMjgsNTAsMTQKRU5ECgoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogSURTX1RJVExFRk9STUFUICAgICAiICVzIL+ssOEiCiBJRFNfTUVTU0FHRUZPUk1BVCAgICIgJXMgv6yw4cHfIgogSURTX0lOQ09SUkVDVFBBU1NXT1JEVElUTEUgICK3zrHXv8IgIL3HxtAiCiBJRFNfSU5DT1JSRUNUUEFTU1dPUkQgICAgICAgIrTnvcXAxyC757/rwNogwMy4p7D6IL7PyKOwoVxuv8O52bilwfYgyK7AzsfPvcq9w7/AIgogSURTX0NBUFNMT0NLT05USVRMRSAiQ2FwcyBMb2NrICDEv8H8IgogSURTX0NBUFNMT0NLT04gICAgICAiQ2FwcyBMb2NrIMDMIMS/wa4gwNbAuLjpIL7PyKOwoSDA37j4wNS3wrXJILz2IMDWvcC0z7TZLlxuXG4gvs/Io7imIMDUt8LHz7HiIMD8v6FcbsWwuri15cDHIENhcHMgTG9jayDFsLimILL0vcOx4iC52bb4tM+02S4iCn0K