LyoKICogQ29weXJpZ2h0IDIwMDMgSm9z6SBNYW51ZWwgRmVycmVyIE9ydGl6CiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb21jdGwzMi5oIgoKTEFOR1VBR0UgTEFOR19TUEFOSVNILCBTVUJMQU5HX05FVVRSQUwKCklERF9QUk9QU0hFRVQgRElBTE9HIERJU0NBUkRBQkxFIDAsIDAsIDIyMCwgMTQwClNUWUxFIERTX0NPTlRFWFRIRUxQIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUgfCBXU19WSVNJQkxFCkNBUFRJT04gIlByb3BpZWRhZGVzIGRlICVzIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiQWNlcHRhciIsICBJRE9LLDQsMTIyLDUwLDE0LCBXU19UQUJTVE9QIHwgV1NfR1JPVVAKICBQVVNIQlVUVE9OICAgICJDYW5jZWxhciIsIElEQ0FOQ0VMLDU4LDEyMiw1MCwxNAogIFBVU0hCVVRUT04gICAgIiZBcGxpY2FyIiwgSURDX0FQUExZX0JVVFRPTiwxMTIsMTIyLDUwLDE0LFdTX0RJU0FCTEVECiAgUFVTSEJVVFRPTiAgICAiQXl1ZGEiLCAgICBJREhFTFAsMTY2LDEyMiw1MCwxNCxXU19UQUJTVE9QfFdTX0dST1VQCiAgQ09OVFJPTCAgICAgICAiVGFiIiwgICAgSURDX1RBQkNPTlRST0wsIlN5c1RhYkNvbnRyb2wzMiIsV1NfQ0xJUFNJQkxJTkdTfFdTX0dST1VQfFdTX1RBQlNUT1B8VENTX01VTFRJTElORSw0LDQsMjEyLDExNApFTkQKCgpJRERfV0laQVJEIERJQUxPRyBESVNDQVJEQUJMRSAwLCAwLCAyOTAsIDE1OQpTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVSB8IFdTX1ZJU0lCTEUKQ0FQVElPTiAiQXl1ZGFudGUiCkZPTlQgOCwgIk1TIFNoZWxsIERsZyIKQkVHSU4KICBQVVNIQlVUVE9OICAgICI8ICZBbnRlcmlvciIsICBJRENfQkFDS19CVVRUT04sNzEsMTM4LDUwLDE0CiAgREVGUFVTSEJVVFRPTiAiJlNpZ3VpZW50ZSA+IiwgSURDX05FWFRfQlVUVE9OLDEyMSwxMzgsNTAsMTQKICBERUZQVVNIQlVUVE9OICJUZXJtaW5hciIsICAgICBJRENfRklOSVNIX0JVVFRPTiwxMjEsMTM4LDUwLDE0CiAgUFVTSEJVVFRPTiAgICAiQ2FuY2VsYXIiLCAgICAgSURDQU5DRUwsMTc4LDEzOCw1MCwxNAogIFBVU0hCVVRUT04gICAgIkF5dWRhIiwgICAgICAgIElESEVMUCwyMzUsMTM4LDUwLDE0LFdTX0dST1VQCiAgTFRFWFQgICAgICAgICAiIiwgICAgICAgIElEQ19TVU5LRU5fTElORSw3LDEyOSwyNzgsMSxTU19TVU5LRU4KICBDT05UUk9MICAgICAgICJUYWIiLCAgICAgSURDX1RBQkNPTlRST0wsIlN5c1RhYkNvbnRyb2wzMiIsV1NfQ0xJUFNJQkxJTkdTIHwgV1NfRElTQUJMRUQsNyw3LDI1OCw1CiAgTFRFWFQJICAgICAgICAiIiwgICAgICAgIElEQ19TVU5LRU5fTElORUhFQURFUiwwLDM1LDI5MCwxLFNTX0xFRlQgfCBTU19TVU5LRU4gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKRU5ECgoKSUREX1RCQ1VTVE9NSVpFIERJQUxPRyBESVNDQVJEQUJMRSAxMCwgMjAsIDM1NywgMTI1ClNUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQpDQVBUSU9OICJQZXJzb25hbGl6YXIgYmFycmEgZGUgaGVycmFtaWVudGFzIgpGT05UIDgsICJNUyBTaGVsbCBEbGciCkJFR0lOCiAgREVGUFVTSEJVVFRPTiAiJkNlcnJhciIsICAgICAgIElEQ0FOQ0VMLDMwOCw2LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiUiZlc3RhdXJhciIsICAgIElEQ19SRVNFVF9CVE4sMzA4LDIzLDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiJkF5dWRhIiwgICAgICAgIElEQ19IRUxQX0JUTiwzMDgsNDAsNDQsMTQKICBQVVNIQlVUVE9OICAgICJNb3ZlciBBJnJyaWJhIiwgSURDX01PVkVVUF9CVE4sMzA4LDc0LDQ0LDE0CiAgUFVTSEJVVFRPTiAgICAiTW92ZXIgQSZiYWpvIiwgIElEQ19NT1ZFRE5fQlROLDMwOCw5MSw0NCwxNAogIExURVhUICAgICAgICAgIkJvdG9uZXMgJmRpc3BvbmlibGVzOiIsIC0xLDQsNSw4NCwxMAogIExJU1RCT1ggICAgICAgSURDX0FWQUlMQlROX0xCT1gsNCwxNywxMjAsMTAwLCBMQlNfTk9USUZZIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfTk9JTlRFR1JBTEhFSUdIVCB8IExCU19ESVNBQkxFTk9TQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfSFNDUk9MTCB8IFdTX1RBQlNUT1AKICBQVVNIQlVUVE9OICAgICJBJvFhZGlyIC0+IiwgICBJRE9LLCAxMzEsIDQyLCA0NCwgMTQKICBQVVNIQlVUVE9OICAgICI8LSAmRWxpbWluYXIiLCBJRENfUkVNT1ZFX0JUTiwxMzEsNjIsNDQsMTQKICBMVEVYVCAgICAgICAgICJCJm90b25lcyBkZSBsYSBiYXJyYToiLCAtMSwxODIsNSw3OCwxMAogIExJU1RCT1ggICAgICAgSURDX1RPT0xCQVJCVE5fTEJPWCwgMTgyLDE3LDEyMCwxMDAsTEJTX05PVElGWSB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX05PSU5URUdSQUxIRUlHSFQgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfVlNDUk9MTCB8IFdTX0hTQ1JPTEwgfCBXU19UQUJTVE9QCkVORAoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSURTX0NMT1NFICAgICJDZXJyYXIiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElETV9UT0RBWSAgICAiSG95OiIKICAgIElETV9HT1RPREFZICAiSXIgYSBob3kiCn0KClNUUklOR1RBQkxFIERJU0NBUkRBQkxFCnsKICAgIElEU19TRVBBUkFUT1IgIlNlcGFyYWRvciIKfQoKU1RSSU5HVEFCTEUgRElTQ0FSREFCTEUKewogICAgSEtZX05PTkUgIk5pbmd1bm8iCn0K