ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjE3LjAgKDEzIFNlcHRlbWJlciAyMDA3KQoKRGFuaWVsIFMgKDEyIFNlcHRlbWJlciAyMDA3KQotIEJ1ZyByZXBvcnQgIzE3OTI2NDkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3OTI2NDkpIHBvaW50ZWQKICBvdXQgYSBwcm9ibGVtIHdpdGggZG9pbmcgYW4gZW1wdHkgdXBsb2FkIG92ZXIgRlRQIG9uIGEgcmUtdXNlZCBjb25uZWN0aW9uLgogIEkgYWRkZWQgdGVzdCBjYXNlIDU0MSB0byByZXByb2R1Y2UgaXQgYW5kIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBJIG5vdGljZWQgd2hpbGUgd3JpdGluZyB0ZXN0IDU0MSB0aGF0IHRoZSBGVFAgY29kZSB3cm9uZ2x5IGRpZCBhIENXRCBvbiB0aGUKICBzZWNvbmQgdHJhbnNmZXIgYXMgaXQgZGlkbid0IHN0b3JlIGFuZCByZW1lbWJlciB0aGUgIiIgcGF0aCBmcm9tIHRoZQogIHByZXZpb3VzIHRyYW5zZmVyIHNvIGl0IHdvdWxkIGluc3RlYWQgQ1dEIHRvIHRoZSBlbnRyeSBwYXRoIGFzIHN0b3JlZC4gVGhpcwogIHdvcmtlZCwgYnV0IGRpZCBhIHN1cGVyZmx1b3VzIGNvbW1hbmQuIFRodXMsIHRlc3QgY2FzZSA1NDEgbm93IGFsc28gdmVyaWZpZXMKICB0aGlzIGZpeC4KCkRhbiBGICg1IFNlcHRlbWJlciAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZSAxMDA3IHRvIHRlc3QgcGVybWlzc2lvbiBwcm9ibGVtIHdoZW4gdXBsb2FkaW5nIHdpdGggVEZUUAogICh0byB2YWxpZGF0ZSBidWcgIzE3OTA0MDMpLgoKLSBURlRQIG5vdyByZXBvcnRzIHRoZSAibm90IGRlZmluZWQiIFRGVFAgZXJyb3IgY29kZSAwIGFzIGFuIGVycm9yLAogIG5vdCBzdWNjZXNzLgoKRGFuaWVsIFMgKDUgU2VwdGVtYmVyIDIwMDcpCi0gQ29udGludWVkIHRoZSB3b3JrIG9uIGEgZml4IGZvciAjMTc3OTA1NAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KS4gTXkgcHJldmlvdXMgZml4IGZyb20gQXVndXN0CiAgMjQgd2FzIG5vdCBjb21wbGV0ZSAoZWl0aGVyKSBidXQgY291bGQgYWNjaWRlbnRhbGx5ICJmb3JnZXQiIHBhcnRzIG9mIGEKICBzZXJ2ZXIgcmVzcG9uc2Ugd2hpY2ggbGVkIHRvIGZhdWx0eSBzZXJ2ZXIgcmVzcG9uc2UgdGltZS1vdXQgZXJyb3JzLgoKRGFuIEYgKDUgU2VwdGVtYmVyIDIwMDcpCi0gTWluaXggZG9lc24ndCBzdXBwb3J0IGdldHNvY2tvcHQgb24gVURQIHNvY2tldHMgb3Igc2VuZC9yZWN2IG9uIFRDUAogIHNvY2tldHMuCgpEYW4gRiAoMzEgQXVndXN0IDIwMDcpCi0gTWFkZSBzb21lIG9mIHRoZSBlcnJvciBzdHJpbmdzIHJldHVybmVkIGJ5IHRoZSAqc3RyZXJyb3IgZnVuY3Rpb25zIG1vcmUKICBnZW5lcmljLCBhbmQgbW9yZSBjb25zaXN0ZW50IHdpdGggZWFjaCBvdGhlci4KCi0gUmVuYW1lZCB0aGUgY3VybF9mdHBzc2wgZW51bSB0byBjdXJsX3VzZXNzbCBhbmQgaXRzIGVudW1lcmF0ZWQgY29uc3RhbnRzLAogIGNyZWF0aW5nIG1hY3JvcyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKCiAgICBDVVJMRlRQU1NMX05PTkUgPT4gQ1VSTFVTRVNTTF9OT05FCiAgICBDVVJMRlRQU1NMX1RSWSA9PiBDVVJMVVNFU1NMX1RSWQogICAgQ1VSTEZUUFNTTF9DT05UUk9MID0+IENVUkxVU0VTU0xfQ09OVFJPTAogICAgQ1VSTEZUUFNTTF9BTEwgPT4gQ1VSTFVTRVNTTF9BTEwKICAgIENVUkxGVFBTU0xfTEFTVCA9PiBDVVJMVVNFU1NMX0xBU1QKCkRhbiBGICgzMCBBdWd1c3QgMjAwNykKLSBSZW5hbWVkIHNldmVyYWwgbGliY3VybCBlcnJvciBjb2RlcyBhbmQgb3B0aW9ucyB0byBtYWtlIHRoZW0gbW9yZSBnZW5lcmFsCiAgYW5kIGFsbG93IHJldXNlIGJ5IG11bHRpcGxlIHByb3RvY29scy4gU2V2ZXJhbCB1bnVzZWQgZXJyb3IgY29kZXMgd2VyZQogIHJlbW92ZWQuICBJbiBhbGwgY2FzZXMsIG1hY3JvcyB3ZXJlIGFkZGVkIHRvIHByZXNlcnZlIHNvdXJjZSAoYW5kIGJpbmFyeSkKICBjb21wYXRpYmlsaXR5IHdpdGggdGhlIG9sZCBuYW1lcy4gIFRoZXNlIG1hY3JvcyBhcmUgc3ViamVjdCB0byByZW1vdmFsIGF0CiAgYSBmdXR1cmUgZGF0ZSwgYnV0IHByb2JhYmx5IG5vdCBiZWZvcmUgMjAwOS4gIEFuIGFwcGxpY2F0aW9uIGNhbiBiZQogIHRlc3RlZCB0byBzZWUgaWYgaXQgaXMgdXNpbmcgYW55IG9ic29sZXRlIGNvZGUgYnkgY29tcGlsaW5nIGl0IHdpdGggdGhlCiAgQ1VSTF9OT19PTERJRVMgbWFjcm8gZGVmaW5lZC4KCiAgVGhlIGZvbGxvd2luZyB1bnVzZWQgZXJyb3IgY29kZXMgd2VyZSByZW1vdmVkOgoKICAgIENVUkxFX0JBRF9DQUxMSU5HX09SREVSCiAgICBDVVJMRV9CQURfUEFTU1dPUkRfRU5URVJFRAogICAgQ1VSTEVfRlRQX0NBTlRfUkVDT05ORUNUCiAgICBDVVJMRV9GVFBfQ09VTEROVF9HRVRfU0laRQogICAgQ1VSTEVfRlRQX0NPVUxETlRfU0VUX0FTQ0lJCiAgICBDVVJMRV9GVFBfVVNFUl9QQVNTV09SRF9JTkNPUlJFQ1QKICAgIENVUkxFX0ZUUF9XRUlSRF9VU0VSX1JFUExZCiAgICBDVVJMRV9GVFBfV1JJVEVfRVJST1IKICAgIENVUkxFX0xJQlJBUllfTk9UX0ZPVU5ECiAgICBDVVJMRV9NQUxGT1JNQVRfVVNFUgogICAgQ1VSTEVfT0JTT0xFVEUKICAgIENVUkxFX1NIQVJFX0lOX1VTRQogICAgQ1VSTEVfVVJMX01BTEZPUk1BVF9VU0VSCgogIFRoZSBmb2xsb3dpbmcgZXJyb3IgY29kZXMgd2VyZSByZW5hbWVkOgoKICAgIENVUkxFX0ZUUF9BQ0NFU1NfREVOSUVEID0+ICAgICAgQ1VSTEVfUkVNT1RFX0FDQ0VTU19ERU5JRUQKICAgIENVUkxFX0ZUUF9DT1VMRE5UX1NFVF9CSU5BUlkgPT4gQ1VSTEVfRlRQX0NPVUxETlRfU0VUX1RZUEUKICAgIENVUkxFX0ZUUF9TU0xfRkFJTEVEID0+ICAgICAgICAgQ1VSTEVfVVNFX1NTTF9GQUlMRUQKICAgIENVUkxFX0ZUUF9RVU9URV9FUlJPUiA9PiAgICAgICAgQ1VSTEVfUVVPVEVfRVJST1IKICAgIENVUkxFX1RGVFBfRElTS0ZVTEwgPT4gICAgICAgICAgQ1VSTEVfUkVNT1RFX0RJU0tfRlVMTAogICAgQ1VSTEVfVEZUUF9FWElTVFMgPT4gICAgICAgICAgICBDVVJMRV9SRU1PVEVfRklMRV9FWElTVFMKICAgIENVUkxFX0hUVFBfUkFOR0VfRVJST1IgPT4gICAgICAgQ1VSTEVfUkFOR0VfRVJST1IgCgogIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyB3ZXJlIHJlbmFtZWQ6CgogICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0QgPT4gQ1VSTE9QVF9LRVlQQVNTV0QgCiAgICBDVVJMT1BUX0ZUUEFQUEVORCA9PiAgICBDVVJMT1BUX0FQUEVORAogICAgQ1VSTE9QVF9GVFBMSVNUT05MWSA9PiAgQ1VSTE9QVF9ESVJMSVNUT05MWQogICAgQ1VSTE9QVF9GVFBfU1NMID0+ICAgICAgQ1VSTE9QVF9VU0VfU1NMCgogIEEgZmV3IG1vcmUgY2hhbmdlcyB3aWxsIHRha2UgcGxhY2Ugd2l0aCB0aGUgbmV4dCBTT05BTUUgYnVtcCBvZiB0aGUKICBsaWJyYXJ5LiAgVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gZG9jcy9UT0RPCgotIERvY3VtZW50ZWQgc29tZSBuZXdlciBlcnJvciBjb2RlcyBpbiBsaWJjdXJsLWVycm9yKDMpCgotIEFkZGVkIG1vcmUgYWNjdXJhdGUgZXJyb3IgY29kZSByZXR1cm5zIGZyb20gU0ZUUCBvcGVyYXRpb25zLiAgQWRkZWQgdGVzdAogIGNhc2UgNjE1IHRvIHRlc3QgYW4gU0ZUUCB1cGxvYWQgZmFpbHVyZS4KCkRhbiBGICgyOCBBdWd1c3QgMjAwNykKLSBTb21lIG1pbm9yIGludGVybmFsIHR5cGUgYW5kIGNvbnN0IGNoYW5nZXMgYmFzZWQgb24gYSBzcGxpbnQgc2Nhbi4KCkRhbmllbCBTICgyNCBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIGxhcmdlIHJlc3BvbnNlcyBmcm9tIHNlcnZlciBjb21tYW5kcywgd2hlbgogIHRoZSBzaW5nbGUgcmVzcG9uc2Ugd2FzIGNvbnNpc3Rpbmcgb2YgbXVsdGlwbGUgbGluZXMgYnV0IG9mIGEgdG90YWwgc2l6ZSBvZgogIDE2S0Igb3IgbW9yZS4gRGFuIEZhbmRyaWNoIGltcHJvdmVkIHRoZSBmdHAgdGVzdCBzY3JpcHQgYW5kIHByb3ZpZGVkIHRlc3QKICBjYXNlIDEwMDYgdG8gcmVwZWF0IHRoZSBwcm9ibGVtLCBhbmQgSSBmaXhlZCB0aGUgY29kZSB0byBtYWtlIHN1cmUgdGhpcyBuZXcKICB0ZXN0IGNhc2UgcnVucyBmaW5lLgoKUGF0cmljayBNICgyMyBBdWd1c3QgMjAwNykKLSBPUy80MDAgcG9ydDogbmV3IGZpbGVzIGxpYi9jb25maWctb3M0MDAuaCBsaWIvc2V0dXAtb3M0MDAuaCBwYWNrYWdlcy9PUzQwMC8qLgogIFNlZSBwYWNrYWdlcy9PUzQwMC9SRUFETUUuT1M0MDAuCgpEYW5pZWwgUyAoMjMgQXVndXN0IDIwMDcpCi0gQnVnIHJlcG9ydCAjMTc3OTc1MSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3OTc1MSkgcG9pbnRlZAogIG91dCB0aGF0IGRvaW5nIGZpcnN0IGEgZmlsZTovLyB1cGxvYWQgYW5kIHRoZW4gYW4gRlRQIHVwbG9hZCBjcmFzaGVkIGxpYmN1cmwKICBvciBhdCBiZXN0IGNhdXNlZCBmdXJpb3VzIHZhbGdyaW5kIGNvbXBsYWludHMuIEZpeGVkIG5vdyEKCkRhbmllbCBTICgyMiBBdWd1c3QgMjAwNykKLSBCdWcgcmVwb3J0ICMxNzc5MDU0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzc5MDU0KSBwb2ludGVkCiAgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgZGVhbCB3aXRoIHZlcnkgbG9uZyAoPjE2SykgRlRQIHNlcnZlciByZXNwb25zZSBsaW5lcwogIHByb3Blcmx5LiBTdGFydGluZyBub3csIGxpYmN1cmwgd2lsbCBjaG9wIHRoZW0gb2ZmICh0aHVzIHRoZSBjbGllbnQgYXBwIHdpbGwKICBub3QgZ2V0IHRoZSBmdWxsIGxpbmUpIGJ1dCBzdXJ2aXZlIGFuZCBkZWFsIHdpdGggdGhlbSBmaW5lIG90aGVyd2lzZS4gVGVzdAogIGNhc2UgMTAwMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgUyAoMjAgQXVndXN0IDIwMDcpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBDaHJpc3RpYW4gVm9ndCwgdGhlIEZUUCBjb2RlIG5vdyBzZXRzIHRoZSB1cGNvbWluZwogIGRvd25sb2FkIHRyYW5zZmVyIHNpemUgbXVjaCBlYXJsaWVyIHRvIGJlIHBvc3NpYmxlIHRvIGdldCByZWFkIHdpdGgKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBhcyBzb29uIGFzIHBvc3NpYmxlLiBUaGlzIGlzIHZlcnkgbXVjaCBpbiBhCiAgc2ltaWxhciBzcGlyaXQgdG8gdGhlIEhUVFAgc2l6ZSBjaGFuZ2UgZnJvbSBBdWd1c3QgMTEgMjAwNy4KCkRhbmllbCBTICgxOCBBdWd1c3QgMjAwNykKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NzYyMzIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc3NjIzMikgYWJvdXQgbGliY3VybCBjYWxsaW5nCiAgQ3VybF9jbGllbnRfd3JpdGUoKSwgcGFzc2luZyBvbiBhIGNvbnN0IHN0cmluZyB0aGF0IHRoZSBjYWxsZXIgbWF5IG5vdAogIG1vZGlmeSBhbmQgeWV0IGl0IGRvZXMgKG9uIHNvbWUgcGxhdGZvcm1zKS4KCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzc2MjM1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3NzYyMzUpIGFib3V0IGZ0cCByZXF1ZXN0cyB3aXRoIE5PQk9EWQogIG9uIGEgZGlyZWN0b3J5IHdvdWxkIGRvIGEgIlNJWkUgKG51bGwpIiByZXF1ZXN0LiBUaGlzIGlzIG5vdyBmaXhlZCBhbmQgdGVzdAogIGNhc2UgMTAwMCB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsIFMgKDE3IEF1Z3VzdCAyMDA3KQotIFNvbmcgTWEgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGN1cmVzIGEgcHJvYmxlbSBsaWJjdXJsIGhhcyB3aGVuIGRvaW5nIHJlc3VtZQogIEhUVFAgUFVUIHVzaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gVGVzdCBjYXNlIDUzMjAgYW5kIDUzMjIgd2VyZSBhbHNvCiAgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsIFMgKDE0IEF1Z3VzdCAyMDA3KQotIEFuZHJldyBXYW5zaW5rIHByb3ZpZGVkIGFuIE5UTE0gYnVnZml4OiBpbiB0aGUgY2FzZSB0aGUgc2VydmVyIHNldHMgdGhlIGZsYWcKICBOVExNRkxBR19ORUdPVElBVEVfVU5JQ09ERSwgd2UgbmVlZCB0byBmaWx0ZXIgaXQgb2ZmIGJlY2F1c2UgbGliY3VybCBkb2Vzbid0CiAgVU5JQ09ERSBlbmNvZGUgdGhlIHN0cmluZ3MgaXQgcGFja3MgaW50byB0aGUgTlRMTSBhdXRoZW50aWNhdGUgcGFja2V0LgoKRGFuaWVsIFMgKDExIEF1Z3VzdCAyMDA3KQotIEFsbGVuIFB1bHNpZmVyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyBsaWJjdXJsIHNldCB0aGUgZXhwZWN0ZWQgZG93bmxvYWQKICBzaXplIGVhcmxpZXIgd2hlbiBkb2luZyBIVFRQIGRvd25sb2Fkcywgc28gdGhhdCBhcHBsaWNhdGlvbnMgYW5kIHRoZQogIHByb2dyZXNzIG1ldGVyIGV0YyBrbm93IGdldCB0aGUgaW5mbyBlYXJsaWVyIGluIHRoZSBmbG93IHRoYW4gYmVmb3JlLgoKLSBQYXRyaWNrIE1vbm5lcmF0IG1vZGlmaWVkIHRoZSBMREFQIGNvZGUgYW5kIGFwcHJvYWNoIGluIGN1cmwuIFN0YXJ0aW5nIG5vdywKICB0aGUgY29uZmlndXJlIHNjcmlwdCBjaGVja3MgZm9yIG9wZW5sZGFwIGFuZCBmcmllbmRzIGFuZCB3ZSBsaW5rIHdpdGggdGhvc2UKICBsaWJzIGp1c3QgbGlrZSB3ZSBsaW5rIGFsbCBvdGhlciB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMsIGFuZCB3ZSBubyBsb25nZXIKICBkbG9wZW4oKSB0aG9zZSBsaWJyYXJpZXMuIE91ciBwcml2YXRlIGhlYWRlciBmaWxlIGxpYi9sZGFwLmggd2FzIHJlbmFtZWQgdG8KICBsaWIvY3VybF9sZGFwLmggZHVlIHRvIHRoaXMuIEkgc2V0IGEgdGFnIGluIENWUyAoY3VybC03XzE3XzAtcHJlbGRhcGZpeCkKICBqdXN0IGJlZm9yZSB0aGlzIGNvbW1pdCwganVzdCBpbiBjYXNlLgoKRGFuIEYgKDggQXVndXN0IDIwMDcpCi0gU29uZyBNYSBub3RlZCBhIHpsaWIgbWVtb3J5IGxlYWsgaW4gdGhlIGlsbGVnYWwgY29tcHJlc3NlZCBoZWFkZXIKICBjb3VudGVybWVhc3VyZXMgY29kZSBwYXRoLgoKRGFuaWVsIFMgKDQgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBmaXhlZCBjdXJsX2Vhc3lfZXNjYXBlKCkgYW5kIGN1cmx4X3N0cnRvbGwoKSB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHN5c3RlbXMuCgpEYW5pZWwgUyAoMyBBdWd1c3QgMjAwNykKLSBJIGN1dCBvdXQgc3VwcG9ydCBmb3IgbGlic3NoMiB2ZXJzaW9ucyBvbGRlciB0aGFuIDAuMTYgdG8gbWFrZSBvdXIgY29kZSBhCiAgbG90IHNpbXBsZXIsIGFuZCB0byBhdm9pZCBnZXR0aW5nIHRyb3VibGUgd2l0aCB0aGUgTElCU1NIMl9BUElOTyBkZWZpbmUKICB0aGF0IDEpIGRpZG4ndCB3b3JrIHByb3Blcmx5IHNpbmNlIGl0IHdhcyA+MzIgYml0cyBhbmQgMikgaXMgcmVtb3ZlZCBpbgogIGxpYnNzaDIgMC4xNi4uLgoKRGFuaWVsIFMgKDIgQXVndXN0IDIwMDcpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NjYzMjAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc2NjMyMCkgcG9pbnRpbmcgb3V0IHRoYXQgdGhlIGxpYmN1cmwKICBjb2RlIGFjY2Vzc2VkIHR3byBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9ucyAoQ1VSTE9QVF9ETlNfQ0FDSEVfVElNRU9VVCBhbmQKICBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFKSBhcyBpbnRzIGV2ZW4gdGhvdWdoIHRoZXkncmUgZG9jdW1lbnRlZCB0byBiZQogIHBhc3NlZCBpbiBhcyBsb25ncywgYW5kIHRoYXQgbWFrZXMgYSBkaWZmZXJlbmNlIG9uIDY0IGJpdCBhcmNoaXRlY3R1cmVzLgoKLSBEbWl0cml5IFNlcmdleWV2IHJlcG9ydGVkIGEgcmVncmVzc2lvbjogcmVzdW1lZCBmaWxlOi8vIHRyYW5zZmVycyBicm9rZQogIGFmdGVyIDcuMTYuMi4gVGhpcyBpcyBtdWNoIGR1ZSB0byB0aGUgZGlmZmVyZW50IHRyZWF0bWVudCBmaWxlOi8vIGdldHMKICBpbnRlcm5hbGx5LCBidXQgbm93IEkgYWRkZWQgdGVzdCAyMzEgdG8gbWFrZSBpdCBsZXNzIGxpa2VseSB0byBoYXBwZW4gYWdhaW4KICB3aXRob3V0IHVzIG5vdGljaW5nIQoKRGFuaWVsIFMgKDEgQXVndXN0IDIwMDcpCi0gUGF0cmljayBNb25uZXJhdCBhbmQgSSBtb2RpZmllZCBsaWJjdXJsIHNvIHRoYXQgbm93IGl0ICpjb3BpZXMqIGFsbCBzdHJpbmdzCiAgcGFzc2VkIHRvIGl0IHdpdGggY3VybF9lYXN5X3NldG9wdCgpISBQcmV2aW91c2x5IGl0IGhhcyBhbHdheXMganVzdCByZWZlcmVkCiAgdG8gdGhlIGRhdGEsIGZvcmNpbmcgdGhlIHVzZXIgdG8ga2VlcCB0aGUgZGF0YSBhcm91bmQgdW50aWwgbGliY3VybCBpcyBkb25lCiAgd2l0aCBpdC4gVGhhdCBpcyBub3cgaGlzdG9yeSBhbmQgbGliY3VybCB3aWxsIGluc3RlYWQgY2xvbmUgdGhlIGdpdmVuCiAgc3RyaW5ncyBhbmQga2VlcCBwcml2YXRlIGNvcGllcy4gVGhpcyBpcyBhbHNvIHBhcnQgb2YgUGF0cmljayBNb25uZXJhdCdzCiAgT1MvNDAwIHBvcnQuCgogIER1ZSB0byB0aGlzIGJlaW5nIGEgc29tZXdoYXQgaW50ZXJlc3RpbmcgY2hhbmdlIEFQSSB3aXNlLCBJJ3ZlIGRlY2lkZWQgdG8KICBidW1wIHRoZSB2ZXJzaW9uIG9mIHRoZSB1cGNvbWluZyByZWxlYXNlIHRvIDcuMTcuMC4gT2xkZXIgYXBwbGljYXRpb25zIHdpbGwKICBvZiBjb3Vyc2Ugbm90IG5vdGljZSB0aGlzIGNoYW5nZSBub3IgZG8gdGhleSBoYXZlIHRvIGNhcmUsIGJ1dCBuZXcKICBhcHBsaWNhdGlvbnMgY2FuIGJlIHdyaXR0ZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcy4KCi0gR3JlZyBNb3JzZSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBQT1NUaW5nIHVzaW5nIEFOWUFVVEggdG8gYSBzZXJ2ZXIKICByZXF1aXJpbmcgTlRMTSwgYW5kIGhlIHByb3ZpZGVkIHRlc3QgY29kZSBhbmQgYSB0ZXN0IHNlcnZlciBhbmQgd2Ugd29ya2VkCiAgb3V0IGEgYnVnIGZpeC4gV2UgZmFpbGVkIHRvIGNvdW50IHNlbnQgYm9keSBkYXRhIGF0IHRpbWVzLCB3aGljaCB0aGVuIGNhdXNlZAogIGludGVybmFsIGNvbmZ1c2lvbnMgd2hlbiBsaWJjdXJsIHRyaWVkIHRvIHNlbmQgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgaW4gb3JkZXIKICB0byBtYWludGFpbiB0aGUgc2FtZSBjb25uZWN0aW9uIGFsaXZlLgoKRGFuaWVsIFMgKDMxIEp1bHkgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBwb2ludGVkIG91dCAoYW5kIGZpeGVkKSB0aGF0IHRoZSBub24tYmxvY2tpbmcgY2hlY2sgaW4KICBjb25maWd1cmUgbWFkZSBsaWJjdXJsIHVzZSBibG9ja2luZyBzb2NrZXRzIG9uIEFJWCA0IGFuZCA1LCB3aGlsZSB0aGF0CiAgd2Fzbid0IHRoZSBpbnRlbnRpb24uCgpEYW5pZWwgUyAoMjkgSnVseSAyMDA3KQotIEpheWVzaCBBIFNoYWggZmlsZWQgYnVnIHJlcG9ydCAjMTc1OTU0MgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU5NTQyKSBpZGVudGlmeWluZyBhIHJhdGhlciBzZXJpb3VzCiAgcHJvYmxlbSB3aXRoIEZUUFM6IGxpYmN1cmwgY2xvc2VkIHRoZSBkYXRhIGNvbm5lY3Rpb24gc29ja2V0IGFuZCB0aGVuIGxhdGVyCiAgaW4gdGhlIGZsb3cgaXQgd291bGQgY2FsbCB0aGUgU1NMIGxheWVyIHRvIGRvIFNTTCBzaHV0ZG93biB3aGljaCB0aGVuIHdvdWxkCiAgdXNlIGEgc29ja2V0IHRoYXQgaGFkIGFscmVhZHkgYmVlbiBjbG9zZWQgLSBzbyBpZiB0aGUgYXBwbGljYXRpb24gaGFkIG9wZW5lZAogIGEgbmV3IG9uZSBpbiB0aGUgbWVhbiB0aW1lLCBsaWJjdXJsIGNvdWxkIHNlbmQgZ2liYmVyaXNoIHRoYXQgd2F5ISBJIHdvcmtlZAogIHdpdGggR3JlZyBaYXZlcnRuaWsgdG8gcHJvcGVybHkgZGlhZ25vc2UgYW5kIGZpeCB0aGlzLiBUaGUgZml4IGFmZmVjdHMgY29kZQogIGZvciBhbGwgU1NMIGxpYnJhcmllcyB3ZSBzdXBwb3J0LCBidXQgaXQgaGFzIG9ubHkgYmVlbiB0cnVseSB2ZXJpZmllZCB0bwogIHdvcmsgZmluZSBmb3IgdGhlIE9wZW5TU0wgdmVyc2lvbi4gVGhlIG90aGVycyBoYXZlIG9ubHkgYmVlbiBjb2RlIHJldmlld2VkLgoKRGFuaWVsIFMgKDIzIEp1bHkgMjAwNykKLSBJbXBsZW1lbnRlZCB0aGUgcGFydHMgb2YgUGF0cmljayBNb25uZXJhdCdzIE9TLzQwMCBwYXRjaCB0aGF0IGludHJvZHVjZXMKICBzdXBwb3J0IGZvciB0aGUgT1MvNDAwIFNlY3VyZSBTb2NrZXRzIExheWVyIGxpYnJhcnkuCgpEYW4gRiAoMjMgSnVseSAyMDA3KQotIEltcGxlbWVudGVkIG9ubHkgdGhlIHBhcnRzIG9mIFBhdHJpY2sgTW9ubmVyYXQncyBPUy80MDAgcGF0Y2ggdGhhdCByZW5hbWVkCiAgc29tZSBmZXcgaW50ZXJuYWwgaWRlbnRpZmllcnMgdG8gYXZvaWQgY29uZmxpY3RzLCB3aGljaCBjb3VsZCBiZSB1c2VmdWwgb24KICBvdGhlciBwbGF0Zm9ybXMuCgpEYW5pZWwgUyAoMjIgSnVseSAyMDA3KQotIEhUVFAgRGlnZXN0IGJ1ZyBmaXggYnkgQ2hyaXMgRmxlcmFja2VyczoKCiAgU2NlbmFyaW8KCiAgLSBQZXJmb21pbmcgYSBQT1NUIHJlcXVlc3Qgd2l0aCBib2R5CiAgLSBXaXRoIGF1dGhlbnRpY2F0aW9uIChvbmx5IERpZ2VzdCkKICAtIFJlLXVzaW5nIGEgY29ubmVjdGlvbgoKICBsaWJjdXJsIHdvdWxkIHNlbmQgYSBIVFRQIFBPU1Qgd2l0aCBhbiBBdXRob3JpemF0aW9uIGhlYWRlciBidXQgd2l0aG91dAogIGJvZHkuIE91ciBzZXJ2ZXIgd291bGQgcmV0dXJuIDQwMCBCYWQgUmVxdWVzdCBpbiB0aGF0IGNhc2UgKGJlY2F1c2UKICBhdXRoZW50aWNhdGlvbiBwYXNzZWQsIGJ1dCB0aGUgYm9keSB3YXMgZW1wdHkpLgoKICBDYXVzZQoKICAxKSBodHRwX2RpZ2VzdC5jIC0+IEN1cmxfb3V0cHV0X2RpZ2VzdAogIC0gVXBkYXRlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCAqb25seSogaWYgZC0+bm9uY2UgaXMKICBmaWxsZWQgaW4gKGFuZCBubyBlcnJvcnMpCiAgLSBhdXRocC0+ZG9uZSA9IFRSVUUgaWYgZC0+bm9uY2UgaXMgZmlsbGVkIGluCiAgMikgaHR0cC5jIC0+IEN1cmxfaHR0cAogIC0gKkFsd2F5cyogdXNlcyBhbGxvY3B0ci51c2VycHdkL2FsbG9jcHRyLnByb3h5dXNlcnB3ZCBpZiBub3QgTlVMTAogIDMpIGh0dHAuYyAtPiBDdXJsX2h0dHAsIEN1cmxfaHR0cF9vdXRwdXRfYXV0aAoKICBTbyB3aGF0IGhhcHBlbnMgaXMgdGhhdCBDdXJsX291dHB1dF9kaWdlc3QgY2Fubm90IHlldCB1cGRhdGUgdGhlCiAgQXV0aG9yaXphdGlvbiBoZWFkZXIgKGFsbG9jcHRyLnVzZXJwd2QpIHdoaWNoIHJlc3VsdHMgaW4gYXV0aGhvc3QtPmRvbmU9MCAtPgogIGF1dGhob3N0LT5tdWx0aT0xIC0+IGNvbm4tPmJpdHMuYXV0aG5lZyA9IFRSVUUuICBUaGUgYm9keSBpcyBub3QKICBhZGRlZC4gKkhvd2V2ZXIqLCBhbGxvY3B0ci51c2VycHdkIGlzIHN0aWxsIHVzZWQgd2hlbiBidWlsZGluZyB0aGUgcmVxdWVzdAoKLSBBZGRlZCB0ZXN0IGNhc2UgMzU0IHRoYXQgbWFrZXMgYSBzaW1wbGUgRlRQIHJldHJpZXZhbCB3aXRob3V0IHBhc3N3b3JkLCB3aGljaAogIHZlcmlmaWVzIHRoZSBidWcgZml4IGluICMxNzU3MzI4LgoKRGFuaWVsIFMgKDIxIEp1bHkgMjAwNykKLSBUbyBhbGxvdyBtb3JlIGZsZXhpYmlsaXR5IGluIEZUUCB0ZXN0IGNhc2VzLCBJJ3ZlIHJlbW92ZWQgdGhlIGVuZm9yY2VkIHN0YXRlcwogIGZyb20gdGhlIHRlc3Qgc2VydmVyIGNvZGUgYXMgdGhleSBzZXJ2ZWQgbm8gcmVhbCBwdXJwb3NlLiBUaGUgdGVzdCBzZXJ2ZXIKICBpcyBoZXJlIHRvIHNlcnZlIGZvciB0aGUgdGVzdCBjYXNlcywgbm90IHRvIGF0dGVtcHQgdG8gZnVuY3Rpb24gYXMgYSByZWFsCiAgc2VydmVyISBXaGlsZSBhdCBpdCwgSSBtb2RpZmllZCB0ZXN0IGNhc2UgMTQxIHRvIGJldHRlciB0ZXN0IGFuZCB2ZXJpZnkKICBjdXJsIC1JIG9uIGEgc2luZ2xlIEZUUCBmaWxlLgoKRGFuaWVsIFMgKDIwIEp1bHkgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGZpeGVkIHRoZSBTRlRQIFBXRCBjb21tYW5kIHRvIHdvcmsuCgotIFJhbGYgUy4gRW5nZWxzY2hhbGwgZmlsZWQgYnVnIHJlcG9ydCAjMTc1NzMyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzU3MzI4KSBhbmQgc3VibWl0dGVkIGEgcGF0Y2guIEl0CiAgdHVybnMgb3V0IHdlIGJyb2tlIGxvZ2luIHRvIEZUUCBzZXJ2ZXJzIHRoYXQgZG9uJ3QgcmVxdWlyZSAobm9yIHVuZGVyc3RhbmQpCiAgUEFTUyBhZnRlciB0aGUgVVNFUiBjb21tYW5kLiBUaGUgYnJlYWthZ2Ugd2FzIGRvbmUgYXMgcGFydCBvZiB0aGUga3JiNQogIGNvbW1pdCBzbyBhIGtyYi11c2luZyBwZXJzb24gbmVlZHMgdG8gdmVyaWZ5IHRoYXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBub3cKICB3b3JrcyBvciBpZiB3ZSBuZWVkIHRvIGZpeCBpdCAoaW4gYSBkaWZmZXJlbnQgd2F5IG9mIGNvdXJzZSkuCgpEYW4gRiAoMTcgSnVseSAyMDA3KQotIEZpeGVkIHRlc3QgY2FzZXMgNjEzIGFuZCA2MTQgYnkgaW1wcm92aW5nIHRoZSBsb2cgcG9zdHByb2Nlc3NvciB0byBoYW5kbGUKICBhIG5ldyBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXQgdGhhdCBuZXdlciBsaWJzc2gyJ3MgY2FuIHByb3ZpZGUuICBUaGlzCiAgaXMgcHJvYmFibHkgTk9UIHN1ZmZpY2llbnQgdG8gaGFuZGxlIGFsbCBkaXJlY3RvcnkgbGlzdGluZyBmb3JtYXRzIHRoYXQKICBzZXJ2ZXIncyBjYW4gcHJvdmlkZSwgYW5kIHNob3VsZCBiZSByZXZpc2l0ZWQuCgpEYW5pZWwgUyAoMTcgSnVseSAyMDA3KQotIERhbmllbCBKb2huc29uIGZpeGVkIGEgYnVnIGluIGhvdyBsaWJzc2gyX3Nlc3Npb25fbGFzdF9lcnJvcigpIHdhcyB1c2VkLCBpbgogIHR3byBwbGFjZXMuCgotIEpvZmVsbCBHYWxsYXJkbyBwb3N0ZWQgYSBsaWJjdXJsIGxvZyB1c2luZyBGVFAgdGhhdCBleHBvc2VkIGEgYnVnIHdoaWNoIG1hZGUKICBhIGNvbnRyb2wgY29ubmVjdGlvbiB0aGF0IHdhcyBkZWVtZWQgImRlYWQiIHRvIHlldCBiZSByZS11c2VkIGluIGEgZm9sbG93aW5nCiAgcmVxdWVzdC4KCkRhbmllbCBTICgxMyBKdWx5IDIwMDcpCi0gQ29saW4gSG9nYmVuIGZpbGVkIGJ1ZyByZXBvcnQgIzE3NTAyNzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTc1MDI3NCkgYW5kIHN1Ym1pdHRlZCBhIHBhdGNoIGZvciB0aGUKICBjYXNlIHdoZXJlIGxpYmN1cmwgZGlkIGEgY29ubmVjdCBhdHRlbXB0IHRvIGEgbm9uLWxpc3RlbmluZyBwb3J0IGFuZCBkaWRuJ3QKICBwcm92aWRlIGEgaHVtYW4gcmVhZGFibGUgZXJyb3Igc3RyaW5nIGJhY2suCgotIERhbmllbCBDYXRlciBmaXhlczoKICAxIC0gbWFkZSAnbWFrZSB2YzgnIHdvcmsgb24gd2luZG93cy4KICAyIC0gbWFkZSBsaWJjdXJsIGl0c2VsZiBidWlsdCB3aXRoIENVUkxfTk9fT0xESUVTIGRlZmluZWQgKHdoaWNoIGRvZXNuJ3QKICAgICAgZGVmaW5lIHRoZSBzeW1ib2xzIGZvciBiYWNrd2FyZHMgc291cmNlIGNvbXBhdGliaWxpdHkpCiAgMyAtIHVwZGF0ZWQgbGliY3VybC1lcnJvcnMuMwogIDQgLSBhZGRlZCBDVVJMX0RJU0FCTEVfVEZUUCB0byBkb2NzL0lOU1RBTEwKCkRhbmllbCBTICgxMiBKdWx5IDIwMDcpCi0gTWFkZSB0aGUga3JiNSBjb2RlIGJ1aWxkIHdpdGggSGVpbWRhbCdzIEdTU0FQSSBsaWIuCgpEYW4gRiAoMTIgSnVseSAyMDA3KQotIENvbXBpbGUgbW9zdCBvZiB0aGUgZXhhbXBsZSBhcHBzIGluIGRvY3MvZXhhbXBsZXMgd2hlbiBkb2luZyBhICdtYWtlIGNoZWNrJy4KICBGaXhlZCBzb21lIGNvbXBpbGUgd2FybmluZ3MgYW5kIGVycm9ycyBpbiB0aG9zZSBleGFtcGxlcy4KCi0gUmVtb3ZlZCB0aGUgZXhhbXBsZSBwcm9ncmFtIGZ0cDNyZHBhcnR5LmMgc2luY2UgbGliY3VybCBkb2Vzbid0IHN1cHBvcnQKICAzcmQgcGFydHkgRlRQIHRyYW5zZmVycyBhbnkgbG9uZ2VyLgoKRGFuaWVsIFMgKDEyIEp1bHkgMjAwNykKLSBTaG11bGlrIFJlZ2V2IGZvdW5kIGFuIChhbGJlaXQgcmFyZSkgY2FzZSB3aGVyZSB0aGUgcHJveHkgQ09OTkVDVCBvcGVyYXRpb24KICBjb3VsZCBpbiBmYWN0IGdldCBzdHVjayBpbiBhbiBlbmRsZXNzIGxvb3AuCgotIE1hZGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBzZXQgdG8gMSBhY3RzIGFzIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbjoKICBmYWlsIHRvIGNvbm5lY3QgaWYgdGhlcmUgaXMgbm8gQ29tbW9uIE5hbWUgZmllbGQgZm91bmQgaW4gdGhlIHJlbW90ZSBjZXJ0LgogIFdlIHNob3VsZCBkZXByZWNhdGUgdGhlIHN1cHBvcnQgZm9yIHRoaXMgc2V0IHRvIDEgYW55d2F5IHNvb24sIHNpbmNlIHRoZQogIGZlYXR1cmUgaXMgcG9pbnRsZXNzIGFuZCBtb3N0IGxpa2VseSBuZXZlciByZWFsbHkgdXNlZCBieSBhbnlvbmUuCgpEYW5pZWwgUyAoMTEgSnVseSAyMDA3KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYSBidWcgd2l0aCB0cmFuc2Zlci1lbmNvZGluZyBza2lwcGluZyBkdXJpbmcgdGhlIDQwNwogIGVycm9yIHBhZ2VzIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbi4KCi0gR2lhbmNhcmxvIEZvcm1pY3VjY2lhIHJlcG9ydGVkIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCBhIGNsb3NlZCBjb25uZWN0aW9uCiAgdG8gYSBwcm94eSBkdXJpbmcgQ09OTkVDVCBhdXRoIG5lZ290aWF0aW9uLgoKRGFuIEYgKDEwIEp1bHkgMjAwNykKLSBGaXhlZCBhIGN1cmwgbWVtb3J5IGxlYWsgcmVwb3J0ZWQgYnkgU29uZyBNYSB3aXRoIGEgbW9kaWZpZWQgdmVyc2lvbgogIG9mIHRoZSBwYXRjaCBoZSBzdWdnZXN0ZWQuICBBZGRlZCBoaXMgdGVzdCBjYXNlIGFzIHRlc3QyODkgdG8gdmVyaWZ5LgoKLSBGb3JjZSB0aGUgdGltZSB6b25lIHRvIEdNVCBpbiB0aGUgY29va2llIHRlc3RzIGluIGNhc2UgdGhlIHVzZXIgaXMKICB1c2luZyBvbmUgb2YgdGhlIHNvLWNhbGxlZCAncmlnaHQnIHRpbWUgem9uZXMgdGhhdCB0YWtlIGludG8gYWNjb3VudAogIGxlYXAgc2Vjb25kcywgd2hpY2ggY2F1c2VzIHRoZSB0ZXN0cyB0byBmYWlsIChhcyByZXBvcnRlZCBieQogIERhbmllbCBCbGFjayBpbiBidWcgcmVwb3J0ICMxNzQ1OTY0KS4KClZlcnNpb24gNy4xNi40ICgxMCBKdWx5IDIwMDcpCgpEYW5pZWwgUyAoMTAgSnVseSAyMDA3KQotIEtlZXMgQ29vayBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA3MDcxMC5odG1sKSBpbiB3aGljaCBsaWJjdXJsIGZhaWxlZCB0bwogIHByb3Blcmx5IHJlamVjdCBzb21lIG91dGRhdGVkIG9yIG5vdCB5ZXQgdmFsaWQgc2VydmVyIGNlcnRpZmljYXRlcyB3aGVuCiAgYnVpbHQgd2l0aCBHbnVUTFMuIEtlZXMgYWxzbyBwcm92aWRlZCB0aGUgcGF0Y2guCgpKYW1lcyBIICg1IEp1bHkgMjAwNykKLSBHYXZyaWUgUGhpbGlwc29uIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCB3aWxsIHVzZSBhIG1vcmUgc3BlY2lmaWMgZXJyb3IKICBtZXNzYWdlIGZvciBhbiBzY3A6Ly8gdXBsb2FkIGZhaWx1cmUuICBJZiBsaWJzc2gyIGhhcyBoaXMgbWF0Y2hpbmcKICBwYXRjaCwgdGhlbiB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm4gYnkgdGhlIHNlcnZlciB3aWxsIGJlIHVzZWQgaW5zdGVhZAogIG9mIGEgbW9yZSBnZW5lcmljIGVycm9yLgoKRGFuaWVsIFMgKDEgSnVseSAyMDA3KQotIFRob21hcyBKLiBNb29yZSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBLZXJiZXJvczUgc3VwcG9ydCBpbgogIGxpYmN1cmwuIFRoaXMgYWxzbyBtYWtlcyB0aGUgb3B0aW9ucyBjaGFuZ2UgbmFtZSB0byAtLWtyYiAoZnJvbSAtLWtyYjQpIGFuZAogIENVUkxPUFRfS1JCTEVWRUwgKGZyb20gQ1VSTE9QVF9LUkI0TEVWRUwpIGJ1dCB0aGUgb2xkIG5hbWVzIGFyZSBzdGlsbCAKCi0gU29uZyBNYSBoZWxwZWQgbWUgdmVyaWZ5IGFuZCBleHRlbmQgYSBmaXggZm9yIGRvaW5nIEZUUCBvdmVyIGEgU09DS1M0LzUKICBwcm94eS4KCkRhbmllbCBTICgyNyBKdW5lIDIwMDcpCi0gSmFtZXMgSG91c2xleTogQWRkIHR3byBuZXcgb3B0aW9ucyBmb3IgdGhlIFNGVFAvU0NQL0ZJTEUgcHJvdG9jb2xzOgogIENVUkxPUFRfTkVXX0ZJTEVfUEVSTVMgYW5kIENVUkxPUFRfTkVXX0RJUkVDVE9SWV9QRVJNUy4gVGhlc2UgY29udHJvbCB0aGUKICBwcmVtaXNzaW9ucyBmb3IgZmlsZXMgYW5kIGRpcmVjdG9yaWVzIGNyZWF0ZWQgb24gdGhlIHJlbW90ZQogIHNlcnZlci4gQ1VSTE9QVF9ORVdfRklMRV9QRVJNUyBkZWZhdWx0cyB0byAwNjQ0IGFuZAogIENVUkxPUFRfTkVXX0RJUkVDVE9SWV9QRVJNUyBkZWZhdWx0cyB0byAwNzU1CgotIEkgY29ycmVjdGVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIGFuZCBhcHBsaWVkIGEgcGF0Y2ggZm9yIGl0IGJ5IEphbWVzCiAgQnVyc2EuCgpEYW5pZWwgUyAoMjYgSnVuZSAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgcmUtYXJyYW5nZWQgdGhlIGludGVybmFsIGhhc2ggY29kZSB0byB3b3JrIHdpdGggYSBjdXN0b20KICBoYXNoIGZ1bmN0aW9uIGZvciBkaWZmZXJlbnQgaGFzaGVzLCBhbmQgYWxzbyBleHBhbmRlZCB0aGUgZGVmYXVsdCBzaXplIGZvcgogIHRoZSBzb2NrZXQgaGFzaCB0YWJsZSB1c2VkIGluIG11bHRpIGhhbmRsZXMgdG8gZ3JlYXRseSBlbmhhbmNlIHNwZWVkIHdoZW4KICB2ZXJ5IG1hbnkgY29ubmVjdGlvbnMgYXJlIGFkZGVkIGFuZCB0aGUgc29ja2V0IEFQSSBpcyB1c2VkLgoKLSBKYW1lcyBIb3VzbGV5IG1hZGUgdGhlIENVUkxPUFRfRlRQTElTVE9OTFkgbW9kZSB3b3JrIGZvciBTRlRQIGRpcmVjdG9yeQogIGxpc3RpbmdzIGFzIHdlbGwKCkRhbmllbCBTICgyNSBKdW5lIDIwMDcpCi0gQWRqdXN0ZWQgaG93IGxpYmN1cmwgdHJlYXRzIEhUVFAgMS4xIHJlc3BvbnNlcyB3aXRob3V0IGNvbnRlbnQtbGVudGggb3IKICBjaHVua2VkIGVuY29kaW5nICh0aGF0IGFsc28gbGFja3MgIkNvbm5lY3Rpb246IGNsb3NlIikuIEl0IG5vdyBzaW1wbHkKICBhc3N1bWVzIHRoYXQgdGhlIGNvbm5lY3Rpb24gV0lMTCBiZSBjbG9zZWQgdG8gc2lnbmFsIHRoZSBlbmQsIGFzIHRoYXQgaXMgaG93CiAgUkZDMjYxNiBzZWN0aW9uIDQuNCBwb2ludCAjNSBzYXlzIHdlIHNob3VsZCBiZWhhdmUuCiAgClZlcnNpb24gNy4xNi4zICgyNSBKdW5lIDIwMDcpCgpEYW5pZWwgUyAoMjMgSnVuZSAyMDA3KQotIEFzIHJlcG9ydGVkIGJ5ICJUcm8iIGluIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNy0wNi8wMTYxLmh0bWwgYW5kCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAyMzguaHRtbCwgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgZG8KICBuby1ib2R5IHJlcXVlc3RzIG9uIEZUUCBmaWxlcyBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHByb3Blcmx5LCBvciBhdCBsZWFzdAogIGl0IGRpZG4ndCBwcm92aWRlIHRoZSBpbmZvIGJhY2sgaW4gdGhlIGhlYWRlciBjYWxsYmFjayBwcm9wZXJseSBpbiB0aGUKICBzdWJzZXF1ZW50IHJlcXVlc3RzLgoKRGFuaWVsIFMgKDIxIEp1bmUgMjAwNykKLSBHZXJyaXQgQnJ1Y2ho5HVzZXIgcG9pbnRlZCBvdXQgYSB3YXJuaW5nIHRoYXQgdGhlIEludGVsKFIpIFRocmVhZCBDaGVja2VyCiAgdG9vbCByZXBvcnRzIGFuZCBpdCB3YXMgaW5kZWVkIGEgbGVnaXRpbWF0ZSBvbmUgYW5kIGl0IGlzIG9uZSBmaXhlZC4gSXQgd2FzCiAgYSB1c2Ugb2YgYSBzaGFyZSB3aXRob3V0IGRvaW5nIHRoZSBwcm9wZXIgbG9ja2luZyBmaXJzdC4KICAKRGFuaWVsIFMgKDIwIEp1bmUgMjAwNykKLSBBZGFtIFBpZ2dvdHQgZmlsZWQgYnVnIHJlcG9ydCAjMTc0MDI2MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzQwMjYzKS4gQWRhbSBkaXNjb3ZlcmVkIHRoYXQgd2hlbgogIGdldHRpbmcgYSBsYXJnZSBhbW91bnQgb2YgVVJMcyB3aXRoIGN1cmwsIHRoZXkgd2VyZSBmZXRjaGVkIHNsb3dlciBhbmQKICBzbG93ZXIuLi4gd2hpY2ggdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIHRoZSAtLWxpYmN1cmwgZGF0YSBjb2xsZWN0aW5nIHdoaWNoCiAgd3JvbmdseSBhbHdheXMgd2FzIGVuYWJsZWQsIGJ1dCBubyBsb25nZXIgaXMuLi4KCkRhbmllbCBTICgxOCBKdW5lIDIwMDcpCi0gUm9ic29uIEJyYWdhIEFyYXVqbyBmaWxlZCBidWcgcmVwb3J0ICMxNzM5MTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzkxMDApIHRoYXQgbWVudGlvbmVkIHRoYXQgbGliY3VybAogIGNvdWxkIG5vdCBhY3R1YWxseSBsaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgYSBnaXZlbiBGVFAKICBzZXJ2ZXIgaWYgdGhlIGxvZ2luIGRpcmVjdG9yeSBpc24ndCByb290LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZAogIHRocmVlIHRlc3QgY2FzZXMgKG9uZSBpcyBkaXNhYmxlZCBmb3Igbm93IHNpbmNlIEkgaWRlbnRpZmllZCBLTk9XTl9CVUdTICM0NCwKICB3ZSBjYW5ub3QgdXNlIC0tZnRwLW1ldGhvZCBub2N3ZCBhbmQgbGlzdCBmdHAgZGlyZWN0b3JpZXMpLgoKRGFuaWVsIFMgKDE0IEp1bmUgMjAwNykKLSBTaG11bGlrIFJlZ2V2OgoKICBJJ3ZlIGVuY291bnRlcmVkIChhbmQgaG9wZWZ1bGx5IGZpeGVkKSBhIHByb2JsZW0gaW52b2x2aW5nIHByb3h5IENPTk5FQ1QKICByZXF1ZXN0cyBhbmQgZWFzeSBoYW5kbGVzIHN0YXRlIG1hbmFnZW1lbnQuIFRoZSBwcm9ibGVtIGlzbid0IHNpbXBsZSB0bwogIHJlcHJvZHVjZSBzaW5jZSBpdCBkZXBlbmRzIG9uIHNvY2tldCBzdGF0ZS4gSXQgb25seSBtYW5pZmVzdHMgaXRzZWxmIHdoZW4KICB3b3JraW5nIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuCgogIEhlcmUgaXMgdGhlIHNjZW5hcmlvOgoKICAxLiBpbiBtdWx0aV9ydW5zaW5nbGUgdGhlIGVhc3kgaGFuZGxlIGlzIGluIHRoZSBDVVJMTV9TVEFURV9XQUlUQ09OTkVDVCBhbmQKICBjYWxscyBDdXJsX3Byb3RvY29sX2Nvbm5lY3QKCiAgMi4gaW4gQ3VybF9wcm94eUNPTk5FQ1QsIGxpbmUgMTI0NywgaWYgdGhlIHNvY2tldCBpc24ndCByZWFkeSB0aGUgZnVuY3Rpb24KICByZXR1cm5zIGFuZCBjb25uLT5iaXRzLnR1bm5lbF9jb25uZWN0aW5nIGlzIFRSVUUKCiAgMy4gd2hlbiB0aGUgY2FsbCB0byBDdXJsX3Byb3RvY29sX2Nvbm5lY3QgcmV0dXJucyB0aGUgcHJvdG9jb2xfY29ubmVjdCBmbGFnCiAgaXMgZmFsc2UgYW5kIHRoZSBlYXN5IHN0YXRlIGlzIGNoYW5nZWQgdG8gQ1VSTE1fU1RBVEVfUFJPVE9DT05ORUNUIHdoaWNoCiAgaXNuJ3QgY29ycmVjdCBpZiBhIHByb3h5IGlzIHVzZWQuICBSYXRoZXIgQ1VSTE1fU1RBVEVfV0FJVFBST1hZQ09OTkVDVAogIHNob3VsZCBiZSB1c2VkLgoKICBJIGRpc2NvdmVyZWQgdGhpcyB3aGlsZSBwZXJmb3JtaW5nIGFuIEhUVFBTIHJlcXVlc3QgdGhyb3VnaCBhIHByb3h5IChzcXVpZCkKICBvbiBteSBsb2NhbCBuZXR3b3JrLiBUaGUgcHJvYmxlbSBjYXVzZWQgb3BlbnNzbCB0byBmYWlsIGFzIGl0IHJlYWQgdGhlIHByb3h5CiAgcmVzcG9uc2UgdG8gdGhlIENPTk5FQ1QgY2FsbCAoJ0hUVFAvMS4wIEVzdGFibGlzaGVkJykgcmF0aGVyIHRoYW4gdGhlIFNTTAogIGhhbmRzaGFrZSAodGhlIGV4YWN0IG9wZW5zc2wgZXJyb3Igd2FzICd3cm9uZyBzc2wgdmVyc2lvbicgYnV0IHRoaXMgaXNuJ3QKICB2ZXJ5IGltcG9ydGFudCkKCi0gRGF2ZSBWYXNpbGV2c2t5IGZpbGVkIGJ1ZyByZXBvcnQgIzE3MzY4NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTczNjg3NSkgYWxtb3N0IHNpbXVsdGFub3Vlc2x5IGFzIERhbgogIEZhbmRyaWNoIG1lbnRpb25lZCBhIHJlbGF0ZWQgYnVpbGQgcHJvYmxlbSBvbiB0aGUgbGliY3VybCBtYWlsaW5nIGxpc3Q6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA3LTA2LzAxMzEuaHRtbC4gQm90aCBwcm9ibGVtcyBoYWQgdGhlIHNhbWUKICByZWFzb246IHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgUE9MTCogZGVmaW5lcyBhbmQgdGhlIHBvbGxmZCBzdHJ1Y3QgaW4gdGhlCiAgbGliY3VybCBjb2RlIHdhcyBkZXBlbmRpbmcgb24gSEFWRV9QT0xMIGluc3RlYWQgb2YgSEFWRV9TWVNfUE9MTF9ILgoKRGFuaWVsIFMgKDEzIEp1bmUgMjAwNykKLSBUb20gUmVnbmVyIHByb3ZpZGVkIGEgcGF0Y2ggYW5kIHdvcmtlZCB0b2dldGhlciB3aXRoIEphbWVzIEhvdXNsZXksIHNvIG5vdwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgd29ya3MgZm9yIFNGVFAgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBGVFAKICBvbmVzLgoKLSBSaWNoIFJhdWVuemFobiBmaWxlZCBidWcgcmVwb3J0ICMxNzMzMTE5CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MzMxMTkpIGFuZCB3ZSBjb2xsYWJvcmF0ZWQgb24gdGhlCiAgZml4LiAgVGhlIHByb2JsZW0gaXMgdGhhdCBmb3IgNjRiaXQgSFBVWCBidWlsZHMsIHNldmVyYWwgc29ja2V0LXJlbGF0ZWQKICBmdW5jdGlvbnMgd291bGQgc3RpbGwgYXNzdW1lIGludCAoMzIgYml0KSBhcmd1bWVudHMgYW5kIG5vdCBzb2NrbGVuX3QgKDY0CiAgYml0KSBvbmVzLgoKRGFuaWVsIFMgKDEyIEp1bmUgMjAwNykKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgaGlzIHJldmFtcGVkIFNTSCBjb2RlIHRoYXQgaXMgc3RhdGUtbWFjaGluZSBkcml2ZW4gdG8KICByZWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG5vdyB0b3RhbGx5IG5vbi1ibG9ja2luZyBsaWJzc2gyIChpbiBDVlMpLgoKRGFuIEYgKDggSnVuZSAyMDA3KQotIEluY29ycG9yYXRlZCBEYW5pZWwgQmxhY2sncyB0ZXN0NzA2IGFuZCB0ZXN0NzA3IFNPQ0tTIHRlc3QgY2FzZXMuCgotIEZpeGVkIGEgZmV3IHByb2JsZW1zIHdoZW4gc3RhcnRpbmcgdGhlIFNPQ0tTIHNlcnZlci4KCi0gUmV2ZXJ0ZWQgc29tZSByZWNlbnQgY2hhbmdlcyB0byBydW50ZXN0cy5wbCB0aGF0IHdlcmVuJ3QgY29tcGF0aWJsZSB3aXRoCiAgcGVybCA1LjAuCgotIEZpeGVkIHRoZSB0ZXN0IGhhcm5lc3Mgc28gdGhhdCBpdCBhY3R1YWxseSBraWxscyB0aGUgc3NoIGJlaW5nIHVzZWQgYXMKICB0aGUgU09DS1Mgc2VydmVyLgoKRGFuaWVsIFMgKDYgSnVuZSAyMDA3KQotIC1zLy0tc2lsZW50IGNhbiBub3cgYmUgdXNlZCB0byB0b2dnbGUgb2ZmIHRoZSBzaWxlbmNlIGFnYWluIGlmIHVzZWQgYSBzZWNvbmQKICB0aW1lLgoKRGFuaWVsIFMgKDUgSnVuZSAyMDA3KQotIEFkZGVkIERhbmllbCBCbGFjaydzIHdvcmsgdGhhdCBhZGRzIHRoZSBmaXJzdCBmZXcgU09DS1MgdGVzdCBjYXNlcy4gSSBhbHNvCiAgZml4ZWQgdHdvIG1pbm9yIFNPQ0tTIHByb2JsZW1zIHRvIG1ha2UgdGhlIHRlc3QgY2FzZXMgcnVuIGZpbmUuCgpEYW5pZWwgUyAoMzEgTWF5IDIwMDcpCi0gRmVuZyBUdSBtYWRlIChsaWIpY3VybCBzdXBwb3J0ICJ1cGxvYWQiIHJlc3VtaW5nIHdvcmsgZm9yIGZpbGU6Ly8gVVJMcy4KCkRhbmllbCBTICgzMCBNYXkgMjAwNykKLSBJIG1vZGlmaWVkIHRoZSAxMC1hdC1hLXRpbWUuYyBleGFtcGxlIHRvIHRyYW5zZmVyIDUwMCBkb3dubG9hZHMgaW4gcGFyYWxsZWwKICB3aXRoIGEgYy1hcmVzIGVuYWJsZWQgYnVpbGQgb25seSB0byBmaW5kIHRoYXQgaXQgY3Jhc2hlZCBtaXNlcmFibHksIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBzb21lIHNlbGVjdCgpaXNtcyBsZWZ0IGluIHRoZSBjb2RlLiBUaGlzIHdhcyBkdWUgdG8gQVBJCiAgcmVzdHJpY3Rpb25zIGluIGMtYXJlcyAxLjMueCwgYnV0IHdpdGggdGhlIHVwY29taW5nIGMtYXJlcyAxLjQuMCB0aGlzIGlzIG5vCiAgbG9uZ2VyIHRoZSBjYXNlIHNvIG5vdyBsaWJjdXJsIHJ1bnMgbXVjaCBiZXR0ZXIgd2l0aCBjLWFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZSB3aXRoID4gMTAyNCBmaWxlIGRlc2NyaXB0b3JzIGluIHVzZS4KCiAgRXh0cmEgbm90ZTogc3RhcnRpbmcgbm93IHdlIHJlcXVpcmUgYy1hcmVzIDEuNC4wIGZvciBhc3luY2hyb25vdXMgbmFtZQogIHJlc29sdmVzLgoKLSBBZGRlZCBDVVJMTU9QVF9NQVhDT05ORUNUUyB3aGljaCBpcyBhIGN1cmxfbXVsdGlfc2V0b3B0KCkgb3B0aW9uIGZvciBzZXR0aW5nCiAgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29ubmVjdGlvbiBjYWNoZSBtYXhpbXVtIHNpemUgb2YgdGhlIG11bHRpIGhhbmRsZS4KCkRhbmllbCBTICgyNyBNYXkgMjAwNykKLSBXaGVuIHdvcmtpbmcgd2l0aCBhIHByb2JsZW0gU3RlZmFuIEJlY2tlciBoYWQsIEkgZm91bmQgYW4gb2ZmLWJ5LW9uZSBidWZmZXIKICBvdmVyd3JpdGUgaW4gQ3VybF9zZWxlY3QoKS4gV2hpbGUgZml4aW5nIGl0LCBJIGFsc28gaW1wcm92ZWQgaXRzIHBlcmZvcm1hbmNlCiAgc29tZXdoYXQgYnkgY2hhbmdpbmcgY2FsbG9jIHRvIG1hbGxvYyBhbmQgYnJlYWtpbmcgb3V0IG9mIGEgbG9vcCBlYXJsaWVyCiAgKHdoZW4gcG9zc2libGUpLgoKRGFuaWVsIFMgKDI1IE1heSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGZpeGVkIGJ1ZyAjMTcwNTgwMgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNzA1ODAyKSwgd2hpY2ggd2FzIGZpbGVkIGJ5IERhbmllbAogIEJsYWNrIGlkZW50aWZ5aW5nIHNldmVyYWwgRlRQLVNTTCB0ZXN0IGNhc2VzIGZhaWwgd2hlbiB3ZSBidWlsZCBsaWJjdXJsIHdpdGgKICBOU1MgZm9yIFRMUy9TU0wuIExpc3RlZCBhcyAjNDIgaW4gS05PV05fQlVHUy4KCkRhbmllbCBTICgyNCBNYXkgMjAwNykKLSBTb25nIE1hIGZpbGVkIGJ1ZyByZXBvcnQgIzE3MjQwMTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcyNDAxNikgbm90aWNpbmcgdGhhdCBkb3dubG9hZGluZwogIGdsb2ItcmFuZ2VzIGZvciBURlRQIHdhcyBicm9rZW4gaW4gQ1ZTLiBGaXhlZCBub3cuCiAgCi0gJ215dHgnIGluIGJ1ZyByZXBvcnQgIzE3MjMxOTQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MjMxOTQpCiAgcG9pbnRlZCBvdXQgdGhhdCB0aGUgd2FybmYoKSBmdW5jdGlvbiBpbiB0aGUgY3VybCB0b29sIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgd2l0aCB0aGUgY2FzZXMgd2hlbiBleGNlc3NpdmVseSBsb25nIHdvcmRzIHdlcmUgdXNlZCBpbiB0aGUgc3RyaW5nIHRvIGNob3AKICB1cC4KCkRhbmllbCBTICgyMiBNYXkgMjAwNykKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdmVyaWZpZXMgdGhlCiAgcGVlcidzIG5hbWUgaW4gdGhlIFNTTCBjZXJ0aWZpY2F0ZSB3aGVuIGJ1aWx0IGZvciBPcGVuU1NMLiBUaGUgbGVhayBoYXBwZW5zCiAgZm9yIGxpYmN1cmxzIHdpdGggQ1VSTF9ET0VTX0NPTlZFUlNJT05TIGVuYWJsZWQgdGhhdCBmYWlsIHRvIGNvbnZlcnQgdGhlIENOCiAgbmFtZSBmcm9tIFVURjguIEhlIGFsc28gZml4ZWQgYSBsZWFrIHdoZW4gUEtDUyAjMTIgcGFyc2luZyBmYWlsZWQuCgpEYW5pZWwgUyAoMTggTWF5IDIwMDcpCi0gRmVuZyBUdSByZXBvcnRlZCB0aGF0IGN1cmwgLXcgZGlkIHdyb25nIG9uIFRGVFAgdHJhbnNmZXJzIGluIGJ1ZyByZXBvcnQKICAjMTcxNTM5NCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcxNTM5NCksIGFuZCB0aGUKICB0cmFuc2Zlci1yZWxhdGVkIGluZm8gInZhcmlhYmxlcyIgd2VyZSBpbmRlZWQgb3ZlcndyaXR0ZW4gd2l0aCB6ZXJvZXMKICB3cm9uZ2x5IGFuZCBoYXZlIG5vdyBiZWVuIGFkanVzdGVkLiBUaGUgdXBsb2FkIHNpemUgc3RpbGwgaXNuJ3QgYWNjdXJhdGUuCgpEYW5pZWwgUyAoMTcgTWF5IDIwMDcpCi0gRmVuZyBUdSBwb2ludGVkIG91dCBhIGRpdmlzaW9uIGJ5IHplcm8gZXJyb3IgaW4gdGhlIFRGVFAgY29ubmVjdCB0aW1lb3V0CiAgY29kZSBmb3IgdGltZW91dHMgbGVzcyB0aGFuIGZpdmUgc2Vjb25kcywgYW5kIGFsc28gcHJvdmlkZWQgYSBmaXggZm9yIGl0LgogIEJ1ZyByZXBvcnQgIzE3MTUzOTIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MTUzOTIpCgpEYW4gRiAoMTYgTWF5IDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBmb3IgY29tcGlsaW5nIHVuZGVyIE1pbml4IDMuMS4zIHVzaW5nIEFDSy4KCkRhbiBGICgxNCBNYXkgMjAwNykKLSBBZGRlZCBTRlRQIGRpcmVjdG9yeSBsaXN0aW5nIHRlc3QgY2FzZSA2MTMuCgotIEFkZGVkIHN1cHBvcnQgZm9yIHF1b3RlIGNvbW1hbmRzIGJlZm9yZSBhIHRyYW5zZmVyIHVzaW5nIFNGVFAgYW5kIHRlc3QKICBjYXNlIDYxNC4KCi0gQ2hhbmdlZCB0aGUgcG9zdC1xdW90ZSBjb21tYW5kcyB0byBvY2N1ciBhZnRlciB0aGUgdHJhbnNmZXJyZWQgZmlsZSBpcwogIGNsb3NlZC4KCi0gQWxsb3cgU0ZUUCBxdW90ZSBjb21tYW5kcyBjaG1vZCwgY2hvd24sIGNoZ3JwIHRvIHNldCBhIHZhbHVlIG9mIDAuCgpEYW4gRiAoOSBNYXkgMjAwNykKLSBLcmlzdGlhbiBHdW5zdG9uZSBmaXhlZCBhIHByb2JsZW0gd2hlcmUgb3ZlcndyaXRpbmcgYW4gdXBsb2FkZWQgZmlsZSB3aXRoCiAgc2Z0cCBkaWRuJ3QgdHJ1bmNhdGUgaXQgZmlyc3QsIHdoaWNoIHdvdWxkIGNvcnJ1cHQgdGhlIGZpbGUgaWYgdGhlIG5ldwogIGZpbGUgd2FzIHNob3J0ZXIgdGhhbiB0aGUgb2xkLgoKRGFuIEYgKDggTWF5IDIwMDcpCi0gQWRkZWQgRlRQUyB0ZXN0IGNhc2VzIDQwNiBhbmQgNDA3CgpEYW5pZWwgUyAoOCBNYXkgMjAwNykKLSBDVVJMRV9GVFBfQ09VTEROVF9TVE9SX0ZJTEUgaXMgbm93IGtub3duIGFzIENVUkxFX1VQTE9BRF9GQUlMRUQuIFRoaXMgaXMKICBiZWNhdXNlIEkganVzdCBtYWRlIFNDUCB1cGxvYWRzIHJldHVybiB0aGlzIHZhbHVlIGlmIHRoZSBmaWxlIHNpemUgb2YKICB0aGUgdXBsb2FkIGZpbGUgaXNuJ3QgZ2l2ZW4gd2l0aCBDVVJMT1BUX0lORklMRVNJWkUqLiBEb2NzIHVwZGF0ZWQgdG8KICByZWZsZWN0IHRoaXMgbmV3cywgYW5kIGEgZGVmaW5lIGZvciB0aGUgb2xkIG5hbWUgd2FzIGFkZGVkIHRvIHRoZSBwdWJsaWMKICBoZWFkZXIgZmlsZS4KCkRhbmllbCBTICg3IE1heSAyMDA3KQotIEphbWVzIEJ1cnNhIGZpeGVkIGEgYnVnIGluIHRoZSBtdWx0aSBoYW5kbGUgY29kZSB0aGF0IG1hZGUgdGhlIGNvbm5lY3Rpb24KICBjYWNoZSBncm93IGEgYml0IHRvbyBtdWNoLCBiZXlvbmQgdGhlIG5vcm1hbCA0ICogZWFzeV9oYW5kbGVzLgoKRGFuaWVsIFMgKDIgTWF5IDIwMDcpCi0gQW5kZXJzIEd1c3RhZnNzb24gcmVtYXJrZWQgdGhhdCByZXF1aXJpbmcgQ1VSTE9QVF9IVFRQX1ZFUlNJT04gc2V0IHRvIDEuMAogIHdoZW4gQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUyBpcyB1c2VkIHRvIGF2b2lkIHRoZSBwcm9ibGVtIG1lbnRpb25lZCBiZWxvdyBpcwogIG5vdCB2ZXJ5IG5pY2UgaWYgdGhlIGNsaWVudCB3YW50cyB0byBiZSBhYmxlIHRvIHVzZSBfZWl0aGVyXyBhIEhUVFAgMS4xCiAgc2VydmVyIG9yIG9uZSB3aXRoaW4gdGhlIGFsaWFzZXMgbGlzdC4uLiBzbyBzdGFydGluZyBub3csIGxpYmN1cmwgd2lsbAogIHNpbXBseSBjb25zaWRlciAyMDAtYWxpYXMgbWF0Y2hlcyB0aGUgdG8gYmUgSFRUUCAxLjAgY29tcGxpYW50LgoKLSBUb2JpYXMgUnVuZHN0cvZtIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGV5IGV4cGVyaWVuY2VkIHdpdGggeG1tczIgYW5kIHJlY2VudAogIGxpYmN1cmxzLCB3aGljaCB0dXJuZWQgb3V0IHRvIGJlIHRoZSAyNS1ub3YtMjAwNiBjaGFuZ2Ugd2hpY2ggdHJlYXRzIEhUVFAKICByZXNwb25zZXMgd2l0aG91dCBDb250ZW50LUxlbmd0aCBvciBjaHVua2VkIGVuY29kaW5nIGFzIHdpdGhvdXQgYm9kaWVzLiBXZQogIG5vdyBhZGRlZCB0aGUgY29uZGl0aW9uYWwgdGhhdCB0aGUgYWJvdmUgbWVudGlvbmVkIHJlc3BvbnNlIGlzIG9ubHkgd2l0aG91dAogIGJvZHkgaWYgdGhlIHJlc3BvbnNlIGlzIEhUVFAgMS4xLgoKLSBKZWZmIFBvaGxtZXllciBpbXByb3ZlZCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSB0byB1c2UgdGhlCiAgQ1VSTE1PUFRfVElNRVJGVU5DVElPTiBjYWxsYmFjayBvcHRpb24uCgotIFNldCB0aGUgdGltZW91dCBmb3IgZWFzeSBoYW5kbGVzIHRvIGV4cGlyZSByZWFsbHkgc29vbiBhZnRlciBhZGRpdGlvbiBvcgogIHdoZW4gQ1VSTE1fQ0FMTF9NVUxUSV9QRVJGT1JNIGlzIHJldHVybmVkIGZyb20gY3VybF9tdWx0aV9zb2NrZXQqL3BlcmZvcm0sCiAgdG8gbWFrZSBhcHBsaWNhdGlvbnMgdXNpbmcgb25seSBjdXJsX211bHRpX3NvY2tldCgpIHRvIHByb3Blcmx5IGZ1bmN0aW9uCiAgd2hlbiBhZGRpbmcgZWFzeSBoYW5kbGVzICJvbiB0aGUgZmx5Ii4gQnVnIHJlcG9ydCBhbmQgdGVzdCBhcHAgcHJvdmlkZWQgYnkKICBNaWNoYWVsIFdhbGxuZXIuCgpEYW4gRiAoMzAgQXByaWwgMjAwNykKLSBJbXByb3ZlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFsbG93IHJ1bm5pbmcgdGVzdCBzZXJ2ZXJzIG9uIG90aGVyIHRoYW4KICB0aGUgZGVmYXVsdCBwb3J0IG51bWJlcnMsIGFsbG93aW5nIG1vcmUgdGhhbiBvbmUgdGVzdCBzdWl0ZSB0byBydW4KICBzaW11bHRhbmVvdXNseSBvbiB0aGUgc2FtZSBob3N0LgoKRGFuaWVsIFMgKDI4IEFwcmlsIDIwMDcpCi0gUGV0ZXIgTydHb3JtYW4gZml4ZWQgbGliY3VybCB0byBub3QgaW5pdCBHbnVUTFMgYXMgZWFybHkgYXMgd2UgZGlkIGJlZm9yZSwKICBzaW5jZSBpdCB0aGVuIGluaXRzIGxpYmdjcnlwdCBhbmQgbGliZ2NyeXB0IGlzIGJlaW5nIGV2aWwgYW5kIEVYSVRTIHRoZQogIGFwcGxpY2F0aW9uIGlmIGl0IGZhaWxzIHRvIGdldCBhIGZpbmUgcmFuZG9tIHNlZWQuIFRoYXQncyByZWFsbHkgbm90IGEgbmljZQogIHRoaW5nIHRvIGRvIGJ5IGEgbGlicmFyeS4KCi0gRnJhbmsgSGVtcGVsIGZpeGVkIGEgY3VybF9lYXN5X2R1cGhhbmRsZSgpIGNyYXNoIG9uIGEgaGFuZGxlIHRoYXQgaGFkCiAgYmVlbiByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUsIGFuZCB0aGVuIGZpeGVkIGFub3RoZXIgZmxhdyB0aGF0IHByZXZlbnRlZAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB3b3JrIGV2ZW4gYWZ0ZXIgdGhlIGZpcnN0IGZpeCAtIHRoZSBoYW5kbGUgd2FzCiAgc3RpbGwgbWFya2VkIGFzIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgUyAoMjYgQXByaWwgMjAwNykKLSBQZXRlciBPJ0dvcm1hbiBmb3VuZCBhIHByb2JsZW0gd2l0aCBTQ1AgZG93bmxvYWRzIHdoZW4gdGhlIGRvd25sb2FkZWQgZmlsZQogIHdhcyAxNjM4NSBieXRlcyAoMTZLKzEpIGFuZCBpdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCBwcm9wZXJseSBhbHdheXMgInN1Y2sKICBvdXQiIGFsbCBkYXRhIGZyb20gbGlic3NoMi4gVGhlIGVmZmVjdCBiZWluZyB0aGF0IGxpYmN1cmwgd291bGQgaGFuZyBvbiB0aGUKICBzb2NrZXQgd2FpdGluZyBmb3IgZGF0YSB3aGVuIGxpYnNzaDIgaGFkIGluIGZhY3QgYWxyZWFkeSByZWFkIGl0IGFsbC4uLgoKRGFuIEYgKDI1IEFwcmlsIDIwMDcpCi0gQWRkZWQgc3VwcG9ydCBpbiBydW50ZXN0cy5wbCBmb3IgIiFuIiB0ZXN0IG51bWJlcnMgdG8gZGlzYWJsZSBpbmRpdmlkdWFsCiAgdGVzdHMuICBDaGFuZ2VkIC10IHRvIG9ubHkga2VlcCBsb2cgZmlsZXMgYXJvdW5kIHdoZW4gLWsgaXMgc3BlY2lmaWVkLAogIHRvIGhhdmUgdGhlIHNhbWUgYmVoYXZpb3VyIGFzIHdpdGhvdXQgLXQuCgpEYW5pZWwgUyAoMjUgQXByaWwgMjAwNykKLSBTb25pYSBTdWJyYW1hbmlhbiBicm91Z2h0IG91ciBhdHRlbnRpb24gdG8gYSBwcm9ibGVtIHRoYXQgaGFwcGVucyBpZiB5b3Ugc2V0CiAgdGhlIENVUkxPUFRfUkVTVU1FX0ZST00gb3IgQ1VSTE9QVF9SQU5HRSBvcHRpb25zIGFuZCBhbiBleGlzdGluZyBjb25uZWN0aW9uCiAgaW4gdGhlIGNvbm5lY3Rpb24gY2FjaGUgaXMgY2xvc2VkIHRvIG1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBvbmUgd2hlbiB5b3UgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkuIEl0IHdvdWxkIHRoZW4gd3JvbmdseSBmcmVlIHJhbmdlLXJlbGF0ZWQgZGF0YSBpbiB0aGUKICBjb25uZWN0aW9uIGNsb3NlIGZ1bnRpb24uCgpZYW5nIFRzZSAoMjUgQXByaWwgMjAwNykKLSBTdGV2ZSBMaXR0bGUgZml4ZWQgY29tcGlsYXRpb24gb24gVk1TIDY0LWJpdCBtb2RlCgpEYW5pZWwgUyAoMjQgQXByaWwgMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIG1hZGUgdGhlICdtYXN0ZXJfYnVmZmVyJyBnZXQgYWxsb2NhdGVkIGZpcnN0IG9uY2UgaXQgaXMKICBjYW4vd2lsbCBiZSB1c2VkIGFzIGl0IHRoZW4gbWFrZXMgdGhlIGNvbW1vbiBjYXNlcyBzYXZlIDE2S0Igb2YgZGF0YSBmb3IgZWFjaAogIGVhc3kgaGFuZGxlIHRoYXQgaXNuJ3QgdXNlZCBmb3IgcGlwZWxpbmluZy4KCkRhbiBGICgyMyBBcHJpbCAyMDA3KQotIEFkZGVkIDxwb3N0Y2hlY2s+IHN1cHBvcnQgdG8gdGhlIHRlc3QgaGFybmVzcy4KCi0gQWRkZWQgdGVzdHMgNjEwLTYxMiB0byB0ZXN0IG1vcmUgU0ZUUCBwb3N0LXF1b3RlIGNvbW1hbmRzLgoKRGFuaWVsIFMgKDIyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSdzIHdhcm5pbmcgaWYgLXIvLS1yYW5nZSBpcyBnaXZlbiB3aXRoIGEgImJhZCIgcmFuZ2UsIGFsc28gbm90ZWQgaW4KICB0aGUgbWFuIHBhZ2Ugbm93LgoKLSBEYW5pZWwgQmxhY2sgZmlsZWQgYnVnICMxNzA1MTc3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE3MDUxNzcpIHdoZXJlIC0td2l0aG91dC1zc2wKICAtLXdpdGgtZ251dGwgb3V0cHV0cyBhIHdhcm5pbmcgYWJvdXQgU1NMIG5vdCBiZWluZyBlbmFibGVkIGV2ZW4gdGhvdWdoIEdudVRMUwogIHdhcyBmb3VuZCBhbmQgdXNlZC4KCkRhbmllbCBTICgyMSBBcHJpbCAyMDA3KQotIERhbmllbCBCbGFjayBmaWxlZCBidWcgIzE3MDQ2NzUKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTcwNDY3NSkgaWRlbnRpZnlpbmcgYSBkb3VibGUtZnJlZQogIHByb2JsZW0gaW4gdGhlIFNTTC1kZWFsaW5nIGxheWVyLCB0ZWxsaW5nIEdudVRMUyB0byBmcmVlIE5VTEwgY3JlZGVudGlhbHMgb24KICBjbG9zZWRvd24gYWZ0ZXIgYSBmYWlsdXJlIGFuZCBhIGJhZCAjaWZkZWYgZm9yIE5TUyB3aGVuIGNsb3NpbmcgZG93biBTU0wuCgpZYW5nIFRzZSAoMjAgQXByaWwgMjAwNykKLSBTYXZlIG9uZSBjYWxsIHRvIGN1cmx4X3R2bm93KCksIHdoaWNoIGNhbGxzIGdldHRpbWVvZmRheSgpLCBpbiBlYWNoIG9mCiAgQ3VybF9zb2NrZXRfcmVhZHkoKSwgQ3VybF9wb2xsKCkgYW5kIEN1cmxfc2VsZWN0KCkgd2hlbiB0aGVzZSBhcmUgY2FsbGVkCiAgd2l0aCBhIHplcm8gdGltZW91dCBvciBhIHRpbWVvdXQgdmFsdWUgaW5kaWNhdGluZyBhIGJsb2NraW5nIGNhbGwgc2hvdWxkCiAgYmUgcGVyZm9ybWVkLgoKRGFuaWVsIFMgKDE4IEFwcmlsIDIwMDcpCi0gSmFtZXMgSG91c2xleSBtYWRlIFNGVFAgdXBsb2FkcyB1c2UgbGlic3NoMidzIG5vbi1ibG9ja2luZyBBUEkKCi0gUHJldmVudCB0aGUgaW50ZXJuYWwgcHJvZ3Jlc3MgbWV0ZXIgZnJvbSB1cGRhdGluZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlCiAgcGVyIHNlY29uZC4KCkRhbiBGICgxNyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk2LCAyOTcgYW5kIDI5OCB0byB0ZXN0IC0tZnRwLW1ldGhvZCBoYW5kbGluZwoKRGFuaWVsIFMgKDE2IEFwcmlsIDIwMDcpCi0gUm9iZXJ0IElha29iYXNodmlsIGFkZGVkIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbigpIHRvIGxpYmN1cmwsIHdoaWNoIGlzIGEKICBmdW5jdGlvbiB0aGF0IGRlcHJlY2F0ZXMgdGhlIGN1cmxfbXVsdGlfc29ja2V0KCkgZnVuY3Rpb24uIFVzaW5nIHRoZSBuZXcKICBmdW5jdGlvbiB0aGUgYXBwbGljYXRpb24gdGVsbCBsaWJjdXJsIHdoYXQgYWN0aW9uIHRoYXQgd2FzIGZvdW5kIGluIHRoZQogIHNvY2tldCB0aGF0IGl0IHBhc3NlcyBpbi4gVGhpcyBnaXZlcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0IGFzIGl0CiAgYWxsb3dzIGxpYmN1cmwgdG8gYXZvaWQgYSBjYWxsIHRvIHBvbGwoKS9zZWxlY3QoKSBmb3IgZXZlcnkgY2FsbCB0bwogIGN1cmxfbXVsdGlfc29ja2V0KigpLgoKICBJIGFkZGVkIGEgZGVmaW5lIGluIHRoZSBwdWJsaWMgY3VybC9tdWx0aS5oIGhlYWRlciBmaWxlIHRoYXQgd2lsbCBtYWtlIHlvdXIKICBleGlzdGluZyBhcHBsaWNhdGlvbiBhdXRvbWF0aWNhbGx5IHVzZSBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24oKSBpbnN0ZWFkIG9mCiAgY3VybF9tdWx0aV9zb2NrZXQoKSB3aGVuIHlvdSByZWNvbXBpbGUuIEJ1dCBvZiBjb3Vyc2UgeW91J2xsIGdldCBiZXR0ZXIKICBwZXJmb3JtYW5jZSBpZiB5b3UgYWRqdXN0IHlvdXIgY29kZSBtYW51YWxseSBhbmQgYWN0dWFsbHkgcGFzcyBpbiB0aGUKICBjb3JyZWN0IGFjdGlvbiBiaXRtYXNrIHRvIHRoaXMgZnVuY3Rpb24uCgpEYW5pZWwgUyAoMTQgQXByaWwgMjAwNykKLSBKYXkgQXVzdGluIGFkZGVkICJESCBQQVJBTUVURVJTIiB0byB0aGUgc3R1bm5lbC5wZW0gY2VydGlmaWNhdGUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUgdG8gbWFrZSBzdHVubmVsIHJ1biBiZXR0ZXIgaW4gc29tZSAobW9zdD8pIGVudmlyb25tZW50cy4KCkRhbiBGICgxMyBBcHJpbCAyMDA3KQotIEFkZGVkIHRlc3QgY2FzZXMgMjk0IGFuZCAyOTUgdG8gdGVzdCAtLWZ0cC1hY2NvdW50IGhhbmRsaW5nCgotIEltcHJvdmVkIGhhbmRsaW5nIG9mIG91dCBvZiBtZW1vcnkgaW4gZnRwLgoKWWFuZyBUc2UgKDEzIEFwcmlsIDIwMDcpCi0gRml4IHRlc3QgY2FzZSA1MzQgd2hpY2ggc3RhcnRlZCB0byBmYWlsIDIwMDctMDQtMTMgZHVlIHRvIHRoZSBleGlzdGFuY2UKICBvZiBhIG5ldyBob3N0IG9uIHRoZSBuZXQgd2l0aCB0aGUgc2FtZSBzaWxseSBkb21haW4gdGhlIHRlc3Qgd2FzIHVzaW5nCiAgZm9yIGEgaG9zdCB3aGljaCB3YXMgc3VwcG9zZWQgbm90IHRvIGV4aXN0LgoKRGFuaWVsIFMgKDEyIEFwcmlsIDIwMDcpCi0gU29uZyBNYSBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBpZjJpcCBjb2RlIGlmIHlvdSBwYXNzIGluIGFuIGludGVyZmFjZQogIG5hbWUgbG9uZ2VyIHRoYW4gdGhlIG5hbWUgZmllbGQgb2YgdGhlIGlmcmVxIHN0cnVjdCAodHlwaWNhbGx5IDYgYnl0ZXMpLCBhcwogIHRoZW4gaXQgd291bGRuJ3QgY2xvc2UgdGhlIHVzZWQgZHVtbXkgc29ja2V0LiBCdWcgIzE2OTg5NzQKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTY5ODk3NCkKClZlcnNpb24gNy4xNi4yICgxMSBBcHJpbCAyMDA3KQoKWWFuZyBUc2UgKDEwIEFwcmlsIDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgc29tZSBmaXhlcyBmb3IgSFRUUCBwaXBlbGluaW5nCgotIGNvbmZpZ3VyZSBzY3JpcHQgd2lsbCBpZ25vcmUgLS1lbmFibGUtc3NwaSBvcHRpb24gZm9yIG5vbi1uYXRpdmUgV2luZG93cy4KCkRhbmllbCBTICg5IEFwcmlsIDIwMDcpCi0gTmljayBaaXR6bWFubiBkaWQgc3NoLmMgY2xlYW51cHMKCkRhbmllbCBTICgzIEFwcmlsIDIwMDcpCi0gUm9iIEpvbmVzIGZpeGVkIGJldHRlciAjaWZkZWYnaW5nIGZvciBhIGJ1bmNoIG9mICNpbmNsdWRlIGxpbmVzLgoKRGFuaWVsIFMgKDIgQXByaWwgMjAwNykKLSBOaWNrIFppdHptYW5uIG1hZGUgdGhlIENVUkxPUFRfUE9TVFFVT1RFIG9wdGlvbiB3b3JrIGZvciBTRlRQIGFzIHdlbGwuIFRoZQogIGFjY2VwdGVkIGNvbW1hbmRzIGFyZSBhcyBmb2xsb3dzOgoKICBjaGdycCAoZ2lkKSAocGF0aCkKICAgIENoYW5nZXMgdGhlIGdyb3VwIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKGdpZCkuIChnaWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBjaG1vZCAocGVybXMpIChwYXRoKQogICAgQ2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb2YgdGhlIGZpbGUgb3IgZGlyZWN0b3J5IGF0IChwYXRoKSB0bwogICAgKHBlcm1zKS4gKHBlcm1zKSBtdXN0IGJlIGEgbnVtYmVyIGluIHRoZSBmb3JtYXQgdXNlZCBieSB0aGUgY2htb2QgVW5peAogICAgY29tbWFuZC4KCiAgY2hvd24gKHVpZCkgKHBhdGgpCiAgICBDaGFuZ2VzIHRoZSB1c2VyIElEIG9mIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAocGF0aCkgdG8gKHVpZCkuICh1aWQpCiAgICBtdXN0IGJlIGEgbnVtYmVyLgoKICBsbiAoc291cmNlKSAoZGVzdCkKICAgIENyZWF0ZXMgYSBzeW1ib2xpYyBsaW5rIGF0IChkZXN0KSB0aGF0IHBvaW50cyB0byB0aGUgZmlsZSBsb2NhdGVkIGF0CiAgICAoc291cmNlKS4KCiAgbWtkaXIgKHBhdGgpCiAgICBDcmVhdGVzIGEgbmV3IGRpcmVjdG9yeSBhdCAocGF0aCkuCgogIHJlbmFtZSAoc291cmNlKSAoZGVzdCkKICAgIE1vdmVzIHRoZSBmaWxlIG9yIGRpcmVjdG9yeSBhdCAoc291cmNlKSB0byAoZGVzdCkuCgogIHJtIChwYXRoKQogICAgRGVsZXRlcyB0aGUgZmlsZSBsb2NhdGVkIGF0IChwYXRoKS4KCiAgcm1kaXIgKHBhdGgpCiAgICBEZWxldGVzIHRoZSBkaXJlY3RvcnkgbG9jYXRlZCBhdCAocGF0aCkuIFRoaXMgY29tbWFuZCB3aWxsIHJhaXNlIGFuIGVycm9yCiAgICBpZiB0aGUgZGlyZWN0b3J5IGlzIG5vdCBlbXB0eS4KCiAgc3ltbGluayAoc291cmNlKSAoZGVzdCkKICAgIFNhbWUgYXMgbG4uCgpEYW5pZWwgUyAoMSBBcHJpbCAyMDA3KQotIFJvYmVydCBJYWtvYmFzaHZpbGkgbWFkZSBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBhIGxvdCBmYXN0ZXIgd2hlbiBtYW55CiAgZWFzeSBoYW5kbGVzIGFyZSBhZGRlZCB0byBhIG11bHRpIGhhbmRsZSwgYnkgYXZvaWRpbmcgdGhlIGxvb3Bpbmcgb3ZlciBhbGwKICB0aGUgaGFuZGxlcyB0byBmaW5kIHdoaWNoIG9uZSB0byByZW1vdmUuCgotIE1hdHQgS3JhYWkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYgZmluZSBhZ2Fpbi4KCkRhbmllbCBTICgzMSBNYXJjaCAyMDA3KQotIEZpeGVkIHNldmVyYWwgbWlub3IgaXNzdWVzIGRldGVjdGVkIGJ5IHRoZSBjb3Zlcml0eS5jb20gc2Nhbm5lci4KCi0gIlBpeGVsIiBmaXhlZCBhIHByb2JsZW0gdGhhdCBhcHBlYXJlZCB3aGVuIHlvdSB1c2VkIC1mIHdpdGggdXNlcitwYXNzd29yZAogIGVtYmVkZGVkIGluIHRoZSBVUkwuCgpEYW4gRiAoMjkgTWFyY2ggMjAwNykKLSBEb24ndCB0ZWFyIGRvd24gdGhlIGZ0cCBjb25uZWN0aW9uIGlmIHRoZSBtYXhpbXVtIGZpbGVzaXplIHdhcyBleGNlZWRlZAogIGFuZCBhZGRlZCB0ZXN0cyAyOTAgYW5kIDI5MSB0byBjaGVjay4KCi0gQWRkZWQgZnRwcyB1cGxvYWQgYW5kIFNTTCByZXF1aXJlZCB0ZXN0cyA0MDEgYW5kIDQwMi4KCi0gU2VuZCBhbiBFT0YgbWVzc2FnZSBiZWZvcmUgY2xvc2luZyBhbiBTQ1AgY2hhbm5lbCwgYXMgcmVjb21tZW5kZWQgYnkKICBSRkM0MjU0LiBFbmFibGUgbGlic3NoMiB0cmFjaW5nIHdoZW4gc3NoIGRlYnVnZ2luZyBpcyB0dXJuZWQgb24uCgpZYW5nIFRzZSAoMjcgTWFyY2ggMjAwNykKLSBJbnRlcm5hbCBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIHJlbmFtZWQgdG8gQ3VybF9zb2NrZXRfcmVhZHkoKQoKICBOZXcgSW50ZXJuYWwgd3JhcHBlciBmdW5jdGlvbiBDdXJsX3NlbGVjdCgpIGFyb3VuZCBzZWxlY3QgKDIpLCBpdAogIHVzZXMgcG9sbCgpIHdoZW4gYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUsIHNvIG5vdyBsaWJjdXJsIGNhbiBiZQogIGJ1aWx0IHdpdGhvdXQgc2VsZWN0KCkgc3VwcG9ydCBhdCBhbGwgaWYgYSBmaW5lIHBvbGwoKSBpcyBhdmFpbGFibGUuCgpEYW5pZWwgUyAoMjUgTWFyY2ggMjAwNykKLSBEYW5pZWwgSm9obnNvbiBmaXhlZCBtdWx0aSBjb2RlIHRvIHRyYXZlcnNlIHRoZSBlYXN5IGhhbmRsZSBsaXN0IHByb3Blcmx5LgogIEEgbGVmdC1vdmVyIGJ1ZyBmcm9tIHRoZSBGZWJydWFyeSAyMSBmaXguCgpEYW4gRiAoMjMgTWFyY2ggMjAwNykKLSBBZGRlZCAtLXB1YmtleSBvcHRpb24gdG8gY3VybCBhbmQgbWFkZSAtLWtleSBhbHNvIHdvcmsgZm9yIFNDUC9TRlRQLAogIHBsdXMgbWFkZSAtLXBhc3Mgd29yayBvbiBhbiBTU0ggcHJpdmF0ZSBrZXkgYXMgd2VsbC4KCi0gQ2hhbmdlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGF0dGVtcHQgdG8gZ3JhY2VmdWxseSBzaHV0IGRvd24gc2VydmVycwogIGJlZm9yZSByZXNvcnRpbmcgdG8gdGhlIGtpbGwgLTkgaGFtbWVyLgoKLSBBZGRlZCB0ZXN0IGhhcm5lc3MgaW5mcmFzdHJ1Y3R1cmUgdG8gc3VwcG9ydCBzY3Avc2Z0cCB0ZXN0cywgdXNpbmcKICBPcGVuU1NIIGFzIHRoZSBzZXJ2ZXIuCgotIEZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBzcGVjaWZ5aW5nIGEgcHJveHkgd2l0aCBhIGZpbGU6IFVSTC4KCllhbmcgVHNlICgyMCBNYXJjaCAyMDA3KQotIEZpeGVkOiBXaGVuIGEgc2lnbmFsIHdhcyBjYXVnaHQgYXdhaXRpbmcgZm9yIGFuIGV2ZW50IHVzaW5nIEN1cmxfc2VsZWN0KCkKICBvciBDdXJsX3BvbGwoKSB3aXRoIGEgbm9uLXplcm8gdGltZW91dCBib3RoIGZ1bmN0aW9ucyB3b3VsZCByZXN0YXJ0IHRoZQogIHNwZWNpZmllZCB0aW1lb3V0LiBUaGlzIGNvdWxkIGV2ZW4gbGVhZCB0byB0aGUgZXh0cmVtZSBjYXNlIHRoYXQgaWYgYQogIHNpZ25hbCBhcnJpdmVkIHdpdGggYSBmcmVjdWVuY3kgbG93ZXIgdG8gdGhlIHNwZWNpZmllZCB0aW1lb3V0IG5laXRoZXIKICBmdW5jdGlvbiB3b3VsZCBldmVyIGV4aXQuCgogIEFkZGVkIGV4cGVyaW1lbnRhbCBzeW1ib2wgZGVmaW5pdGlvbiBjaGVjayBDVVJMX0FDS05PV0xFREdFX0VJTlRSIGluCiAgQ3VybF9zZWxlY3QoKSBhbmQgQ3VybF9wb2xsKCkuIFdoZW4gY29tcGlsZWQgd2l0aCBDVVJMX0FDS05PV0xFREdFX0VJTlRSCiAgZGVmaW5lZCBib3RoIGZ1bmN0aW9ucyB3aWxsIHJldHVybiBhcyBzb29uIGFzIGEgc2lnbmFsIGlzIGNhdWdodC4gVXNlIGl0CiAgYXQgeW91ciBvd24gcmlzaywgYWxsIGNhbGxzIHRvIHRoZXNlIGZ1bmN0aW9ucyBpbiB0aGUgbGlicmFyeSBzaG91bGQgYmUKICByZXZpc2l0ZWQgYW5kIGNoZWNrZWQgYmVmb3JlIGZ1bGx5IHN1cHBvcnRpbmcgdGhpcyBmZWF0dXJlLgoKWWFuZyBUc2UgKDE5IE1hcmNoIDIwMDcpCi0gQnJ5YW4gSGVuZGVyc29uIGZpeGVkIHRoZSBwcm9ncmVzcyBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBnZXQgY2FsbGVkIG1vcmUKICBmcmVxdWVudGx5IGFsbG93aW5nIHNhbWUgY2FsbGluZyBmcmVjdWVuY3kgZm9yIHRoZSBjbGllbnQgcHJvZ3Jlc3MgY2FsbGJhY2suCiAgCkRhbiBGICgxNSBNYXJjaCAyMDA3KQotIFZhcmlvdXMgbWVtb3J5IGxlYWtzIHBsdWdnZWQgYW5kIE5VTEwgcG9pbnRlciBmaXhlcyBtYWRlIGluIHRoZSBzc2ggY29kZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNykKLSBOaWNrIG1hZGUgdGhlIGN1cmwgdG9vbCBhY2NlcHQgZ2xvYmJpbmcgcmFuZ2VzIHRoYXQgb25seSBpcyBvbmUgbnVtYmVyLCBpLmUKICB5b3UgY2FuIG5vdyB1c2UgWzEtMV0gd2l0aG91dCBjdXJsIGNvbXBsYWluaW5nLgoKRGFuaWVsICgxMCBNYXJjaCAyMDA3KQotIEV5Z2VuZSBSeWFiaW5raW46CgogIFRoZSBwcm9ibGVtIGlzIHRoZSBmb2xsb3dpbmc6IHdoZW4gd2UncmUgY2FsbGluZyBDdXJsX2RvbmUgYW5kIGl0IGRlY2lkZXMgdG8KICBrZWVwIHRoZSBjb25uZWN0aW9uIG9wZW5lZCAoJ2xlZnQgaW50YWN0JyksIHRoZW4gdGhlIGNhbGxlciBpcyBub3Qgbm90aWZpZWQKICB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkb25lIHZpYSB0aGUgTlVMTGlmeWluZyBvZiB0aGUgcG9pbnRlciwgc28gc29tZSBlYXN5CiAgaGFuZGxlIGlzIGtlZXBpbmcgdGhlIHBvaW50ZXIgdG8gdGhpcyBjb25uZWN0aW9uLgoKICBMYXRlciBDb25uZWN0aW9uRXhpc3RzIGNhbiBzZWxlY3Qgc3VjaCBjb25uZWN0aW9uIGZvciByZXVzZSBldmVuIGlmIHdlJ3JlCiAgbm90IHBpcGVsaW5pbmc6IHBpcGVMZW4gaXMgemVybywgc28gdGhlIChwaXBlTGVuID4gMCAmJiAhY2FuUGlwZWxpbmUpIGlzCiAgZmFsc2UgYW5kIHdlIGNhbiByZXVzZSB0aGlzIGNvbm5lY3Rpb24gZm9yIGFub3RoZXIgZWFzeSBoYW5kbGUuIEJ1dCB0aHVzIHRoZQogIGNvbm5lY3Rpb24gd2lsbCBiZSBzaGFyZWQgYmV0d2VlbiB0d28gZWFzeSBoYW5kbGVzIGlmIHRoZSBoYW5kbGUgdGhhdCB3YW50cwogIHRvIHRha2UgdGhlIG93bmVyc2hpcCBpcyBub3QgdGhlIHNhbWUgYXMgd2FzIG5vdCBub3RpZmllZCBvZiB0aGUgY29ubmVjdGlvbgogIHdhcyBkb25lIGluIEN1cmxfZG9uZS4gQW5kIHdoZW4gc29tZSBvZiB0aGVzZSBlYXN5IGhhbmRsZXMgd2lsbCBnZXQgdGhlaXIKICBjb25uZWN0aW9uIHJlYWxseSBmcmVlZCB0aGUgYW5vdGhlciBvbmUgd2lsbCBzdGlsbCBrZWVwIHRoZSBwb2ludGVyLgoKICBNeSBmaXggd2FzIHJhdGhlciB0cml2aWFsOiBJIGp1c3QgYWRkZWQgdGhlIE5VTExpZmljYXRpb24gdG8gdGhlICdlbHNlJwogIGJyYW5jaCBpbiB0aGUgQ3VybF9kb25lLiBNeSB0ZXN0cyB3aXRoIEdpdCBhbmQgRWxlY3RyaWNGZW5jZSBzaG93ZWQgbm8KICBwcm9ibGVtcyBib3RoIGZvciBIVFRQIHB1bGxpbmcgYW5kIGNsb25pbmcuIFJlcG9zaXRvcnkgc2l6ZSBpcyBhYm91dCAyNTAgTWIsCiAgc28gaXQgd2FzIGEgY29uc2lkZXJhYmxlIGFtb3VudCBvZiBDdXJsJ3Mgd29yay4KCkRhbiBGICg5IE1hcmNoIDIwMDcpCi0gVXBkYXRlZCB0aGUgdGVzdCBoYXJuZXNzIHRvIGFkZCBhIG5ldyAiY3J5cHRvIiBmZWF0dXJlIGNoZWNrIGFuZCB1cGRhdGVkIHRoZQogIGFwcHJvcHJpYXRlIHRlc3QgY2FzZSB0byB1c2UgaXQuICBGb3Igbm93LCB0aGlzIGlzIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdGhlCiAgIlNTTCIgZmVhdHVyZSBiZWNhdXNlIGN1cmwgZG9lc24ndCBsaXN0IGl0IHNlcGFyYXRlbHkuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNykKLSBSb2JlcnQgSWFrb2Jhc2h2aWxpIGZpeGVkIENVUkxPUFRfSU5URVJGQUNFIGZvciBJUHY2LgoKLSBSb2JlcnQgQS4gTW9uYXQgaW1wcm92ZWQgdGhlIG1ha2V0Z3ogYW5kIFZDNi84IGdlbmVyYXRpbmcgdG8gc2V0IHRoZSBjb3JyZWN0CiAgbWFjaGluZSB0eXBlIHRvby4KCi0gSnVzdGluIEZsZXRjaGVyIGZpeGVkIGEgZmlsZSBkZXNjcmlwdG9yIGxlYWsgaW4gdGhlIGN1cmwgdG9vbCB3aGVuIHRyeWluZyB0bwogIHVwbG9hZCBhIGZpbGUgaXQgY291bGRuJ3Qgb3Blbi4gQnVnICMxNjc2NTgxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2NzY1ODEpCgpEYW4gRiAoOSBNYXJjaCAyMDA3KQotIFVwZGF0ZWQgdGhlIHRlc3QgaGFybmVzcyB0byBjaGVjayBmb3IgcHJvdG9jb2wgc3VwcG9ydCBiZWZvcmUgcnVubmluZyBlYWNoCiAgdGVzdCwgZml4aW5nIEtOT1dOX0JVR1MgIzExLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBSZWludHJvZHVjZWQgKGFmdGVyIGEgMyB5ZWFyIGhpYXR1cykgYW4gRlRQUyB0ZXN0IGNhc2UgKDQwMCkgaW50byB0aGUgdGVzdAogIGhhcm5lc3MuICBJdCBpcyB2ZXJ5IGxpbWl0ZWQgYXMgaXQgc3VwcG9ydHMgb25seSBmdHBzOi8vIFVSTHMgd2l0aAogIC0tZnRwLXNzbC1jb250cm9sIHNwZWNpZmllZCwgd2hpY2ggaW1wbGljaXRseSBlbmNyeXB0cyB0aGUgY29udHJvbAogIGNoYW5uZWwgYnV0IG5vdCB0aGUgZGF0YSBjaGFubmVscy4gIFRoYXQgYWxsb3dzIHN0dW5uZWwgdG8gYmUgdXNlZCB3aXRoCiAgYW4gdW5tb2RpZmllZCBmdHAgc2VydmVyIGluIGV4YWN0bHkgdGhlIHNhbWUgd2F5IHRoYXQgdGhlIHRlc3QgaHR0cHMKICBzZXJ2ZXIgaXMgc2V0IHVwLgoKRGFuIEYgKDcgTWFyY2ggMjAwNykKLSBIb25vdXIgLS1mdHAtc3NsLWNvbnRyb2wgb24gZnRwczovLyBVUkxzIHRvIGFsbG93IGVuY3J5cHRlZCBjb250cm9sIGFuZAogIHVuZW5jcnlwdGVkIGRhdGEgY29ubmVjdGlvbnMuCgpEYW4gRiAoNiBNYXJjaCAyMDA3KQotIEZpeGVkIGEgY291cGxlIG9mIGltcHJvcGVyIHBvaW50ZXIgdXNlcyBkZXRlY3RlZCBieSB2YWxncmluZCBpbiB0ZXN0CiAgY2FzZXMgMTgxICYgMjE2LgoKRGFuaWVsICgyIE1hcmNoIDIwMDcpCi0gUm9iZXJ0IEEuIE1vbmF0IGFuZCBTaG11bGlrIFJlZ2V2IGhlbHBlZCBvdXQgdG8gZml4IHRoZSBuZXcgKi9NYWtlZmlsZS52YzgKICBtYWtlZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIHNvdXJjZSByZWxlYXNlIGFyY2hpdmVzLCBnZW5lcmF0ZWQgZnJvbQogIHRoZSBNYWtlZmlsZS52YzYgZmlsZXMgYnkgdGhlIG1ha2V0Z3ogc2NyaXB0LiBJIGFsc28gbW9kaWZpZWQgdGhlIHJvb3QKICBNYWtlZmlsZSB0byBoYXZlIGEgVkMgdmFyaWFibGUgdGhhdCBkZWZhdWx0cyB0byB2YzYgYnV0IGNhbiBiZSBvdmVycmlkZGVuIHRvCiAgYWxsb3cgaXQgdG8gYmUgdXNlZCBmb3IgdmM4IGFzIHdlbGwuIExpa2UgdGhpczoKCiAgICBubWFrZSBWQz12YzggdmMKCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNykKLSBIYW5nIEtpbiBMYXUgZm91bmQgYW5kIGZpeGVkOiBXaGVuIEkgdXNlIGxpYmN1cmwgdG8gY29ubmVjdCB0byBhbiBodHRwcwogIHNlcnZlciB0aHJvdWdoIGEgcHJveHkgYW5kIGhhdmUgdGhlIHJlbW90ZSBodHRwcyBzZXJ2ZXIgcG9ydCBzZXQgdXNpbmcgdGhlCiAgQ1VSTE9QVF9QT1JUIG9wdGlvbiwgcHJvdG9jb2wgZ2V0cyByZXNldCB0byBodHRwIGZyb20gaHR0cHMgYWZ0ZXIgdGhlIGZpcnN0CiAgcmVxdWVzdC4KIAogIFVzZXIgZGVmaW5lZCBVUkwgd2FzIG1vZGlmaWVkIGludGVybmFsbHkgYnkgbGliY3VybCBhbmQgc3Vic2VxdWVudCByZXVzZSBvZgogIHRoZSBlYXN5IGhhbmRsZSBtYXkgbGVhZCB0byBjb25uZWN0aW9uIHVzaW5nIGEgZGlmZmVyZW50IHByb3RvY29sIChpZiBub3QKICBvcmlnaW5hbGx5IGh0dHApLgogCiAgSSBmb3VuZCB0aGF0IGxpYmN1cmwgaGFyZGNvZGVkIHRoZSBwcm90b2NvbCB0byAiaHR0cCIgd2hlbiBpdCB0cmllcyB0bwogIHJlZ2VuZXJhdGUgdGhlIFVSTCBpZiBDVVJMT1BUX1BPUlQgaXMgc2V0LiBJIHRyaWVkIHRvIGZpeCB0aGUgcHJvYmxlbSBhcwogIGZvbGxvd3MgYW5kIGl0J3Mgd29ya2luZyBmaW5lIHNvIGZhcgoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA3KQotIEFkYW0gRC4gTW9zcyBtYWRlIHRoZSBIVFRQIENPTk5FQ1QgcHJvY2VkdXJlIGxlc3MgYmxvY2tpbmcgd2hlbiB1c2VkIGZyb20KICB0aGUgbXVsdGkgaW50ZXJmYWNlLiBOb3RlIHRoYXQgaXQgc3RpbGwgZG9lcyBhIHBhcnQgb2YgdGhlIGNvbm5lY3Rpb24gaW4gYQogIGJsb2NraW5nIG1hbm5lci4KCkRhbmllbCAoMjMgRmVicnVhcnkgMjAwNykKLSBBZGRlZCB3YXJuaW5nIG91dHB1dHMgaWYgdGhlIGNvbW1hbmQgbGluZSB1c2VzIG1vcmUgdGhhbiBvbmUgb2YgdGhlIG9wdGlvbnMKICAtdiwgLS10cmFjZSBhbmQgLS10cmFjZS1hc2NpaSwgc2luY2UgaXQgY291bGQgcmVhbGx5IGNvbmZ1c2UgdGhlIHVzZXIuCiAgQ2xhcmlmaWVkIHRoaXMgZmFjdCBpbiB0aGUgbWFuIHBhZ2UuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDcpCi0gUmF2aSBQcmF0YXAgcHJvdmlkZWQgd29yayBvbiBsaWJjdXJsIG1ha2luZyBwaXBlbGluaW5nIG1vcmUgcm9idXN0IGFuZAogIGZpeGluZyBzb21lIGJ1Z3M6CiAgbyBEb24ndCBtaXggR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGluIGEgcGlwZWxpbmUKICBvIEZpeCB0aGUgb3JkZXIgaW4gd2hpY2ggcmVxdWVzdHMgYXJlIGRpc3BhdGNoZWQgZnJvbSB0aGUgcGlwZWxpbmUKICBvIEZpeGVkIHNldmVyYWwgY3VybCBidWdzIHdpdGggcGlwZWxpbmluZyB3aGVuIHRoZSBzZXJ2ZXIgaXMgcmV0dXJuaW5nCiAgICBjaHVua2VkIGVuY29kaW5nOgogICAgKiBBZGRlZCBzdGF0ZXMgdG8gY2h1bmtlZCBwYXJzaW5nIGZvciBmaW5hbCBDUkxGCiAgICAqIFJld2luZCBidWZmZXIgYWZ0ZXIgcGFyc2luZyBjaHVuayB3aXRoIGRhdGEgcmVtYWluaW5nCiAgICAqIE1vdmVkIGNodW5rZWQgaGVhZGVyIGluaXRpYWxpemluZyB0byBhIHNwb3QganVzdCBiZWZvcmUgcmVjZWl2aW5nCiAgICAgIGhlYWRlcnMKCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGNoYW5nZWQgdGhlIENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIHRvIGhhbmRsZQogIGFjdGl2ZSBhbmQgcGFzc2l2ZSBDQ0Mgc2h1dGRvd24gYW5kIGFkZGVkIHRoZSAtLWZ0cC1zc2wtY2NjLW1vZGUgY29tbWFuZAogIGxpbmUgb3B0aW9uLgoKRGFuaWVsICgxOSBGZWJydWFyeSAyMDA3KQotIElhbiBUdXJuZXIgZml4ZWQgdGhlIGxpYmN1cmwubTQgbWFjcm8ncyBzdXBwb3J0IGZvciAtLXdpdGgtbGliY3VybC4KCi0gU2htdWxpayBSZWdldiBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIHJlLXVzZWQgSFRUUFMgY29ubmVjdGlvbnMsIGF0IGxlYXN0CiAgd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIHdhcyB1c2VkLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIG1hZGUgcGFzc2l2ZSBGVFAgdHJhbnNmZXJzIHdvcmsgd2l0aCBTT0NLUyAoYm90aCA0IGFuZAogIDUpLgoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA3KQotIEplZmYgUG9obG1leWVyIGlkZW50aWZpZWQgdHdvIHByb2JsZW1zOiBmaXJzdCBhIHJhdGhlciBvYnNjdXJlIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Rpb24gcmUtdXNlIHRoYXQgY291bGQgbWFrZSBhCiAgY3VybF9tdWx0aV9yZW1vdmVfaGFuZGxlKCkgcnVpbiBhIHBvaW50ZXIgaW4gYW5vdGhlciBoYW5kbGUuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSB3YXMgbGVzcyBvZiBhbiBhY3R1YWwgcHJvYmxlbSBidXQgbW9yZSBvZiBtaW5vciBxdWlyazoKICB0aGUgcmUtdXNpbmcgb2YgY29ubmVjdGlvbnMgd2Fzbid0IHByb3Blcmx5IGNoZWNraW5nIGlmIHRoZSBjb25uZWN0aW9uIHdhcwogIG1hcmtlZCBmb3IgY2xvc3VyZS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNykKLSBEdW5jYW4gTWFjLVZpY2FyIFByZXR0IGFuZCBNaWNoYWwgTWFyZWsgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCByZXNldHRpbmcKICBDVVJMT1BUX1JBTkdFIGJhY2sgdG8gbm8gcmFuZ2Ugb24gYW4gZWFzeSBoYW5kbGUgd2hlbiB1c2luZyBGVFAuCgpEYW4gRiAoMTQgRmVicnVhcnkgMjAwNykKLSBGaXhlZCBjdXJsLWNvbmZpZyAtLWxpYnMgc28gaXQgZG9lc24ndCBsaXN0IHVubmVjZXNzYXJ5IGxpYnJhcmllcyAoYW5kCiAgdGhlcmVmb3JlIGludHJvZHVjZSB1bm5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMpIHdoZW4gaXQncyBub3QgbmVlZGVkLgogIEFsc28sIGRvbid0IGJvdGhlciBhZGRpbmcgYSBsaWJyYXJ5IHBhdGggb2YgL3Vzci9saWIKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNykKLSBUaGUgZGVmYXVsdCBwYXNzd29yZCBmb3IgYW5vbnltb3VzIEZUUCBjb25uZWN0aW9ucyBpcyBub3cgY2hhbmdlZCB0byBiZQogICJmdHBAZXhhbXBsZS5jb20iLgoKLSBSb2JlcnQgQS4gTW9uYXQgbWFkZSBsaWJjdXJsIGJ1aWxkIGZpbmUgd2l0aCBWQzIwMDUgLSBpdCBkb2Vzbid0IGhhdmUKICBnbXRpbWVfcigpIGxpa2UgdGhlIG9sZGVyIFZDIHZlcnNpb25zLiBIZSBhbHNvIG1hZGUgdXNlIG9mIHNvbWUgbWFjaGluZS0KICBzcGVjaWZpYyBkZWZpbmVzIHRvIGRpZmZlcmVudGlhdGUgdGhlICJPUyIgZGVmaW5lLgoKRGFuaWVsICgxMiBGZWJydWFyeSAyMDA3KQotIFJvYiBDcml0dGVuZGVuIGFkZGVkIHN1cHBvcnQgZm9yIE5TUyAoTmV0d29yayBTZWN1cml0eSBTZXJ2aWNlKSBmb3IgdGhlCiAgU1NML1RMUyBsYXllci4gaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9wcm9qZWN0cy9zZWN1cml0eS9wa2kvbnNzLwoKICBUaGlzIGlzIHRoZSBmb3VydGggc3VwcG9ydGVkIGxpYnJhcnkgZm9yIFRMUy9TU0wgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIQoKLSBTaG11bGlrIFJlZ2V2IGZpeGVkIHNvIHRoYXQgdGhlIGZpbmFsIENSTEYgb2YgSFRUUCByZXNwb25zZSBoZWFkZXJzIGFyZSBzZW50CiAgdG8gdGhlIGRlYnVnIGNhbGxiYWNrLgoKLSBTaG11bGlrIFJlZ2V2IGFkZGVkIENVUkxPUFRfSFRUUF9DT05URU5UX0RFQ09ESU5HIGFuZAogIENVUkxPUFRfSFRUUF9UUkFOU0ZFUl9ERUNPRElORyB0aGF0IGlmIHNldCB0byB6ZXJvIHdpbGwgZGlzYWJsZSBsaWJjdXJsJ3MKICBpbnRlcm5hbCBkZWNvZGluZyBvZiBjb250ZW50IG9yIHRyYW5zZmVyIGVuY29kZWQgY29udGVudC4gVGhpcyBtYXkgYmUKICBwcmVmZXJhYmxlIGluIGNhc2VzIHdoZXJlIHlvdSB1c2UgbGliY3VybCBmb3IgcHJveHkgcHVycG9zZXMgb3Igc2ltaWxhci4gVGhlCiAgY29tbWFuZCBsaW5lIHRvb2wgZ290IGEgLS1yYXcgb3B0aW9uIHRvIGRpc2FibGUgYm90aCBhdCBvbmNlLgoKLSByZWxlYXNlIHRhcmJhbGxzIG1hZGUgd2l0aCBtYWtldGd6IHdpbGwgZnJvbSBub3cgb24gaGF2ZSBhIExJQkNVUkxfVElNRVNUQU1QCiAgZGVmaW5lIHNldCB0byBob2xkIHRoZSBleGFjdCBkYXRlIGFuZCB0aW1lIG9mIHdoZW4gdGhlIHRhcmJhbGwgd2FzIGJ1aWx0LCBhcwogIGEgaHVtYW4gcmVhZGFibGUgc3RyaW5nIHVzaW5nIHRoZSBVVEMgdGltZSB6b25lLgogIAotIEplZmYgUG9obG1leWVyIGZpeGVkIGEgZmxhdyBpbiBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSB3aGVuIGFkZGluZyBhIGhhbmRsZQogIHRoYXQgaGFzIGFuIGVhc3kgaGFuZGxlIHByZXNlbnQgaW4gdGhlICJjbG9zdXJlIiBsaXN0IHBlbmRpbmcgY2xvc3VyZS4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDA3KQotIFJlZ3VsYXIgZmlsZSBkb3dubG9hZHMgd2lodCBTRlRQIGFuZCBTQ1AgYXJlIG5vdyBkb25lIHVzaW5nIHRoZSBub24tYmxvY2tpbmcKICBBUEkgb2YgbGlic3NoMiwgaWYgdGhlIGxpYnNzaDIgaGVhZGVycyBzZWVtIHRvIHN1cHBvcnQgdGhlbS4gVGhpcyB3aWxsIG1ha2UKICBTQ1AgYW5kIFNGVFAgbXVjaCBtb3JlIHJlc3BvbnNpdmUgYW5kIGJldHRlciBsaWJjdXJsIGNpdGl6ZW5zIHdoZW4gdXNlZCB3aXRoCiAgdGhlIG11bHRpIGludGVyZmFjZSBldGMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNykKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgc3VwcG9ydCBmb3IgQ1VSTE9QVF9USU1FT1VUX01TIGFuZAogIENVUkxPUFRfQ09OTkVDVFRJTUVPVVRfTVMgdGhhdCwgYXMgdGhlaXIgbmFtZXMgc3VnZ2VzdCwgZG8gdGhlIHRpbWVvdXRzIHdpdGgKICBtaWxsaXNlY29uZCByZXNvbHV0aW9uLiBUaGUgb25seSByZXN0cmljdGlvbiB0byB0aGF0IGlzIHRoZSBhbGFybSgpCiAgKHNvbWV0aW1lcykgdXNlZCB0byBhYm9ydCBuYW1lIHJlc29sdmVzIGFzIHRoYXQgdXNlcyBmdWxsIHNlY29uZHMuIEkgZml4ZWQKICB0aGUgRlRQIHJlc3BvbnNlIHRpbWVvdXQgcGFydCBvZiB0aGUgcGF0Y2guCgogIEludGVybmFsbHkgd2Ugbm93IGNvdW50IGFuZCBrZWVwIHRoZSB0aW1lb3V0cyBpbiBtaWxsaXNlY29uZHMgYnV0IGl0IGFsc28KICBtZWFucyB3ZSBtdWx0aXBseSBzZXQgdGltZW91dHMgd2l0aCAxMDAwLiBUaGUgZWZmZWN0IG9mIHRoaXMgaXMgdGhhdCBubwogIHRpbWVvdXQgY2FuIGJlIHNldCB0byBtb3JlIHRoYW4gMl4zMSBtaWxsaXNlY29uZHMgKG9uIDMyIGJpdCBzeXN0ZW1zKSwgd2hpY2gKICBlcXVhbHMgMjQuODYgZGF5cy4gIFdlIHByb2JhYmx5IGNvdWxkbid0IGJlZm9yZSBlaXRoZXIgc2luY2UgdGhlIGNvZGUgZGlkCiAgKjEwMDAgb24gdGhlIHRpbWVvdXQgdmFsdWVzIG9uIHNldmVyYWwgcGxhY2VzIGFscmVhZHkuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwNykKLSBZYW5nIFRzZSBmaXhlZCB0aGUgY29va2llIGV4cGlyeSBkYXRlIGluIHNldmVyYWwgdGVzdCBjYXNlcyB0aGF0IHN0YXJ0ZWQgdG8KICBmYWlsIHNpbmNlIHRoZXkgdXNlZCAiMSBmZWIgMjAwNyIuLi4KCi0gTWFuZnJlZCBTY2h3YXJiIHJlcG9ydGVkIHRoYXQgc29ja3M1IHN1cHBvcnQgd2FzIGJyb2tlbiBhbmQgaGVscCB1cyBwaW5wb2ludAogIHRoZSBwcm9ibGVtLiBUaGUgY29kZSBub3cgdHJpZXMgaGFyZGVyIHRvIHVzZSBodHRwcm94eSBhbmQgcHJveHkgd2hlcmUKICBhcHBwcm9wcmlhdGUsIGFzIG5vdCBhbGwgcHJveGllcyBhcmUgSFRUUC4uLgoKVmVyc2lvbiA3LjE2LjEgKDI5IEphbnVhcnkgMjAwNykKCkRhbmllbCAoMjkgSmFudWFyeSAyMDA3KQotIE1pY2hhZWwgV2FsbG5lciByZXBvcnRlZCB0aGF0IHdoZW4gZG9pbmcgYSBDT05ORUNUIHdpdGggYSBjdXN0b20gVXNlci1BZ2VudAogIGhlYWRlciwgeW91IGdvdCBfdHdvXyBVc2VyLUFnZW50IGhlYWRlcnMgaW4gdGhlIENPTk5FQ1QgcmVxdWVzdC4uLiEgQWRkZWQKICB0ZXN0IGNhc2UgMjg3IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgyOCBKYW51YXJ5IDIwMDcpCi0gY3VybF9lYXN5X3Jlc2V0KCkgbm93IHJlc2V0cyB0aGUgQ0EgYnVuZGxlIHBhdGggY29ycmVjdGx5LgoKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCB0aGUgQ3VybCBjb21tYW5kIGxpbmUgdG9vbCBmb3IgSFRUUCBvbiBub24tQVNDSUkKICBwbGF0Zm9ybXMuCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwNykKLSBBZGRlZCB0aGUgLS1saWJjdXJsIFtmaWxlXSBvcHRpb24gdG8gY3VybC4gQXBwZW5kIHRoaXMgb3B0aW9uIHRvIGFueQogIG9yZGluYXJ5IGN1cmwgY29tbWFuZCBsaW5lLCBhbmQgeW91IHdpbGwgZ2V0IGEgbGliY3VybC11c2luZyBzb3VyY2UgY29kZQogIHdyaXR0ZW4gdG8gdGhlIGZpbGUgdGhhdCBkb2VzIHRoZSBlcXVpdmFsZW50IG9wZXJhdGlvbiBvZiB3aGF0IHlvdXIgY29tbWFuZAogIGxpbmUgb3BlcmF0aW9uIGRvZXMhCgpEYW4gRiAoMjQgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgZGFuZ2xpbmcgcG9pbnRlciBwcm9ibGVtIHRoYXQgcHJldmVudGVkIHRoZSBodHRwX3Byb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGUgZnJvbSBiZWluZyBwcm9wZXJseSB1c2VkIGluIG1hbnkgY2FzZXMgKGFuZCBjYXVzZWQgdGVzdCBjYXNlIDYzCiAgdG8gZmFpbCkuCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBkaWQgTlRMTSBjaGFuZ2VzIG1haW5seSBmb3Igbm9uLUFTQ0lJIHBsYXRmb3JtczoKCiAgIzEKICBUaGVyZSdzIGEgY29tcGlsYXRpb24gZXJyb3IgaW4gaHR0cF9udGxtLmMgaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBOT1QKICBkZWZpbmVkLiAgSSBub3RpY2VkIHRoaXMgd2hpbGUgdGVzdGluZyB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLiAgTGluZSA4Njcgb2YKICB0aGUgY3VycmVudCBodHRwX250bG0uYyBpcyBhIGNsb3NpbmcgYnJhY2tldCBmb3IgYW4gaWYvZWxzZSBwYWlyIHRoYXQgb25seQogIGdldHMgY29tcGlsZWQgaW4gaWYgVVNFX05UTE0yU0VTU0lPTiBpcyBkZWZpbmVkLiAgQnV0IHRoaXMgY2xvc2luZyBicmFja2V0CiAgd2Fzbid0IGluIGFuICNpZmRlZiBzbyB0aGUgY29kZSBmYWlscyB0byBjb21waWxlIHVubGVzcyBVU0VfTlRMTTJTRVNTSU9OIHdhcwogIGRlZmluZWQuICBMaW5lcyAxOTggYW5kIDE0MCBvZiBteSBwYXRjaCB3cmFwcyB0aGF0IGNsb3NpbmcgYnJhY2tldCBpbiBhbgogICNpZmRlZiBVU0VfTlRMTTJTRVNTSU9OLgoKICAjMgogIEkgbm90aWNlZCBzZXZlcmFsIHBpY2t5IGNvbXBpbGVyIHdhcm5pbmdzIHdoZW4gREVCVUdfTUUgaXMgZGVmaW5lZC4gIEkndmUKICBmaXhlZCB0aGVtIHdpdGggY2FzdGluZy4gIEJ5IHRoZSB3YXksIERFQlVHX01FIHdhcyBhIGh1Z2UgaGVscCBpbgogIHVuZGVyc3RhbmRpbmcgdGhpcyBjb2RlLgoKICAjMwogIEhvcGVmdWxseSB0aGUgbGFzdCBub24tQVNDSUkgY29udmVyc2lvbiBwYXRjaCBmb3IgbGliY3VybCBpbiBhIHdoaWxlLiAgSQogIGNoYW5nZWQgdGhlICJOVExNU1NQIiBsaXRlcmFsIHRvIGhleCBzaW5jZSB0aGlzIHNpZ25hdHVyZSBtdXN0IGFsd2F5cyBiZSBpbgogIEFTQ0lJLgoKICBDb252ZXJzaW9uIGNvZGUgd2FzIHN0cmF0ZWdpY2FsbHkgYWRkZWQgd2hlcmUgbmVjZXNzYXJ5LiAgQW5kIHRoZQogIEN1cmxfYmFzZTY0X2VuY29kZSBjYWxscyB3ZXJlIGNoYW5nZWQgc28gdGhlIGJpbmFyeSAiYmxvYnMiIGh0dHBfbnRsbS5jCiAgY3JlYXRlcyBhcmUgTk9UIHRyYW5zbGF0ZWQgb24gbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbiBGICgyMiBKYW51YXJ5IDIwMDcpCi0gQ29udmVydGVkIChtb3N0IG9mKSB0aGUgdGVzdCBkYXRhIGZpbGVzIGludG8gZ2VudWluZSBYTUwuICBBIGhhbmRmdWwgc3RpbGwKICBhcmUgbm90LCBkdWUgbWFpbmx5IHRvIHRoZSBsYWNrIG9mIHN1cHBvcnQgZm9yIFhNTCBjaGFyYWN0ZXIgZW50aXRpZXMKICAoZS5nLiAmID0+ICZhbXA7ICkuICBUaGlzIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gdmFsaWRhdGUgdGVzdCBmaWxlcyB1c2luZwogIHRvb2xzIGxpa2UgeG1sbGludCwgYXMgd2VsbCBhcyB0byBlZGl0IGFuZCB2aWV3IHRoZW0gdXNpbmcgWE1MIHRvb2xzLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDcpCi0gQXJtZWwgQXNzZWxpbiBpbXByb3ZlZCBsaWJjdXJsIHRvIGJlaGF2ZSBhIGxvdCBiZXR0ZXIgd2hlbiBhbiBlYXN5IGhhbmRsZQogIGRvaW5nIGFuIEZUUCB0cmFuc2ZlciBpcyByZW1vdmVkIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIGNvbXBsZXRpb24uIFRoZQogIGZpeCBhbHNvIGZpeGVkIHRoZSAiYWxpdmUgY291bnRlciIgdG8gYmUgY29ycmVjdCBvbiAicHJlbWF0dXJlIHJlbW92YWwiIGZvcgogIGFsbCBwcm90b2NvbHMuCgpEYW4gRiAoMTYgSmFudWFyeSAyMDA3KQotIEZpeGVkIGEgc21hbGwgbWVtb3J5IGxlYWsgaW4gdGZ0cCB1cGxvYWRzIGRpc2NvdmVyZWQgYnkgY3VybCdzIG1lbW9yeSBsZWFrCiAgZGV0ZWN0b3IuICBBbHNvIGNoYW5nZWQgdGZ0cCBkb3dubG9hZHMgdG8gVVJMLXVuZXNjYXBlIHRoZSBkb3dubG9hZGVkCiAgZmlsZSBuYW1lLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgcHJvdmlkZWQgbGliY3VybCBjaGFuZ2VzIGZvciBkb2luZyBIVFRQIGNvbW11bmljYXRpb24gb24KICBub24tQVNDSUkgcGxhdGZvcm1zLiBJdCBkb2VzIGFkZCBzb21lIGNvbXBsZXhpdHksIG1vc3Qgbm90YWJseSB3aXRoIG1vcmUKICAjaWZkZWZzLCBidXQgSSB3YW50IHRvIHNlZSB0aGlzIHN1cHBvcnRlZCBhZGRlZCBhbmQgSSBjYW4ndCBzZWUgaG93IHdlIGNhbgogIGFkZCBpdCB3aXRob3V0IHRoZSBleHRyYSBzdHVmZiBhZGRlZC4KCi0gU2V0dGluZyBDVVJMT1BUX0NPT0tJRUxJU1QgdG8gIkFMTCIgd2hlbiBubyBjb29raWVzIGF0IGFsbCB3YXMgcHJlc2VudCwKICBsaWJjdXJsIHdvdWxkIGNyYXNoIHdoZW4gdHJ5aW5nIHRvIHJlYWQgYSBOVUxMIHBvaW50ZXIuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNykKLSBUb2J5IFBldGVyc29uIGZvdW5kIGEgbmFzdHkgYnVnIHRoYXQgcHJldmVudGVkIChsaWIpY3VybCBmcm9tIHByb3Blcmx5CiAgZG93bmxvYWRpbmcgKG1vc3QpIHRoaW5ncyB0aGF0IHdlcmUgbGFyZ2VyIHRoYW4gNEdCIG9uIDMyIGJpdCBzeXN0ZW1zLiAgTWF0dAogIFdpdGhlcnNwb29uIGhlbHBlZCBhcyBuYXJyb3cgZG93biB0aGUgcHJvYmxlbS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDcpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBpbnRyb2R1Y2VkIHRoZSAtLWZ0cC1zc2wtY2NjIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KICBjdXJsIHRoYXQgdXNlcyB0aGUgbmV3IENVUkxPUFRfRlRQX1NTTF9DQ0Mgb3B0aW9uIGluIGxpYmN1cmwuIElmIGVuYWJsZWQsIGl0CiAgd2lsbCBtYWtlIGxpYmN1cmwgc2h1dGRvd24gU1NML1RMUyBhZnRlciB0aGUgYXV0aGVudGljYXRpb24gaXMgZG9uZSBvbiBhCiAgRlRQLVNTTCBvcGVyYXRpb24uCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IG1hZGUgY2hhbmdlcyB0byBhbGxvdyBiYXNlNjQgZW5jb2RpbmcvZGVjb2RpbmcgdG8gd29yayBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuCgpEYW5pZWwgKDMgSmFudWFyeSAyMDA3KQotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgdGhlIGZsYXcgd2hpY2ggbWFkZSBsaWJjdXJsIDcuMTYuMCBhbHdheXMgc3RvcmUKICBkb3dubG9hZGVkIGRhdGEgaW4gdHdvIGJ1ZmZlcnMsIGp1c3QgdG8gYmUgYWJsZSB0byBkZWFsIHdpdGggYSBzcGVjaWFsIEhUVFAKICBwaXBlbGluaW5nIGNhc2UuIFRoYXQgaXMgbm93IG9ubHkgYWN0aXZhdGVkIGZvciBwaXBlbGluZWQgdHJhbnNmZXJzLiBJbgogIE1hdHQncyBjYXNlLCBpdCBzaG93ZWQgYXMgYSBjb25zaWRlcmFibGUgcGVyZm9ybWFuY2UgZGlmZmVyZW5jZSwKCkRhbmllbCAoMiBKYW51YXJ5IDIwMDcpCi0gVmljdG9yIFNuZXpoa28gaGVscGVkIHVzIGZpeCBidWcgcmVwb3J0ICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIChrbm93biBidWcgIzM2KSAtLWxpbWl0LXJhdGUKICAoQ1VSTE9QVF9NQVhfU0VORF9TUEVFRF9MQVJHRSBhbmQgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSkgYXJlIGJyb2tlbgogIG9uIFdpbmRvd3MgKHNpbmNlIDcuMTYuMCwgYnV0IHRoYXQncyB3aGVuIHRoZXkgd2VyZSBpbnRyb2R1Y2VkIGFzIHByZXZpb3VzCiAgdG8gdGhhdCB0aGUgbGltaXRpbmcgbG9naWMgd2FzIG1hZGUgaW4gdGhlIGFwcGxpY2F0aW9uIG9ubHkgYW5kIG5vdCBpbiB0aGUKICBsaWJyYXJ5KS4gSXQgd2FzIGFjdHVhbGx5IGFsc28gYnJva2VuIG9uIHNlbGVjdCgpLWJhc2VkIHN5c3RlbXMgKGFzIGFwcG9zZWQKICB0byBwb2xsKCkpIGJ1dCB3ZSBoYXZlbid0IGhhZCBhbnkgc3VjaCByZXBvcnRzLiBXZSBub3cgdXNlIHNlbGVjdCgpLCBTbGVlcCgpCiAgb3IgZGVsYXkoKSBwcm9wZXJseSB0byBzbGVlcCBhIHdoaWxlIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55dGhpbmcgaW5wdXQgb3IKICBvdXRwdXQgd2hlbiB0aGUgcmF0ZSBsaW1pdGluZyBpcyBhY3RpdmF0ZWQgd2l0aCB0aGUgZWFzeSBpbnRlcmZhY2UuCgotIE1vZGlmaWVkIGxpYmN1cmwucGMuaW4gdG8gdXNlIExpYnMucHJpdmF0ZSBmb3IgdGhlIGxpYnMgbGliY3VybCBpdHNlbGYgbmVlZHMKICB0byBnZXQgYnVpbHQgc3RhdGljLiBJdCBoYXMgYmVlbiBtZW50aW9uZWQgYmVmb3JlIGFuZCB3YXMgYWdhaW4gYnJvdWdodCB0bwogIG91ciBhdHRlbnRpb24gYnkgTmF0aGFuYWVsIE5lcm9kZSB3aG8gZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzQwNTIyNgogIChodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9NDA1MjI2KS4KCg==