LyoKICogQ29weXJpZ2h0IDIwMDMgSGFqaW1lIFNlZ2F3YQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgpMQU5HVUFHRSBMQU5HX0pBUEFORVNFLCBTVUJMQU5HX0RFRkFVTFQKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VIHwgV1NfVklTSUJMRQpDQVBUSU9OICJQcm9wZXJ0aWVzIGZvciAiCkZPTlQgOSwgIk1TIFVJIEdvdGhpYyIKQkVHSU4KICBERUZQVVNIQlVUVE9OICJPSyIsICAgICBJRE9LLDQsMTIyLDUwLDE0LCBXU19UQUJTVE9QIHwgV1NfR1JPVVAKICBQVVNIQlVUVE9OICAgICKDTIODg5ODWoOLIiwgSURDQU5DRUwsNTgsMTIyLDUwLDE0CiAgUFVTSEJVVFRPTiAgICAik0uXcCgmQSkiLCBJRENfQVBQTFlfQlVUVE9OLDExMiwxMjIsNTAsMTQsV1NfRElTQUJMRUQKICBQVVNIQlVUVE9OICAgICKDd4OLg3YiLCAgIElESEVMUCwxNjYsMTIyLDUwLDE0LFdTX1RBQlNUT1B8V1NfR1JPVVAKICBDT05UUk9MICAgICAgICJUYWIiLCAgICBJRENfVEFCQ09OVFJPTCwiU3lzVGFiQ29udHJvbDMyIixXU19DTElQU0lCTElOR1N8V1NfR1JPVVB8V1NfVEFCU1RPUCw0LDQsMjEyLDExNApFTkQKCgpJRERfV0laQVJEIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyOTAsIDE1OQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IFdTX1ZJU0lCTEUKQ0FQVElPTiAiV2l6YXJkIgpGT05UIDksICJNUyBVSSBHb3RoaWMiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiiq6XuSIsICBJRENfRklOSVNIX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgREVGUFVTSEJVVFRPTiAikGmC3igmTikgPiIsIElEQ19ORVhUX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiPCCW34LpKCZCKSIsIElEQ19CQUNLX0JVVFRPTiw3MSwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICKDTIODg5ODWoOLIiwgIElEQ0FOQ0VMLDE3OCwxMzgsNTAsMTQKICBQVVNIQlVUVE9OICAgICKDd4OLg3YiLCAgICBJREhFTFAsMjM1LDEzOCw1MCwxNCxXU19HUk9VUAogIExURVhUICAgICAgICAgIiIsICAgICAgICBJRENfU1VOS0VOX0xJTkUsNywxMjksMjc4LDEsU1NfU1VOS0VOCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgIElEQ19UQUJDT05UUk9MLCJTeXNUYWJDb250cm9sMzIiLFdTX0NMSVBTSUJMSU5HUyB8IFdTX0RJU0FCTEVELDcsNywyNTgsNQpFTkQKCgpJRERfVEJDVVNUT01JWkUgRElBTE9HIERJU0NBUkRBQkxFIDEwLCAyMCwgMzU3LCAxMjUKU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCkNBUFRJT04gIkN1c3RvbWl6ZSBUb29sYmFyIgpGT05UIDksICJNUyBVSSBHb3RoaWMiCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAilcKCtoLpKCZDKSIsICAgICBJRENBTkNFTCwzMDgsNiw0NCwxNAogIFBVU0hCVVRUT04gICAgIoOKg1qDYoNnKFImKSIsICAgICBJRENfUkVTRVRfQlROLDMwOCwyMyw0NCwxNAogIFBVU0hCVVRUT04gICAgIoN3g4uDdigmSCkiLCAgICAgIElEQ19IRUxQX0JUTiwzMDgsNDAsNDQsMTQKICBQVVNIQlVUVE9OICAgICKP44LWICgmVSkiLCAgIElEQ19NT1ZFVVBfQlROLDMwOCw3NCw0NCwxNAogIFBVU0hCVVRUT04gICAgIom6gtYgKCZEKSIsIElEQ19NT1ZFRE5fQlROLDMwOCw5MSw0NCwxNAogIExURVhUICAgICAgICAgIkEmdmFpbGFibGUgYnV0dG9uczoiLCAtMSw0LDUsODQsMTAKICBMSVNUQk9YICAgICAgIElEQ19BVkFJTEJUTl9MQk9YLDQsMTcsMTIwLDEwMCwgTEJTX05PVElGWSB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgfCBXU19UQUJTVE9QCiAgUFVTSEJVVFRPTiAgICAikseJwSgmQSkgLT4iLCAgICBJRE9LLCAxMzEsIDQyLCA0NCwgMTQKICBQVVNIQlVUVE9OICAgICI8LSCN7Y+cKCZSKSIsIElEQ19SRU1PVkVfQlROLDEzMSw2Miw0NCwxNAogIExURVhUICAgICAgICAgIiZUb29sYmFyIGJ1dHRvbnM6IiwgLTEsMTgyLDUsNzgsMTAKICBMSVNUQk9YICAgICAgIElEQ19UT09MQkFSQlROX0xCT1gsIDE4MiwxNywxMjAsMTAwLExCU19OT1RJRlkgfCBMQlNfT1dORVJEUkFXRklYRUQgfCBMQlNfSEFTU1RSSU5HUyB8IExCU19OT0lOVEVHUkFMSEVJR0hUIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19IU0NST0xMIHwgV1NfVEFCU1RPUApFTkQKClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19DTE9TRSAgICAiQ2xvc2UiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElETV9UT0RBWSAgICAiVG9kYXk6IgogICAgSURNX0dPVE9EQVkgICJHbyB0byB0b2RheSIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX1NFUEFSQVRPUiAiU2VwYXJhdG9yIgp9CgpTVFJJTkdUQUJMRSBESVNDQVJEQUJMRQp7CiAgICBIS1lfTk9ORSAiTm9uZSIKfQo=