ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKRGFuaWVsIFN0ZW5iZXJnICgxNyBNYXkgMjAwOSkKLSBKYW1lcyBCdXJzYSBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0IHRoYXQgZml4ZWQgYSBwcm9ibGVtIHdpdGgKICBub19wcm94eSB3aGljaCBtYWRlIGl0IG5vdCBza2lwIHRoZSBwcm94eSBpZiB0aGUgVVJMIGVudGVyZWQgY29udGFpbmVkIGEKICB1c2VyIG5hbWUuIEkgYWRkZWQgdGVzdCBjYXNlIDExMDEgdG8gdmVyaWZ5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBNYXkgMjAwOSkKLSBCYWxpbnQgU3ppbGFrc3ppIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgd2hlbiBsaWJjdXJsIGRpZCBnemlwIGRlY29tcHJlc3Npb24KICBvZiBzdHJlYW1zIHRoYXQgaGFkIHNvbWUgcGFydHMgKGxlZ2l0aW1hdGVseSkgbWlzc2luZy4gV2Ugbm93IHByb3ZpZGUgYW5kIHVzZQogIGEgcHJvcGVyIGNsZWFudXAgZnVuY3Rpb24gZm9yIHRoZSBjb250ZW50IGVuY29kaW5nIHN1Ym1vZHVsZS4KICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDUvMDA5Mi5odG1sCgotIEthbWlsIER1ZGthIHByb3ZpZGVkIGEgZml4IGZvciBsaWJjdXJsLU5TUyByZXBvcnRlZCBieSBNaWNoYWVsIENyb25lbndvcnRoCiAgYXQgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00NTM2MTIjYzEyCgogIElmIGFuIGluY29ycmVjdCBwYXNzd29yZCBpcyBnaXZlbiB3aGlsZSBsb2FkaW5nIGEgcHJpdmF0ZSBrZXksIGxpYmN1cmwgZW5kcwogIHVwIGluIGFuIGluZmluaXRlIGxvb3AgY29uc3VtaW5nIG1lbW9yeS4gVGhlIGJ1ZyBpcyBjcml0aWNhbC4KCi0gSSBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGRvaW5nIE5UTE0sIFBPU1QgYW5kIHRoZW4gZm9sbG93aW5nIGEgMzAyIHJlZGlyZWN0LAogIGFzIHJlcG9ydGVkIGJ5IEViZW5lemVyIElrb25uZSAob24gY3VybC11c2VycykgYW5kIExhdXJlbnQgUmFicmV0IChvbgogIGN1cmwtbGlicmFyeSkuIFRoZSB0cmFuc2ZlciB3YXMgbWlzdGFrZW5seSBtYXJrZWQgdG8gZ2V0IG1vcmUgZGF0YSB0byBzZW5kCiAgYnV0IHNpbmNlIGl0IGRpZG4ndCBhY3R1YWxseSBoYXZlIHRoYXQsIGl0IGp1c3QgaHVuZyB0aGVyZS4uLgoKRGFuaWVsIFN0ZW5iZXJnICgxMCBNYXkgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGNvcnJlY3RseSBwb2ludGVkIG91dCBhbiBvdmVyLWFsbG9jIHdpdGggb25lIHdhc3RlZAogIGJ5dGUgaW4gdGhlIGRpZ2VzdCBjb2RlLgoKWWFuZyBUc2UgKDkgTWF5IDIwMDkpCi0gUmVtb3ZlZCBET1MgYW5kIFRQRiBwYWNrYWdlJ3Mgc3ViZGlyZWN0b3J5IE1ha2VmaWxlLmFtLCBpdCB3YXMgb25seSB1c2VkCiAgdG8gaW5jbHVkZSBzb21lIGZpbGVzIGluIHRoZSBkaXN0cmlidXRpb24gdGFyYmFsbCBzZXJ2aW5nIG5vIG90aGVyIHB1cnBvc2UuCiAgRmlsZXMgZnJvbSB0aGUgRE9TIGFuZCBUUEYgc3ViZGlyZWN0b3JpZXMgYXJlIG5vdyBpbmNsdWRlZCBpbiB0aGUgRVhUUkFfRElTVAogIG9mIHRoZSBNYWtlZmlsZSBpbiB0aGUgcGFyZW50IHN1YmRpcmVjdG9yeS4KCllhbmcgVHNlICg4IE1heSAyMDA5KQotIENoYW5nZWQgaG9zdCBuYW1lIGxpdGVyYWwgaW4gc2V2ZXJhbCB0ZXN0cyB0byBvbmUgdW5kZXIgdGhlIGhheHguc2UgZG9tYWluLgoKLSBSZW5hbWVkIHZjNiB3b3Jrc3BhY2UgYW5kIHByb2plY3QgZmlsZXMgdG8gYXZvaWQgZmlsZW5hbWUgY2xhc2ggd2hlbiB1c2VkCiAgZm9yIGNvbnZlcnNpb24gdG8gbGF0ZXIgVlMgdmVyc2lvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDggTWF5IDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZml4ZWQgYnVnIHJlcG9ydCAjMjc4NDA1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg0MDU1KSBpZGVudGlmeWluZyBhIHByb2JsZW0gdG8KICBjb25uZWN0IHRvIFNPQ0tTIHByb3hpZXMgd2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLiBJdCB0dXJuZWQgb3V0IHRvCiAgYWxtb3N0IG5vdCB3b3JrIGF0IGFsbCBwcmV2aW91c2x5LiBXZSBuZWVkIHRvIHdhaXQgZm9yIHRoZSBUQ1AgY29ubmVjdCB0bwogIGJlIHByb3Blcmx5IHZlcmlmaWVkIGJlZm9yZSBkb2luZyB0aGUgU09DS1MgbWFnaWMuCgogIFRoZXJlJ3Mgc3RpbGwgYSBmbGF3IGluIHRoZSBGVFAgY29kZSBmb3IgdGhpcy4KCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOSkKLSBNYWRlIHRoZSBTT19TTkRCVUYgc2V0dGluZyBmb3IgdGhlIGRhdGEgY29ubmVjdGlvbiBzb2NrZXQgZm9yIGZ0cCB1cGxvYWRzIGFzCiAgd2VsbC4gU2VlIGNoYW5nZSAyOCBBcHIgMjAwOS4KCllhbmcgVHNlICg3IE1heSAyMDA5KQotIEZpeGVkIGFuIGlzc3VlIGFmZmVjdGluZyBGVFAgdHJhbnNmZXJzLCBpbnRyb2R1Y2VkIHdpdGggdGhlIHRyYW5zZmVyLmMKICBwYXRjaCBjb21taXR0ZWQgTWF5IDQuCgpEYW5pZWwgU3RlbmJlcmcgKDcgTWF5IDIwMDkpCi0gTWFuIHBhZ2UgKnJvZmYgcHJvYmxlbXMgZml4ZWQgdGhhbmtzIHRvIGlucHV0IGZyb20gQ29saW4gV2F0c29uLiBQcm9ibGVtcwogIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gcGFja2FnZS4KCi0gVmlqYXkgRyBmaWxlZCBidWcgcmVwb3J0ICMyNzIzMjM2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMzYpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoCiAgbGliY3VybCdzIFRGVFAgY29kZSBhbmQgaXRzIGxhY2sgb2YgZGVhbGluZyB3aXRoIHRoZSBPQUNLIHBhY2tldC4KCllhbmcgVHNlICg1IE1heSAyMDA5KQotIEZpeGVkIHRoZSAtLWZ0cC1wb3J0IGFkZHJlc3Mgb2YgdGVzdCAjMjUxIHRvIHRoZSBDTElFTlRJUCBhZGRyZXNzLCBhbmQKICByZXZlcnRlZCB0aGUgY2hhbmdlIGFmZmVjdGluZyB0ZXN0IHN1aXRlIGhhcm5lc3MgY29tbWl0dGVkIDQgTWF5LgoKRGFuaWVsIFN0ZW5iZXJnICg1IE1heSAyMDA5KQotIEluc3BpcmVkIGJ5IE1pY2hhZWwgU21pdGgncyBzZXNzaW9uIGlkIGZpeCBmb3IgT3BlblNTTCwgSSBkaWQgdGhlCiAgY29ycmVzcG9uZGluZyBmaXggaW4gdGhlIEdudVRMUyBjb2RlOiBtYWtlIHN1cmUgdG8gc3RvcmUgdGhlIG5ldyBzZXNzaW9uIGlkCiAgaW4gY2FzZSB0aGUgcHJldmlvdXMgcmUtdXNlZCBvbmUgaXMgcmVqZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDQgTWF5IDIwMDkpCi0gTWljaGFlbCBTbWl0aCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjc4NjI1NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzg2MjU1KSB3aXRoIGEgcGF0Y2gsIGlkZW50aWZ5aW5nIGhvdwogIGxpYmN1cmwgZGlkIG5vdCBkZWFsIHdpdGggU1NMIHNlc3Npb24gaWRzIHByb3Blcmx5IGlmIHRoZSBzZXJ2ZXIgcmVqZWN0ZWQgYQogIHJlLXVzZSBvZiBvbmUuIFN0YXJ0aW5nIG5vdywgaXQgd2lsbCBmb3JnZXQgdGhlIHJlamVjdGVkIG9uZSBhbmQgcmVtZW1iZXIKICB0aGUgbmV3LiBUaGlzIGNoYW5nZSB3YXMgZm9yIE9wZW5TU0wgb25seSwgaXQgaXMgbGlrZWx5IHRoYXQgb3RoZXIgU1NMIGxpYgogIGNvZGUgbmVlZHMgc2ltaWxhciBmaXhlcy4KCllhbmcgVHNlICg0IE1heSAyMDA5KQotIEFwcGxpZWQgRGF2aWQgTWNDcmVlZHkncyAidHJhbnNmZXIuYyBmaXhlcyBmb3IgQ1VSTF9ET19MSU5FRU5EX0NPTlYgYW5kCiAgbm9uLUFTQ0lJIHBsYXRmb3JtIEhUVFAgcmVxdWVzdHMiIHBhdGNoIGFkZHJlc3NpbmcgdHdvIEhUVFAgUFVUIHByb2JsZW1zOgogIDEpIE9uIG5vbi1BU0NJSSBwbGF0Zm9ybXMgbm90IGFsbCBvZiB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgb2YgdGhlIFBVVCBhcmUKICBiZWluZyB0cmFuc2xhdGVkIHRvIEFTQ0lJLiAgMikgT24gYWxsIHBsYXRmb3JtcyB0aGUgbGluZSBlbmRpbmdzIG9mIHBhcnQgb2YKICB0aGUgcHJvdG9jb2wgcG9ydGlvbnMgYXJlIG1hbmdsZWQgZnJvbSBDUkxGIHRvIENSQ1JMRiBpZiBkYXRhLT5zZXQuY3JsZiBvcgogIGRhdGEtPnNldC5wcmVmZXJfYXNjaWkgYXJlIHNldCAoZGVwZW5kaW5nIG9uIENVUkxfRE9fTElORUVORF9DT05WKS4KCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoIHRvIGZpeCB0ZXN0IHN1aXRlIGhhcm5lc3MgdG8gYWxsb3cgdGVzdCBGVFAKICBzZXJ2ZXIgYW5kIGNsaWVudCBvbiBkaWZmZXJlbnQgbWFjaGluZXMsIHByb3ZpZGluZyBGVFAgY2xpZW50IGFkZHJlc3Mgd2hlbgogIHJ1bm5pbmcgdGhlIEZUUCB0ZXN0IHNlcnZlci4KCkRhbmllbCBGYW5kcmljaCAoMyBNYXkgMjAwOSkKLSBBZGRlZCBhbmQgZGlzYWJsZWQgdGVzdCBjYXNlIDU2MyB3aGljaCBzaG93cyBLTk9XTl9CVUdTICM1OS4gIFRoZSBidWcKICByZXBvcnQgZmFpbGVkIHRvIG1lbnRpb24gdGhhdCBhIHByb3h5IG11c3QgYmUgdXNlZCB0byByZXByb2R1Y2UgaXQuCgpZYW5nIFRzZSAoMiBNYXkgMjAwOSkKLSBVc2UgYSBidWlsZC10aW1lIGNvbmZpZ3VyZWQgY3VybF9zb2NrbGVuX3QgZGF0YSB0eXBlIGluc3RlYWQgb2Ygc29ja2xlbl90LgoKWWFuZyBUc2UgKDEgTWF5IDIwMDkpCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzIHBhdGNoZXMgIlRQRi1wbGF0Zm9ybSBzcGVjaWZpYyBjaGFuZ2VzIHRvIHZhcmlvdXMKICBmaWxlcyIgYW5kICJodHRwLmMgZml4IHRvIEN1cmxfcHJveHlDT05ORUNUIGZvciBub24tQVNDSUkgcGxhdGZvcm1zIiwgdGhlCiAgZm9ybWVyIHdpdGggbWlub3IgZWRpdHMuCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEFwciAyMDA5KQotIEkgd2FzIGdvaW5nIHRvIGZpeCBpc3N1ZSAjNTkgaW4gS05PV05fQlVHUwoKICBJZiB0aGUgQ1VSTE9QVF9QT1JUIG9wdGlvbiBpcyB1c2VkIG9uIGFuIEZUUCBVUkwgbGlrZQogICJmdHA6Ly9leGFtcGxlLmNvbS9maWxlO3R5cGU9QSIgdGhlICI7dHlwZT1BIiBpcyBzdHJpcHBlZCBvZmYuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDU2MiB0byB2ZXJpZnksIG9ubHkgdG8gZmluZCBvdXQgdGhhdCBJIGNvdWxkbid0IHJlcGVhdAogIHRoaXMgYnVnIHNvIEkgaGVyZWJ5IGNvbnNpZGVyIGl0IG5vdCBhIGJ1ZyBhbnltb3JlIQoKRGFuaWVsIFN0ZW5iZXJnICgyOSBBcHIgMjAwOSkKLSBCYXNlZCBvbiBidWcgcmVwb3J0ICMyNzIzMjE5IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzIzMjE5KQogIEkndmUgbm93IG1hZGUgVEZUUCAiY29ubmVjdGlvbnMiIG5vdCBiZWluZyBrZXB0IGZvciByZS11c2Ugd2l0aGluIGxpYmN1cmwuCiAgVEZUUCBpcyBVRFAtYmFzZWQgc28gdGhlIGJlbmVmaXQgd2FzIHJlYWxseSBsb3cgKGlmIGV2ZW4gZXhpc3RpbmcpIHRvIGJlZ2luCiAgd2l0aCBzbyBpbnN0ZWFkIG9mIHRyYWNraW5nIGRvd24gdG8gZml4IHRoaXMgcHJvYmxlbSB3ZSBpbnN0ZWFkIHJlbW92ZWQgdGhlCiAgcmUtdXNlLiBJIGFsc28gZW5hYmxlZCB0ZXN0IGNhc2UgMTA5OSB0aGF0IEkgd3JvdGUgYSBmZXcgZGF5cyBhZ28gdG8gdmVyaWZ5CiAgdGhhdCB0aGlzIGNoYW5nZSBmaXhlcyB0aGUgcmVwb3J0ZWQgcHJvYmxlbS4KCkRhbmllbCBTdGVuYmVyZyAoMjggQXByIDIwMDkpCi0gQ29uc3RhbnRpbmUgU2FwdW50emFraXMgZmlsZWQgYnVnIHJlcG9ydCAjMjc4MzA5MAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzgzMDkwKSBwb2ludGluZyBvdXQgdGhhdCBvbiB3aW5kb3dzCiAgd2UgbmVlZCB0byBncm93IHRoZSBTT19TTkRCVUYgYnVmZmVyIHNvbWV3aGF0IHRvIGdldCByZWFsbHkgZ29vZCB1cGxvYWQKICBzcGVlZHMuIGh0dHA6Ly9zdXBwb3J0Lm1pY3Jvc29mdC5jb20va2IvODIzNzY0IGhhcyB0aGUgZGV0YWlscy4gRnJpZW5kcwogIGNvbmZpcm1lZCB0aGF0IHNpbXBseSBhZGRpbmcgMzIgdG8gQ1VSTF9NQVhfV1JJVEVfU0laRSBpcyBlbm91Z2guCgotIEJ1ZyByZXBvcnQgIzI3MDkwMDQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MDkwMDQpIGJ5IFRpbQogIENoZW4gcG9pbnRlZCBvdXQgaG93IGN1cmwgY291bGRuJ3QgdXBsb2FkIHdpdGggcmVzdW1lIHdoZW4gcmVhZGluZyBmcm9tIGEKICBwaXBlLgoKICBUaGlzIGVuZGVkIHVwIHdpdGggdGhlIGludHJvZHVjdGlvbiBvZiBhIG5ldyByZXR1cm4gY29kZSBmb3IgdGhlCiAgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gY2FsbGJhY2sgdGhhdCBiYXNpY2FsbHkgc2F5cyB0aGF0IHRoZSBzZWVrIGZhaWxlZCBidXQKICB0aGF0IGxpYmN1cmwgbWF5IHRyeSB0byByZXNvbHZlIHRoZSBzaXR1YXRpb24gYW55d2F5LiBJbiBvdXIgY2FzZSB0aGlzIG1lYW5zCiAgbGliY3VybCB3aWxsIGF0dGVtcHQgdG8gaW5zdGVhZCByZWFkIHRoYXQgbXVjaCBkYXRhIGZyb20gdGhlIHN0cmVhbSBpbnN0ZWFkCiAgb2Ygc2Vla2luZyBhbmQgdGhhdCB3YXkgY3VybCBjYW4gbm93IHVwbG9hZCB3aXRoIHJlc3VtZSB3aGVuIGRhdGEgaXMgcmVhZAogIGZyb20gYSBzdHJlYW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEFwciAyMDA5KQotIEJ1ZyByZXBvcnQgIzI3Nzk3MzMgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3Nzk3MzMpIGJ5IFN2ZW4KICBXZWdlbmVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTElORk9fQVBQQ09OTkVDVF9USU1FIGRpZG4ndCB3b3JrIHdpdGggdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQgZml4ZWQgdGhlIHByb2JsZW0hCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEFwciAyMDA5KQotIEthbWlsIER1ZGthIGZpeGVkIGFub3RoZXIgTlNTLXJlbGF0ZWQgbGVhayB3aGVuIGNsaWVudCBjZXJ0cyB3ZXJlIHVzZWQuCgotIEJ1ZyByZXBvcnQgIzI3NzkyNDUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3NzkyNDUpIGJ5IFJhaW5lcgogIEtvZW5pZyBwb2ludGVkIG91dCB0aGF0IHRoZSBtYW4gcGFnZSBkaWRuJ3QgdGVsbCB0aGF0IHRoZSAqX3Byb3h5CiAgZW52aXJvbm1lbnQgdmFyaWFibGVzIGNhbiBiZSBzcGVjaWZpZWQgbG93ZXIgY2FzZSBvciBVUFBFUiBDQVNFIGFuZCB0aGUKICBsb3dlciBjYXNlIHRha2VzIHByZWNlZGVuY2UsCgpEYW5pZWwgRmFuZHJpY2ggKDIxIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBBbWlnYSwgUmlzY09TIGFuZCBWQzYgYnVpbGQgZmlsZXMuCgpZYW5nIFRzZSAoMjEgQXByIDIwMDkpCi0gTW92ZWQgcG90ZW50aWFsIGluY2x1c2lvbiBvZiBzeXN0ZW0ncyBtYWxsb2MuaCBhbmQgbWVtb3J5LmggaGVhZGVyIGZpbGVzIHRvCiAgc2V0dXBfb25jZS5oLiAgSW5jbHVzaW9uIG9mIGVhY2ggaGVhZGVyIGZpbGUgaXMgYmFzZWQgb24gdGhlIGRlZmluaXRpb24gb2YKICBORUVEX01BTExPQ19IIGFuZCBORUVEX01FTU9SWV9IIHJlc3BlY3RpdmVseS4KCiAgUmVuYW1lZCBsaWJjdXJsJ3MgbWVtb3J5LmggdG8gY3VybF9tZW1vcnkuaAoKRGFuaWVsIFN0ZW5iZXJnICgyMCBBcHIgMjAwOSkKLSBMZWFuaWMgTGVmZXZlciByZXBvcnRlZCBhIGNyYXNoIGFuZCBkaWQgc29tZSBkZXRhaWxlZCByZXNlYXJjaCBvbiB3aHkgYW5kCiAgaG93IGl0IG9jY3VycyAoaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA0LzAyODkuaHRtbCkuIFRoZQogIGNvbmNsdXNpb24gd2FzIHRoYXQgaWYgYW4gZXJyb3IgaXMgZGV0ZWN0ZWQgYW5kIEN1cmxfZG9uZSgpIGlzIGNhbGxlZCBmb3IKICB0aGUgY29ubmVjdGlvbiwgZnRwX2RvbmUoKSBjb3VsZCBhdCB0aW1lcyByZXR1cm4gYW5vdGhlciBlcnJvciBjb2RlIHRoYXQKICB0aGVuIHdvdWxkIHRha2UgcHJlY2VkZW5jZSBhbmQgdGhhdCBuZXcgY29kZSBjb25mdXNlZCBleGlzdGluZyBsb2dpYyB0aGF0CiAgd29ya3MgZm9yIHRoZSBmaXJzdCBlcnJvciBjb2RlIChDVVJMRV9TRU5EX0VSUk9SKSBvbmx5LgoKLSBHaXNsZSBWYW5lbSBub3RpY2VkIHRoYXQgLS1saWJ0b29sIHdvdWxkIHByb2R1Y2UgYm9ndXMgc3RyaW5ncyBhdCB0aW1lcyBmb3IKICBPQkpFQ1RQT0lOVCBvcHRpb25zLiBOb3cgd2UndmUgaW50cm9kdWNlZCBhIG5ldyBmdW5jdGlvbiAtIG15X3NldG9wdF9zdHIgLQogIHdpdGhpbiB0aGUgYXBwIGZvciBzZXR0aW5nIHBsYWluIHN0cmluZyBvcHRpb25zIHRvIGF2b2lkIHRoZSByaXNrIG9mIHRoaXMKICBtaXN0YWtlIGhhcHBlbmluZy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgQXByIDIwMDkpCi0gUHJhbW9kIFNoYXJtYSByZXBvcnRlZCBhbmQgdHJhY2tlZCBkb3duIGEgYnVnIHdoZW4gZG9pbmcgRlRQIG92ZXIgYSBIVFRQCiAgcHJveHkuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFmdGVyIGVhY2gKICByZXF1ZXN0LiBJbiBoaXMgY2FzZSBpdCBoYWQgdGhlIHdlaXJkIHNpZGUtZWZmZWN0IHRoYXQgaXQga2lsbGVkIE5UTE0gYXV0aAogIGZvciB0aGUgcHJveHkgY2F1c2luZyBhbiBpbmlmaW5pdGUgbG9vcCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMTA5OCB0byB2ZXJpZnkgdGhpcyBmaXguIFRoZSB0ZXN0IGNhc2UgZG9lcyBob3dldmVyIG5vdAogIHByb3Blcmx5IHZlcmlmeSB0aGF0IHRoZSB0cmFuc2ZlcnMgYXJlIGRvbmUgcGVyc2lzdGVudGx5IC0gYXMgSSBjb3VsZG4ndAogIHRoaW5rIG9mIGEgY2xldmVyIHdheSB0byBhY2hpZXZlIGl0IHJpZ2h0IG5vdyAtIGJ1dCB5b3UgbmVlZCB0byByZWFkIHRoZQogIHN0ZGVyciBvdXRwdXQgYWZ0ZXIgYSB0ZXN0IHJ1biB0byBzZWUgdGhhdCBpdCB0cnVseSBkaWQgdGhlIHJpZ2h0IHRoaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBBcHIgMjAwOSkKLSBidWcgcmVwb3J0ICMyNzI3OTgxIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNzI3OTgxKSBieSBNYXJ0aW4KICBTdG9yc2r2IHBvaW50ZWQgb3V0IGhvdyBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIDAgY291bGQgYmUgZG93bnJpZ2h0CiAgY29uZnVzaW5nIGFzIGl0IHNldCB0aGUgbWV0aG9kIHRvIGVpdGhlciBHRVQgb3IgSEVBRC4gVGhlIGV4YW1wbGUgaGUgc2hvd2VkCiAgbG9va2VkIGxpa2U6CgogICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfUFVULCAxKTsKICAgY3VybF9lYXN5X3NldG9wdChjdXJsLCBDVVJMT1BUX05PQk9EWSwgMCk7CgogIFRoZSBuZXcgd2F5IGRvZXNuJ3QgYWx0ZXIgdGhlIG1ldGhvZCB1bnRpbCB0aGUgcmVxdWVzdCBpcyBhYm91dCB0byBzdGFydC4gSWYKICBDVVJMT1BUX05PQk9EWSBpcyB0aGVuIDEgdGhlIEhUVFAgcmVxdWVzdCB3aWxsIGJlIEhFQUQuIElmIENVUkxPUFRfTk9CT0RZIGlzCiAgMCBhbmQgdGhlIHJlcXVlc3QgaGFwcGVucyB0byBoYXZlIGJlZW4gc2V0IHRvIEhFQUQsIGl0IHdpbGwgdGhlbiBpbnN0ZWFkIGJlCiAgc2V0IHRvIEdFVC4gSSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBsZXNzIHN1cnByaXNpbmcgdG8gdXNlcnMsIGFuZCBob3BlZnVsbHkKICBub3QgaGl0IGFueSBleGlzdGluZyB1c2VycyBiYWRseS4KCi0gVG9zaGlvIEt1cmF0b21pIHJlcG9ydGVkIGEgbWVtb3J5IGxlYWsgcHJvYmxlbSB3aXRoIGxpYmN1cmwrTlNTIHRoYXQgdHVybmVkCiAgb3V0IHRvIGJlIGxlYWtpbmcgY2FjZXJ0cy4gS2FtaWwgRHVka2EgaGVscGVkIG1lIGNvbXBsZXRlIHRoZSBmaXguIFRoZSBpc3N1ZQogIGlzIGZvdW5kIGluIFJlZGhhdCdzIGJ1ZyB0cmFja2VyOgogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NDUzNjEyCgogIFRoZXJlIGFyZSBzdGlsbCBtZW1vcnkgbGVha3MgcHJlc2VudCwgYnV0IHRoZXkgc2VlbSB0byBoYXZlIG90aGVyIHJlYXNvbnMuCgpEYW5pZWwgRmFuZHJpY2ggKDExIEFwciAyMDA5KQotIEFkZGVkIG5ldyBsaWJjdXJsIHNvdXJjZSBmaWxlcyB0byBTeW1iaWFuIE9TIGJ1aWxkIGZpbGVzLgotIEltcHJvdmVkIFN5bWJpYW4gc3VwcG9ydCBmb3IgU1NMLgoKWWFuZyBUc2UgKDEwIEFwciAyMDA5KQotIERhbmllbCBKb2huc29uIGltcHJvdmVkIHRoZSBNYWNPU1gtRnJhbWV3b3JrIHNoZWxsIHNjcmlwdCB0byBub3cgcGVyZm9ybSBhbGwKICB0aGUgc3RlcHMgcmVxdWlyZWQgdG8gYnVpbGQgYSBNYWMgT1MgWCBmb3VyIHdheSBmYXQgcHBjL2kzODYvcHBjNjQveDg2XzY0CiAgbGliY3VybC5mcmFtZXdvcmsuICBGb3VyIHdheSBmYXQgZnJhbWV3b3JrIHJlcXVpcmVzIE9TIFggMTAuNSBTREsgb3IgbGF0ZXIuCgpZYW5nIFRzZSAoOCBBcHIgMjAwOSkKLSBSZW1vdmVkIFN1biBjb21waWxlcnMgcHJlcHJvY2Vzc29yIGJsb2NrIGZyb20gY3VybGJ1aWxkLmguZGlzdCwgdGhpcyBhbHNvCiAgcmVtb3ZlcyBpdCBmcm9tIHRoZSBjdXJsYnVpbGQuaCBmaWxlIG9yaWdpbmFsbHkgZGlzdHJpYnV0ZWQgYnkgdGhlIGNVUkwKICBwcm9qZWN0IGFzIHRoaXMgZmlsZSBpcyBpbnRlbmRlZCBmb3Igc3lzdGVtcyBub3QgY2FwYWJsZSBvZiBydW5uaW5nIHRoZQogIGNvbmZpZ3VyZSBzY3JpcHQuICBGb3IgdGhvc2Ugd2hvIGhhdmUgYmVlbiBidWlsZGluZyBjdXJsIG91dCBvZiB0aGUgc291cmNlCiAgY29kZSBjdXJsIGRpc3RyaWJ1dGlvbiB0YXJiYWxsIHByb3ZpZGVkIGJ5IGN1cmwuaGF4eC5zZSB0aGUgY2hhbmdlIGltcGxpZXMKICBub3RoaW5nLiAgUHJldmlvdXMgY2hhbmdlIGluIHRoaXMgYXJlYSBjb21taXR0ZWQgMiBBcHIgYmVjb21lcyBpcnJlbGV2YW50LgoKRGFuaWVsIFN0ZW5iZXJnICg2IEFwciAyMDA5KQotIEkgY2xhcmlmaWVkIGluIHRoZSBkb2NzIHRoYXQgQ1VSTE9QVF9TRUVLRlVOQ1RJT04gc2hvdWxkIHJldHVybiAwIG9uIHN1Y2Nlc3MKICBhbmQgMSBvbiBmYXRhbCBlcnJvcnMuIFByZXZpb3VzbHkgaXQgb25seSBtZW50aW9uZWQgbm9uLXplcm8gb24gZmF0YWwKICBlcnJvcnMuIFRoaXMgaXMgYSBzbGlnaHQgY2hhbmdlIGluIG1lYW5pbmcsIGJ1dCBpdCBmb2xsb3dzIHdoYXQgd2UndmUgZG9uZQogIGVsc2V3aGVyZSBiZWZvcmUgYW5kIGl0IG9wZW5zIHVwIGZvciBMT1RTIG9mIG1vcmUgdXNlZnVsIHJldHVybiBjb2RlcwogIHdoZW5ldmVyIHdlIGNhbiB0aGluayBvZiB0aGVtLi4uCgpZYW5nIFRzZSAoMiBBcHIgMjAwOSkKLSBGaXggY3VybF9vZmZfdCBkZWZpbml0aW9uIGZvciBidWlsZHMgZG9uZSB1c2luZyBTdW4gY29tcGlsZXJzIGFuZCBhCiAgbm9uLWNvbmZpZ3VyZWQgbGliY3VybC4gSW4gdGhpcyBjYXNlIGN1cmxfb2ZmX3QgZGF0YSB0eXBlIHdhcyBnYXRlZAogIHRvIHRoZSBvZmZfdCBkYXRhIHR5cGUgd2hpY2ggZGVwZW5kcyBvbiB0aGUgX0ZJTEVfT0ZGU0VUX0JJVFMuIFRoaXMKICBjb25maWd1cmF0aW9uIGlzIGV4YWN0bHkgdGhlIHVud2FudGVkIGNvbmZpZ3VyYXRpb24gZm9yIG91ciBjdXJsX29mZl90CiAgZGF0YSB0eXBlIHdoaWNoIG11c3Qgbm90IGRlcGVuZCBvbiBzdWNoIHNldHRpbmcuIFRoaXMgYnJlYWtzIEFCSSBmb3IKICBsaWJjdXJsIGxpYnJhcmllcyBidWlsdCB3aXRoIFN1biBjb21waWxlcnMgd2hpY2ggd2VyZSBidWlsdCB3aXRob3V0CiAgaGF2aW5nIHJ1biB0aGUgY29uZmlndXJlIHNjcmlwdCB3aXRoIF9GSUxFX09GRlNFVF9CSVRTIGRpZmZlcmVudCB0aGFuCiAgNjQgYW5kIHVzaW5nIHRoZSBJTFAzMiBkYXRhIG1vZGVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEFwciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZml4ZWQgYSBOVUxMIHBvaW50ZXIgdXNlIGluIGFuIGluZm9mKCkgY2FsbCBpZiBhCiAgc3RyZHVwKCkgY2FsbCBmYWlsZWQuIAoKRGFuaWVsIEZhbmRyaWNoICgzMSBNYXIgMjAwOSkKLSBQcm9wZXJseSByZXR1cm4gYW4gZXJyb3IgY29kZSBpbiBjdXJsX2Vhc3lfcmVjdiAocmVwb3J0ZWQgYnkgSmltIEZyZWVtYW4pLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBNYXIgMjAwOSkKLSBLYW1pbCBEdWRrYSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBlbmFibGVzIDYgYWRkaXRpb25hbCBjcnlwdG8gYWxnb3JpdGhtcyB3aGVuCiAgTlNTIGlzIHVzZWQuIFRoZXNlIGNpcGhlcnMgd2VyZSBhZGRlZCBpbiBOU1MgMy40IGFuZCByZXF1aXJlIHRvIGJlIGVuYWJsZWQKICBleHBsaWNpdGx5LgogCkRhbmllbCBTdGVuYmVyZyAoMTMgTWFyIDIwMDkpCi0gVXNlIGxpYnNzaDJfdmVyc2lvbigpIHRvIHByZXNlbnQgdGhlIGxpYnNzaDIgdmVyc2lvbiBpbiBjYXNlIHRoZSBsaWJzc2gyCiAgbGlicmFyeSBpcyBmb3VuZCB0byBzdXBwb3J0IGl0LgoKWWFuZyBUc2UgKDEyIE1hciAyMDA5KQotIEFkZGVkIG1pc3NpbmcgQ3VybF9yZWFkKCkgcmV0dXJuIGNvZGUgY2hlY2tpbmcgaW4gVEVMTkVUIHRyYW5zZmVycy4KCi0gUGllcnJlIEJyaWNvIGZvdW5kIGFuZCBmaXhlZCBURUxORVQgdHJhbnNmZXJzIG5vdCBiZWluZyBhYm9ydGVkIHVwb24KICBhIHdyaXRlIGNhbGxiYWNrIGZhaWx1cmUuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE1hciAyMDA5KQotIEthbWlsIER1ZGthIG1hZGUgdGhlIGN1cmwgdG9vbCBwcm9wZXJseSBjYWxsIGN1cmxfZ2xvYmFsX2luaXQoKSBiZWZvcmUgYW55CiAgb3RoZXIgbGliY3VybCBmdW5jdGlvbi4KCllhbmcgVHNlICgxMSBNYXIgMjAwOSkKLSBBZGRlZCBtaXNzaW5nIFRFTE5FVCB0aW1lb3V0IHN1cHBvcnQgZm9yIFdpbmRvd3MgYnVpbGRzLiBUaGlzIGlzc3VlIHdhcwogIHJlcG9ydGVkIGJ5IFBpZXJyZSBCcmljby4KCkRhbmllbCBTdGVuYmVyZyAoOSBNYXIgMjAwOSkKLSBGcmFuayBIZW1wZWwgZm91bmQgb3V0IGEgYnVnIGFuZCBwcm92aWRlZCB0aGUgZml4OiAKICAKICBjdXJsX2Vhc3lfZHVwaGFuZGxlIGRpZCBub3QgbmVjZXNzYXJpbHkgZHVwbGljYXRlIHRoZSBDVVJMT1BUX0NPT0tJRUZJTEUKICBvcHRpb24uIEl0IG9ubHkgZW5hYmxlZCB0aGUgY29va2llIGVuZ2luZSBpbiB0aGUgZGVzdGluYXRpb24gaGFuZGxlIGlmCiAgZGF0YS0+Y29va2llcyBpcyBub3QgTlVMTCAod2hlcmUgZGF0YSBpcyB0aGUgc291cmNlIGhhbmRsZSkuIEluIGNhc2Ugb2YgYQogIG5ld2x5IGluaXRpYWxpemVkIGhhbmRsZSB3aGljaCBqdXN0IGhhZCB0aGUgY29va2llIHN1cHBvcnQgZW5hYmxlZCBieSBhCiAgY3VybF9lYXN5X3NldG9wdChoYW5kbGUsIENVUkxfQ09PS0lFRklMRSwgIiIpLWNhbGwsIGhhbmRsZS0+Y29va2llcyB3YXMKICBzdGlsbCBOVUxMIGJlY2F1c2UgdGhlIHNldG9wdC1jYWxsIG9ubHkgYXBwZW5kcyB0aGUgdmFsdWUgdG8KICBkYXRhLT5jaGFuZ2UuY29va2llbGlzdCwgaGVuY2UgZHVwbGljYXRpbmcgdGhpcyBoYW5kbGUgd291bGQgbm90IGhhdmUgdGhlCiAgY29va2llIGVuZ2luZSBzd2l0Y2hlZCBvbi4KCiAgV2UgYWxzbyBjb25jbHVkZWQgdGhhdCB0aGUgc2xpc3QtZnVuY3Rpb25hbGl0eSB3b3VsZCBiZSBzdWl0YWJsZSBmb3IgYmVpbmcKICBwdXQgaW4gaXRzIG93biBtb2R1bGUgcmF0aGVyIHRoYW4gc2ltcGx5IGhhbmdpbmcgb3V0IGluIGxpYi9zZW5kZi5jIHNvIEkKICBjcmVhdGVkIGxpYi9zbGlzdC5bY2hdIGZvciB0aGVtLgoKLSBBbmRyZWFzIEZhcmJlciBtYWRlIHRoZSAnYnVpbGRjb25mJyBzY3JpcHQgY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBtNAogIHNjcmlwdHMgdG8gbWFrZSBpdCBkZXRlY3QgYSBiYWQgY2hlY2tvdXQgZWFybGllci4gUGVvcGxlIHdpdGggb2xkZXIKICBjaGVja291dHMgd2hvIGRvbid0IGRvIGN2cyB1cGRhdGUgd2l0aCB0aGUgLWQgb3B0aW9uIHdvbid0IGdldCB0aGUgbmV3IGRpcnMKICBhbmQgdGhlbiB3aWxsIGdldCBmdW5ueSBvdXRwdXRzIHRoYXQgY2FuIGJlIGEgYml0IGhhcmQgdG8gdW5kZXJzdGFuZCBhbmQKICBmaXguCiAgCkRhbmllbCBTdGVuYmVyZyAoOCBNYXIgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIGNvZGUgc2VnbWVudCBpbiBzc2x1c2UuYyB3aGVyZSB0aGUKICBhbGxvY2F0aW9uIG9mIHRoZSBtZW1vcnkgQklPIHdhcyBub3QgYmVpbmcgcHJvcGVybHkgY2hlY2tlZC4KCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCB0aGUgZ251dGxzLXVzaW5nIGNvZGU6IFRoZXJlIGFyZSBhIGZldyBwbGFjZXMKICBpbiB0aGUgZ251dGxzIGNvZGUgd2hlcmUgd2Ugd2VyZSBjaGVja2luZyBmb3IgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvcnMsCiAgd2hlbiB0aGUgbWFuIHBhZ2VzIHN0YXRlIHRoYXQgR05VVExTX0VfU1VDQ0VTUyBpcyByZXR1cm5lZCBvbiBzdWNjZXNzIGFuZAogIG90aGVyIHZhbHVlcyBpbmRpY2F0ZSBlcnJvciBjb25kaXRpb25zLgoKLSBCaWxsIEVnZXJ0IHBvaW50ZWQgb3V0IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNjcxNjAyKSB0aGF0CiAgY3VybCBkaWRuJ3QgdXNlIHNwcmludGYoKSBpbiBhIHdheSB0aGF0IGlzIGRvY3VtZW50ZWQgdG8gd29yayBpbiBQT1NJWCBidXQKICBzaW5jZSB3ZSB1c2Ugb3VyIG93biBwcmludGYoKSBjb2RlIChmcm9tIGxpYmN1cmwpIHRoYXQgc2hvdWxkbid0IGJlIGEKICBwcm9ibGVtLiBOb25ldGhlbGVzcyBJIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdCByZWx5IG9uIHN1Y2ggcGFydGljdWxhcgogIGZlYXR1cmVzIGFuZCB0byBub3QgY2F1c2UgZnVydGhlciByYWlzZWQgZXllYnJvd3NlIHdpdGggbm8gZ29vZCByZWFzb24uCgpEYW5pZWwgRmFuZHJpY2ggKDUgTWFyIDIwMDkpCi0gRXhwYW5kZWQgdGhlIHNlY3VyaXR5IHNlY3Rpb24gb2YgdGhlIGxpYmN1cmwtdHV0b3JpYWwgbWFuIHBhZ2UgdG8gY292ZXIKICBtb3JlIGlzc3VlcyBmb3IgYXV0aG9ycyB0byBjb25zaWRlciB3aGVuIHdyaXRpbmcgcm9idXN0IGxpYmN1cmwtdXNpbmcKICBhcHBsaWNhdGlvbnMuCgpZYW5nIFRzZSAoNSBNYXIgMjAwOSkKLSBGaXhlZCBOVExNIGF1dGhlbnRpY2F0aW9uIG1lbW9yeSBsZWFrIG9uIFNTUEkgZW5hYmxlZCBXaW5kb3dzIGJ1aWxkcy4gVGhpcwogIGlzc3VlIHdhcyBub3RpY2VkIGJ5IENocmlzIERlaWR1bi4KCkRhbmllbCBGYW5kcmljaCAoNCBNYXIgMjAwOSkKLSBGaXhlZCBhIHByb2JsZW0gd2l0aCBtNCBxdW90aW5nIGluIHRoZSBPcGVuU1NMIGNvbmZpZ3VyZSBjaGVjayByZXBvcnRlZAogIGJ5IERhbmllbCBKb2huc29uLgoKRGFuaWVsIFN0ZW5iZXJnICgzIE1hciAyMDA5KQotIERhdmlkIEphbWVzIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgbGliY3VybCBjbG9zZSAoYWxsKSBkZWFkIGNvbm5lY3Rpb25zCiAgd2hlbmV2ZXIgeW91IGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBjb25uZWN0aW9uLgoKICAxLiBBZnRlciBjbGVhbmluZyB1cCBhIGRlYWQgY29ubmVjdGlvbiwgImNvbnRpbnVlIiBpbnN0ZWFkIG9mCiAgICAgcmV0dXJuaW5nIEZBTFNFLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSBjbGVhbiB1cCBhbGwgZGVhZCBjb25uZWN0aW9ucywKICAgICByYXRoZXIgdGhhbiBqdXN0IGNsZWFuaW5nIHVwIHRoZSBmaXJzdCBkZWFkIGNvbm5lY3Rpb24uCiAgMi4gTW92ZSB1cCB0aGUgY2xlYW51cCBmb3IgZGVhZCBjb25uZWN0aW9ucyBzbyB0aGF0IGl0IG9jY3VycyBmb3IKICAgICBhbGwgY29ubmVjdGlvbnMsIHJhdGhlciB0aGFuIGp1c3QgdGhlIGNvbm5lY3Rpb25zIHdoaWNoIGhhdmUgdGhlIHNhbWUKICAgICBwcmVmZXJlbmNlcyBhcyBvdXIgY3VycmVudCBuZXcgY29ubmVjdGlvbi4KClZlcnNpb24gNy4xOS40ICgzIE1hcmNoIDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgS2llcnpub3dza2kgbm90aWZpZWQgdXMgYWJvdXQgYSBzZWN1cml0eSBmbGF3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwOTAzMDMuaHRtbCBhbHNvIGtub3duIGFzIENWRS0yMDA5LTAwMzcpIGluCiAgd2hpY2ggcHJldmlvdXMgbGliY3VybCB2ZXJzaW9ucyAoYnkgZGVzaWduKSBjYW4gYmUgdHJpY2tlZCB0byBhY2Nlc3MgYW4KICBhcmJpdHJhcnkgbG9jYWwvZGlmZmVyZW50IGZpbGUgaW5zdGVhZCBvZiBhIHJlbW90ZSBvbmUgd2hlbgogIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZC4gVGhpcyBmbGF3IGlzIG5vdyBmaXhlZCBpbiB0aGlzIHJlbGVhc2UKICB0b2dldGhlciB0aGlzIHRoZSBhZGRpdGlvbiBvZiB0d28gbmV3IHNldG9wdCBvcHRpb25zIGZvciBjb250cm9sbGluZyB0aGlzCiAgbmV3IGJlaGF2aW9yOgoKICBvIENVUkxPUFRfUkVESVJfUFJPVE9DT0xTIGNvbnRyb2xzIHdoYXQgcHJvdG9jb2xzIGxpYmN1cmwgaXMgYWxsb3dlZCB0bwogIGZvbGxvdyB0byB3aGVuIENVUkxPUFRfRk9MTE9XTE9DQVRJT04gaXMgZW5hYmxlZC4gQnkgZGVmYXVsdCwgdGhpcyBvcHRpb24KICBleGNsdWRlcyB0aGUgRklMRSBhbmQgU0NQIHByb3RvY29scyBhbmQgdGh1cyB5b3UgbmVlIHRvIGV4cGxpY2l0bHkgYWxsb3cKICB0aGVtIGluIHlvdXIgYXBwIGlmIHlvdSByZWFsbHkgd2FudCB0aGF0IGJlaGF2aW9yLgoKICBvIENVUkxPUFRfUFJPVE9DT0xTIGNvbnRyb2xzIHdoYXQgcHJvdG9jb2wocykgbGliY3VybCBpcyBhbGxvd2VkIHRvIGZldGNoCiAgdXNpbmcgdGhlIHByaW1hcnkgVVJMIG9wdGlvbi4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYWxsb3cgYSB1c2VyIG9yCiAgb3RoZXIgb3V0c2lkZXJzIGNvbnRyb2wgd2hhdCBVUkwgdG8gcGFzcyB0byBsaWJjdXJsIGFuZCB5ZXQgbm90IGFsbG93IGFsbAogIHByb3RvY29scyBsaWJjdXJsIG1heSBoYXZlIGJlZW4gYnVpbHQgdG8gc3VwcG9ydC4KCkRhbmllbCBTdGVuYmVyZyAoMjcgRmViIDIwMDkpCi0gU2VudGhpbCBSYWphIFZlbHUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdoZW4gQ1VSTE9QVF9JTlRFUkZBQ0UgYW5kCiAgQ1VSTE9QVF9MT0NBTFBPUlQgd2VyZSB1c2VkIHRvZ2V0aGVyICh0aGUgbG9jYWwgcG9ydCBiaW5kIGZhaWxlZCksIGFuZAogIE1hcmt1cyBLb2V0dGVyIHByb3ZpZGVkIHRoZSBmaXghCgpEYW5pZWwgU3RlbmJlcmcgKDI1IEZlYiAyMDA5KQotIEFzIERhbmllbCBGYW5kcmljaCBmaWd1cmVkIG91dCwgd2UgbXVzdCBkbyB0aGUgR251VExTIGluaXRpbmcgaW4gdGhlCiAgY3VybF9nbG9iYWxfaW5pdCgpIGZ1bmN0aW9uIHRvIHByb3Blcmx5IG1haW50YWluIHRoZSBwZXJmb3JtaW5nIGZ1bmN0aW9ucwogIHRocmVhZC1zYWZlLiBXZSd2ZSBwcmV2aW91c2x5ICgyOCBBcHJpbCAyMDA3KSBtb3ZlZCB0aGUgaW5pdCB0byBhIGxhdGVyIHRpbWUKICBqdXN0IHRvIGF2b2lkIGl0IHRvIGZhaWwgdmVyeSBlYXJseSB3aGVuIGxpYmdjcnlwdCBkaXNsaWtlcyB0aGUgc2l0dWF0aW9uLAogIGJ1dCB0aGF0IG1vdmUgd2FzIGJhZCBhbmQgdGhlIGZpeCBzaG91bGQgcmF0aGVyIGJlIGluIGxpYmdjcnlwdCBvcgogIGVsc2V3aGVyZS4KICAKRGFuaWVsIFN0ZW5iZXJnICgyNCBGZWIgMjAwOSkKLSBCcmlhbiBKLiBNdXJyZWxsIGZvdW5kIG91dCB0aGF0IE5lZ290aWF0ZSBwcm94eSBhdXRoZW50aWNhdGlvbiBkaWRuJ3Qgd29yay4KICBJdCBoYXBwZW5lZCBiZWNhdXNlIHRoZSBjb2RlIHVzZWQgdGhlIHN0cnVjdCBmb3Igc2VydmVyLWJhc2VkIGF1dGggYWxsIHRoZQogIHRpbWUgZm9yIGJvdGggcHJveHkgYW5kIHNlcnZlciBhdXRoIHdoaWNoIG9mIGNvdXJzZSB3YXMgd3JvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDIzIEZlYiAyMDA5KQotIEFmdGVyIGEgYnVnIHJlcG9ydGVkIGJ5IEphbWVzIENoZW5nIEkndmUgbWFkZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZvcgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQgcmV0dXJuCiAgLTEgaWYgdGhlIHNpemVzIGFyZW4ndCBrbm93LiBQcmV2aW91c2x5IHRoZXNlIHJldHVybmVkIDAsIG1ha2UgaXQgaW1wb3NzaWJsZQogIHRvIGRldGVjdCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGFjdHVhbGx5IHplcm8gYW5kIHVua25vd24uCgpZYW5nIFRzZSAoMjMgRmViIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gcHJvdmlkZWQgYSBzaGVsbCBzY3JpcHQgdGhhdCB3aWxsIHBlcmZvcm0gYWxsIHRoZSBzdGVwcyBuZWVkZWQKICB0byBidWlsZCBhIE1hYyBPUyBYIGZhdCBwcGMvaTM4NiBvciBwcGM2NC94ODZfNjQgbGliY3VybC5mcmFtZXdvcmsKCkRhbmllbCBTdGVuYmVyZyAoMjMgRmViIDIwMDkpCi0gSSByZW5hbWVkIGV2ZXJ5dGhpbmcgaW4gdGhlIHdpbmRvd3MgYnVpbGRzIGZpbGVzIHRoYXQgdXNlZCB0aGUgbmFtZSAnY3VybGxpYicKICB0byB0aGUgcHJvcGVyICdsaWJjdXJsJyBhcyBjbGVhcmx5IHRoaXMgY2F1c2VkIGNvbmZ1c2lvbi4KCllhbmcgVHNlICgyMCBGZWIgMjAwOSkKLSBEbyBub3QgaGFsdCBjb21waWxhdGlvbiB3aGVuIHVzaW5nIFZTMjAwOCB0byBidWlsZCBhIFdpbmRvd3MgMjAwMCB0YXJnZXQuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEZlYiAyMDA5KQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcmVwb3J0ZWQgYW5kIGhlbHBlZCBtZSByZXBlYXQgYW5kIGZpeCBhIHByb2JsZW0gd2l0aAogIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2U6IHdoZW4gYSB0cmFuc2ZlciBmYWlscywgbGlrZSB3aGVuIGFib3J0ZWQgYnkgYQogIHdyaXRlIGNhbGxiYWNrLCB0aGUgY29udHJvbCBjb25uZWN0aW9uIHdhcyB3cm9uZ2x5IGNsb3NlZCBhbmQgdGh1cyBub3QKICByZS11c2VkIHByb3Blcmx5LgoKICBUaGlzIGNoYW5nZSBpcyBhbHNvIGFuIGF0dGVtcHQgdG8gY2xlYW51cCB0aGUgY29kZSBzb21ld2hhdCBpbiB0aGlzIGFyZWEsIGFzCiAgbm93IHRoZSBGVFAgY29kZSBhdHRlbXB0cyB0byBrZWVwIChiZXR0ZXIpIHRyYWNrIG9uIHBlbmRpbmcgcmVzcG9uc2VzCiAgbmVjZXNzYXJ5IHRvIGdldCByZWFkIGluIGZ0cF9kb25lKCkuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IEZlYiAyMDA5KQotIFBhdHJpayBUaHVuc3Ryb20gcmVwb3J0ZWQgYSBwcm9ibGVtIGFuZCBoZWxwZWQgbWUgcmVwZWF0IGl0LiBJdCB0dXJuZWQgb3V0IAogIGxpYmN1cmwgZGlkIGEgc3VwZXJmbHVvdXMgMTAwMG1zIHdhaXQgd2hlbiBkb2luZyBTRlRQIGRvd25sb2FkcyEKCiAgV2UgcmVhZCBkYXRhIHdpdGggbGlic3NoMiB3aGlsZSBkb2luZyB0aGUgIkRPIiBvcGVyYXRpb24gZm9yIFNGVFAgYW5kIHRoZW4KICB3aGVuIHdlIHdlcmUgYWJvdXQgdG8gc3RhcnQgZ2V0dGluZyBkYXRhIGZvciB0aGUgYWN0dWFsIGZpbGUgcGFydCwgdGhlCiAgIlRSQU5TRkVSIiBwYXJ0LCB3ZSB3YWl0ZWQgZm9yIHNvY2tldCBhY3Rpb24gKGluIDEwMDBtcykgYmVmb3JlIGRvaW5nIGEKICBsaWJzc2gyLXJlYWQuIEJ1dCBpbiB0aGlzIGNhc2UgbGlic3NoMiBoYWQgYWxyZWFkeSByZWFkIGFuZCBidWZmZXJlZCB0aGUKICBkYXRhIHNvIHdlIGVuZGVkIHVwIGFsd2F5cyBqdXN0IHdhaXRpbmcgMTAwMG1zIGJlZm9yZSB3ZSBnZXQgd29ya2luZyBvbiB0aGUKICBkYXRhIQoKUGF0cmljayBNb25uZXJhdCAoMTggRmViIDIwMDkpCi0gRlRQIGRvd25sb2FkcyAoaS5lLjogUkVUUikgZW5kaW5nIHdpdGggY29kZSA1NTAgbm93IHJldHVybiBlcnJvcgogIENVUkxFX1JFTU9URV9GSUxFX05PVF9GT1VORCBpbnN0ZWFkIG9mIENVUkxFX0ZUUF9DT1VMRE5UX1JFVFJfRklMRS4KCkRhbmllbCBTdGVuYmVyZyAoMTcgRmViIDIwMDkpCi0gS2FtaWwgRHVka2EgbWFkZSBOU1MtcG93ZXJlZCBidWlsZHMgY29tcGlsZSBhbmQgcnVuIGFnYWluIQoKLSBBIHNlY29uZCBmb2xsb3ctdXAgY2hhbmdlIGJ5IEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgdG8gZml4IGEgcmVsYXRlZCBtZW1vcnkKICBsZWFrIGxpa2UgdGhhdCBmaXhlZCBvbiB0aGUgMTR0aC4gV2hlbiB6bGliIHJldHVybnMgZmFpbHVyZSwgd2UgbmVlZCB0bwogIGNsZWFudXAgcHJvcGVybHkgYmVmb3JlIHJldHVybmluZyBlcnJvci4KCi0gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUyBjYW4gbm93IGJlIHNldCB0byAyIGluIGFkZGl0aW9uIHRvIDEgZm9yCiAgcGxhaW4gRlRQIGNvbm5lY3Rpb25zLCBhbmQgaXQgd2lsbCB0aGVuIGFsbG93IE1LRCB0byBmYWlsIG9uY2UgYW5kIHJldHJ5IHRoZQogIENXRCBhZnRlcndhcmRzLiBUaGlzIGlzIGVzcGVjaWFsbHkgdXNlZnVsIGlmIHlvdSdyZSBkb2luZyBtYW55IHNpbXVsdGFub2VzCiAgY29ubmVjdGlvbnMgYWdhaW5zdCB0aGUgc2FtZSBzZXJ2ZXIgYW5kIHRoZXkgYWxsIGhhdmUgdGhpcyBvcHRpb24gZW5hYmxlZCwKICBhcyB0aGVuIENXRCBtYXkgZmlyc3QgZmFpbCBidXQgdGhlbiBhbm90aGVyIGNvbm5lY3Rpb24gZG9lcyBNS0QgYmVmb3JlIHRoaXMKICBjb25uZWN0aW9uIGFuZCB0aHVzIE1LRCBmYWlscyBidXQgdHJ5aW5nIENXRCB3b3JrcyEgVGhlIG51bWJlcnMgY2FuCiAgKHNob3VsZD8pIG5vdyBiZSBzZXQgd2l0aCB0aGUgY29udmVuaWVuY2UgZW51bXMgbm93IGNhbGxlZAogIENVUkxGVFBfQ1JFQVRFX0RJUiBhbmQgQ1VSTEZUUF9DUkVBVEVfRElSX1JFVFJZLgoKICBUZXN0cyBoYXMgcHJvdmVuIHRoYXQgaWYgeW91J3JlIG1ha2luZyBhbiBhcHBsaWNhdGlvbiB0aGF0IHVwbG9hZHMgYSBzZXQgb2YKICBmaWxlcyB0byBhbiBmdHAgc2VydmVyLCB5b3Ugd2lsbCBnZXQgYSBub3RpY2FibGUgZ2FpbiBpbiBzcGVlZCBpZiB5b3UncmUKICB1c2luZyBtdWx0aXBsZSBjb25uZWN0aW9ucyBhbmQgdGhpcyBvcHRpb24gd2lsbCBiZSB0aGVuIGJlIHZlcnkgdXNlZnVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxNCBGZWIgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBjb250ZW50IGVuY29kaW5nCiAgY29kZSwgd2hpY2ggY291bGQgaGFwcGVuIG9uIGxpYnogZXJyb3JzLgoKRGFuaWVsIEZhbmRyaWNoICgxMiBGZWIgMjAwOSkKLSBBZGRlZCBzdXBwb3J0IGZvciBEaWdlc3QgYW5kIE5UTE0gYXV0aGVudGljYXRpb24gdXNpbmcgR251VExTLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBGZWIgMjAwOSkKLSBDVVJMSU5GT19DT05ESVRJT05fVU5NRVQgd2FzIGFkZGVkIHRvIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGdldCB0byBrbm93IGlmCiAgdGhlIGNvbmRpdGlvbiBpbiB0aGUgcHJldmlvdXMgcmVxdWVzdCB3YXMgdW5tZXQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgdGltZQogIGNvbmRpdGlvbiBzZXQgd2l0aCBDVVJMT1BUX1RJTUVDT05ESVRJT04gYW5kIHdhcyBwcmV2aW91c2x5IG5vdCBwb3NzaWJsZSB0bwogIHJlbGlhYmx5IGZpZ3VyZSBvdXQuIEZyb20gYnVnIHJlcG9ydCAjMjU2NTEyOAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNTY1MTI4KSBmaWxlZCBieSBKb2NlbHluIEphdWJlcnQuCgpEYW5pZWwgRmFuZHJpY2ggKDQgRmViIDIwMDkpCi0gRG9uJ3QgYWRkIHRoZSBzdGFuZGFyZCAvdXNyL2xpYiBvciAvdXNyL2luY2x1ZGUgcGF0aHMgdG8gTERGTEFHUyBhbmQgQ1BQRkxBR1MKICAocmVzcGVjdGl2ZWx5KSB3aGVuIC0td2l0aC1zc2w9L3VzciBpcyB1c2VkIChwYXRjaCBiYXNlZCBvbiBGcmVlQlNEKS4KCi0gQWRkZWQgYW4gZXhwbGljaXQgYnVmZmVyIGxpbWl0IGNoZWNrIGluIG1zZG9zaWZ5KCkgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgogIFRoaXMgY291bGRuJ3QgZXZlciBvdmVyZmxvdyBpbiBjdXJsLCBidXQgbWlnaHQgaWYgdGhlIGNvZGUgd2VyZSB1c2VkCiAgZWxzZXdoZXJlIG9yIHVuZGVyIGRpZmZlcmVudCBjb25kaXRpb25zLgoKRGFuaWVsIFN0ZW5iZXJnICgzIEZlYiAyMDA5KQotIEhpZGVtb3RvIE5ha2FkYSBwcm92aWRlZCBhIHNtYWxsIGZpeCB0aGF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGdldCB0aGUKICBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBzaXplIGZyb20gZmlsZTovLyAidHJhbnNmZXJzIiB3aXRoCiAgQ1VSTE9QVF9OT0JPRFkgc2V0IHRydWUuCgpEYW5pZWwgU3RlbmJlcmcgKDIgRmViIDIwMDkpCi0gUGF0cmljayBTY290dCBmb3VuZCBhIHJhdGhlciBsYXJnZSBtZW1vcnkgbGVhayB3aGVuIHVzaW5nIHRoZSBtdWx0aQogIGludGVyZmFjZSBhbmQgc2V0dGluZyBDVVJMTU9QVF9NQVhDT05ORUNUUyB0byBzb21ldGhpbmcgbGVzcyB0aGFuIHRoZSBudW1iZXIKICBvZiBoYW5kbGVzIHlvdSBhZGQgdG8gdGhlIG11bHRpIGhhbmRsZS4gQWxsIHRoZSBjb25uZWN0aW9ucyB0aGF0IGRpZG4ndCBmaXQKICBpbiB0aGUgY2FjaGUgd291bGQgbm90IGJlIHByb3Blcmx5IGRpc2Nvbm5lY3RlZCBub3IgZnJlZWQhCgotIENyYWlnIEEgV2VzdCBicm91Z2h0IHVzOiBsaWJjdXJsIG5vdyBkZWZhdWx0cyB0byBkbyBDT05ORUNUIHdpdGggSFRUUAogIHZlcnNpb24gMS4xIGluc3RlYWQgb2YgMS4wIGxpa2UgYmVmb3JlLiBUaGlzIGNoYW5nZSBhbHNvIGludHJvZHVjZXMgdGhlIG5ldwogIHByb3h5IHR5cGUgZm9yIGxpYmN1cmwgY2FsbGVkICdDVVJMUFJPWFlfSFRUUF8xXzAnIHRoYXQgdGhlbiBhbGxvd3MgYXBwcyB0bwogIHN3aXRjaCAoYmFjaykgdG8gQ09OTkVDVCAxLjAgcmVxdWVzdHMuIFRoZSBjdXJsIHRvb2wgYWxzbyBnb3QgYSAtLXByb3h5MS4wCiAgb3B0aW9uIHRoYXQgd29ya3MgZXhhY3RseSBsaWtlIC0tcHJveHkgYnV0IHNldHMgQ1VSTFBST1hZX0hUVFBfMV8wLgoKICBJIHVwZGF0ZWQgYWxsIHRlc3QgY2FzZXMgY2FzZXMgdGhhdCB1c2UgQ09OTkVDVCBhbmQgSSB0cmllZCB0byBkbyBzb21lIHVzaW5nCiAgLS1wcm94eTEuMCBhbmQgc29tZSB1cGRhdGVkIHRvIGRvIENPTk5FQ1QgMS4xIHRvIGdldCBib3RoIHZlcnNpb25zIHJ1bi4KCkRhbmllbCBTdGVuYmVyZyAoMzEgSmFuIDIwMDkpCi0gV2hlbiBidWlsZGluZyB3aXRoIGMtYXJlcyAxLjYuMSAobm90IHlldCByZWxlYXNlZCkgb3IgbGF0ZXIgYW5kIElQdjYgc3VwcG9ydAogIGVuYWJsZWQsIHdlIGNhbiBub3cgdGFrZSBhZHZhbnRhZ2Ugb2YgaXRzIGJyYW5kIG5ldyBBRl9VTlNQRUMgc3VwcG9ydCBpbgogIGFyZXNfZ2V0aG9zdGJ5bmFtZSgpLiBUaGlzIG1ha2VzIHRlc3QgY2FzZSAyNDEgZmluYWxseSBydW4gZmluZSBmb3IgbWUgd2l0aAogIHRoaXMgc2V0dXAgc2luY2UgaXQgbm93IHBhcnNlcyB0aGUgIjo6MSBpcDYtbG9jYWxob3N0IiBsaW5lIGZpbmUgaW4gbXkKICAvZXRjL2hvc3RzIGZpbGUhCgpEYW5pZWwgU3RlbmJlcmcgKDMwIEphbiAyMDA5KQotIFNjb3R0IENhbnRvciBmaWxlZCBidWcgcmVwb3J0ICMyNTUwMDYxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NTAwNjEpIG1lbnRpb25pbmcgdGhhdCBJIGZhaWxlZCB0bwogIHByb3Blcmx5IG1ha2Ugc3VyZSB0aGF0IHRoZSBWQzkgbWFrZWZpbGVzIGdvdCBpbmNsdWRlZCBpbiB0aGUgbGF0ZXN0CiAgcmVsZWFzZS4gSSd2ZSBub3cgZml4ZWQgdGhlIHJlbGVhc2Ugc2NyaXB0IGFuZCB2ZXJpZmllZCBpdCBzbyBuZXh0IHJlbGVhc2UKICB3aWxsIGhvcGVmdWxseSBpbmNsdWRlIHRoZW0gcHJvcGVybHkhCgpEYW5pZWwgRmFuZHJpY2ggKDMwIEphbiAyMDA5KQotIEZpeGVkIC0tZGlzYWJsZS1wcm94eSBmb3IgRlRQIGFuZCBTT0NLUy4gVGhhbmtzIHRvIERhbmllbCBFZ2dlciBmb3IKICByZXBvcnRpbmcuCgpZYW5nIFRzZSAoMjkgSmFuIDIwMDkpCi0gSW50cm9kdWNlZCBjdXJsX3NzcGkuYyBhbmQgY3VybF9zc3BpLmggZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBmdW5jdGlvbnMKICBDdXJsX3NzcGlfZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9zc3BpX2dsb2JhbF9jbGVhbnVwKCkgd2hpY2ggcHJldmlvdXNseSB3ZXJlCiAgbmFtZWQgQ3VybF9udGxtX2dsb2JhbF9pbml0KCkgYW5kIEN1cmxfbnRsbV9nbG9iYWxfY2xlYW51cCgpIGluIGh0dHBfbnRsbS5jCiAgQWxzbyBhZGp1c3RlZCBzb2Nrc19zc3BpLmMgdG8gcmVtb3ZlIHRoZSBsaW5rLXRpbWUgZGVwZW5kZW5jeSBvbiB0aGUgV2luZG93cwogIFNTUEkgbGlicmFyeSB1c2luZyBpdCBub3cgaW4gdGhlIHNhbWUgd2F5IGFzIGl0IHdhcyBkb25lIGluIGh0dHBfbnRsbS5jLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBKYW4gMjAwOSkKLSBNYXJrdXMgTW9lbGxlciBpbnRyb2R1Y2VkIHR3byBuZXcgb3B0aW9ucyB0byBsaWJjdXJsOgogIENVUkxPUFRfU09DS1M1X0dTU0FQSV9TRVJWSUNFIGFuZCBDVVJMT1BUX1NPQ0tTNV9HU1NBUElfTkVDIHRvIGFsbG93IGxpYmN1cmwKICB0byBkbyBHU1Mtc3R5bGUgYXV0aGVudGljYXRpb24gd2l0aCBTT0NLUzUgcHJveGllcy4gVGhlIGN1cmwgdG9vbCBnb3QgdGhlCiAgb3B0aW9ucyBjYWxsZWQgLS1zb2NrczUtZ3NzYXBpLXNlcnZpY2UgYW5kIC0tc29ja3M1LWdzc2FwaS1uZWMgdG8gZW5hYmxlCiAgdGhlc2UuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEphbiAyMDA5KQotIENoYWQgTW9ucm9lIHByb3ZpZGVkIHRoZSBuZXcgQ1VSTE9QVF9URlRQX0JMS1NJWkUgb3B0aW9uIHRoYXQgYWxsb3dzIGFuIGFwcAogIHRvIHNldCBkZXNpcmVkIGJsb2NrIHNpemUgdG8gdXNlIGZvciBURlRQIHRyYW5zZmVycyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0CiAgNTEyIGJ5dGVzLgoKLSBUaGUgIi1ub190aWNrZXQiIG9wdGlvbiB3YXMgaW50cm9kdWNlZCBpbiBPcGVuc3NsMC45LjhqLiBJdCdzIGEgZmxhZyB0bwogIGRpc2FibGUgInJmYzQ1MDdiaXMgc2Vzc2lvbiB0aWNrZXQgc3VwcG9ydCIuICByZmM0NTA3YmlzIHdhcyBsYXRlciB0dXJuZWQKICBpbnRvIHRoZSBwcm9wZXIgUkZDNTA3NyBpdCBzZWVtczogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTA3NwoKICBUaGUgZW5hYmxlZCBleHRlbnNpb24gY29uY2VybnMgdGhlIHNlc3Npb24gbWFuYWdlbWVudC4gSSB3b25kZXIgaG93IG9mdGVuCiAgbGliY3VybCBzdG9wcyBhIGNvbm5lY3Rpb24gYW5kIHRoZW4gcmVzdW1lcyBhIFRMUyBzZXNzaW9uLiBhbHNvLCBzZW5kaW5nIHRoZQogIHNlc3Npb24gZGF0YSBpcyBzb21lIG92ZXJoZWFkLiAuSSBzdWdnZXN0IHRoYXQgeW91IGp1c3QgdXNlIHlvdXIgcHJvcG9zZWQKICBwYXRjaCAod2hpY2ggZXhwbGljaXRseSBkaXNhYmxlcyBUSUNLRVQpLgoKICBJZiBzb21lb25lIHdyaXRlcyBhbiBhcHBsaWNhdGlvbiB3aXRoIGxpYmN1cmwgYW5kIG9wZW5zc2wgd2hvIHdhbnRzIHRvCiAgZW5hYmxlIHRoZSBmZWF0dXJlLCBvbmUgY2FuIGRvIHRoaXMgaW4gdGhlIFNTTCBjYWxsYmFjay4KCiAgU2hhcmFkIEd1cHRhIGJyb3VnaHQgdGhpcyB0byBteSBhdHRlbnRpb24uIFBldGVyIFN5bHZlc3RlciBoZWxwZWQgbWUgZGVjaWRlCiAgb24gdGhlIHByb3BlciBhY3Rpb24uCgotIEFsZXhleSBCb3J6b3YgZmlsZWQgYnVnIHJlcG9ydCAjMjUzNTUwNAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNTM1NTA0KSBwb2ludGluZyBvdXQgdGhhdCByZWFsbXMgd2l0aAogIHF1b3RlZCBxdW90YXRpb24gbWFya3MgaW4gSFRUUCBEaWdlc3QgaGVhZGVycyBkaWRuJ3Qgd29yay4gSSd2ZSBub3cgYWRkZWQgCiAgdGVzdCBjYXNlIDEwOTUgdGhhdCB2ZXJpZmllcyBteSBmaXguCgotIENyYWlnIEEgV2VzdCBicm91Z2h0IENVUkxPUFRfTk9QUk9YWSBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgLS1ub3Byb3h5IG9wdGlvbi4KICBUaGV5IGJhc2ljYWxseSBvZmZlciB0aGUgc2FtZSB0aGluZyB0aGUgTk9fUFJPWFkgZW52aXJvbm1lbnQgdmFyaWFibGUgb25seQogIG9mZmVyZWQgcHJldmlvdXNseTogbGlzdCBhIHNldCBvZiBob3N0IG5hbWVzIHRoYXQgc2hhbGwgbm90IHVzZSB0aGUgcHJveHkKICBldmVuIGlmIG9uZSBpcyBzcGVjaWZpZWQuCgpEYW5pZWwgRmFuZHJpY2ggKDIwIEphbiAyMDA5KQotIENhbGwgc2V0bG9jYWxlKCkgZm9yIGxpYnRlc3QgdGVzdHMgdG8gdGVzdCB0aGUgZWZmZWN0cyBvZiBsb2NhbGUtaW5kdWNlZAogIGxpYmMgY2hhbmdlcyBvbiBsaWJjdXJsLgoKLSBGaXhlZCBhIGNvdXBsZSBtb3JlIGxvY2FsZS1kZXBlbmRlbnQgdG91cHBlciBjb252ZXJzaW9ucywgbWFpbmx5IGZvcgogIGNsYXJpdHkuICBUaGlzIGRvZXMgZml4IG9uZSBwcm9ibGVtIHRoYXQgY2F1c2VzIDt0eXBlPWkgRlRQIFVSTHMKICB0byBmYWlsIGluIHRoZSBUdXJraXNoIGxvY2FsZSB3aGVuIENVUkxPUFRfUFJPWFlfVFJBTlNGRVJfTU9ERSBpcwogIHVzZWQgKHRlc3QgY2FzZSA1NjEpCgotIEFkZGVkIHRlc3RzIDU2MSBhbmQgMTA5MSB0aHJvdWdoIDEwOTQgdG8gdGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucwogIG9mIDt0eXBlPSBhbmQgO21vZGU9IFVSTHMgdGhhdCBjb3VsZCBwb3RlbnRpYWxseSBmYWlsIGluIHRoZSBUdXJraXNoCiAgbG9jYWxlLgoKRGFuaWVsIFN0ZW5iZXJnICgyMCBKYW4gMjAwOSkKLSBMaXNhIFh1IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHNzaC5vYmogZmlsZSB3YXMgbWlzc2luZyBmcm9tIHRoZQogIGxpYi9NYWtlZmlsZS52YzYgZmlsZSAoYW5kIHRodXMgZnJvbSB0aGUgdmM4IGFuZCB2Yzkgb25lcyB0b28pLgoKVmVyc2lvbiA3LjE5LjMgKDE5IEphbnVhcnkgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTYgSmFuIDIwMDkpCi0gQW5kcmV3IGRlIGxvcyBSZXllcyBmaXhlZCBjdXJsYnVpbGQuaCBmb3IgImdlbmVyaWMiIGdjYyBidWlsZHMgb24gUFBDLCBib3RoCiAgMzIgYml0IGFuZCA2NCBiaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IEphbiAyMDA5KQotIFRpbSBBbnNlbGwgZml4ZWQgYSBjb21waWxlciB3YXJuaW5nIGluIGxpYi9jb29raWUuYwoKRGFuaWVsIFN0ZW5iZXJnICgxNCBKYW4gMjAwOSkKLSBHcmFudCBFcmlja3NvbiBmaXhlZCB0aW1lb3V0cyBmb3IgVEZUUCBzdWNoIHRoYXQgc3BlY2lmeWluZyBhCiAgY29ubmVjdC10aW1lb3V0LCBhIG1heC10aW1lIG9yIGJvdGggb3B0aW9ucyB3b3JrIGNvcnJlY3RseSBhbmQgYXMgZXhwZWN0ZWQKICBieSBwYXNzaW5nIHRoZSBjb3JyZWN0IGJvb2xlYW4gdmFsdWUgdG8gQ3VybF90aW1lbGVmdCB2aWEgdGhlCiAgJ2R1cmluZ2Nvbm5lY3QnIHBhcmFtZXRlci4KCiAgV2l0aCB0aGlzIHNtYWxsIGNoYW5nZSwgY3VybCBURlRQIG5vdyBiZWhhdmVzIGFzIGV4cGVjdGVkIChhbmQgbGlrZWx5IGFzCiAgb3JpZ2luYWxseS1kZXNpZ25lZCk6CgogIDEpIEZvciBub24tZXhpc3RlbnQgb3IgdW5yZWFjaGFibGUgZG90dGVkIElQIGFkZHJlc3NlczoKCiAgIGEpIFdpdGggbm8gb3B0aW9ucywgZm9sbG93cyB0aGUgZGVmYXVsdCBjdXJsIDMwMHMgdGltZW91dC4uLgogICBiKSBXaXRoIC0tY29ubmVjdC10aW1lb3V0IG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZS4uLgogICBjKSBXaXRoIC0tbWF4LXRpbWUgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlLi4uCiAgIGQpIFdpdGggYm90aCAtLWNvbm5lY3QtdGltZW91dCBhbmQgLS1tYXgtdGltZSwgZm9sbG93cyB0aGUgc21hbGxlciB2YWx1ZS4uLgoKICAgYW5kIHRpbWVzIG91dCB3aXRoIGEgImN1cmw6ICg3KSBDb3VsZG4ndCBjb25uZWN0IHRvIHNlcnZlciIgZXJyb3IuCgogIDIpIEZvciB0cmFuc2ZlcnMgdG8vZnJvbSBhIHZhbGlkIGhvc3Q6CgogICBhKSBXaXRoIG5vIG9wdGlvbnMsIGZvbGxvd3MgZGVmYXVsdCBjdXJsIDMwMHMgdGltZW91dCBmb3IgdGhlCiAgICAgIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGRlZmF1bHQgVEZUUCAzNjAwcwogICAgICB0aW1lb3V0IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYikgV2l0aCAtLWNvbm5lY3QtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUgZm9yIHRoZQogICAgICBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBkZWZhdWx0IFRGVFAgMzYwMHMKICAgICAgdGltZW91dCBmb3IgdGhlIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGMpIFdpdGggLS1tYXgtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUgZm9yIHRoZSBmaXJzdAogICAgICBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZQogICAgICB0cmFuc2Zlci4uLgoKICAgZCkgV2l0aCBib3RoIC0tY29ubmVjdC10aW1lb3V0IGFuZCAtLW1heC10aW1lLCBmb2xsb3dzIHRoZSBmb3JtZXIKICAgICAgZm9yIHRoZSBmaXJzdCBYUlEvREFUQS9BQ0sgdHJhbnNhY3Rpb24gYW5kIHRoZSBsYXR0ZXIgZm9yIHRoZQogICAgICByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBhbmQgdGltZXMgb3V0IHdpdGggYSAiY3VybDogKDI4KSBUaW1lb3V0IHdhcyByZWFjaGVkIiBlcnJvciBhcwogICBhcHByb3ByaWF0ZS4KCkRhbmllbCBTdGVuYmVyZyAoMTMgSmFuIDIwMDkpCi0gTWljaGFlbCBXYWxsbmVyIGZpeGVkIGEgTlVMTCBwb2ludGVyIGRlcmVmIHdoZW4gY2FsbGluZwogIGN1cmxfZWFzeV9zZXR1cChjdXJsLCBDVVJMT1BUX0NPT0tJRUxJU1QsICJTRVNTIikgb24gYSBDVVJMIGhhbmRsZSB3aXRoIG5vCiAgY29va2llcyBkYXRhLgoKLSBTdGVmYW4gVGVsZW1hbiBicm91Z2h0IGEgcGF0Y2ggdG8gZml4IHRoZSBkZWZhdWx0IGN1cmxidWlsZC5oIGZpbGUgZm9yIHRoZQogIFN1blBybyBjb21waWxlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIEphbiAyMDA5KQotIEJhc2VkIG9uIGJ1ZyByZXBvcnQgIzI0OTg2NjUgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0OTg2NjUpCiAgYnkgRGFuaWVsIEJsYWNrLCBJJ3ZlIG5vdyBhZGRlZCBtYWdpYyB0byB0aGUgY29uZmlndXJlIHNjcmlwdCB0aGF0IG1ha2VzIGl0CiAgdXNlIHBrZy1jb25maWcgdG8gZGV0ZWN0IGdudXRscyBkZXRhaWxzIGFzIHdlbGwgaWYgdGhlIGV4aXN0aW5nIG1ldGhvZAogICh1c2luZyBsaWJnbnV0bHMtY29uZmlnKSBmYWlscy4gV2hpbGUgZG9pbmcgdGhpcywgSSBjbGVhbmVkIHVwIGFuZCB1bmlmaWVkCiAgdGhlIHBrZy1jb25maWcgdXNhZ2Ugd2hlbiBkZXRlY3Rpbmcgb3BlbnNzbCBhbmQgbnNzIGFzIHdlbGwuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEphbiAyMDA5KQotIEthcmwgTW9lcmRlciBicm91Z2h0IHRoZSBwYXRjaCB0aGF0IGNyZWF0ZXMgdmM5IE1ha2VmaWxlcywgYW5kIEkgbWFkZQogICdtYWtldGd6JyBub3cgdXNlIHRoZSBhY3R1YWwgbWFrZWZpbGUgdGFyZ2V0cyB0byBkbyB0aGUgVkM4IGFuZCBWQzkKICBtYWtlZmlsZXMuCgpEYW5pZWwgU3RlbmJlcmcgKDEwIEphbiAyMDA5KQotIEVtaWwgUm9tYW51cyBmaXhlZDoKCiAgV2hlbiB1c2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlIG92ZXIgSFRUUCBhbmQgdGhlIHNlcnZlciByZXR1cm5zIGEgTG9jYXRpb24KICBoZWFkZXIsIHRoZSBydW5uaW5nIGVhc3kgaGFuZGxlIHdpbGwgZ2V0IHN0dWNrIGluIHRoZSBDVVJMTV9TVEFURV9QRVJGT1JNCiAgc3RhdGUsIGxlYXZpbmcgdGhlIGV4dGVybmFsIGV2ZW50IGxvb3Agc3R1Y2sgd2FpdGluZyBmb3IgZGF0YSBmcm9tIHRoZQogIGluZ29pbmcgc29ja2V0ICh3aGVuIHVzaW5nIHRoZSBjdXJsX211bHRpX3NvY2tldF9hY3Rpb24gc3R1ZmYpLiBXaGlsZSB0aGlzCiAgYnVnIHdhcyBwcmV0dHkgaGFyZCB0byBmaW5kLCBpdCBzZWVtcyB0byByZXF1aXJlIG9ubHkgYSBvbmUtbGluZSBmaXguIFRoZQogIGJyZWFrIHN0YXRlbWVudCBvbiBsaW5lIDEzNzQgaW4gbXVsdGkuYyBjYXVzZWQgdGhlIGZ1bmN0aW9uIHRvIHNraXAgdGhlIGNhbGwKICB0byBtdWx0aXN0YXRlKCkuCgogIEhvdyB0byByZXByb2R1Y2UgdGhpcyBidWc/IFdlbGwsIHRoYXQncyBhbm90aGVyIHF1ZXN0aW9uLiAgZXZoaXBlcmZpZm8uYyBpbgogIHRoZSBleGFtcGxlcyBkaXJlY3RvcnkgY2hva2VzIG9uIHRoaXMgYnVnIG9ubHkgX3NvbWV0aW1lc18sIHByb2JhYmx5CiAgZGVwZW5kaW5nIG9uIGhvdyBmYXN0IHRoZSBVUkxzIGFyZSBhZGRlZC4gT25lIHdheSBvZiB0ZXN0aW5nIHRoZSBidWcgb3V0IGlzCiAgd3JpdGluZyB0byBoaXBlci5maWZvIGZyb20gbW9yZSB0aGFuIG9uZSBzb3VyY2UgYXQgdGhlIHNhbWUgdGltZS4KCkRhbmllbCBGYW5kcmljaCAoNyBKYW4gMjAwOSkKLSBVbmlmaWVkIG11Y2ggb2YgdGhlIFNlc3Npb25IYW5kbGUgaW5pdGlhbGl6YXRpb24gZG9uZSBpbiBDdXJsX29wZW4oKSBhbmQKICBjdXJsX2Vhc3lfcmVzZXQoKSBieSBjcmVhdGluZyBDdXJsX2luaXRfdXNlcmRlZmluZWQoKS4gVGhpcyBoYWQgdGhlIHNpZGUKICBlZmZlY3Qgb2YgZml4aW5nIGN1cmxfZWFzeV9yZXNldCgpIHNvIGl0IG5vdyBhbHNvIHJlc2V0cwogIENVUkxPUFRfRlRQX0ZJTEVNRVRIT0QgYW5kIENVUkxPUFRfU1NMX1NFU1NJT05JRF9DQUNIRQoKRGFuaWVsIFN0ZW5iZXJnICg3IEphbiAyMDA5KQotIFJvYiBDcml0dGVuZGVuIGRpZCBvbmNlIGFnYWluIHByb3ZpZGUgYW4gTlNTIHVwZGF0ZToKCiAgSSBoYXZlIHRvIGp1bXAgdGhyb3VnaCBhIGZldyBob29wcyBub3cgd2l0aCB0aGUgTlNTIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24KICBzaW5jZSBhbm90aGVyIHBhcnQgb2YgYW4gYXBwbGljYXRpb24gbWF5IGhhdmUgYWxyZWFkeSBpbml0aWFsaXplZCBOU1MgYnkgdGhlCiAgdGltZSBDdXJsIGdldHMgaW52b2tlZC4gVGhpcyBwYXRjaCBpcyBtb3JlIGNhcmVmdWwgdG8gb25seSBzaHV0ZG93biB0aGUgTlNTCiAgbGlicmFyeSBpZiBDdXJsIGRpZCB0aGUgaW5pdGlhbGl6YXRpb24uCgogIEl0IGFsc28gYWRkcyBpbiBhIGJpdCBvZiBjb2RlIHRvIHNldCB0aGUgZGVmYXVsdCBjaXBoZXJzIGlmIHRoZSBhcHAgdGhhdAogIGNhbGwgTlNTX0luaXQqIGRpZCBub3QgY2FsbCBOU1NfU2V0RG9tZXN0aWNQb2xpY3koKSBvciBzZXQgc3BlY2lmaWMKICBjaXBoZXJzLiBPbmUgbWlnaHQgYXJndWUgdGhhdCB0aGlzIGxldHMgb3RoZXIgYXBwbGljYXRpb24gZGV2ZWxvcGVycyBnZXQKICBsYXp5IGFuZC9vciB0aGV5IGFyZW4ndCB1c2luZyB0aGUgTlNTIEFQSSBjb3JyZWN0bHksIGFuZCB5b3UnZCBiZSByaWdodC4KICBCdXQgc3RpbGwsIHRoaXMgd2lsbCBhdm9pZCB0ZXJyaWJseSBkaWZmaWN1bHQtdG8tdHJhY2UgY3Jhc2hlcyBhbmQgaXMKICBnZW5lcmFsbHkgaGVscGZ1bC4KCkRhbmllbCBTdGVuYmVyZyAoMSBKYW4gMjAwOSkKLSAncmVjb25mJyBpcyByZW1vdmVkIHNpbmNlIHdlIHJhdGhlciBoYXZlIHVzZXJzIHVzZSAnYnVpbGRjb25mJwoKRGFuaWVsIFN0ZW5iZXJnICgzMSBEZWMgMjAwOCkKLSBCYXMgTWV2aXNzZW4gcmVwb3J0ZWQgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjQ3OTAzMCBwb2ludGluZwogIG91dCB0aGF0ICdyZWNvbmYnIGRpZG4ndCBwcm9wZXJseSBwb2ludCBvdXQgdGhlIG00IHN1YmRpcmVjdG9yeSB3aGVuIHJ1bm5pbmcKICBhY2xvY2FsLgoKRGFuaWVsIFN0ZW5iZXJnICgyOSBEZWMgMjAwOCkKIC0gUGhpbCBMaXNpZWNraSBmaWxlZCBidWcgcmVwb3J0ICMyNDEzMDY3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0MTMwNjcpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gdGhhdAogIHdvdWxkIGNhdXNlIGxpYmN1cmwgdG8gbWFyayBhIEROUyBjYWNoZSBlbnRyeSAiaW4gdXNlIiBldGVybmFsbHkgaWYgdGhlCiAgc3Vic2VxdWVuY2UgVENQIGNvbm5lY3QgZmFpbGVkLiBJdCB3b3VsZCB0aHVzIG5ldmVyIGdldCBwcnVuZWQgYW5kIHJlZnJlc2hlZAogIGFzIGl0IHNob3VsZCd2ZSBiZWVuLgoKICBQaGlsIHByb3ZpZGVkIGhpcyBvd24gcGF0Y2ggdG8gdGhpcyBwcm9ibGVtIHRoYXQgd2hpbGUgaXQgc2VlbWVkIHRvIHdvcmsKICB3YXNuJ3QgY29tcGxldGUgYW5kIHRodXMgSSB3cm90ZSBteSBvd24gZml4IHRvIHRoZSBwcm9ibGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBEZWMgMjAwOCkKLSBQZXRlciBLb3JzZ2FhcmQgZml4ZWQgYnVpbGRpbmcgbGliY3VybCB3aXRoICJjb25maWd1cmUgLS13aXRoLXNzbAogIC0tZGlzYWJsZS12ZXJib3NlIi4KICAKLSBBbnRob255IEJyeWFuIGZpeGVkIG1vcmUgbGFuZ3VhZ2UgYW5kIHNwZWxsaW5nIGZsYXdzIGluIG1hbiBwYWdlcy4KCkRhbmllbCBTdGVuYmVyZyAoMjIgRGVjIDIwMDgpCi0gR2l2ZW4gYSByZWNlbnQgZW5vdWdoIGxpYnNzaDIsIGxpYmN1cmwgY2FuIG5vdyBzZWVrL3Jlc3VtZSB3aXRoIFNGVFAgZXZlbgogIG9uIGZpbGUgaW5kZXhlcyBiZXlvbmQgMiBvciA0R0IuCgotIEFudGhvbnkgQnJ5YW4gcHJvdmlkZWQgYSBzZXQgb2YgcGF0Y2hlcyB0aGF0IGNsZWFuZWQgdXAgbWFudWFsIGxhbmd1YWdlLAogIGNvcnJlY3RlZCBzcGVsbGluZ3MgYW5kIG1vcmUuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIERlYyAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgZml4ZWQgYSBiYWQgc2l0dWF0aW9uIGZvciB0aGUgbXVsdGlfc29ja2V0KCkgQVBJIHdoZW4gZG9pbmcKICBwaXBlbGluaW5nLCBhcyBsaWJjdXJsIGNvdWxkIHRoZW4gZWFzaWx5IGdldCBjb25mdXNlZCBhbmQgQSkgd29yayBvbiB0aGUKICBoYW5kbGUgdGhhdCB3YXMgbm90ICJmaXJzdCBpbiBxdWV1ZSIgb24gYSBwaXBlbGluZSwgb3IgZXZlbiBCKSB0ZWxsIHRoZSBhcHAKICB0byBSRU1PVkUgYSBzb2NrZXQgd2hpbGUgaXQgd2FzIGluIHVzZSBieSBhIHNlY29uZCBoYW5kbGUgaW4gYSBwaXBlbGluZS4gQm90aAogIGVycm9ycyBjYXVzZWQgaGFuZ2luZyBvciBzdGFsbGluZyBhcHBsaWNhdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDE5IERlYyAyMDA4KQotIGN1cmxfbXVsdGlfdGltZW91dCgpIGNvdWxkIHJldHVybiBhIHRpbWVvdXQgdmFsdWUgb2YgMCBldmVuIHRob3VnaCBub3RoaW5nCiAgd2FzIGFjdHVhbGx5IHJlYWR5IHRvIGdldCBkb25lLCBhcyB0aGUgaW50ZXJuYWwgdGltZSByZXNvbHV0aW9uIGlzIGhpZ2hlcgogIHRoYW4gdGhlIHJldHVybmVkIG1pbGxpc2Vjb25kIHRpbWVyLiBUaGVyZWZvcmUgaXQgY291bGQgY2F1c2UgYXBwbGljYXRpb25zCiAgcnVubmluZyBvbiBmYXN0IHByb2Nlc3NvcnMgdG8gZG8gc2hvcnQgYnVyc3RzIG9mIGJ1c3ktbG9vcHMuCiAgY3VybF9tdWx0aV90aW1lb3V0KCkgd2lsbCBub3cgb25seSByZXR1cm4gMCBpZiB0aGUgdGltZW91dCBpcyBhY3R1YWxseQogIGFscmVheSB0cmlnZ2VyZWQuCgotIFVzaW5nIHRoZSBsaWJzc2gyIDAuMTkgZnVuY3Rpb24gbGlic3NoMl9zZXNzaW9uX2Jsb2NrX2RpcmVjdGlvbnMoKSwgbGliY3VybAogIG5vdyBoYXMgYW4gaW1wcm92ZWQgYWJpbGl0eSB0byBkbyByaWdodCB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2UgKGJvdGgKICAicmVndWxhciIgYW5kIG11bHRpX3NvY2tldCkgaXMgdXNlZCBmb3IgU0NQIGFuZCBTRlRQIHRyYW5zZmVycy4gVGhpcyBzaG91bGQKICByZXN1bHQgaW4gKG11Y2gpIGxlc3MgYnVzeS1sb29wIHNpdHVhdGlvbnMgYW5kIHRodXMgbGVzcyBDUFUgdXNhZ2Ugd2l0aCBubwogIHNwZWVkIGxvc3MuCgpEYW5pZWwgU3RlbmJlcmcgKDE3IERlYyAyMDA4KQotIFNDUCBhbmQgU0ZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgaGFkIHRoZSBzYW1lIGZsYXc6IHRoZSAnRE9ORScKICBvcGVyYXRpb24gZGlkbid0IGNvbXBsZXRlIHByb3Blcmx5IGlmIHRoZSBFQUdBSU4gZXF1aXZhbGVudCB3YXMgcmV0dXJuZWQgYnV0CiAgbGliY3VybCB3b3VsZCBzaW1wbHkgY29udGludWUgd2l0aCBhIGhhbGYtY29tcGxldGVkIGNsb3NlIG9wZXJhdGlvbgogIHBlcmZvcm1lZC4gVGhpcyBydWluZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uIHJlLXVzZSBhbmQgY2F1c2Ugc29tZQogIFNTSC1wcm90b2NvbCBlcnJvcnMgaW4gZ2VuZXJhbC4gVGhlIGNvcnJlY3Rpb24gaXMgdW5mb3J0dW5hdGVseSBhZGRpbmcgYQogIGJsb2NraW5nIGZ1bmN0aW9uIC0gZG9pbmcgaXQgZW50aXJlbHkgbm9uLWJsb2NraW5nIHNob3VsZCBiZSBjb25zaWRlcmVkIGZvcgogIGEgYmV0dGVyIGZpeC4KCkdpc2xlIFZhbmVtICgxNiBEZWMgMjAwOCkKLSBBZGRlZCB0aGUgcG9zc2liaWxpdHkgdG8gdXNlIHRoZSBXYXR0LTMyIHRjcC9pcCBzdGFjayB1bmRlciBXaW5kb3dzLgogIFRoZSBjaGFuZ2Ugc2ltcGx5IGludm9sdmVkIGFkZGluZyBhIFVTRV9XQVRUMzIgc2VjdGlvbiBpbiB0aGUKICBjb25maWctd2luMzIuaCBmaWxlcyAodW5kZXIgLi9saWIgYW5kIC4vc3JjKS4gVGhpcyBzZWN0aW9uIGRpc2FibGVzCiAgdGhlIHVzZSBvZiBhbnkgV2luc29jayBoZWFkZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBEZWMgMjAwOCkKLSBsaWJzc2gyX3NmdHBfbGFzdF9lcnJvcigpIHdhcyB3cm9uZ2x5IHVzZWQgYXQgc29tZSBwbGFjZXMgaW4gbGliY3VybCB3aGljaAogIG1hZGUgbGliY3VybCBzb21ldGltZXMgbm90IHByb3Blcmx5IGFib3J0IHByb2JsZW1hdGljIFNGVFAgdHJhbnNmZXJzLgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBEZWMgMjAwOCkKLSBNb3JlIHdvcmsgd2l0aCBJZ29yIE5vdm9zZWx0c2V2IHRvIGZpcnN0IGZpeCB0aGUgcmVtYWluaW5nIHN0dWZmIGZvcgogIHJlbW92aW5nIGVhc3kgaGFuZGxlcyBmcm9tIG11bHRpIGhhbmRsZXMgd2hlbiB0aGUgZWFzeSBoYW5kbGUgaXMvd2FzIHdpdGhpbgogIGEgSFRUUCBwaXBlbGluZS4gSGlzIGJ1ZyByZXBvcnQgIzIzNTE2NTMKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjM1MTY1Mykgd2FzIGFsc28gcmVsYXRlZCBhbmQgd2FzCiAgZXZlbnR1YWxseSBmaXhlZCBieSBhIHBhdGNoIGJ5IElnb3IgaGltc2VsZi4KCllhbmcgVHNlICgxMiBEZWMgMjAwOCkKLSBQYXRyaWNrIE1vbm5lcmF0IGZpeGVkIGEgYnVpbGQgcmVncmVzc2lvbiwgaW50cm9kdWNlZCBpbiA3LjE5LjIsIGFmZmVjdGluZwogIE9TLzQwMCBjb21waWxhdGlvbnMgd2l0aCBJUHY2IGVuYWJsZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA4KQotIE1hcmsgS2FycGVsZXMgZmlsZWQgYnVnIHJlcG9ydCAjMjQxNjE4MiB0aXRsZWQgImNyYXNoIGluIENvbm5lY3Rpb25FeGlzdHMKICB3aGVuIHVzaW5nIGR1cGhhbmRsZStjdXJsX211dGxpIgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDE2MTgyKSB3aGljaCBzaG93ZWQgdGhhdAogIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB3cm9uZ2x5IGFsc28gY29waWVkIHRoZSBwb2ludGVyIHRvIHRoZSBjb25uZWN0aW9uCiAgY2FjaGUsIHdoaWNoIHdhcyBwbGFpbiB3cm9uZyBhbmQgY2F1c2VkIGEgc2VnZmF1bHQgaWYgdGhlIGhhbmRsZSB3b3VsZCBiZQogIHVzZWQgaW4gYSBkaWZmZXJlbnQgbXVsdGkgaGFuZGxlIHRoYW4gdGhlIGhhbmRsZSBpdCB3YXMgZHVwbGljYXRlZCBmcm9tLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBLZXNoYXYgS3JpdHkgZm91bmQgb3V0IHRoYXQgbGliY3VybCBmYWlsZWQgdG8gZGVhbCB3aXRoIGRvdHRlZCBJUHY2CiAgYWRkcmVzc2VzIGlmIHRoZXkgd2VyZSB2ZXJ5IGxvbmcgKD4zOSBsZXR0ZXJzKSBkdWUgdG8gYSB0b28gc3RyaWN0IGFkZHJlc3MKICB2YWxpZGl0eSBwYXJzZXIuIEl0IG5vdyBhY2NlcHRzIGFkZHJlc3NlcyB1cCB0byA0NSBieXRlcyBsb25nLgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBEZWMgMjAwOCkKLSBJbnRlcm5ldCBFeHBsb3JlciBoYWQgYSBicm9rZW4gSFRUUCBkaWdlc3QgYXV0aGVudGljYXRpb24gYmVmb3JlIHY3IGFuZAogIHRoZXJlIGFyZSBzZXJ2ZXJzICJvdXQgdGhlcmUiIHRoYXQgcmVsaWVzIG9uIHRoZSBjbGllbnQgZG9pbmcgdGhpcyBicm9rZW4KICBEaWdlc3QgYXV0aGVudGljYXRpb24uIEFwYWNoZSBldmVuIGNvbWVzIHdpdGggYW4gb3B0aW9uIHRvIHdvcmsgd2l0aCBzdWNoCiAgYnJva2VuIGNsaWVudHMuCgogIFRoZSBkaWZmZXJlbmNlIGlzIG9ubHkgZm9yIFVSTHMgdGhhdCBjb250YWluIGEgcXVlcnktcGFydCAoYSAnPyctbGV0dGVyIGFuZAogIHRleHQgdG8gdGhlIHJpZ2h0IG9mIGl0KS4KCiAgbGliY3VybCBub3cgc3VwcG9ydHMgdGhpcyBxdWlyaywgYW5kIHlvdSBlbmFibGUgaXQgYnkgc2V0dGluZyB0aGUKICBDVVJMQVVUSF9ESUdFU1RfSUUgYml0IGluIHRoZSBiaXRtYXNrIHlvdSBwYXNzIHRvIHRoZSBDVVJMT1BUX0hUVFBBVVRIIG9yCiAgQ1VSTE9QVF9QUk9YWUFVVEggb3B0aW9ucy4gVGhleSBhcmUgdGh1cyBpbmRpdmlkdWFsbHkgY29udHJvbGxlZCB0byBzZXJ2ZXIKICBhbmQgcHJveHkuCgogIChub3RlIHRoYXQgdGhlcmUncyBubyB3YXkgdG8gYWN0aXZhdGUgdGhpcyB3aXRoIHRoZSBjdXJsIHRvb2wgeWV0KQoKRGFuaWVsIEZhbmRyaWNoICg5IERlYyAyMDA4KQotIEFkZGVkIHRlc3QgY2FzZXMgMTA4OSBhbmQgMTA5MCB0byB0ZXN0IC0td3JpdGUtb3V0IGFmdGVyIGEgcmVkaXJlY3QgdG8KICB0ZXN0IGEgcmVwb3J0IHRoYXQgdGhlIHNpemUgZGlkbid0IHdvcmssIGJ1dCB0aGVzZSB0ZXN0IGNhc2VzIHBhc3MuCgotIERvY3VtZW50ZWQgQ1VSTE9QVF9DT05ORUNUX09OTFkgYXMgYmVpbmcgdXNlZnVsIG9ubHkgb24gSFRUUCBVUkxzLgoKRGFuaWVsIFN0ZW5iZXJnICg5IERlYyAyMDA4KQotIEtlbiBIaXJzY2ggc2ltcGxpZmllZCBob3cgbGliY3VybCBkb2VzIEZUUFM6IG5vdyBpdCBkb2Vzbid0IGFzc3VtZSBhbnkKICBwYXJ0aWN1bGFyIHN0YXRlIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIGxpa2UgaXQgZGlkIGJlZm9yZSBmb3IgaW1wbGljaXQKICBGVFBTIChsaWJjdXJsIGFzc3VtZWQgc3VjaCBjb250cm9sIGNvbm5lY3Rpb25zIHRvIGJlIGVuY3J5cHRlZCB3aGlsZSBzb21lCiAgRlRQUyBzZXJ2ZXJzIHN1Y2ggYXMgRmlsZVppbGxhIGFzc3VtZXMgc3VjaCBjb25uZWN0aW9ucyB0byBiZSBjbGVhcgogIG1vZGUpLiBVc2UgdGhlIENVUkxPUFRfVVNFX1NTTCBvcHRpb24gdG8gc2V0IHlvdXIgZGVzaXJlZCBsZXZlbC4KCkRhbmllbCBTdGVuYmVyZyAoOCBEZWMgMjAwOCkKLSBGcmVkIE1hY2hhZG8gcG9zdGVkIGFib3V0IGEgd2VpcmQgRlRQIHByb2JsZW0gb24gdGhlIGN1cmwtdXNlcnMgbGlzdCBhbmQgd2hlbgogIHJlc2VhcmNoaW5nIGl0LCBpdCB0dXJuZWQgb3V0IGhlIGdvdCBhIDU1MCByZXNwb25zZSBiYWNrIGZyb20gYSBTSVpFIGNvbW1hbmQKICBhbmQgdGhlbiBJIGZlbGwgb3ZlciB0aGUgdGV4dCBpbiBSRkMzNjU5IHRoYXQgc2F5czoKCiAgIFRoZSBwcmVzZW5jZSBvZiB0aGUgNTUwIGVycm9yIHJlc3BvbnNlIHRvIGEgU0laRSBjb21tYW5kIE1VU1QgTk9UIGJlIHRha2VuCiAgIGJ5IHRoZSBjbGllbnQgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IHRoZSBmaWxlIGNhbm5vdCBiZSB0cmFuc2ZlcnJlZCBpbiB0aGUKICAgY3VycmVudCBNT0RFIGFuZCBUWVBFLgoKICBJbiBvdGhlciB3b3JkczogdGhlIGNoYW5nZSBJIGRpZCBvbiBTZXB0ZW1iZXIgMzB0aCAyMDA4IGFuZCB0aGF0IGhhcyBiZWVuCiAgaW5jbHVkZWQgaW4gdGhlIGxhc3QgdHdvIHJlbGVhc2VzIHdlcmUgYSByZWdyZXNzaW9uIGFuZCBhIGJhZCBpZGVhLiBXZSBNVVNUCiAgTk9UIHRha2UgYSA1NTAgcmVzcG9uc2UgZnJvbSBTSVpFIGFzIGEgaGludCB0aGF0IHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCgotIENocmlzdGlhbiBLcmF1c2UgZmlsZWQgYnVnICMyMjIxMjM3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyMjEyMzcpIHRoYXQgaWRlbnRpZmllZCBhbiBpbmZpbml0ZQogIGxvb3AgZHVyaW5nIEdTUyBhdXRoZW50aWNhdGlvbiBnaXZlbiBzb21lIHNwZWNpZmljIGNvbmRpdGlvbnMuIFdpdGggaGlzCiAgcGF0aWVuY2UgYW5kIGdyZWF0IGZlZWRiYWNrIEkgbWFuYWdlZCB0byBuYXJyb3cgZG93biB0aGUgcHJvYmxlbSBhbmQKICBldmVudHVhbGx5IGZpeCBpdCBhbHRob3VnaCBJIGNhbid0IHRlc3QgYW55IG9mIHRoaXMgbXlzZWxmIQoKRGFuaWVsIEZhbmRyaWNoICgzIERlYyAyMDA4KQotIEZpeGVkIHRoZSBnZXRpZmFkZHJzIHZlcnNpb24gb2YgQ3VybF9pZjJpcCB0byB3b3JrIG9uIHN5c3RlbXMgd2l0aG91dCBJUHY2CiAgc3VwcG9ydCAoZS5nLiBNaW5peCkKCkRhbmllbCBTdGVuYmVyZyAoMyBEZWMgMjAwOCkKLSBJZ29yIE5vdm9zZWx0c2V2IGZpbGVkIGJ1ZyAjMjM1MTY0NQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjQ1KSB0aGF0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIHRoYXQgb2NjdXJlZCBpZiB5b3UgcmVtb3ZlZCBhbiBlYXN5IGhhbmRsZSB3aGlsZSBpbgogIHByb2dyZXNzIGFuZCB0aGUgaGFuZGxlIHdhcyB1c2VkIGluIGEgSFRUUCBwaXBlbGluZS4KCi0gUGF3ZWwgS2llcnNraSBwb2ludGVkIG91dCBhIG1pc3Rha2UgaW4gdGhlIGNvb2tpZSBjb2RlIHRoYXQgY291bGQgbGVhZCB0byBhCiAgYmFkIGZjbG9zZSgpIGFmdGVyIGEgZmF0YWwgZXJyb3IgaGFkIG9jY3VyZWQuCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzODIyMTkpCgpEYW5pZWwgRmFuZHJpY2ggKDI1IE5vdiAyMDA4KQotIElmIGEgSFRUUCByZXF1ZXN0IGlzIEJhc2ljIGFuZCBudW0gaXMgYWxyZWFkeSA+PTEwMDAsIHRoZSBIVFRQIHRlc3QKICBzZXJ2ZXIgYWRkcyAxIHRvIG51bSB0byBnZXQgdGhlIGRhdGEgc2VjdGlvbiB0byByZXR1cm4uIFRoaXMgYWxsb3dzCiAgdGVzdGluZyBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbnMgdXNpbmcgdGhlIEJhc2ljIGF1dGhlbnRpY2F0aW9uCiAgbWV0aG9kLgoKLSBBZGRlZCB0ZXN0cyAxMDg3IGFuZCAxMDg4IHRvIHRlc3QgQmFzaWMgYXV0aGVudGljYXRpb24gb24gYSByZWRpcmVjdAogIHdpdGggYW5kIHdpdGhvdXQgLS1sb2NhdGlvbi10cnVzdGVkCgpEYW5pZWwgU3RlbmJlcmcgKDI0IE5vdiAyMDA4KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgVmxhZCBHcmFjaG92LCBsaWJjdXJsIG5vdyB1c2VzIGEgbmV3IGxpYnNzaDIgMC4xOQogIGZ1bmN0aW9uIHdoZW4gYnVpbHQgdG8gc3VwcG9ydCBTQ1AgYW5kIFNGVFAgdGhhdCBoZWxwcyB0aGUgbGlicmFyeSB0byBrbm93CiAgaW4gd2hpY2ggZGlyZWN0aW9uIGEgcGFydGljdWxhciBsaWJzc2gyIG9wZXJhdGlvbiB3b3VsZCByZXR1cm4gRUFHQUlOIHNvCiAgdGhhdCBsaWJjdXJsIGtub3dzIHdoYXQgc29ja2V0IGNvbmRpdGlvbnMgdG8gd2FpdCBmb3IgYmVmb3JlIHRyeWluZyB0aGUKICBmdW5jdGlvbiBjYWxsIGFnYWluLiBQcmV2aW91c2x5IChhbmQgc3RpbGwgd2hlbiB1c2luZyBsaWJzc2gyIDAuMTggb3IKICBlYXJsaWVyKSwgbGliY3VybCB3aWxsIGJ1c3ktbG9vcCBpbiB0aGlzIHNpdHVhdGlvbiB3aGVuIHRoZSBlYXN5IGludGVyZmFjZQogIGlzIHVzZWQhCgpEYW5pZWwgRmFuZHJpY2ggKDIwIE5vdiAyMDA4KQotIEF1dG9tYXRpY2FsbHkgZGV0ZWN0IE9wZW5CU0QncyBDQSBjZXJ0IGJ1bmRsZS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgTm92IDIwMDgpCi0gSSByZW1vdmVkIHRoZSBkZWZhdWx0IHVzZSBvZiAiUHJhZ21hOiBuby1jYWNoZSIgZnJvbSBsaWJjdXJsIHdoZW4gYSBwcm94eSBpcwogIHVzZWQuIEl0IGhhcyBiZWVuIHVzZWQgc2luY2UgZm9yZXZlciBidXQgaXQgd2FzIG5ldmVyIGEgZ29vZCBpZGVhIHRvIHVzZQogIHVubGVzcyBleHBsaWNpdGx5IGFza2VkIGZvci4KCi0gSm9zZWYgV29sZidzIGV4dGVuc2lvbiB0aGF0IGFsbG93cyBhICRURVNURElSL2dkYmluaXQkdGVzdG51bSBmaWxlIHRoYXQgd2hlbgogIHlvdSB1c2UgcnVudGVzdHMucGwgLWcsIHdpbGwgYmUgc291cmNlZCBieSBnZGIgdG8gYWxsb3cgYWRkaXRpb25hbCBmYW5jeSBvcgogIHdoYXRldmVyIHlvdSBzZWUgZml0CgotIENocmlzdGlhbiBLcmF1c2UgcmVwb3J0ZWQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCB3b3VsZCBvY2N1ciB3aXRoIEhUVFAKICBHU1Mva2VyYmVyb3MgYXV0aGVudGljYXRpb24gKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIyODQzODYpCgotIEFuZHJlYXMgV3VyZiBhbmQgTWFya3VzIEtvZXR0ZXIgaGVscGVkIG1lIGFuYWx5emUgYSBwcm9ibGVtIHRoYXQgQW5kcmVhcyBnb3QKICB3aGVuIHVwbG9hZGluZyBmaWxlcyB0byBhIHNpbmdsZSBGVFAgc2VydmVyIHVzaW5nIG11bHRpcGxlIGVhc3kgaGFuZGxlCiAgaGFuZGxlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIE9jY2FzaW9uYWxseSBhIGhhbmRsZSB3b3VsZCBzdGFsbCBpbgogIG15c3RlcmlvdXMgd2F5cy4KCiAgVGhlIHByb2JsZW0gdHVybmVkIG91dCB0byBiZSBhIHNpZGUtZWZmZWN0IG9mIHRoZSBDb25uZWN0aW9uRXhpc3RzKCkKICBmdW5jdGlvbidzIGVhZ2VybmVzcyB0byByZS11c2UgYSBoYW5kbGUgZm9yIEhUVFAgcGlwZWxpbmluZyBzbyBpdCB3b3VsZAogIHNlbGVjdCBpdCBldmVuIGlmIGFscmVhZHkgYmVpbmcgaW4gdXNlLCBkdWUgdG8gYW4gaW5hZGVxdWF0ZSBjaGVjayBmb3IgaXRzCiAgY2hhbmNlcyBvZiBiZWluZyB1c2VkIGZvciBwaXBlbG5pbmluZy4KCkRhbmllbCBGYW5kcmljaCAoMTcgTm92IDIwMDgpCi0gQWRkZWQgbW9yZSBjb21waWxlciB3YXJuaW5nIG9wdGlvbnMgZm9yIGdjYyA0LjMKCllhbmcgVHNlICgxNyBOb3YgMjAwOCkKLSBGaXggYSByZW1haW5pbmcgcHJvYmxlbSBpbiB0aGUgaW5ldF9wdG9uKCkgcnVudGltZSBjb25maWd1cmUgY2hlY2suIEFuZAogIGZpeCBpbnRlcm5hbCBDdXJsX2luZXRfcHRvbigpIGZhaWx1cmVzIHRvIHJlamVjdCBjZXJ0YWluIG1hbGZvcm1lZCBsaXRlcmFscy4KCi0gTWFrZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrIGlmIGlvY3RsIHdpdGggdGhlIFNJT0NHSUZBRERSIGNvbW1hbmQgY2FuIGJlCiAgdXNlZCwgYW5kIGRlZmluZSBIQVZFX0lPQ1RMX1NJT0NHSUZBRERSIGlmIGFwcHJvcHJpYXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgxNiBOb3YgMjAwOCkKLSBDaHJpc3RpYW4gS3JhdXNlIGZpeGVkIGEgYnVpbGQgZmFpbHVyZSB3aGVuIGJ1aWxkaW5nIHdpdGggZ3NzIHN1cHBvcnQKICBlbmFibGVkIGFuZCBGVFAgZGlzYWJsZWQuCgotIEFkZGVkIGNoZWNrIGZvciBOVUxMIHJldHVybnMgZnJvbSBzdHJkdXAoKSBpbiBzcmMvbWFpbi5jIGFuZCBsaWIvZm9ybWRhdGEuYwogIC0gcmVwb3J0ZWQgYnkgSmltIE1leWVyaW5nIGFsc28gcHJldmVudCBidWZmZXIgb3ZlcmZsb3cgb24gTVNET1Mgd2hlbiB5b3UgZG8KICBmb3IgZXhhbXBsZSAtTyBvbiBhIHVybCB3aXRoIGEgZmlsZSBuYW1lIHBhcnQgbG9uZ2VyIHRoYW4gUEFUSF9NQVggbGV0dGVycwoKLSBsaWIvbnNzLmMgZml4ZXMgYmFzZWQgb24gdGhlIHJlcG9ydCBieSBKaW0gTWV5ZXJpbmc6IEkgd2VudCBvdmVyIGFuZCBhZGRlZAogIGNoZWNrcyBmb3IgcmV0dXJuIGNvZGVzIGZvciBhbGwgY2FsbHMgdG8gbWFsbG9jIGFuZCBzdHJkdXAgdGhhdCB3ZXJlCiAgbWlzc2luZy4gSSBhbHNvIGNoYW5nZWQgYSBmZXcgbWFsbG9jKDEzKSB0byB1c2UgYXJyYXlzIG9uIHRoZSBzdGFjayBhbmQgYQogIGZldyBtYWxsb2MoUEFUSF9NQVgpIHRvIGluc3RlYWQgdXNlIGFwcmludGYoKSB0byBsb3dlciBtZW1vcnkgdXNlLgoKLSBJIGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gQ3VybF9uc3NfY29ubmVjdCgpIHdoZW4gQ1VSTE9QVF9JU1NVRVJDRVJUIGlzCiAgaW4gdXNlLgoKRGFuaWVsIEZhbmRyaWNoICgxNCBOb3YgMjAwOCkKLSBBZGRlZCAueG1sIGFzIG9uZSBvZiB0aGUgZmV3IGNvbW1vbiBmaWxlIGV4dGVuc2lvbnMga25vd24gYnkgdGhlIG11bHRpcGFydAogIGZvcm0gZ2VuZXJhdG9yLgoKLSBBZGRlZCBzb21lICNpZmRlZnMgYXJvdW5kIGhlYWRlciBmaWxlcyBhbmQgY2hhbmdlIHRoZSBFQUdBSU4gdGVzdCB0bwogIGZpeCBjb21waWxhdGlvbiBvbiBDZWxsIChyZXBvcnRlZCBieSBKZWZmIEN1cmxleSkuCgpZYW5nIFRzZSAoMTQgTm92IDIwMDgpCi0gRml4ZWQgc2V2ZXJhbCBjb25maWd1cmUgc2NyaXB0IGlzc3VlcyBhZmZlY3RpbmcgY2hlY2tzIGZvciBpbmV0X250b2FfcigpLAogIGluZXRfbnRvcCgpLCBpbmV0X3B0b24oKSwgZ2V0aWZhZGRycygpLCBmY250bCgpIGFuZCBnZXRhZGRyaW5mbygpLgoKWWFuZyBUc2UgKDEzIE5vdiAyMDA4KQotIFJlZmFjdG9yZWQgY29uZmlndXJlIHNjcmlwdCBkZXRlY3Rpb24gb2YgZnVuY3Rpb25zIHVzZWQgdG8gc2V0IHNvY2tldHMgaW50bwogIG5vbi1ibG9ja2luZyBtb2RlLCBhbmQgZGVjb3VwbGUgZnVuY3Rpb24gZGV0ZWN0aW9uIGZyb20gZnVuY3Rpb24gY2FwYWJpbGl0eS4KCg==