ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKVmVyc2lvbiA3LjE5LjcgKDQgTm92ZW1iZXIgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMiBOb3YgMjAwOSkKLSBBcyByZXBvcnRlZCBpbmRlcGVuZGVudCBieSBib3RoIFN0YW4gdmFuIGRlIEJ1cmd0IGFuZCBEaWRpZXIgQnJpc2Vib3VyZywKICBDVVJMSU5GT19TSVpFX0RPV05MT0FEICh0aGUgLXcgdmFyaWFibGUgc2l6ZV9kb3dubG9hZCkgZGlkbid0IHdvcmsgd2hlbgogIGdldHRpbmcgZGF0YSBmcm9tIGxkYXAhCgpEYW5pZWwgU3RlbmJlcmcgKDMxIE9jdCAyMDA5KQotIEdhYnJpZWwgS3VyaSByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCBpZiB0aGUKICBkb3dubG9hZCB3YXMgMCBieXRlcywgYXMgbGliY3VybCB3b3VsZCB0aGVuIHJldHVybiB0aGUgc2l6ZSBhcyB1bmtub3duICgtMSkKICBhbmQgbm90IDAuIEkgd3JvdGUgYSBmaXggYW5kIHRlc3QgY2FzZSA1NjYgdG8gdmVyaWZ5IGl0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMCBPY3QgMjAwOSkKLSBMaXphIEFsZW5jaGVyeSBtZW50aW9uZWQgYSBwcm9ibGVtIHdpdGggcmUtdXNlZCBTQ1AgY29ubmVjdGlvbiB3aGVuIGEgYmFkCiAgYXV0aCBpcyB1c2VkLCBhcyBpdCBjYXVzZWQgYSBjcmFzaC4gSSBmYWlsZWQgdG8gcmVwZWF0IHRoZSBpc3N1ZSwgYnV0IHN0aWxsCiAgbWFkZSBhIGNoYW5nZSB0aGF0IG5vdyBmb3JjZXMgdGhlIFRDUCBjb25uZWN0aW9uIHVzZWQgZm9yIGEgZnJlZWQgU0NQCiAgc2Vzc2lvbiB0byBnZXQgY2xvc2VkIGFuZCBub3QgYmUgcmUtdXNlZC4KCi0gIlRvbSIgcG9zdGVkIGEgYnVnIHJlcG9ydCB0aGF0IG1lbnRpb25lZCBob3cgbGliY3VybCBkaWQgd3Jvbmcgd2hlbiBkb2luZyBhCiAgUE9TVCB1c2luZyBhIHJlYWQgY2FsbGJhY2ssIHdpdGggRGlnZXN0IGF1dGhlbnRpY2F0aW9uIGFuZAogICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIgZW5mb3JjZWQuICBJIHdvdWxkIHRoZW4gY2F1c2UgdGhlIGZpcnN0IHJlcXVlc3QKICB0byBiZSB3cm9uZ2x5IHNlbnQgYW5kIHRoZW4gYmFzaWNhbGx5IGhhbmcgdW50aWwgdGhlIHNlcnZlciBjbG9zZWQgdGhlCiAgY29ubmVjdGlvbi4gSSBmaXhlZCB0aGUgcHJvYmxlbSBhbmQgYWRkZWQgdGVzdCBjYXNlIDU2NSB0byB2ZXJpZnkgaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE9jdCAyMDA5KQotIERpbWEgQmFyc2t5IG1hZGUgdGhlIGN1cmwgY29va2llIHBhcnNlciBhY2NlcHQgY29va2llcyBldmVuIHdpdGggYmxhbmsgb3IKICB1bnBhcnNhYmxlIGV4cGlyeSBkYXRlcyBhbmQgdGhlbiB0cmVhdCB0aGVtIGFzIHNlc3Npb24gY29va2llcyAtIHByZXZpb3VzbHkKICBsaWJjdXJsIHdvdWxkIHJlamVjdCBjb29raWVzIHdpdGggYSBkYXRlIGZvcm1hdCBpdCBjb3VsZG4ndCBwYXJzZS4gUmVzZWFyY2gKICBzaG93cyB0aGF0IHRoZSBtYWpvciBicm93c2VyIHRyZWF0IHN1Y2ggY29va2llcyBhcyBzZXNzaW9uIGNvb2tpZXMuIEkKICBtb2RpZmllZCB0ZXN0IDggYW5kIDMxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBPY3QgMjAwOSkKLSBBdHRlbXB0IHRvIHVzZSBwa2ctY29uZmlnIGZvciBmaW5kaW5nIG91dCBsaWJzc2gyIGluc3RhbGxhdGlvbiBkZXRhaWxzCiAgZHVyaW5nIGNvbmZpZ3VyZS4KCi0gQSBwYXRjaCBpbiBidWcgcmVwb3J0ICMyODgzMTc3IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODgzMTc3KQogIGJ5IEpvaGFuIHZhbiBTZWxzdCBpbnRyb2R1Y2VkIHRoZSAtLWNybGZpbGUgb3B0aW9uIHRvIGN1cmwsIHdoaWNoIG1ha2VzIGN1cmwKICB0ZWxsIGxpYmN1cmwgYWJvdXQgYSBmaWxlIHdpdGggQ1JMIChjZXJ0aWZpY2F0ZSByZXZvY2F0aW9uIGxpc3QpIGRhdGEgdG8KICByZWFkLgoKRGFuaWVsIFN0ZW5iZXJnICgxOCBPY3QgMjAwOSkKLSBSYXkgRGFzc2VuIHByb3ZpZGVkIGEgcGF0Y2ggaW4gRGViaWFuJ3MgYnVnIHRyYWNrZXIgKGJ1ZyBudW1iZXIgIzU1MTQ2MSkKICB0aGF0IG5vdyBtYWtlcyBjdXJsX2dldGRhdGUoMykgYWN0dWFsbHkgaGFuZGxlcyBSRkMgODIyIGZvcm1hdHRlZCBkYXRlcyB0aGF0CiAgdXNlIHRoZSAic2luZ2xlIGxldHRlciBtaWxpdGFyeSB0aW1lem9uZXMiLgogIGh0dHA6Ly93d3cucmZjLXJlZi5vcmcvUkZDLVRFWFRTLzgyMi9jaGFwdGVyNS5odG1sIGhhcyB0aGUgZGV0YWlscy4KCi0gRml4ZWQgbWVtb3J5IGxlYWsgaW4gdGhlIFNDUC9TRlRQIGNvZGUgYXMgaXQgbmV2ZXIgZnJlZWQgdGhlIGtub3duaG9zdHMKICBkYXRhIQoKLSBKb2huIERlbm5pcyBmaWxlZCBidWcgcmVwb3J0ICMyODczNjY2CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzM2NjYpIHdoaWNoIGlkZW50aWZpZWQgYSBwcm9ibGVtCiAgd2hpY2ggbWFkZSBsaWJjdXJsIGxvb3AgaW5maW5pdGVseSB3aGVuIGdpdmVuIGluY29ycmVjdCBjcmVkZW50aWFscyB3aGVuCiAgdXNpbmcgSFRUUCBHU1MgbmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uLiBIZSBhbHNvIHByb3ZpZGVkIGEgc21hbGwgYW5kIHNpbXBsZQogIHBhdGNoIGZvciBpdC4KCi0gS2V2aW4gQmF1Z2htYW4gZm91bmQgYSBkb3VibGUgY2xvc2UoKSBwcm9ibGVtIHdpdGggbGliY3VybC1OU1MsIGFzIHdoZW4KICBsaWJjdXJsIGNhbGxlZCBOU1MgdG8gY2xvc2UgdGhlIFNTTCAic2Vzc2lvbiIgaXQgYWxzbyBjbG9zZWQgdGhlIGFjdHVhbAogIHNvY2tldC4KCllhbmcgVHNlICgxNyBPY3QgMjAwOSkKLSBCdWcgcmVwb3J0ICMyODY2NzI0IGluZGljYXRlZAogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODY2NzI0KSB0aGF0IGN1cmwgb24gV2luZG93cyBmYWlsZWQKICB3aGVuIHdyaXRpbmcgZmlsZXMgd2hvc2UgZmlsZSBuYW1lcyBvcmlnaW5hbGx5IGNvbnRhaW5lZCBjaGFyYWN0ZXJzIHdoaWNoCiAgYXJlIG5vdCB2YWxpZCBmb3IgZmlsZSBuYW1lcyBvbiBXaW5kb3dzLiBEYW4gRmFuZHJpY2ggcHJvdmlkZWQgYW4gaW5pdGlhbAogIHBhdGNoIGFuZCBhbm90aGVyIHJldmlzZWQgb25lIHRvIGZpeCB0aGlzIGlzc3VlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIE9jdCAyMDA5KQotIFRvbSBNdWVsbGVyIGNvcnJlY3RseSByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMyODcwMjIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4NzAyMjEpIHRoYXQgbGliY3VybCByZXR1cm5lZCBhbgogIGluY29ycmVjdCByZXR1cm4gY29kZSBmcm9tIHRoZSBpbnRlcm5hbCB0cnluZXh0aXAoKSBmdW5jdGlvbiB3aGljaCBjYXVzZWQKICBoaW0gZ3JpZWYuIFRoaXMgaXMgYSByZWdyZXNzaW9uIHRoYXQgd2FzIGludHJvZHVjZWQgaW4gNy4xOS4xIGFuZCBJIGZpbmQgaXQKICBzdHJhbmdlIGl0IGhhc24ndCBoaXQgdXMgaGFyZGVyLCBidXQgSSB3b24ndCBwZXJzdWUgaW50byBmaWd1cmluZyBvdXQKICBleGFjdGx5IHdoeS4KIAotIENvbnN0YW50aW5lIFNhcHVudHpha2lzOiBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIGFsd2F5cyBzZXQKICBTT19TTkRCVUYgdG8gQ1VSTF9XUklURV9TSVpFIGV2ZW4gaWYgdGhlIFNPX1NOREJVRiBzdGFydHMgb3V0IGxhcmdlci4gIFRoZQogIHBhdGNoIGRvZXNuJ3QgZG8gYSBzZXRzb2Nrb3B0IGlmIFNPX1NOREJVRiBpcyBhbHJlYWR5IGdyZWF0ZXIgdGhhbgogIENVUkxfV1JJVEVfU0laRS4gVGhpcyBzaG91bGQgaGVscCBmb2xrcyB3aG8gaGF2ZSBzZXQgdXAgdGhlaXIgY29tcHV0ZXIgd2l0aAogIGxhcmdlIHNlbmQgYnVmZmVycy4KCkRhbmllbCBTdGVuYmVyZyAoMjcgU2VwIDIwMDkpCi0gSSBpbnRyb2R1Y2VkIGEgbWF4aW11bSBsaW1pdCBmb3IgcmVjZWl2ZWQgSFRUUCBoZWFkZXJzLiBJdCBpcyBjb250cm9sbGVkIGJ5CiAgdGhlIGRlZmluZSBDVVJMX01BWF9IVFRQX0hFQURFUiB3aGljaCBpcyBldmVuIGV4cG9zZWQgaW4gdGhlIHB1YmxpYyBoZWFkZXIKICBmaWxlIHRvIGFsbG93IGZvciB1c2VycyB0byBmYWlybHkgZWFzeSByZWJ1aWxkIGxpYmN1cmwgd2l0aCBhIG1vZGlmaWVkCiAgbGltaXQuIFRoZSByYXRpb25hbGUgZm9yIGEgZml4ZWQgbGltaXQgaXMgdGhhdCBsaWJjdXJsIGlzIHJlYWxsb2MoKWluZyBhCiAgYnVmZmVyIHRvIGJlIGFibGUgdG8gcHV0IGEgZnVsbCBoZWFkZXIgaW50byBpdCwgc28gdGhhdCBpdCBjYW4gY2FsbCB0aGUKICBoZWFkZXIgY2FsbGJhY2sgd2l0aCB0aGUgZW50aXJlIGhlYWRlciwgYnV0IHRoYXQgYWxzbyByaXNrIGdldHRpbmcgaXQgaW50bwogIHRyb3VibGUgaWYgYSBzZXJ2ZXIgYnkgbWlzdGFrZSBvciB3aWxsaW5nbHkgc2VuZHMgYSBoZWFkZXIgdGhhdCBpcyBtb3JlIG9yCiAgbGVzcyB3aXRob3V0IGFuIGVuZC4gVGhlIGxpbWl0IGlzIHNldCB0byAxMDBLLgoKRGFuaWVsIFN0ZW5iZXJnICgyNiBTZXAgMjAwOSkKLSBKb2huIFAuIE1jQ2Fza2V5IHBvc3RlZCBhIGJ1ZyByZXBvcnQgdGhhdCBzaG93ZWQgaG93IGxpYmN1cmwgZGlkIHdyb25nIHdoZW4KICBzYXZpbmcgcmVjZWl2ZWQgY29va2llcyB3aXRoIG5vIGdpdmVuIHBhdGgsIGlmIHRoZSBwYXRoIGluIHRoZSByZXF1ZXN0IGhhZCBhCiAgcXVlcnkgcGFydC4gVGhhdCBpcyBtZWFucyBhIHF1ZXN0aW9uIG1hcmsgKD8pIGFuZCBjaGFyYWN0ZXJzIG9uIHRoZSByaWdodAogIHNpZGUgb2YgdGhhdC4gSSB3cm90ZSB0ZXN0IGNhc2UgMTEwNSBhbmQgZml4ZWQgdGhpcyBwcm9ibGVtLgoKS2FtaWwgRHVka2EgKDI2IFNlcCAyMDA5KQotIEltcGxlbWVudGVkIGEgcHJvdG9jb2wgaW5kZXBlbmRlbnQgd2F5IHRvIHNwZWNpZnkgYmxvY2tpbmcgZGlyZWN0aW9uLCB1c2VkIGJ5CiAgdHJhbnNmZXIuYyBmb3IgYmxvY2tpbmcuIEl0IGlzIGN1cnJlbnRseSB1c2VkIG9ubHkgYnkgU0NQIGFuZCBTRlRQIHByb3RvY29scy4KICBUaGlzIGVuaGFuY2VtZW50IHJlc29sdmVzIGFuIGlzc3VlIHdpdGggMTAwJSBDUFUgdXNhZ2UgZHVyaW5nIFNGVFAgdXBsb2FkLAogIHJlcG9ydGVkIGJ5IFZvdXJoZXkuCgpEYW5pZWwgU3RlbmJlcmcgKDI1IFNlcCAyMDA5KQotIENocmlzIE11bWZvcmQgZmlsZWQgYnVnIHJlcG9ydCAjMjg2MTU4NwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODYxNTg3KSBpZGVudGlmeWluZyB0aGF0IGxpYmN1cmwgdXNlZAogIHRoZSBPcGVuU1NMIGZ1bmN0aW9uIFg1MDlfbG9hZF9jcmxfZmlsZSgpIHdyb25nbHkgYW5kIGZhaWxlZCBpZiBpdCB3b3VsZAogIGxvYWQgYSBDUkwgZmlsZSB3aXRoIG1vcmUgdGhhbiBvbmUgY2VydGlmaWNhdGUgd2l0aGluLiBUaGlzIGlzIG5vdyBmaXhlZC4KICAKRGFuaWVsIFN0ZW5iZXJnICgxNiBTZXAgMjAwOSkKLSBTdmVuIEFuZGVycyByZXBvcnRlZCB0aGF0IHdlIGludHJvZHVjZWQgYSBjZXJ0IHZlcmZpY2F0aW9uIGZsYXcgZm9yIE9wZW5TU0wtCiAgcG93ZXJlZCBsaWJjdXJsIGluIDcuMTkuNi4gSWYgdGhlcmUgd2FzIGEgWDUwOXYzIFN1YmplY3QgQWx0ZXJuYXRpdmUgTmFtZQogIGZpZWxkIGluIHRoZSBjZXJ0ZmljYXRlIGl0IGhhZCB0byBtYXRjaCBhbmQgc28gZXZlbiBpZiBub24tRE5TIGFuZCBub24tSVAKICBlbnRyeSB3YXMgcHJlc2VudCBpdCBjYXVzZWQgdGhlIHZlcmlmaWNhdGlvbiB0byBmYWlsLgoKRGFuaWVsIEZhbmRyaWNoICgxNSBTZXAgMjAwOSkKLSBNb3ZlZCB0aGUgbGlic3NoMiBjaGVja3MgYWZ0ZXIgdGhlIFNTTCBsaWJyYXJ5IGNoZWNrcy4gVGhpcyBoZWxwcyB3aGVuCiAgc3RhdGljYWxseSBsaW5raW5nIHNpbmNlIGxpYnNzaDIgbmVlZHMgdGhlIFNTTCBsaWJyYXJ5IGxpbmsgZmxhZ3MgdG8gYmUKICBzZXQgdXAgYWxyZWFkeSB0byBzYXRpc2Z5IGl0cyBkZXBlbmRlbmNpZXMuIFRoaXMgd291bGRuJ3QgYmUgbmVjZXNzYXJ5IGlmCiAgdGhlIGxpYnNzaDIgY29uZmlndXJlIGNoZWNrIHdhcyBjaGFuZ2VkIHRvIHVzZSBwa2ctY29uZmlnIHNpbmNlIHRoZQogIC0tc3RhdGljIGZsYWcgd291bGQgYWRkIHRoZSBkZXBlbmRlbmNpZXMgYXV0b21hdGljYWxseS4KCllhbmcgVHNlICgxNCBTZXAgMjAwOSkKLSBSZXZlcnQgSm9zaHVhIEt3YW4ncyBwYXRjaCBjb21taXR0ZWQgMTEgU2VwIDIwMDkuCgogIFNvbWUgc3lzdGVtcyBwb2xsIGZ1bmN0aW9uIHNldHMgUE9MTEhVUCBpbiByZXZlbnRzIHdpdGhvdXQgc2V0dGluZwogIFBPTExJTiwgYW5kIHNldHMgUE9MTEVSUiB3aXRob3V0IHNldHRpbmcgUE9MTElOIGFuZCBQT0xMT1VULiBJbiBzb21lCiAgbGliY3VybCBjb2RlIGV4ZWN1dGlvbiBwYXRocyB0aGlzIGNvdWxkIHRyaWdnZXIgYnVzeSB3YWl0IGxvb3BzIHdpdGgKICBoaWdoIENQVSB1c2FnZSB1bnRpbCBhIHRpbWVvdXQgY29uZGl0aW9uIGFib3J0ZWQgdGhlIGxvb3AuCgogIFRoZSByZXZlcnRlZCBwYXRjaCBhZGRyZXNzZWQgdGhlIGFib3ZlIGlzc3VlIGZvciBhIHZlcnkgc3BlY2lmaWMgY2FzZSwKICB3aGVuIGF3YWl0aW5nIGMtYXJlcyB0byByZXNvbHZlLiBBIGxpYmN1cmwtd2lkZSBmaXggZm9yIEN1cmxfcG9sbCBub3cKICBzdXBlcmNlZWRzIHRoaXMgb25lLgoKR3VlbnRlciBLbmF1ZiAoMTEgU2VwIDIwMDkpCi0gSm9zaHVhIEt3YW4gcHJvdmlkZWQgYSBwYXRjaCB0byBwYXNzIFBPTExFUlIgLyBQT0xMSFVQIGJhY2sgdG8gYy1hcmVzLgogIFRoaXMgZml4ZXMgYSBsb29wIHByb2JsZW0gd2l0aCBoaWdoIENQVSB1c2FnZS4KCkRhbmllbCBTdGVuYmVyZyAoMTAgU2VwIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGZpeGVkIGEgcHJvYmxlbSB3aXRoIGNvb2tpZSBleHBpcnkgZGF0ZXMgYXQgZXhjdGx5IHRoZSBlcG9jaAogIHN0YXJ0IHNlY29uZCAiVGh1IEphbiAxIDAwOjAwOjAwIEdNVCAxOTcwIiBhcyB0aGUgZGF0ZSBwYXJzZXIgdGhlbiByZXR1cm5zIDAKICB3aGljaCBpbnRlcm5hbGx5IHRoZW4gaXMgdHJlYXRlZCBhcyBhIHNlc3Npb24gY29va2llLiBUaGF0IHBhcnRpY3VsYXIgZGF0ZQogIGlzIG5vdyBtYWRlIHRvIGdldCB0aGUgdmFsdWUgb2YgMS4KCkRhbmllbCBTdGVuYmVyZyAoMiBTZXAgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBmb3VuZCBhIGZsYXcgaW4gdGhlIGNvZGUgY29udmVydGluZyBzZnRwLWVycm9ycyB0byBsaWJjdXJsCiAgZXJyb3JzLgoKRGFuaWVsIFN0ZW5iZXJnICgxIFNlcCAyMDA5KQotIFBldGVyIFN5bHZlc3RlciBtYWRlIGEgZGVidWcgZmVhdHVyZSBmb3IgQ3VybF9yZXNvbHYoKSB0aGF0IG5vdyB3aWxsIGZvcmNlCiAgbGliY3VybCB0byByZXNvbHZlICdsb2NhbGhvc3QnIHdoYXRldmVyIG5hbWUgeW91IHVzZSBpbiB0aGUgVVJMICppZiogeW91IHNldAogIHRoZSAtLWludGVyZmFjZSBvcHRpb24gdG8gKGV4YWN0bHkpICJMb2NhbEhvc3QiLiBUaGlzIHdpbGwgZW5hYmxlIHVzIHRvCiAgd3JpdGUgdGVzdHMgZm9yIGN1c3RvbSBob3N0cyBuYW1lcyBidXQgc3RpbGwgdXNlIGEgbG9jYWwgaG9zdCBzZXJ2ZXIuCgotIGNvbmZpZ3VyZSBub3cgdHJpZXMgdG8gdXNlIHBrZy1jb25maWcgZm9yIGEgbnVtYmVyIG9mIHN1Yi1kZXBlbmRlbmNpZXMgZXZlbgogIHdoZW4gY3Jvc3MtY29tcGlsaW5nLiBUaGUga2V5IHRvIHN1Y2Nlc3MgaXMgdGhlbiB5b3UgcHJvcGVybHkgc2V0dXAKICBQS0dfQ09ORklHX1BBVEggYmVmb3JlIGludm9raW5nIGNvbmZpZ3VyZS4KCiAgSSBhbHNvIGltcHJvdmVkIGhvdyBOU1MgaXMgZGV0ZWN0ZWQgYnkgdHJ5aW5nIG5zcy1jb25maWcgaWYgcGtnLWNvbmZpZyBpc24ndAogIHByZXNlbnQsIGFuZCBhcyBhIGxhc3QgcmVzb3J0IGp1c3QgdXNlIHRoZSBsaWIgbmFtZSBhbmQgZm9yY2UgdGhlIHVzZXIgdG8KICBzZXR1cCB0aGUgTElCUy9MREZMQUdTL0NGTEFHUyBldGMgcHJvcGVybHkuIFRoZSBwcmV2aW91cyBsYXN0IHJlc29ydCB3b3VsZAogIGFkZCBhIHJhbmdlIG9mIHZhcmlvdXMgbGlicyB0aGF0IHdvdWxkIGFsbW9zdCBuZXZlciBiZSBxdWl0ZSBjb3JyZWN0LgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBBdWcgMjAwOSkKLSBXaGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2l0aCBGVFAgYW5kIHlvdSBhc2tlZCBmb3IgTk9CT0RZLCB5b3UgZGlkIG5vCiAgUVVPVEUgY29tbWFuZHMgYW5kIHRoZSByZXF1ZXN0IHVzZWQgdGhlIHNhbWUgcGF0aCBhcyB0aGUgY29ubmVjdGlvbiBoYWQKICBhbHJlYWR5IGNoYW5nZWQgdG8sIGl0IHdvdWxkIGRlY2lkZSB0aGF0IG5vIGNvbW1hbmRzIHdvdWxkIGJlIG5lY2Vzc2FyeSBmb3IKICB0aGUgIkRPIiBhY3Rpb24gYW5kIHRoYXQgd2FzIG5vdCBoYW5kbGVkIHByb3Blcmx5IGJ1dCBsaWJjdXJsIHdvdWxkIGluc3RlYWQKICBoYW5nLgoKS2FtaWwgRHVka2EgKDI4IEF1ZyAyMDA5KQotIEltcHJvdmVkIGVycm9yIG1lc3NhZ2UgZm9yIG5vdCBtYXRjaGluZyBjZXJ0aWZpY2F0ZSBzdWJqZWN0IG5hbWUgaW4KICBsaWJjdXJsLU5TUy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NiNjOQoKUGF0cmljayBNb25uZXJhdCAoMjQgQXVnIDIwMDkpCi0gSW50cm9kdWNlZCBhIFNZU1QtYmFzZWQgdGVzdCB0byBwcm9wZXJseSBzZXQtdXAgbmFtZSBmb3JtYXQgd2hlbiBkZWFsaW5nCiAgd2l0aCB0aGUgT1MvNDAwIEZUUCBzZXJ2ZXIuCgotIEZpeGVkIGFuIGZ0cF9yZWFkcmVzcCgpIGJ1ZyBwcmV2ZW50aW5nIGRldGVjdGlvbiBvZiBmYWlsaW5nIGNvbnRyb2wgc29ja2V0CiAgYW5kIGNhdXNpbmcgRlRQIGNsaWVudCB0byBsb29wIGZvcmV2ZXIuCgpEYW5pZWwgU3RlbmJlcmcgKDI0IEF1ZyAyMDA5KQotIE1hcmMgZGUgQnJ1aW4gcG9pbnRlZCBvdXQgdGhhdCBjb25maWd1cmUgLS13aXRoLWdudXRscz1QQVRIIGRpZG4ndCB3b3JrCiAgcHJvcGVybHkgYW5kIHByb3ZpZGVkIGEgZml4LiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODQzMDA4CgotIEVyaWMgV29uZyBpbnRyb2R1Y2VkIHN1cHBvcnQgZm9yIHRoZSBuZXcgb3B0aW9uIC1ULiAoZG90KSB0aGF0IG1ha2VzIGN1cmwKICByZWFkIHN0ZGluIGluIGEgbm9uLWJsb2NraW5nIGZhc2hpb24uIFRoaXMgYWxzbyBicmluZ3MgYmFjayAtVC0gKG1pbnVzKSB0bwogIHRoZSBwcmV2aW91cyBibG9ja2luZyBiZWhhdmlvciBzaW5jZSBpdCBjb3VsZCBicmVhayBzdHVmZiBmb3IgcGVvcGxlIGF0CiAgdGltZXMuCgpNaWNoYWwgTWFyZWsgKDIxIEF1ZyAyMDA5KQotIFdpdGggQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFLCBhdm9pZCBzZW5kaW5nIGludmFsaWQgVVJMcyBsaWtlCiAgZnRwOi8vZXhhbXBsZS5jb207dHlwZT1pIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBmdHA6Ly9leGFtcGxlLmNvbSB3aXRob3V0IHRoZQogIHNsYXNoLgoKRGFuaWVsIFN0ZW5iZXJnICgyMSBBdWcgMjAwOSkKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IHBvaW50ZWQgb3V0IGEgbWlzc2luZyByZXR1cm4gY29kZSBjaGVjayBmb3IgYQogIHN0cmR1cCgpIHRoYXQgY291bGQgbGVhZCB0byBzZWdmYXVsdCBpZiBpdCByZXR1cm5lZCBOVUxMLiBJIGV4dGVuZGVkIGhpcwogIHN1Z2dlc3QgcGF0Y2ggdG8gbm93IGhhdmUgQ3VybF9yZXRyeV9yZXF1ZXN0KCkgcmV0dXJuIGEgcmVndWxhciByZXR1cm4gY29kZQogIGFuZCBiZXR0ZXIgY2hlY2sgdGhhdC4KCi0gTG90cyBvZiBnb29kIHdvcmsgYnkgS3Jpc3RlciBKb2hhbnNlbiwgbW9zdGx5IHJlbGF0ZWQgdG8gcGlwZWxpbmluZzoKCiAgRml4IFNJR1NFR1Ygb24gZnJlZSdkIGVhc3lfY29ubiB3aGVuIHBpcGUgdW5leHBlY3RlZGx5IGJyZWFrcwogIEZpeCBkYXRhIGNvcnJ1cHRpb24gaXNzdWUgd2l0aCByZS1jb25uZWN0ZWQgdHJhbnNmZXJzCiAgRml4IHVzZSBhZnRlciBmcmVlIGlmIHdlJ3JlIGNvbXBsZXRlZCBidXQgZWFzeV9jb25uIG5vdCBOVUxMCgpLYW1pbCBEdWRrYSAoMTMgQXVnIDIwMDkpCi0gQ2hhbmdlZCBOU1MgY29kZSB0byBub3QgaWdub3JlIHRoZSB2YWx1ZSBvZiBzc2wudmVyaWZ5aG9zdCBhbmQgcHJvZHVjZSBtb3JlCiAgdmVyYm9zZSBlcnJvciBtZXNzYWdlcy4gT3JpZ2luYWxseSByZXBvcnRlZCBhdDoKICBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTUxNjA1NgoKRGFuaWVsIFN0ZW5iZXJnICgxMiBBdWcgMjAwOSkKLSBLYXJsIE1vZXJkZXIgZml4ZWQgdGhlIE1ha2VmaWxlLnZjKiBtYWtlZmlsZXMgdG8gaW5jbHVkZSB0aGUgbmV3IGZpbGUKICBub25ibG9jay5jIHNvIHRoYXQgdGhleSB3b3JrIGZpbmUgYWdhaW4KCi0gSSBleHBhbmRlZCB0ZXN0IDUxNyB3aXRoIGEgYnVuY2ggb2YgbW9yZSBkYXRlcyB0aGF0IG9yaWdpbmF0ZSBmcm9tIHRoZQogIENocm9tZSBicm93c2VyIHRlc3Qgc3VpdGUuIEl0IHR1cm5zIG91dCBtb3N0IG9mIHRoZW0gZ2V0IHBhcnNlZCB0aGUgc2FtZQogIHdheS4KClZlcnNpb24gNy4xOS42ICgxMiBBdWd1c3QgMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMTIgQXVnIDIwMDkpCi0gQ2Fyc3RlbiBMYW5nZSByZXBvcnRlZCBhIGJ1ZyBhbmQgcHJvdmlkZWQgYSBwYXRjaCBmb3IgVEZUUCB1cGxvYWQgYW5kIHRoZQogIHNlbmRpbmcgb2YgdGhlIFRTSVpFIG9wdGlvbi4gSSBkb24ndCBsaWtlIGZpeGluZyBidWdzIGp1c3QgaG91cnMgYmVmb3JlCiAgYSByZWxlYXNlLCBidXQgc2luY2UgaXQgd2FzIGJyb2tlbiBhbmQgdGhlIHBhdGNoIGZpeGVzIHRoaXMgZm9yIGhpbSBJIGRlY2lkZWQKICB0byBnZXQgaXQgaW4gYW55d2F5LgoKRGFuaWVsIFN0ZW5iZXJnICgxMSBBdWcgMjAwOSkKLSBQZXRlciBTeWx2ZXN0ZXIgbWFkZSB0aGUgSFRUUFMgdGVzdCBzZXJ2ZXIgdXNlIHNwZWNpZmljIGNlcnRpZmljYXRlcyBmb3IKICBlYWNoIHRlc3QsIHNvIHRoYXQgdGhlIHRlc3Qgc3VpdGUgY2FuIG5vdyBiZSB1c2VkIHRvIGFjdHVhbGx5IHRlc3QgdGhlCiAgdmVyaWZpY2F0aW9uIG9mIGNlcnQgbmFtZXMgZXRjLiBUaGlzIG1hZGUgYW4gZXJyb3Igc2hvdyB1cCBpbiB0aGUgT3BlblNTTC0KICBzcGVjaWZpYyBjb2RlIHdoZXJlIGl0IHdvdWxkIGF0dGVtcHQgdG8gbWF0Y2ggdGhlIENOIGZpZWxkIGV2ZW4gaWYgYQogIHN1YmplY3RBbHROYW1lIGV4aXN0cyB0aGF0IGRvZXNuJ3QgbWF0Y2guIFRoaXMgaXMgbm93IGZpeGVkIGFuZCB2ZXJpZmllZAogIGluIHRlc3QgMzExLgoKLSBCZW5idWNrIE5hc29uIHBvc3RlZCB0aGUgYnVnIHJlcG9ydCAjMjgzNTE5NgogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODM1MTk2KSwgZml4aW5nIGEgZmV3IGNvbXBpbGVyCiAgd2FybmluZ3Mgd2hlbiBtaXhpbmcgaW50cyBhbmQgYm9vbHMuCgpEYW5pZWwgRmFuZHJpY2ggKDEwIEF1ZyAyMDA5KQotIEZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIEZUUCBjb2RlIGFuZCBhbiBvZmYtYnktb25lIGhlYXAgYnVmZmVyIG92ZXJmbG93LgoKRGFuaWVsIEZhbmRyaWNoICg5IEF1ZyAyMDA5KQotIEZpeGVkIHNvbWUgbWVtb3J5IGxlYWtzIGluIHRoZSBjb21tYW5kLWxpbmUgdG9vbCB0aGF0IGNhdXNlZCBtb3N0IG9mIHRoZQogIHRvcnR1cmUgdGVzdHMgdG8gZmFpbC4KCkRhbmllbCBTdGVuYmVyZyAoMiBBdWcgMjAwOSkKLSBDdXJ0IEJvZ21pbmUgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggU05JIGVuYWJsZWQgb24gYSBwYXJ0aWN1bGFyIHNlcnZlci4gV2UKICBzaG91bGQgaW50cm9kdWNlIGFuIG9wdGlvbiB0byBkaXNhYmxlIFNOSSwgYnV0IGFzIHdlJ3JlIGluIGZlYXR1cmUgZnJlZXplCiAgbm93IEkndmUgYWRkcmVzc2VkIHRoZSBvYnZpb3VzIGJ1ZyBoZXJlIChwb2ludGVkIG91dCBieSBQZXRlciBTeWx2ZXN0ZXIpOiB3ZQogIHNob3VsZG4ndCB0cnkgdG8gZW5hYmxlIFNOSSB3aGVuIFNTTHYyIG9yIFNTTHYzIGlzIGV4cGxpY2l0bHkgc2VsZWN0ZWQuCiAgQ29kZSBmb3IgT3BlblNTTCBhbmQgR251VExTIHdhcyBmaXhlZC4gTlNTIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGEgcGFydGljdWxhcgogIG9wdGlvbiBmb3IgU05JLCBvciBhcmUgd2Ugc2ltcGx5IG5vdCB1c2luZyBpdD8KCkRhbmllbCBTdGVuYmVyZyAoMSBBdWcgMjAwOSkKLSBTY290dCBDYW50b3IgcG9zdGVkIHRoZSBidWcgcmVwb3J0ICMyODI5OTU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI4Mjk5NTUpIG1lbnRpb25pbmcgdGhlIHJlY2VudCBTU0wgY2VydAogIHZlcmlmaWNhdGlvbiBmbGF3IGZvdW5kIGFuZCBleHBsb2l0ZWQgYnkgTW94aWUgTWFybGluc3Bpa2UuIFRoZSBwcmVzZW50YXRpb24KICBoZSBkaWQgYXQgQmxhY2sgSGF0IGlzIGF2YWlsYWJsZSBoZXJlOgogIGh0dHBzOi8vd3d3LmJsYWNraGF0LmNvbS9odG1sL2JoLXVzYS0wOS9iaC11c2EtMDktYXJjaGl2ZXMuaHRtbCNNYXJsaW5zcGlrZQoKICBBcHBhcmVudGx5IGF0IGxlYXN0IG9uZSBDQSBhbGxvd2VkIGEgc3ViamVjdEFsdE5hbWUgb3IgQ04gdGhhdCBjb250YWluIGEKICB6ZXJvIGJ5dGUsIGFuZCB0aHVzIGNsaWVudHMgdGhhdCBhc3N1bWVkIHRoZXkgd291bGQgbmV2ZXIgaGF2ZSB6ZXJvIGJ5dGVzCiAgd2VyZSBleHBsb2l0ZWQgdG8gT0sgYSBjZXJ0aWZpY2F0ZSB0aGF0IGRpZG4ndCBhY3R1YWxseSBtYXRjaCB0aGUgc2l0ZS4gTGlrZQogIGlmIHRoZSBuYW1lIGluIHRoZSBjZXJ0IHdhcyAiZXhhbXBsZS5jb21cMHRoZWF0dWFsc2l0ZS5jb20iLCBsaWJjdXJsIHdvdWxkCiAgaGFwcGlseSB2ZXJpZnkgdGhhdCBjZXJ0IGZvciBleGFtcGxlLmNvbS4KCiAgbGliY3VybCBub3cgYmV0dGVyIHVzZXMgdGhlIGxlbmd0aCBvZiB0aGUgZXh0cmFjdGVkIG5hbWUsIG5vdCB1c2luZyB0aGUgemVybwogIHRlcm1pbmF0aW9uIGZvciBnZXR0aW5nIHRoZSBzdHJpbmcgbGVuZ3RoLgoKICBUaGlzIGZpeGluZyBvbmx5IG1hZGUgYW5kIG5lZWRlZCBpbiBPcGVuU1NMIGludGVyZmFjaW5nIGNvZGUuCgotIFRhbmd1eSBGYXV0cmUgcG9pbnRlZCBvdXQgdGhhdCBPcGVuU1NMJ3MgZnVuY3Rpb24gUkFORF9zY3JlZW4oKSAocHJlc2VudAogIG9ubHkgaW4gc29tZSBPcGVuU1NMIGluc3RhbGxzIC0gbGlrZSBvbiBXaW5kb3dzKSBpc24ndCB0aHJlYWQtc2FmZSBhbmQgd2UKICBhZ3JlZWQgdGhhdCBtb3ZpbmcgaXQgdG8gdGhlIGdsb2JhbF9pbml0KCkgZnVuY3Rpb24gaXMgYSBkZWNlbnQgd2F5IHRvIGRlYWwKICB3aXRoIHRoaXMgc2l0dWF0aW9uLgoKLSBBbGV4YW5kZXIgQmVlZGllIHByb3ZpZGVkIHRoZSBwYXRjaCBmb3IgYSBub3Byb3h5IHByb2JsZW06IElmIEkgaGF2ZSBzZXQKICBDVVJMT1BUX05PUFJPWFkgdG8gIioiLCBvciB0byBhIGhvc3QgdGhhdCBzaG91bGQgbm90IHVzZSBhIHByb3h5LCBJIGFjdHVhbGx5CiAgY291bGQgc3RpbGwgZW5kIHVwIHVzaW5nIGEgcHJveHkgaWYgYSBwcm94eSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgc2V0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBKdWwgMjAwOSkKLSBBbGwgdGhlIHF1b3RlIG9wdGlvbnMgKENVUkxPUFRfUVVPVEUsIENVUkxPUFRfUE9TVFFVT1RFIGFuZAogIENVUkxPUFRfUFJFUVVPVEUpIG5vdyBhY2NlcHQgYSBwcmVjZWVkaW5nIGFzdGVyaXNrIGJlZm9yZSB0aGUgY29tbWFuZCB0bwogIHNlbmQgd2hlbiB1c2luZyBGVFAsIGFzIGEgc2lnbiB0aGF0IGxpYmN1cmwgc2hhbGwgc2ltcGx5IGlnbm9yZSB0aGUgcmVzcG9uc2UKICBmcm9tIHRoZSBzZXJ2ZXIgaW5zdGVhZCBvZiB0cmVhdGluZyBpdCBhcyBhbiBlcnJvci4gTm90IHRyZWF0aW5nIGEgNDAwKyBGVFAKICByZXNwb25zZSBjb2RlIGFzIGFuIGVycm9yIG1lYW5zIHRoYXQgZmFpbGVkIGNvbW1hbmRzIHdpbGwgbm90IGFib3J0IHRoZQogIGNoYWluIG9mIGNvbW1hbmRzLCBub3Igd2lsbCB0aGV5IGNhdXNlIHRoZSBjb25uZWN0aW9uIHRvIGdldCBkaXNjb25uZWN0ZWQuCgpEYW5pZWwgU3RlbmJlcmcgKDI2IEp1bCAyMDA5KQotIEpvaGFuIHZhbiBTZWxzdCBwb3N0ZWQgYnVnIHJlcG9ydCAjMjgyNTk4OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODI1OTg5KSBwb2ludGluZyBvdXQgdGhhdAogIE9wZW5TU0wtcG93ZXJlZCBsaWJjdXJsIGRpZG4ndCBzdXBwb3J0IHRoZSBTSEEtMiBkaWdlc3QgYWxnb3JpdGhtLCBhbmQKICBwcm92aWRlZCB0aGUgc29sdXRpb24gdG9vOiB0byB1c2UgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSBpbiBhZGRpdGlvbgogIHRvIHRoZSBvbGRlciBTU0xlYXlfKiBhbHRlcm5hdGl2ZS4gT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMgd2FzIGFkZGVkIGluCiAgT3BlblNTTCAwLjkuNQoKRGFuaWVsIFN0ZW5iZXJnICgyMyBKdWwgMjAwOSkKLSBBZGRlZCBDVVJMT1BUX1NTSF9LTk9XTkhPU1RTLCBDVVJMT1BUX1NTSF9LRVlGVU5DVElPTiwgQ1VSTE9QVF9TU0hfS0VZREFUQS4KICBUaGV5IGludHJvZHVjZSBrbm93bl9ob3N0IHN1cHBvcnQgZm9yIFNTSCBrZXlzIHRvIGxpYmN1cmwuIFNlZSBkb2NzIGZvcgogIGRldGFpbHMuIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZGVwZW5kcyBvbiBhIG5ldyBlbm91Z2ggbGlic3NoMiB2ZXJzaW9uLCB0bwogIGJlIHN1cHBvcnRlZCBpbiBsaWJzc2gyIDEuMiBhbmQgbGF0ZXIgKG9yIGN1cnJlbnQgZ2l0IHJlcG8gYXQgdGhpcyB0aW1lKS4KCk1pY2hhbCBNYXJlayAoMjIgSnVsIDIwMDkpCi0gRGF2aWQgQmluZGVybWFuIGZvdW5kIGEgbWVtb3J5IGFuZCBmZCBsZWFrIGluIGxpYi9ndGxzLmM6bG9hZF9maWxlKCkKICAoaHR0cHM6Ly9idWd6aWxsYS5ub3ZlbGwuY29tLzUyMzkxOSkuIFdoZW4gbG9va2luZyBhdCB0aGUgY29kZSwgSSBmb3VuZCB0aGF0CiAgYWxzbyB0aGUgcHRyIHBvaW50ZXIgY2FuIGxlYWsuCgpLYW1pbCBEdWRrYSAoMjAgSnVsIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIGltcHJvdmVkIHRoZSBzdXBwb3J0IGZvciBjbGllbnQgY2VydGlmaWNhdGVzIGhhbmRsaW5nIGluCiAgTlNTLXBvd2VyZWQgbGliY3VybC4gTm93IHRoZSBjbGllbnQgY2VydGlmaWNhdGVzIGNhbiBiZSBzZWxlY3RlZAogIGF1dG9tYXRpY2FsbHkgYnkgYSBOU1MgYnVpbHQtaW4gaG9vay4gQWRkaXRpb25hbGx5IHByZS1sb2dpbiB0byBhbGwgUEtDUzExCiAgc2xvdHMgaXMgbm8gbW9yZSBwZXJmb3JtZWQuIEl0IHVzZWQgdG8gY2F1c2UgcHJvYmxlbXMgd2l0aCBIVyB0b2tlbnMuCgotIEZpeGVkIHJlZmVyZW5jZSBjb3VudGluZyBmb3IgTlNTIGNsaWVudCBjZXJ0aWZpY2F0ZXMuIE5vdyB0aGUgUEVNIHJlYWRlcgogIG1vZHVsZSBzaG91bGQgYmUgYWx3YXlzIHByb3Blcmx5IHVubG9hZGVkIG9uIEN1cmxfbnNzX2NsZWFudXAoKS4gSWYgdGhlCiAgdW5sb2FkIGZhaWxzIHRob3VnaCwgbGliY3VybCB3aWxsIHRyeSB0byByZXVzZSB0aGUgYWxyZWFkeSBsb2FkZWQgaW5zdGFuY2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE1IEp1bCAyMDA5KQotIEFkZGVkIG5vbmJsb2NrLmMgdG8gdGhlIG5vbi1hdXRvbWFrZSBtYWtlZmlsZXMgKG5vdGUgdGhhdCB0aGUgZGVwZW5kZW5jaWVzCiAgaW4gdGhlIFdhdGNvbSBtYWtlZmlsZXMgYXJlbid0IHF1aXRlIGNvcnJlY3QpLgoKTWljaGFsIE1hcmVrICgxNSBKdWwgMjAwOSkKLSBDaGFuZ2VkIHRoZSBkZXNjcmlwdGlvbiBvZiBDVVJMSU5GT19PU19FUlJOTyB0byBtYWtlIGl0IGNsZWFyIHRoYXQgdGhlCiAgZXJybm8gaXMgbm90IHJlc2V0IG9uIHN1Y2Nlc3MuCgpHdWVudGVyIEtuYXVmICgxNCBKdWwgMjAwOSkKLSByZW5hbWVkIGdlbmVyYXRlZCBjb25maWcuaCB0byBjdXJsX2NvbmZpZy5oIHRvIGF2b2lkIGFueSBmdXR1cmUgY2xhc2hlcwogIHdpdGggY29uZmlnLmggZnJvbSBvdGhlciBwcm9qZWN0cy4KICAKRGFuaWVsIFN0ZW5iZXJnICg5IEp1bCAyMDA5KQotIEVyaWMgV29uZyBpbnRyb2R1Y2VkIGN1cmx4X25vbmJsb2NrKCkgdGhhdCB0aGUgY3VybCB0b29sIG5vdyAocmUtKXVzZXMgZm9yCiAgc2V0dGluZyBhIGZpbGUgZGVzY3JpcHRvciBub24tYmxvY2tpbmcuIFVzZWQgYnkgdGhlIGZ1bmN0aW9uYWxpdHkgRXJpYwogIGhpbXNlbGYgYnJvdWdoIG9uIEp1bmUgMTV0aC4KCkRhbmllbCBTdGVuYmVyZyAoOCBKdWwgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBwb3N0ZWQgYnVnIHJlcG9ydCAjMjgxMzEyMwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yODEzMTIzKSBhbmQgYW4gYSBwYXRjaCB0aGF0IGZpeGVzIHRoZQogIHByb2JsZW06CgogIFVybCBBIGlzIGFjY2Vzc2VkIHVzaW5nIGF1dGguIFVybCBBIHJlZGlyZWN0cyB0byBVcmwgQiAob24gYSBkaWZmZXJlbnQKICBzZXJ2ZXIwLiBVcmwgQiByZXVzZXMgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIFVybCBCIGhhcyBhdXRoLCBldmVuIHRob3VnaAogIGl0J3Mgb24gYSBkaWZmZXJlbnQgc2VydmVyLgoKICBOb3RlOiBpZiBVcmwgQiBkb2VzIG5vdCByZXVzZSBhIHBlcnNpc3RlbnQgY29ubmVjdGlvbiwgYXV0aCBpcyBub3Qgc2VudC4KCiAgcmVhc29uOgoKICBkYXRhLT5zdGF0ZS5maXJzdF9ob3N0IGlzIG5vdCBpbml0aWFsaXplZCBiZWN1YXNlIEN1cmxfaHR0cF9jb25uZWN0IGlzIG5vdAogIGNhbGxlZCB3aGVuIGEgY29ubmVjdGlvbiBpcyByZXVzZWQuCgogIFNvbHV0aW9uOgoKICBtb3ZlIGluaXRpYWxpemF0aW9uIG9mIGRhdGEtPnN0YXRlLmZpcnN0X2hvc3QgdG8gQ3VybF9odHRwLiBObyBjb2RlIGJlZm9yZQogIEN1cmxfaHR0cCB1c2VzIGRhdGEtPnN0YXRlLmZpcnN0X2hvc3QgYW55d2F5LgoKR3VlbnRlciBLbmF1ZiAoNCBKdWwgMjAwOSkKLSBNYXJrdXMgS29ldHRlciBwcm92aWRlZCBhIHBhdGNoIHRvIGF2b2lkIGdldG5hbWVpbmZvKCkgdXNhZ2Ugd2hpY2ggYnJva2UgYQogIGNvdXBsZSBvZiBib3RoIElQdjQgYW5kIElQdjYgYXV0b2J1aWxkcy4KCkRhbmllbCBTdGVuYmVyZyAoMjkgSnVuIDIwMDkpCi0gTWFya3VzIEtvZXR0ZXIgbWFkZSBDVVJMT1BUX0ZUUFBPUlQgKGFuZCBjdXJsJ3MgLVAvLS1mdHBwb3J0KSBzdXBwb3J0IGEgcG9ydAogIHJhbmdlIGlmIGdpdmVuIGNvbG9uLXNlcGFyYXRlZCBhZnRlciB0aGUgaG9zdCBuYW1lL2FkZHJlc3MgcGFydC4gTGlrZQogICIxOTIuMTY4LjAuMToyMDAwLTEwMDAwIgoKLSBNb2RpZmllZCB0aGUgc2VwYXJhdG9ycyB1c2VkIGZvciBDVVJMT1BUX0NFUlRJTkZPIGluIG11bHRpLXBhcnQgb3V0cHV0cy4gSQogIGRvbid0IGtub3cgaG93IHRoZXkgZ290IHdyb25nIGluIHRoZSBmaXJzdCBwbGFjZSwgYnV0IHVzaW5nIHRoaXMgb3V0cHV0CiAgZm9ybWF0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHF1aXRlIGVhc2lseSBzZXBhcmF0ZSB0aGUgc3RyaW5nIGludG8gYW4gYXJyYXkKICBvZiBtdWx0aXBsZSBpdGVtcy4KCkRhbmllbCBGYW5kcmljaCAoMTYgSnVuZSAyMDA5KQotIEFkZGVkIGEgZmV3IG1vcmUgY29tcGlsZXIgd2FybmluZyBvcHRpb25zIGZvciBnY2MuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IEp1biAyMDA5KQotIFJldXZlbiBXYWNodGZvZ2VsIG1hZGUgY3VybCAtbyAtIHByb3Blcmx5IHByb2R1Y2UgYSBiaW5hcnkgb3V0cHV0IG9uIHdpbmRvd3MKICAobm8gbmV3bGluZSB0cmFuc2xhdGlvbnMpLiBVc2UgLUIvLS11c2UtYXNjaWkgaWYgeW91IHJhdGhlciBnZXQgdGhlIGFzY2lpCiAgYXBwcm9hY2guCgpNaWNoYWwgTWFyZWsgKDE2IEp1biAyMDA5KQotIFdoZW4gZG9pbmcgbm9uLWFub255bW91cyBmdHAgdmlhIGh0dHAgcHJveGllcyBhbmQgdGhlIHBhc3N3b3JkIGlzIG5vdAogIHByb3ZpZGVkIGluIHRoZSB1cmwsIGFkZCBpdCB0aGVyZSAoc3F1aWQgbmVlZHMgdGhpcykuCgpEYW5pZWwgU3RlbmJlcmcgKDE1IEp1biAyMDA5KQotIEVyaWMgV29uZydzIHBhdGNoOgoKICBUaGlzIGFsbG93cyBjdXJsKDEpIHRvIGJlIHVzZWQgYXMgYSBjbGllbnQtc2lkZSB0dW5uZWwgZm9yIGFyYml0cmFyeSBzdHJlYW0KICBwcm90b2NvbHMgYnkgYWJ1c2luZyBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nIGluIGJvdGggdGhlIEhUVFAgcmVxdWVzdCBhbmQKICBIVFRQIHJlc3BvbnNlLiAgVGhpcyByZXF1aXJlcyBzZXJ2ZXIgc3VwcG9ydCBmb3Igc2VuZGluZyBhIHJlc3BvbnNlIHdoaWxlIGEKICByZXF1ZXN0IGlzIHN0aWxsIGJlaW5nIHJlYWQsIG9mIGNvdXJzZS4KCiAgSWYgYXR0ZW1wdGluZyB0byByZWFkIGZyb20gc3RkaW4gcmV0dXJucyBFQUdBSU4sIHRoZW4gd2UgcGF1c2Ugb3VyIHNlbmRlci4KICBUaGlzIGxlYXZlcyBjdXJsIHRvIGF0dGVtcHQgdG8gcmVhZCBmcm9tIHRoZSBzb2NrZXQgd2hpbGUgcmVhZGluZyBmcm9tIHN0ZGluCiAgKGFuZCB0aHVzIHNlbmRpbmcpIGlzIHBhdXNlZC4KCiAgVGhpcyBjaGFuZ2Ugd2FzIG5lZWRlZCB0byBhbGxvdyBzdWNjZXNzZnVsbHkgdHVubmVsaW5nIHRoZSBnaXQgcHJvdG9jb2wgb3ZlcgogIEhUVFAgKC0tbm8tYnVmZmVyIGlzIG5lZWRlZCwgYXMgd2VsbCkuCgpQYXRyaWNrIE1vbm5lcmF0ICgxNSBKdW4gMjAwOSkKLSBSZXBsYWNlZCB1c2Ugb2Ygc3RhbmRhcmQgQyBsaWJyYXJ5IHJhbmQoKS9zcmFuZCgpIGJ5IG91ciBvd24gcHNldWRvLXJhbmRvbQogIG51bWJlciBnZW5lcmF0b3IuCgpZYW5nIFRzZSAoMTEgSnVuIDIwMDkpCi0gSSBhZGFwdGVkIHRlc3RjdXJsIHNjcmlwdCB0byBhbGxvdyBidWlsZGluZyB0ZXN0IGhhcm5lc3MgcHJvZ3JhbXMgd2hlbgogIGNyb3NzLWNvbXBpbGluZyBmb3IgYSAqLSotbWluZ3cqIGhvc3QuCgpEYW5pZWwgU3RlbmJlcmcgKDEwIEp1biAyMDA5KQotIEZhYmlhbiBLZWlsIHJhbiBjbGFuZyBvbiB0aGUgKGxpYiljdXJsIGNvZGUsIGZvdW5kIGEgYnVuY2ggb2Ygd2FybmluZ3MgYW5kCiAgY29udHJpYnV0ZWQgYSByYW5nZSBvZiBwYXRjaGVzIHRvIGZpeCB0aGVtLgoKWWFuZyBUc2UgKDEwIEp1biAyMDA5KQotIEkgaW50cm9kdWNlZCBjb25maWd1cmUgc2NyaXB0IG9wdGlvbiAtLWVuYWJsZS1jdXJsZGVidWcgd2hpY2ggbm93IGFsbG93cwogIHRoZSBkZWNvdXBsZWQgZW5hYmxpbmcgb3IgZGlzYWJsaW5nIG9mIHRoZSBjdXJsIGRlYnVnIG1lbW9yeSB0cmFja2luZwogIGZlYXR1cmUgZnJvbSB0aGUgLS1lbmFibGUtZGVidWcgb3B0aW9uIHdoaWNoIG5vIGxvbmdlciBjb250cm9scyB0aGlzLgoKICBjdXJsIC0tdmVyc2lvbiB3aWxsIGxpc3QgJ0RlYnVnJyBmZWF0dXJlIGZvciBkZWJ1ZyBlbmFibGVkIGJ1aWxkcywgYW5kCiAgd2lsbCBsaXN0ICdUcmFja01lbW9yeScgZmVhdHVyZSBmb3IgY3VybCBkZWJ1ZyBtZW1vcnkgdHJhY2tpbmcgY2FwYWJsZQogIGJ1aWxkcy4gVGhlc2UgZmVhdHVyZXMgYXJlIGluZGVwZW5kZW50IGFuZCBjYW4gYmUgY29udHJvbGxlZCB3aGVuIHJ1bm5pbmcKICB0aGUgY29uZmlndXJlIHNjcmlwdC4gV2hlbiAtLWVuYWJsZS1kZWJ1ZyBpcyBnaXZlbiBib3RoIGZlYXR1cmVzIHdpbGwgYmUKICBlbmFibGVkLCB1bmxlc3Mgc29tZSByZXN0cmljdGlvbiBwcmV2ZW50cyBtZW1vcnkgdHJhY2tpbmcgZnJvbSBiZWluZyB1c2VkLgoKICBJbnRlcm5hbGx5LCBkZWZpbml0aW9uIG9mIHByZXByb2Nlc3NvciBzeW1ib2wgREVCVUdCVUlMRCByZXN0cmljdHMgY29kZQogIHdoaWNoIGlzIG9ubHkgY29tcGlsZWQgZm9yIGRlYnVnIGVuYWJsZWQgYnVpbGRzLiBBbmQgc3ltYm9sIENVUkxERUJVRyBpcwogIHVzZWQgdG8gZGlmZmVyZW50aWF0ZSBjb2RlIHdoaWNoIGlzIF9vbmx5XyB1c2VkIGZvciBtZW1vcnkgdHJhY2tpbmcuCgpZYW5nIFRzZSAoOSBKdW4gMjAwOSkKLSBEYW5pZWwgU3RlaW5iZXJnIHBvaW50ZWQgb3V0IHRoYXQgQ3VybF9Gb3JtSW5pdCgpIGluIGZvcm1kYXRhLmMgd2FzIG5vdAogIGluaXRpYWxpemluZyB0aGUgZnJlYWQgY2FsbGJhY2sgcG9pbnRlciBhbmQgdGhpcyB0cmlnZ2VyZWQgYSBjb21waWxlcgogIHdhcm5pbmcsIGFsc28gcHJvdmlkZWQgYSBmcmllbmRseSBzdWdnZXN0aW9uIG9uIGhvdyB0byBmaXggaXQuCgpEYW5pZWwgU3RlbmJlcmcgKDggSnVuIDIwMDkpCi0gQ2xhZXMgSmFrb2Jzc29uIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIGxpYmN1cmwtTlNTIHRoYXQgZml4ZWQgYSBiYWQgcmVmY291bnQKICBpc3N1ZSB3aXRoIGNsaWVudCBjZXJ0cyB0aGF0IGNhdXNlZCBpc3N1ZXMgbGlrZSBzZWdmYXVsdHMuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA5LTA1LzAzMTYuaHRtbAoKLSBUcmlnZ2VyZWQgYnkgYnVnIHJlcG9ydCAjMjc5ODg1MiBhbmQgdGhlIHBhdGNoIGluIHRoZXJlLCBJIGZpeGVkIGNvbmZpZ3VyZQogIHRvIGRldGVjdCBnbnV0bHMgYnVpbGQgb3B0aW9ucyB3aXRoIHBrZy1jb25maWcgb25seSBhbmQgbm90IGxpYmdudXRscy1jb25maWcKICBhbnltb3JlIHNpbmNlIEdudVRMUyBoYXMgc3RvcHBlZCBkaXN0cmlidXRpbmcgdGhhdCB0b29sLiBJZiBhbiBleHBsaWNpdCBwYXRoCiAgaXMgZ2l2ZW4gdG8gY29uZmlndXJlLCB3ZSB3aWxsIGluc3RlYWQgZ3Vlc3Mgb24gaG93IHRvIGxpbmsgYW5kIHVzZSB0aGF0CiAgbGliLiBJIGRpZCBub3QgdXNlIHRoZSBwYXRjaCBmcm9tIHRoZSBidWcgcmVwb3J0LgoKWWFuZyBUc2UgKDggSnVuIDIwMDkpCi0gSWdvciBOb3Zvc2VsdHNldiBhZGp1c3RlZCBNYWtlZmlsZS52eHdvcmtzIHRvIGdldCBzb3VyY2VzIGFuZCBoZWFkZXJzCiAgaW5jbHVkZWQgZnJvbSBNYWtlZmlsZS5pbmMsIGFuZCBwcm92aWRlZCBkb2NzXElOU1RBTEwgVnhXb3JrcyBzZWN0aW9uLgoKLSBJIHJlbW92ZWQgYnVpbGRjb25mLmJhdCBmcm9tIHJlbGVhc2UgYW5kIGRhaWx5IHNuYXBzaG90IGFyY2hpdmVzLiBUaGlzCiAgZmlsZSBpcyBvbmx5IGZvciBDVlMgdHJlZSBjaGVja291dCBidWlsZHMuCgpEYW5pZWwgU3RlbmJlcmcgKDggSnVuIDIwMDkpCi0gRXJpYyBXb25nIGZpeGVkIC0tbm8tYnVmZmVyIHRvIGFjdHVhbGx5IHN3aXRjaCBvZmYgb3V0cHV0IGJ1ZmZlcmluZy4gQmVlbgogIGJyb2tlbiBzaW5jZSA3LjE5LjAKCkJpbGwgSG9mZm1hbiAoNiBKdW4gMjAwOSkKLSBBZGRlZCBzb21lIGNtYWtlIGRvY3MgYW5kIGZpeGVkIHNvY2tsZW5fdCBpbiB0aGUgYnVpbGQuCgpZYW5nIFRzZSAoNSBKdW4gMjAwOSkKLSBKb2huIEUuIE1hbG1iZXJnIHByb3ZpZGVkIFZNUyBzcGVjaWZpYyBwYXRjaDogIlRoaXMgZml4ZXMgYW4gZXhpc3RpbmcgYnVnCiAgaW4gdXJsZ2xvYi5jIHdoZXJlIGl0IHdhcyBub3QgY29udmVydGluZyB0aGUgQ3VybCBVbml4IGV4aXQgY29kZSB0byBhIFZNUwogIERDTCBjb21wYXRpYmxlIGV4aXQgY29kZS4gIFRoaXMgZml4IHJlcXVpcmVkIHRoZSBlbmhhbmNlbWVudCBkZXNjcmliZWQgbmV4dC4KICBUaGlzIGFsc28gYWRkcyBhbiBlbmhhbmNlbWVudCB0byBtYWluLmMgc28gdGhhdCB3aGVuIGN1cmwgaXMgcnVuIHVuZGVyIGEKICBVbml4IHNoZWxsIGxpa2UgQmFzaCBvbiBWTVMsIGl0IHdpbGwgcmV0dXJuIHRoZSBzdGFuZGFyZCBVbml4IGV4aXQgY29kZXMKICBhbmQgbWVzc2FnZXMuIiBBbmQgYW5vdGhlciBwYXRjaCBmb3IgZG9jcy9leGFtcGxlcy4KCiAgSSBpbnRyb2R1Y2VkIG9zLXNwZWNpZmljLmMgYW5kIG9zLXNwZWNpZmljLmggZm9yIHVzZSBpbiBjdXJsIHRvb2wgY29kZQogIGFuZCBhZGp1c3RlZCBKb2huIEUuIE1hbG1iZXJnJ3MgcGF0Y2ggcGxhY2VtZW50IHRvIHVzZSB0aGVzZSBuZXcgZmlsZXMKICBhcyBhbiBlZmZvcnQgdG8gcHJldmVudCBtYWluLmMgZnJvbSBncm93aW5nIGFkIGluZmluaXR1bS4gQ29kZSBhbHJlYWR5CiAgZXhpc3RpbmcgaW4gbWFpbi5jIHdoaWNoIGlzIE9TIHNwZWNpZmljIHNob3VsZCBiZSBtb3ZlZCBpbnRvIHRoZXNlIGZpbGVzLgoKRGFuaWVsIFN0ZW5iZXJnICg0IEp1bmUgMjAwOSkKLSBTZXR0aW5nIHRoZSBDb250ZW50LUxlbmd0aDogaGVhZGVyIGZyb20geW91ciBhcHAgd2hlbiB5b3UgZG8gYSBQT1NUIG9yIFBVVAogIGlzIGFsbW9zdCBhbHdheXMgYSBWRVJZIEJBRCBJREVBLiBZZXQgdGhlcmUgYXJlIHN0aWxsIGFwcHMgb3V0IHRoZXJlIGRvaW5nCiAgdGhpcywgYW5kIG5vdyByZWNlbnRseSBpdCB0cmlnZ2VyZWQgYSBidWcvc2lkZS1lZmZlY3QgaW4gbGliY3VybCBhcyB3aGVuCiAgbGliY3VybCBzZW5kcyBhIFBPU1Qgb3IgUFVUIHdpdGggTlRMTSwgaXQgc2VuZHMgYW4gZW1wdHkgcG9zdCBmaXJzdCB3aGVuIGl0CiAga25vd3MgaXQgd2lsbCBqdXN0IGdldCBhIDQwMS80MDcgYmFjay4gSWYgdGhlIGFwcCB0aGVuIHJlcGxhY2VkIHRoZQogIENvbnRlbnQtTGVuZ3RoIGhlYWRlciwgaXQgY2F1c2VkIHRoZSBzZXJ2ZXIgdG8gd2FpdCBmb3IgaW5wdXQgdGhhdCBsaWJjdXJsCiAgd291bGRuJ3Qgc2VuZC4gQWFyb24gT25lYWwgcmVwb3J0ZWQgdGhpcyBwcm9ibGVtIGluIGJ1ZyByZXBvcnQgIzI3OTkwMDgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc5OTAwOCkgYW5kIGhlbHBlZCB1cyB2ZXJpZnkgdGhlIGZpeC4KCllhbmcgVHNlICg0IEp1biAyMDA5KQotIElnb3IgTm92b3NlbHRzZXYgcHJvdmlkZWQgcGF0Y2hlcyBhbmQgaW5mb3JtYXRpb24sIHRoYXQgYWZ0ZXIgc29tZQogIGFkanVzdG1lbnRzIHRvIGJldHRlciBmaXQgY3VybCdzIHdheSBvZiBkb2luZyB0aGluZ3MsIGhhdmUgcmVzdWx0ZWQKICBpbiB0aGUgcG9zaWJpbGl0eSBvZiBidWlsZGluZyBsaWJjdXJsIGZvciBWeFdvcmtzLgoKRGFuaWVsIEZhbmRyaWNoICgyIEp1bmUgMjAwOSkKLSBDaGVja2VkIGluIGEgR29vZ2xlIEFuZHJvaWQgbWFrZSBmaWxlLiBUbyB1c2UgaXQsIHlvdSBtdXN0IGZpcnN0CiAgY3JlYXRlIGEgY29uZmlnLmggZmlsZSBieSBydW5uaW5nIGNvbmZpZ3VyZSBpbiB0aGUgQW5kcm9pZCBlbnZpcm9ubWVudCwKICB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgZWFzeSB0byBkby4gSWYgbm8gZWFzeSB3YXkgY2FuIGJlIGZvdW5kLCBhCiAgc3RhdGljIGNvbmZpZy1hbmRyb2lkLmggbWF5IG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgY2hlY2tlZCBpbiB0byB0aGUKICBsaWJjdXJsIHNvdXJjZSB0cmVlLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEp1bmUgMjAwOSkKLSBDbGFlcyBKYWtvYnNzb24gZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYmV0dGVyIGZpbmQgYW5kIHVzZSBOU1MKICB3aXRob3V0IHBrZy1jb25maWcuCgpZYW5nIFRzZSAoMSBKdW4gMjAwOSkKLSBKb2huIEUuIE1hbG1iZXJnIHByb3ZpZGVkIGEgVk1TIHNwZWNpZmljIGNsZWFuLXVwIGZvciBjdXJsLmgsIGFuZCBwb2ludGVkCiAgb3V0IHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzIGZhaWxpbmcgdG8gZGV0ZWN0IHRoZSB0aW1ldmFsIHN0cnVjdCBvbgogIFZNUyB3aGVuIGJ1aWxkaW5nIHdpdGggX1hPUEVOX1NPVVJDRV9FWFRFTkRFRCB1bmRlZmluZWQgZHVlIHRvIGRlZmluaXRpb24KICB0YWtpbmcgcGxhY2UgaW4gc29ja2V0LmggaW5zdGVhZCBvZiB0aW1lLmguICBJIGhhdmUgYWRqdXN0ZWQgY29uZmlndXJlCiAgc2NyaXB0IHRvIGFsc28gaW5jbHVkZSB0aGlzIGhlYWRlciB3aGVuIGNoZWNraW5nIHN0cnVjdCB0aW1ldmFsLgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBNYXkgMjAwOSkKLSBGcmFuayBNY0dlb3VnaCBwcm92aWRlZCBhIHNtYWxsIE9wZW5TU0wgI2luY2x1ZGUgZml4IHRvIG1ha2UgbGliY3VybCBjb21waWxlCiAgZmluZSB3aXRoIE5va2lhIDV0aCBlZGl0aW9uIDEuMCBTREsgZm9yIFN5bWJpYW4uCgotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYSBjYWxsIHRvIGEgT3BlblNTTCBmdW5jdGlvbiB0aGF0IGRpZG4ndCBjaGVjawogIGZvciBhIGZhaWx1cmUgcHJvcGVybHkuCgotIE1pa2UgQ3Jvd2UgcG9pbnRlZCBvdXQgdGhhdCBzZXR0aW5nIENVUkxPUFRfVVNFUlBXRCB0byBOVUxMIHVzZWQgdG8gY2xlYXIKICB0aGUgYXV0aCBjcmVkZW50aWFscyBiYWNrIGluIDcuMTkuMCBhbmQgZWFybGllciB3aGlsZSBub3cgeW91IGhhdmUgdG8gc2V0ICIiCiAgdG8gZ2V0IHRoZSBzYW1lIGVmZmVjdC4gSGlzIHBhdGNoIGJyaW5ncyBiYWNrIHRoZSBhYmlsaXR5IHRvIHVzZSBOVUxMLgoKLSBDbGFlcyBKYWtvYnNzb24gZml4ZWQgbGliY3VybC1OU1MgdG8gYnVpbGQgZmluZSBldmVuIHdpdGhvdXQgdGhlCiAgUEsxMV9DcmVhdGVHZW5lcmljT2JqZWN0KCkgZnVuY3Rpb24uCgpEYW5pZWwgU3RlbmJlcmcgKDI1IE1heSAyMDA5KQotIGJ1ZyByZXBvcnQgIzI3OTYzNTggKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3OTYzNTgpIHBvaW50ZWQKICBvdXQgdGhhdCB0aGUgY29va2llIHBhcnNlciB3b3VsZCBsZWFrIG1lbW9yeSB3aGVuIGl0IHBhcnNlcyBjb29raWVzIHRoYXQgYXJlCiAgcmVjZWl2ZWQgd2l0aCBkb21haW4sIHBhdGggZXRjIHNldCBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgc2FtZSBoZWFkZXIuIFdoaWxlCiAgc3VjaCBhIGNvb2tpZSBpcyBxdWVzdGlvbmFibGUsIHRoZXkgb2NjdXIgaW4gdGhlIHdpbGQgYW5kIGxpYmN1cmwgbm8gbG9uZ2VyCiAgbGVha3MgbWVtb3J5IGZvciB0aGVtLiBJIGFkZGVkIHN1Y2ggYSBoZWFkZXIgdG8gdGVzdCBjYXNlIDguCgpEYW5pZWwgRmFuZHJpY2ggKDIyIE1heSAyMDA5KQotIFJlbW92ZWQgc29tZSBvYnNvbGV0ZSBkaWdlc3QgY29kZSB0aGF0IGNhdXNlZCBhIHZhbGdyaW5kIGVycm9yIGluIHRlc3QgNTUxLgoKRGFuaWVsIEZhbmRyaWNoICgyMCBNYXkgMjAwOSkKLSBBZGRlZCAibm9uLWV4aXN0aW5nIGhvc3QiIHRlc3Qga2V5d29yZHMgdG8gbWFrZSBpdCBlYXN5IHRvIHNraXAgdGhvc2UKICB0ZXN0cyBvbiBtYWNoaW5lcyB0aGF0IGhhdmUgYnJva2VuIEROUyBjb25maWd1cmF0aW9ucyAoc3VjaCBhcwogIHRob3NlIGNvbmZpZ3VyZWQgdG8gdXNlIE9wZW5ETlMpLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBNYXkgMjAwOSkKLSBLYW1pbCBEdWRrYSBicm91Z2h0IHRoZSBwYXRjaCBmcm9tIHRoZSBSZWRoYXQgYnVnIGVudHJ5CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00Mjc5NjYgd2hpY2ggd2FzIGxpYmN1cmwgY2xvc2luZwogIGEgYmFkIGZpbGUgZGVzY3JpcHRvciB3aGVuIGNsb3NpbmcgZG93biB0aGUgRlRQIGRhdGEgY29ubmVjdGlvbi4gIENhb2xhbgogIE1jTmFtYXJhIHNlZW1zIHRvIGJlIHRoZSBvcmlnaW5hbCBhdXRob3Igb2YgaXQuCgpWZXJzaW9uIDcuMTkuNSAoMTggTWF5IDIwMDkpCgpEYW5pZWwgU3RlbmJlcmcgKDE3IE1heSAyMDA5KQotIEphbWVzIEJ1cnNhIHBvc3RlZCBhIHBhdGNoIHRvIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBmaXhlZCBhIHByb2JsZW0gd2l0aAogIG5vX3Byb3h5IHdoaWNoIG1hZGUgaXQgbm90IHNraXAgdGhlIHByb3h5IGlmIHRoZSBVUkwgZW50ZXJlZCBjb250YWluZWQgYQogIHVzZXIgbmFtZS4gSSBhZGRlZCB0ZXN0IGNhc2UgMTEwMSB0byB2ZXJpZnkuCgpEYW5pZWwgU3RlbmJlcmcgKDExIE1heSAyMDA5KQotIEJhbGludCBTemlsYWtzemkgcmVwb3J0ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGxpYmN1cmwgZGlkIGd6aXAgZGVjb21wcmVzc2lvbgogIG9mIHN0cmVhbXMgdGhhdCBoYWQgc29tZSBwYXJ0cyAobGVnaXRpbWF0ZWx5KSBtaXNzaW5nLiBXZSBub3cgcHJvdmlkZSBhbmQgdXNlCiAgYSBwcm9wZXIgY2xlYW51cCBmdW5jdGlvbiBmb3IgdGhlIGNvbnRlbnQgZW5jb2Rpbmcgc3VibW9kdWxlLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwOS0wNS8wMDkyLmh0bWwKCi0gS2FtaWwgRHVka2EgcHJvdmlkZWQgYSBmaXggZm9yIGxpYmN1cmwtTlNTIHJlcG9ydGVkIGJ5IE1pY2hhZWwgQ3JvbmVud29ydGgKICBhdCBodHRwczovL2J1Z3ppbGxhLnJlZGhhdC5jb20vc2hvd19idWcuY2dpP2lkPTQ1MzYxMiNjMTIKCiAgSWYgYW4gaW5jb3JyZWN0IHBhc3N3b3JkIGlzIGdpdmVuIHdoaWxlIGxvYWRpbmcgYSBwcml2YXRlIGtleSwgbGliY3VybCBlbmRzCiAgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCBjb25zdW1pbmcgbWVtb3J5LiBUaGUgYnVnIGlzIGNyaXRpY2FsLgoKLSBJIGZpeGVkIHRoZSBwcm9ibGVtIHdpdGggZG9pbmcgTlRMTSwgUE9TVCBhbmQgdGhlbiBmb2xsb3dpbmcgYSAzMDIgcmVkaXJlY3QsCiAgYXMgcmVwb3J0ZWQgYnkgRWJlbmV6ZXIgSWtvbm5lIChvbiBjdXJsLXVzZXJzKSBhbmQgTGF1cmVudCBSYWJyZXQgKG9uCiAgY3VybC1saWJyYXJ5KS4gVGhlIHRyYW5zZmVyIHdhcyBtaXN0YWtlbmx5IG1hcmtlZCB0byBnZXQgbW9yZSBkYXRhIHRvIHNlbmQKICBidXQgc2luY2UgaXQgZGlkbid0IGFjdHVhbGx5IGhhdmUgdGhhdCwgaXQganVzdCBodW5nIHRoZXJlLi4uCgpEYW5pZWwgU3RlbmJlcmcgKDEwIE1heSAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgY29ycmVjdGx5IHBvaW50ZWQgb3V0IGFuIG92ZXItYWxsb2Mgd2l0aCBvbmUgd2FzdGVkCiAgYnl0ZSBpbiB0aGUgZGlnZXN0IGNvZGUuCgpZYW5nIFRzZSAoOSBNYXkgMjAwOSkKLSBSZW1vdmVkIERPUyBhbmQgVFBGIHBhY2thZ2UncyBzdWJkaXJlY3RvcnkgTWFrZWZpbGUuYW0sIGl0IHdhcyBvbmx5IHVzZWQKICB0byBpbmNsdWRlIHNvbWUgZmlsZXMgaW4gdGhlIGRpc3RyaWJ1dGlvbiB0YXJiYWxsIHNlcnZpbmcgbm8gb3RoZXIgcHVycG9zZS4KICBGaWxlcyBmcm9tIHRoZSBET1MgYW5kIFRQRiBzdWJkaXJlY3RvcmllcyBhcmUgbm93IGluY2x1ZGVkIGluIHRoZSBFWFRSQV9ESVNUCiAgb2YgdGhlIE1ha2VmaWxlIGluIHRoZSBwYXJlbnQgc3ViZGlyZWN0b3J5LgoKWWFuZyBUc2UgKDggTWF5IDIwMDkpCi0gQ2hhbmdlZCBob3N0IG5hbWUgbGl0ZXJhbCBpbiBzZXZlcmFsIHRlc3RzIHRvIG9uZSB1bmRlciB0aGUgaGF4eC5zZSBkb21haW4uCgotIFJlbmFtZWQgdmM2IHdvcmtzcGFjZSBhbmQgcHJvamVjdCBmaWxlcyB0byBhdm9pZCBmaWxlbmFtZSBjbGFzaCB3aGVuIHVzZWQKICBmb3IgY29udmVyc2lvbiB0byBsYXRlciBWUyB2ZXJzaW9ucy4KCkRhbmllbCBTdGVuYmVyZyAoOCBNYXkgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaXhlZCBidWcgcmVwb3J0ICMyNzg0MDU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3ODQwNTUpIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB0bwogIGNvbm5lY3QgdG8gU09DS1MgcHJveGllcyB3aGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UuIEl0IHR1cm5lZCBvdXQgdG8KICBhbG1vc3Qgbm90IHdvcmsgYXQgYWxsIHByZXZpb3VzbHkuIFdlIG5lZWQgdG8gd2FpdCBmb3IgdGhlIFRDUCBjb25uZWN0IHRvCiAgYmUgcHJvcGVybHkgdmVyaWZpZWQgYmVmb3JlIGRvaW5nIHRoZSBTT0NLUyBtYWdpYy4KCiAgVGhlcmUncyBzdGlsbCBhIGZsYXcgaW4gdGhlIEZUUCBjb2RlIGZvciB0aGlzLgoKRGFuaWVsIFN0ZW5iZXJnICg3IE1heSAyMDA5KQotIE1hZGUgdGhlIFNPX1NOREJVRiBzZXR0aW5nIGZvciB0aGUgZGF0YSBjb25uZWN0aW9uIHNvY2tldCBmb3IgZnRwIHVwbG9hZHMgYXMKICB3ZWxsLiBTZWUgY2hhbmdlIDI4IEFwciAyMDA5LgoKWWFuZyBUc2UgKDcgTWF5IDIwMDkpCi0gRml4ZWQgYW4gaXNzdWUgYWZmZWN0aW5nIEZUUCB0cmFuc2ZlcnMsIGludHJvZHVjZWQgd2l0aCB0aGUgdHJhbnNmZXIuYwogIHBhdGNoIGNvbW1pdHRlZCBNYXkgNC4KCkRhbmllbCBTdGVuYmVyZyAoNyBNYXkgMjAwOSkKLSBNYW4gcGFnZSAqcm9mZiBwcm9ibGVtcyBmaXhlZCB0aGFua3MgdG8gaW5wdXQgZnJvbSBDb2xpbiBXYXRzb24uIFByb2JsZW1zCiAgcmVwb3J0ZWQgaW4gdGhlIERlYmlhbiBwYWNrYWdlLgoKLSBWaWpheSBHIGZpbGVkIGJ1ZyByZXBvcnQgIzI3MjMyMzYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjcyMzIzNikgaWRlbnRpZnlpbmcgYSBwcm9ibGVtIHdpdGgKICBsaWJjdXJsJ3MgVEZUUCBjb2RlIGFuZCBpdHMgbGFjayBvZiBkZWFsaW5nIHdpdGggdGhlIE9BQ0sgcGFja2V0LgoKWWFuZyBUc2UgKDUgTWF5IDIwMDkpCi0gRml4ZWQgdGhlIC0tZnRwLXBvcnQgYWRkcmVzcyBvZiB0ZXN0ICMyNTEgdG8gdGhlIENMSUVOVElQIGFkZHJlc3MsIGFuZAogIHJldmVydGVkIHRoZSBjaGFuZ2UgYWZmZWN0aW5nIHRlc3Qgc3VpdGUgaGFybmVzcyBjb21taXR0ZWQgNCBNYXkuCgpEYW5pZWwgU3RlbmJlcmcgKDUgTWF5IDIwMDkpCi0gSW5zcGlyZWQgYnkgTWljaGFlbCBTbWl0aCdzIHNlc3Npb24gaWQgZml4IGZvciBPcGVuU1NMLCBJIGRpZCB0aGUKICBjb3JyZXNwb25kaW5nIGZpeCBpbiB0aGUgR251VExTIGNvZGU6IG1ha2Ugc3VyZSB0byBzdG9yZSB0aGUgbmV3IHNlc3Npb24gaWQKICBpbiBjYXNlIHRoZSBwcmV2aW91cyByZS11c2VkIG9uZSBpcyByZWplY3RlZC4KCkRhbmllbCBTdGVuYmVyZyAoNCBNYXkgMjAwOSkKLSBNaWNoYWVsIFNtaXRoIHBvc3RlZCBidWcgcmVwb3J0ICMyNzg2MjU1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3ODYyNTUpIHdpdGggYSBwYXRjaCwgaWRlbnRpZnlpbmcgaG93CiAgbGliY3VybCBkaWQgbm90IGRlYWwgd2l0aCBTU0wgc2Vzc2lvbiBpZHMgcHJvcGVybHkgaWYgdGhlIHNlcnZlciByZWplY3RlZCBhCiAgcmUtdXNlIG9mIG9uZS4gU3RhcnRpbmcgbm93LCBpdCB3aWxsIGZvcmdldCB0aGUgcmVqZWN0ZWQgb25lIGFuZCByZW1lbWJlcgogIHRoZSBuZXcuIFRoaXMgY2hhbmdlIHdhcyBmb3IgT3BlblNTTCBvbmx5LCBpdCBpcyBsaWtlbHkgdGhhdCBvdGhlciBTU0wgbGliCiAgY29kZSBuZWVkcyBzaW1pbGFyIGZpeGVzLgoKWWFuZyBUc2UgKDQgTWF5IDIwMDkpCi0gQXBwbGllZCBEYXZpZCBNY0NyZWVkeSdzICJ0cmFuc2Zlci5jIGZpeGVzIGZvciBDVVJMX0RPX0xJTkVFTkRfQ09OViBhbmQKICBub24tQVNDSUkgcGxhdGZvcm0gSFRUUCByZXF1ZXN0cyIgcGF0Y2ggYWRkcmVzc2luZyB0d28gSFRUUCBQVVQgcHJvYmxlbXM6CiAgMSkgT24gbm9uLUFTQ0lJIHBsYXRmb3JtcyBub3QgYWxsIG9mIHRoZSBwcm90b2NvbCBwb3J0aW9ucyBvZiB0aGUgUFVUIGFyZQogIGJlaW5nIHRyYW5zbGF0ZWQgdG8gQVNDSUkuICAyKSBPbiBhbGwgcGxhdGZvcm1zIHRoZSBsaW5lIGVuZGluZ3Mgb2YgcGFydCBvZgogIHRoZSBwcm90b2NvbCBwb3J0aW9ucyBhcmUgbWFuZ2xlZCBmcm9tIENSTEYgdG8gQ1JDUkxGIGlmIGRhdGEtPnNldC5jcmxmIG9yCiAgZGF0YS0+c2V0LnByZWZlcl9hc2NpaSBhcmUgc2V0IChkZXBlbmRpbmcgb24gQ1VSTF9ET19MSU5FRU5EX0NPTlYpLgoKLSBBcHBsaWVkIERhdmlkIE1jQ3JlZWR5J3MgcGF0Y2ggdG8gZml4IHRlc3Qgc3VpdGUgaGFybmVzcyB0byBhbGxvdyB0ZXN0IEZUUAogIHNlcnZlciBhbmQgY2xpZW50IG9uIGRpZmZlcmVudCBtYWNoaW5lcywgcHJvdmlkaW5nIEZUUCBjbGllbnQgYWRkcmVzcyB3aGVuCiAgcnVubmluZyB0aGUgRlRQIHRlc3Qgc2VydmVyLgoKRGFuaWVsIEZhbmRyaWNoICgzIE1heSAyMDA5KQotIEFkZGVkIGFuZCBkaXNhYmxlZCB0ZXN0IGNhc2UgNTYzIHdoaWNoIHNob3dzIEtOT1dOX0JVR1MgIzU5LiAgVGhlIGJ1ZwogIHJlcG9ydCBmYWlsZWQgdG8gbWVudGlvbiB0aGF0IGEgcHJveHkgbXVzdCBiZSB1c2VkIHRvIHJlcHJvZHVjZSBpdC4KCllhbmcgVHNlICgyIE1heSAyMDA5KQotIFVzZSBhIGJ1aWxkLXRpbWUgY29uZmlndXJlZCBjdXJsX3NvY2tsZW5fdCBkYXRhIHR5cGUgaW5zdGVhZCBvZiBzb2NrbGVuX3QuCgpZYW5nIFRzZSAoMSBNYXkgMjAwOSkKLSBBcHBsaWVkIERhdmlkIE1jQ3JlZWR5J3MgcGF0Y2hlcyAiVFBGLXBsYXRmb3JtIHNwZWNpZmljIGNoYW5nZXMgdG8gdmFyaW91cwogIGZpbGVzIiBhbmQgImh0dHAuYyBmaXggdG8gQ3VybF9wcm94eUNPTk5FQ1QgZm9yIG5vbi1BU0NJSSBwbGF0Zm9ybXMiLCB0aGUKICBmb3JtZXIgd2l0aCBtaW5vciBlZGl0cy4KCkRhbmllbCBTdGVuYmVyZyAoMzAgQXByIDIwMDkpCi0gSSB3YXMgZ29pbmcgdG8gZml4IGlzc3VlICM1OSBpbiBLTk9XTl9CVUdTCgogIElmIHRoZSBDVVJMT1BUX1BPUlQgb3B0aW9uIGlzIHVzZWQgb24gYW4gRlRQIFVSTCBsaWtlCiAgImZ0cDovL2V4YW1wbGUuY29tL2ZpbGU7dHlwZT1BIiB0aGUgIjt0eXBlPUEiIGlzIHN0cmlwcGVkIG9mZi4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTYyIHRvIHZlcmlmeSwgb25seSB0byBmaW5kIG91dCB0aGF0IEkgY291bGRuJ3QgcmVwZWF0CiAgdGhpcyBidWcgc28gSSBoZXJlYnkgY29uc2lkZXIgaXQgbm90IGEgYnVnIGFueW1vcmUhCgpEYW5pZWwgU3RlbmJlcmcgKDI5IEFwciAyMDA5KQotIEJhc2VkIG9uIGJ1ZyByZXBvcnQgIzI3MjMyMTkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3MjMyMTkpCiAgSSd2ZSBub3cgbWFkZSBURlRQICJjb25uZWN0aW9ucyIgbm90IGJlaW5nIGtlcHQgZm9yIHJlLXVzZSB3aXRoaW4gbGliY3VybC4KICBURlRQIGlzIFVEUC1iYXNlZCBzbyB0aGUgYmVuZWZpdCB3YXMgcmVhbGx5IGxvdyAoaWYgZXZlbiBleGlzdGluZykgdG8gYmVnaW4KICB3aXRoIHNvIGluc3RlYWQgb2YgdHJhY2tpbmcgZG93biB0byBmaXggdGhpcyBwcm9ibGVtIHdlIGluc3RlYWQgcmVtb3ZlZCB0aGUKICByZS11c2UuIEkgYWxzbyBlbmFibGVkIHRlc3QgY2FzZSAxMDk5IHRoYXQgSSB3cm90ZSBhIGZldyBkYXlzIGFnbyB0byB2ZXJpZnkKICB0aGF0IHRoaXMgY2hhbmdlIGZpeGVzIHRoZSByZXBvcnRlZCBwcm9ibGVtLgoKRGFuaWVsIFN0ZW5iZXJnICgyOCBBcHIgMjAwOSkKLSBDb25zdGFudGluZSBTYXB1bnR6YWtpcyBmaWxlZCBidWcgcmVwb3J0ICMyNzgzMDkwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3ODMwOTApIHBvaW50aW5nIG91dCB0aGF0IG9uIHdpbmRvd3MKICB3ZSBuZWVkIHRvIGdyb3cgdGhlIFNPX1NOREJVRiBidWZmZXIgc29tZXdoYXQgdG8gZ2V0IHJlYWxseSBnb29kIHVwbG9hZAogIHNwZWVkcy4gaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi84MjM3NjQgaGFzIHRoZSBkZXRhaWxzLiBGcmllbmRzCiAgY29uZmlybWVkIHRoYXQgc2ltcGx5IGFkZGluZyAzMiB0byBDVVJMX01BWF9XUklURV9TSVpFIGlzIGVub3VnaC4KCi0gQnVnIHJlcG9ydCAjMjcwOTAwNCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjcwOTAwNCkgYnkgVGltCiAgQ2hlbiBwb2ludGVkIG91dCBob3cgY3VybCBjb3VsZG4ndCB1cGxvYWQgd2l0aCByZXN1bWUgd2hlbiByZWFkaW5nIGZyb20gYQogIHBpcGUuCgogIFRoaXMgZW5kZWQgdXAgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIGEgbmV3IHJldHVybiBjb2RlIGZvciB0aGUKICBDVVJMT1BUX1NFRUtGVU5DVElPTiBjYWxsYmFjayB0aGF0IGJhc2ljYWxseSBzYXlzIHRoYXQgdGhlIHNlZWsgZmFpbGVkIGJ1dAogIHRoYXQgbGliY3VybCBtYXkgdHJ5IHRvIHJlc29sdmUgdGhlIHNpdHVhdGlvbiBhbnl3YXkuIEluIG91ciBjYXNlIHRoaXMgbWVhbnMKICBsaWJjdXJsIHdpbGwgYXR0ZW1wdCB0byBpbnN0ZWFkIHJlYWQgdGhhdCBtdWNoIGRhdGEgZnJvbSB0aGUgc3RyZWFtIGluc3RlYWQKICBvZiBzZWVraW5nIGFuZCB0aGF0IHdheSBjdXJsIGNhbiBub3cgdXBsb2FkIHdpdGggcmVzdW1lIHdoZW4gZGF0YSBpcyByZWFkCiAgZnJvbSBhIHN0cmVhbSEKCkRhbmllbCBTdGVuYmVyZyAoMjYgQXByIDIwMDkpCi0gQnVnIHJlcG9ydCAjMjc3OTczMyAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc3OTczMykgYnkgU3ZlbgogIFdlZ2VuZXIgcG9pbnRlZCBvdXQgdGhhdCBDVVJMSU5GT19BUFBDT05ORUNUX1RJTUUgZGlkbid0IHdvcmsgd2l0aCB0aGUgbXVsdGkKICBpbnRlcmZhY2UgYW5kIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgcHJvYmxlbSEKCkRhbmllbCBTdGVuYmVyZyAoMjQgQXByIDIwMDkpCi0gS2FtaWwgRHVka2EgZml4ZWQgYW5vdGhlciBOU1MtcmVsYXRlZCBsZWFrIHdoZW4gY2xpZW50IGNlcnRzIHdlcmUgdXNlZC4KCi0gQnVnIHJlcG9ydCAjMjc3OTI0NSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9Mjc3OTI0NSkgYnkgUmFpbmVyCiAgS29lbmlnIHBvaW50ZWQgb3V0IHRoYXQgdGhlIG1hbiBwYWdlIGRpZG4ndCB0ZWxsIHRoYXQgdGhlICpfcHJveHkKICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgY2FuIGJlIHNwZWNpZmllZCBsb3dlciBjYXNlIG9yIFVQUEVSIENBU0UgYW5kIHRoZQogIGxvd2VyIGNhc2UgdGFrZXMgcHJlY2VkZW5jZSwKCkRhbmllbCBGYW5kcmljaCAoMjEgQXByIDIwMDkpCi0gQWRkZWQgbmV3IGxpYmN1cmwgc291cmNlIGZpbGVzIHRvIEFtaWdhLCBSaXNjT1MgYW5kIFZDNiBidWlsZCBmaWxlcy4KCllhbmcgVHNlICgyMSBBcHIgMjAwOSkKLSBNb3ZlZCBwb3RlbnRpYWwgaW5jbHVzaW9uIG9mIHN5c3RlbSdzIG1hbGxvYy5oIGFuZCBtZW1vcnkuaCBoZWFkZXIgZmlsZXMgdG8KICBzZXR1cF9vbmNlLmguICBJbmNsdXNpb24gb2YgZWFjaCBoZWFkZXIgZmlsZSBpcyBiYXNlZCBvbiB0aGUgZGVmaW5pdGlvbiBvZgogIE5FRURfTUFMTE9DX0ggYW5kIE5FRURfTUVNT1JZX0ggcmVzcGVjdGl2ZWx5LgoKICBSZW5hbWVkIGxpYmN1cmwncyBtZW1vcnkuaCB0byBjdXJsX21lbW9yeS5oCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEFwciAyMDA5KQotIExlYW5pYyBMZWZldmVyIHJlcG9ydGVkIGEgY3Jhc2ggYW5kIGRpZCBzb21lIGRldGFpbGVkIHJlc2VhcmNoIG9uIHdoeSBhbmQKICBob3cgaXQgb2NjdXJzIChodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDktMDQvMDI4OS5odG1sKS4gVGhlCiAgY29uY2x1c2lvbiB3YXMgdGhhdCBpZiBhbiBlcnJvciBpcyBkZXRlY3RlZCBhbmQgQ3VybF9kb25lKCkgaXMgY2FsbGVkIGZvcgogIHRoZSBjb25uZWN0aW9uLCBmdHBfZG9uZSgpIGNvdWxkIGF0IHRpbWVzIHJldHVybiBhbm90aGVyIGVycm9yIGNvZGUgdGhhdAogIHRoZW4gd291bGQgdGFrZSBwcmVjZWRlbmNlIGFuZCB0aGF0IG5ldyBjb2RlIGNvbmZ1c2VkIGV4aXN0aW5nIGxvZ2ljIHRoYXQKICB3b3JrcyBmb3IgdGhlIGZpcnN0IGVycm9yIGNvZGUgKENVUkxFX1NFTkRfRVJST1IpIG9ubHkuCgotIEdpc2xlIFZhbmVtIG5vdGljZWQgdGhhdCAtLWxpYnRvb2wgd291bGQgcHJvZHVjZSBib2d1cyBzdHJpbmdzIGF0IHRpbWVzIGZvcgogIE9CSkVDVFBPSU5UIG9wdGlvbnMuIE5vdyB3ZSd2ZSBpbnRyb2R1Y2VkIGEgbmV3IGZ1bmN0aW9uIC0gbXlfc2V0b3B0X3N0ciAtCiAgd2l0aGluIHRoZSBhcHAgZm9yIHNldHRpbmcgcGxhaW4gc3RyaW5nIG9wdGlvbnMgdG8gYXZvaWQgdGhlIHJpc2sgb2YgdGhpcwogIG1pc3Rha2UgaGFwcGVuaW5nLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBBcHIgMjAwOSkKLSBQcmFtb2QgU2hhcm1hIHJlcG9ydGVkIGFuZCB0cmFja2VkIGRvd24gYSBidWcgd2hlbiBkb2luZyBGVFAgb3ZlciBhIEhUVFAKICBwcm94eS4gbGliY3VybCB3b3VsZCB0aGVuIHdyb25nbHkgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYWZ0ZXIgZWFjaAogIHJlcXVlc3QuIEluIGhpcyBjYXNlIGl0IGhhZCB0aGUgd2VpcmQgc2lkZS1lZmZlY3QgdGhhdCBpdCBraWxsZWQgTlRMTSBhdXRoCiAgZm9yIHRoZSBwcm94eSBjYXVzaW5nIGFuIGluaWZpbml0ZSBsb29wIQoKICBJIGFkZGVkIHRlc3QgY2FzZSAxMDk4IHRvIHZlcmlmeSB0aGlzIGZpeC4gVGhlIHRlc3QgY2FzZSBkb2VzIGhvd2V2ZXIgbm90CiAgcHJvcGVybHkgdmVyaWZ5IHRoYXQgdGhlIHRyYW5zZmVycyBhcmUgZG9uZSBwZXJzaXN0ZW50bHkgLSBhcyBJIGNvdWxkbid0CiAgdGhpbmsgb2YgYSBjbGV2ZXIgd2F5IHRvIGFjaGlldmUgaXQgcmlnaHQgbm93IC0gYnV0IHlvdSBuZWVkIHRvIHJlYWQgdGhlCiAgc3RkZXJyIG91dHB1dCBhZnRlciBhIHRlc3QgcnVuIHRvIHNlZSB0aGF0IGl0IHRydWx5IGRpZCB0aGUgcmlnaHQgdGhpbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDEzIEFwciAyMDA5KQotIGJ1ZyByZXBvcnQgIzI3Mjc5ODEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI3Mjc5ODEpIGJ5IE1hcnRpbgogIFN0b3JzavYgcG9pbnRlZCBvdXQgaG93IHNldHRpbmcgQ1VSTE9QVF9OT0JPRFkgdG8gMCBjb3VsZCBiZSBkb3ducmlnaHQKICBjb25mdXNpbmcgYXMgaXQgc2V0IHRoZSBtZXRob2QgdG8gZWl0aGVyIEdFVCBvciBIRUFELiBUaGUgZXhhbXBsZSBoZSBzaG93ZWQKICBsb29rZWQgbGlrZToKCiAgIGN1cmxfZWFzeV9zZXRvcHQoY3VybCwgQ1VSTE9QVF9QVVQsIDEpOwogICBjdXJsX2Vhc3lfc2V0b3B0KGN1cmwsIENVUkxPUFRfTk9CT0RZLCAwKTsKCiAgVGhlIG5ldyB3YXkgZG9lc24ndCBhbHRlciB0aGUgbWV0aG9kIHVudGlsIHRoZSByZXF1ZXN0IGlzIGFib3V0IHRvIHN0YXJ0LiBJZgogIENVUkxPUFRfTk9CT0RZIGlzIHRoZW4gMSB0aGUgSFRUUCByZXF1ZXN0IHdpbGwgYmUgSEVBRC4gSWYgQ1VSTE9QVF9OT0JPRFkgaXMKICAwIGFuZCB0aGUgcmVxdWVzdCBoYXBwZW5zIHRvIGhhdmUgYmVlbiBzZXQgdG8gSEVBRCwgaXQgd2lsbCB0aGVuIGluc3RlYWQgYmUKICBzZXQgdG8gR0VULiBJIGJlbGlldmUgdGhpcyB3aWxsIGJlIGxlc3Mgc3VycHJpc2luZyB0byB1c2VycywgYW5kIGhvcGVmdWxseQogIG5vdCBoaXQgYW55IGV4aXN0aW5nIHVzZXJzIGJhZGx5LgoKLSBUb3NoaW8gS3VyYXRvbWkgcmVwb3J0ZWQgYSBtZW1vcnkgbGVhayBwcm9ibGVtIHdpdGggbGliY3VybCtOU1MgdGhhdCB0dXJuZWQKICBvdXQgdG8gYmUgbGVha2luZyBjYWNlcnRzLiBLYW1pbCBEdWRrYSBoZWxwZWQgbWUgY29tcGxldGUgdGhlIGZpeC4gVGhlIGlzc3VlCiAgaXMgZm91bmQgaW4gUmVkaGF0J3MgYnVnIHRyYWNrZXI6CiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL3Nob3dfYnVnLmNnaT9pZD00NTM2MTIKCiAgVGhlcmUgYXJlIHN0aWxsIG1lbW9yeSBsZWFrcyBwcmVzZW50LCBidXQgdGhleSBzZWVtIHRvIGhhdmUgb3RoZXIgcmVhc29ucy4KCkRhbmllbCBGYW5kcmljaCAoMTEgQXByIDIwMDkpCi0gQWRkZWQgbmV3IGxpYmN1cmwgc291cmNlIGZpbGVzIHRvIFN5bWJpYW4gT1MgYnVpbGQgZmlsZXMuCi0gSW1wcm92ZWQgU3ltYmlhbiBzdXBwb3J0IGZvciBTU0wuCgpZYW5nIFRzZSAoMTAgQXByIDIwMDkpCi0gRGFuaWVsIEpvaG5zb24gaW1wcm92ZWQgdGhlIE1hY09TWC1GcmFtZXdvcmsgc2hlbGwgc2NyaXB0IHRvIG5vdyBwZXJmb3JtIGFsbAogIHRoZSBzdGVwcyByZXF1aXJlZCB0byBidWlsZCBhIE1hYyBPUyBYIGZvdXIgd2F5IGZhdCBwcGMvaTM4Ni9wcGM2NC94ODZfNjQKICBsaWJjdXJsLmZyYW1ld29yay4gIEZvdXIgd2F5IGZhdCBmcmFtZXdvcmsgcmVxdWlyZXMgT1MgWCAxMC41IFNESyBvciBsYXRlci4KCllhbmcgVHNlICg4IEFwciAyMDA5KQotIFJlbW92ZWQgU3VuIGNvbXBpbGVycyBwcmVwcm9jZXNzb3IgYmxvY2sgZnJvbSBjdXJsYnVpbGQuaC5kaXN0LCB0aGlzIGFsc28KICByZW1vdmVzIGl0IGZyb20gdGhlIGN1cmxidWlsZC5oIGZpbGUgb3JpZ2luYWxseSBkaXN0cmlidXRlZCBieSB0aGUgY1VSTAogIHByb2plY3QgYXMgdGhpcyBmaWxlIGlzIGludGVuZGVkIGZvciBzeXN0ZW1zIG5vdCBjYXBhYmxlIG9mIHJ1bm5pbmcgdGhlCiAgY29uZmlndXJlIHNjcmlwdC4gIEZvciB0aG9zZSB3aG8gaGF2ZSBiZWVuIGJ1aWxkaW5nIGN1cmwgb3V0IG9mIHRoZSBzb3VyY2UKICBjb2RlIGN1cmwgZGlzdHJpYnV0aW9uIHRhcmJhbGwgcHJvdmlkZWQgYnkgY3VybC5oYXh4LnNlIHRoZSBjaGFuZ2UgaW1wbGllcwogIG5vdGhpbmcuICBQcmV2aW91cyBjaGFuZ2UgaW4gdGhpcyBhcmVhIGNvbW1pdHRlZCAyIEFwciBiZWNvbWVzIGlycmVsZXZhbnQuCgpEYW5pZWwgU3RlbmJlcmcgKDYgQXByIDIwMDkpCi0gSSBjbGFyaWZpZWQgaW4gdGhlIGRvY3MgdGhhdCBDVVJMT1BUX1NFRUtGVU5DVElPTiBzaG91bGQgcmV0dXJuIDAgb24gc3VjY2VzcwogIGFuZCAxIG9uIGZhdGFsIGVycm9ycy4gUHJldmlvdXNseSBpdCBvbmx5IG1lbnRpb25lZCBub24temVybyBvbiBmYXRhbAogIGVycm9ycy4gVGhpcyBpcyBhIHNsaWdodCBjaGFuZ2UgaW4gbWVhbmluZywgYnV0IGl0IGZvbGxvd3Mgd2hhdCB3ZSd2ZSBkb25lCiAgZWxzZXdoZXJlIGJlZm9yZSBhbmQgaXQgb3BlbnMgdXAgZm9yIExPVFMgb2YgbW9yZSB1c2VmdWwgcmV0dXJuIGNvZGVzCiAgd2hlbmV2ZXIgd2UgY2FuIHRoaW5rIG9mIHRoZW0uLi4KCllhbmcgVHNlICgyIEFwciAyMDA5KQotIEZpeCBjdXJsX29mZl90IGRlZmluaXRpb24gZm9yIGJ1aWxkcyBkb25lIHVzaW5nIFN1biBjb21waWxlcnMgYW5kIGEKICBub24tY29uZmlndXJlZCBsaWJjdXJsLiBJbiB0aGlzIGNhc2UgY3VybF9vZmZfdCBkYXRhIHR5cGUgd2FzIGdhdGVkCiAgdG8gdGhlIG9mZl90IGRhdGEgdHlwZSB3aGljaCBkZXBlbmRzIG9uIHRoZSBfRklMRV9PRkZTRVRfQklUUy4gVGhpcwogIGNvbmZpZ3VyYXRpb24gaXMgZXhhY3RseSB0aGUgdW53YW50ZWQgY29uZmlndXJhdGlvbiBmb3Igb3VyIGN1cmxfb2ZmX3QKICBkYXRhIHR5cGUgd2hpY2ggbXVzdCBub3QgZGVwZW5kIG9uIHN1Y2ggc2V0dGluZy4gVGhpcyBicmVha3MgQUJJIGZvcgogIGxpYmN1cmwgbGlicmFyaWVzIGJ1aWx0IHdpdGggU3VuIGNvbXBpbGVycyB3aGljaCB3ZXJlIGJ1aWx0IHdpdGhvdXQKICBoYXZpbmcgcnVuIHRoZSBjb25maWd1cmUgc2NyaXB0IHdpdGggX0ZJTEVfT0ZGU0VUX0JJVFMgZGlmZmVyZW50IHRoYW4KICA2NCBhbmQgdXNpbmcgdGhlIElMUDMyIGRhdGEgbW9kZWwuCgpEYW5pZWwgU3RlbmJlcmcgKDEgQXByIDIwMDkpCi0gQW5kcmUgR3VpYmVydCBkZSBCcnVldCBmaXhlZCBhIE5VTEwgcG9pbnRlciB1c2UgaW4gYW4gaW5mb2YoKSBjYWxsIGlmIGEKICBzdHJkdXAoKSBjYWxsIGZhaWxlZC4gCgpEYW5pZWwgRmFuZHJpY2ggKDMxIE1hciAyMDA5KQotIFByb3Blcmx5IHJldHVybiBhbiBlcnJvciBjb2RlIGluIGN1cmxfZWFzeV9yZWN2IChyZXBvcnRlZCBieSBKaW0gRnJlZW1hbikuCgpEYW5pZWwgU3RlbmJlcmcgKDE4IE1hciAyMDA5KQotIEthbWlsIER1ZGthIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGVuYWJsZXMgNiBhZGRpdGlvbmFsIGNyeXB0byBhbGdvcml0aG1zIHdoZW4KICBOU1MgaXMgdXNlZC4gVGhlc2UgY2lwaGVycyB3ZXJlIGFkZGVkIGluIE5TUyAzLjQgYW5kIHJlcXVpcmUgdG8gYmUgZW5hYmxlZAogIGV4cGxpY2l0bHkuCiAKRGFuaWVsIFN0ZW5iZXJnICgxMyBNYXIgMjAwOSkKLSBVc2UgbGlic3NoMl92ZXJzaW9uKCkgdG8gcHJlc2VudCB0aGUgbGlic3NoMiB2ZXJzaW9uIGluIGNhc2UgdGhlIGxpYnNzaDIKICBsaWJyYXJ5IGlzIGZvdW5kIHRvIHN1cHBvcnQgaXQuCgpZYW5nIFRzZSAoMTIgTWFyIDIwMDkpCi0gQWRkZWQgbWlzc2luZyBDdXJsX3JlYWQoKSByZXR1cm4gY29kZSBjaGVja2luZyBpbiBURUxORVQgdHJhbnNmZXJzLgoKLSBQaWVycmUgQnJpY28gZm91bmQgYW5kIGZpeGVkIFRFTE5FVCB0cmFuc2ZlcnMgbm90IGJlaW5nIGFib3J0ZWQgdXBvbgogIGEgd3JpdGUgY2FsbGJhY2sgZmFpbHVyZS4KCkRhbmllbCBTdGVuYmVyZyAoMTEgTWFyIDIwMDkpCi0gS2FtaWwgRHVka2EgbWFkZSB0aGUgY3VybCB0b29sIHByb3Blcmx5IGNhbGwgY3VybF9nbG9iYWxfaW5pdCgpIGJlZm9yZSBhbnkKICBvdGhlciBsaWJjdXJsIGZ1bmN0aW9uLgoKWWFuZyBUc2UgKDExIE1hciAyMDA5KQotIEFkZGVkIG1pc3NpbmcgVEVMTkVUIHRpbWVvdXQgc3VwcG9ydCBmb3IgV2luZG93cyBidWlsZHMuIFRoaXMgaXNzdWUgd2FzCiAgcmVwb3J0ZWQgYnkgUGllcnJlIEJyaWNvLgoKRGFuaWVsIFN0ZW5iZXJnICg5IE1hciAyMDA5KQotIEZyYW5rIEhlbXBlbCBmb3VuZCBvdXQgYSBidWcgYW5kIHByb3ZpZGVkIHRoZSBmaXg6IAogIAogIGN1cmxfZWFzeV9kdXBoYW5kbGUgZGlkIG5vdCBuZWNlc3NhcmlseSBkdXBsaWNhdGUgdGhlIENVUkxPUFRfQ09PS0lFRklMRQogIG9wdGlvbi4gSXQgb25seSBlbmFibGVkIHRoZSBjb29raWUgZW5naW5lIGluIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGUgaWYKICBkYXRhLT5jb29raWVzIGlzIG5vdCBOVUxMICh3aGVyZSBkYXRhIGlzIHRoZSBzb3VyY2UgaGFuZGxlKS4gSW4gY2FzZSBvZiBhCiAgbmV3bHkgaW5pdGlhbGl6ZWQgaGFuZGxlIHdoaWNoIGp1c3QgaGFkIHRoZSBjb29raWUgc3VwcG9ydCBlbmFibGVkIGJ5IGEKICBjdXJsX2Vhc3lfc2V0b3B0KGhhbmRsZSwgQ1VSTF9DT09LSUVGSUxFLCAiIiktY2FsbCwgaGFuZGxlLT5jb29raWVzIHdhcwogIHN0aWxsIE5VTEwgYmVjYXVzZSB0aGUgc2V0b3B0LWNhbGwgb25seSBhcHBlbmRzIHRoZSB2YWx1ZSB0bwogIGRhdGEtPmNoYW5nZS5jb29raWVsaXN0LCBoZW5jZSBkdXBsaWNhdGluZyB0aGlzIGhhbmRsZSB3b3VsZCBub3QgaGF2ZSB0aGUKICBjb29raWUgZW5naW5lIHN3aXRjaGVkIG9uLgoKICBXZSBhbHNvIGNvbmNsdWRlZCB0aGF0IHRoZSBzbGlzdC1mdW5jdGlvbmFsaXR5IHdvdWxkIGJlIHN1aXRhYmxlIGZvciBiZWluZwogIHB1dCBpbiBpdHMgb3duIG1vZHVsZSByYXRoZXIgdGhhbiBzaW1wbHkgaGFuZ2luZyBvdXQgaW4gbGliL3NlbmRmLmMgc28gSQogIGNyZWF0ZWQgbGliL3NsaXN0LltjaF0gZm9yIHRoZW0uCgotIEFuZHJlYXMgRmFyYmVyIG1hZGUgdGhlICdidWlsZGNvbmYnIHNjcmlwdCBjaGVjayBmb3IgdGhlIHByZXNlbmNlIG9mIG00CiAgc2NyaXB0cyB0byBtYWtlIGl0IGRldGVjdCBhIGJhZCBjaGVja291dCBlYXJsaWVyLiBQZW9wbGUgd2l0aCBvbGRlcgogIGNoZWNrb3V0cyB3aG8gZG9uJ3QgZG8gY3ZzIHVwZGF0ZSB3aXRoIHRoZSAtZCBvcHRpb24gd29uJ3QgZ2V0IHRoZSBuZXcgZGlycwogIGFuZCB0aGVuIHdpbGwgZ2V0IGZ1bm55IG91dHB1dHMgdGhhdCBjYW4gYmUgYSBiaXQgaGFyZCB0byB1bmRlcnN0YW5kIGFuZAogIGZpeC4KICAKRGFuaWVsIFN0ZW5iZXJnICg4IE1hciAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgY29kZSBzZWdtZW50IGluIHNzbHVzZS5jIHdoZXJlIHRoZQogIGFsbG9jYXRpb24gb2YgdGhlIG1lbW9yeSBCSU8gd2FzIG5vdCBiZWluZyBwcm9wZXJseSBjaGVja2VkLgoKLSBBbmRyZSBHdWliZXJ0IGRlIEJydWV0IGZpeGVkIHRoZSBnbnV0bHMtdXNpbmcgY29kZTogVGhlcmUgYXJlIGEgZmV3IHBsYWNlcwogIGluIHRoZSBnbnV0bHMgY29kZSB3aGVyZSB3ZSB3ZXJlIGNoZWNraW5nIGZvciBuZWdhdGl2ZSB2YWx1ZXMgZm9yIGVycm9ycywKICB3aGVuIHRoZSBtYW4gcGFnZXMgc3RhdGUgdGhhdCBHTlVUTFNfRV9TVUNDRVNTIGlzIHJldHVybmVkIG9uIHN1Y2Nlc3MgYW5kCiAgb3RoZXIgdmFsdWVzIGluZGljYXRlIGVycm9yIGNvbmRpdGlvbnMuCgotIEJpbGwgRWdlcnQgcG9pbnRlZCBvdXQgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI2NzE2MDIpIHRoYXQKICBjdXJsIGRpZG4ndCB1c2Ugc3ByaW50ZigpIGluIGEgd2F5IHRoYXQgaXMgZG9jdW1lbnRlZCB0byB3b3JrIGluIFBPU0lYIGJ1dAogIHNpbmNlIHdlIHVzZSBvdXIgb3duIHByaW50ZigpIGNvZGUgKGZyb20gbGliY3VybCkgdGhhdCBzaG91bGRuJ3QgYmUgYQogIHByb2JsZW0uIE5vbmV0aGVsZXNzIEkgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm90IHJlbHkgb24gc3VjaCBwYXJ0aWN1bGFyCiAgZmVhdHVyZXMgYW5kIHRvIG5vdCBjYXVzZSBmdXJ0aGVyIHJhaXNlZCBleWVicm93c2Ugd2l0aCBubyBnb29kIHJlYXNvbi4KCkRhbmllbCBGYW5kcmljaCAoNSBNYXIgMjAwOSkKLSBFeHBhbmRlZCB0aGUgc2VjdXJpdHkgc2VjdGlvbiBvZiB0aGUgbGliY3VybC10dXRvcmlhbCBtYW4gcGFnZSB0byBjb3ZlcgogIG1vcmUgaXNzdWVzIGZvciBhdXRob3JzIHRvIGNvbnNpZGVyIHdoZW4gd3JpdGluZyByb2J1c3QgbGliY3VybC11c2luZwogIGFwcGxpY2F0aW9ucy4KCllhbmcgVHNlICg1IE1hciAyMDA5KQotIEZpeGVkIE5UTE0gYXV0aGVudGljYXRpb24gbWVtb3J5IGxlYWsgb24gU1NQSSBlbmFibGVkIFdpbmRvd3MgYnVpbGRzLiBUaGlzCiAgaXNzdWUgd2FzIG5vdGljZWQgYnkgQ2hyaXMgRGVpZHVuLgoKRGFuaWVsIEZhbmRyaWNoICg0IE1hciAyMDA5KQotIEZpeGVkIGEgcHJvYmxlbSB3aXRoIG00IHF1b3RpbmcgaW4gdGhlIE9wZW5TU0wgY29uZmlndXJlIGNoZWNrIHJlcG9ydGVkCiAgYnkgRGFuaWVsIEpvaG5zb24uCgpEYW5pZWwgU3RlbmJlcmcgKDMgTWFyIDIwMDkpCi0gRGF2aWQgSmFtZXMgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBsaWJjdXJsIGNsb3NlIChhbGwpIGRlYWQgY29ubmVjdGlvbnMKICB3aGVuZXZlciB5b3UgYXR0ZW1wdCB0byBvcGVuIGEgbmV3IGNvbm5lY3Rpb24uCgogIDEuIEFmdGVyIGNsZWFuaW5nIHVwIGEgZGVhZCBjb25uZWN0aW9uLCAiY29udGludWUiIGluc3RlYWQgb2YKICAgICByZXR1cm5pbmcgRkFMU0UuIFRoaXMgZW5zdXJlcyB0aGF0IHdlIGNsZWFuIHVwIGFsbCBkZWFkIGNvbm5lY3Rpb25zLAogICAgIHJhdGhlciB0aGFuIGp1c3QgY2xlYW5pbmcgdXAgdGhlIGZpcnN0IGRlYWQgY29ubmVjdGlvbi4KICAyLiBNb3ZlIHVwIHRoZSBjbGVhbnVwIGZvciBkZWFkIGNvbm5lY3Rpb25zIHNvIHRoYXQgaXQgb2NjdXJzIGZvcgogICAgIGFsbCBjb25uZWN0aW9ucywgcmF0aGVyIHRoYW4ganVzdCB0aGUgY29ubmVjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2FtZQogICAgIHByZWZlcmVuY2VzIGFzIG91ciBjdXJyZW50IG5ldyBjb25uZWN0aW9uLgoKVmVyc2lvbiA3LjE5LjQgKDMgTWFyY2ggMjAwOSkKCkRhbmllbCBTdGVuYmVyZyAoMyBNYXIgMjAwOSkKLSBEYXZpZCBLaWVyem5vd3NraSBub3RpZmllZCB1cyBhYm91dCBhIHNlY3VyaXR5IGZsYXcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL2Fkdl8yMDA5MDMwMy5odG1sIGFsc28ga25vd24gYXMgQ1ZFLTIwMDktMDAzNykgaW4KICB3aGljaCBwcmV2aW91cyBsaWJjdXJsIHZlcnNpb25zIChieSBkZXNpZ24pIGNhbiBiZSB0cmlja2VkIHRvIGFjY2VzcyBhbgogIGFyYml0cmFyeSBsb2NhbC9kaWZmZXJlbnQgZmlsZSBpbnN0ZWFkIG9mIGEgcmVtb3RlIG9uZSB3aGVuCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBUaGlzIGZsYXcgaXMgbm93IGZpeGVkIGluIHRoaXMgcmVsZWFzZQogIHRvZ2V0aGVyIHRoaXMgdGhlIGFkZGl0aW9uIG9mIHR3byBuZXcgc2V0b3B0IG9wdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoaXMKICBuZXcgYmVoYXZpb3I6CgogIG8gQ1VSTE9QVF9SRURJUl9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbHMgbGliY3VybCBpcyBhbGxvd2VkIHRvCiAgZm9sbG93IHRvIHdoZW4gQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkLiBCeSBkZWZhdWx0LCB0aGlzIG9wdGlvbgogIGV4Y2x1ZGVzIHRoZSBGSUxFIGFuZCBTQ1AgcHJvdG9jb2xzIGFuZCB0aHVzIHlvdSBuZWUgdG8gZXhwbGljaXRseSBhbGxvdwogIHRoZW0gaW4geW91ciBhcHAgaWYgeW91IHJlYWxseSB3YW50IHRoYXQgYmVoYXZpb3IuCgogIG8gQ1VSTE9QVF9QUk9UT0NPTFMgY29udHJvbHMgd2hhdCBwcm90b2NvbChzKSBsaWJjdXJsIGlzIGFsbG93ZWQgdG8gZmV0Y2gKICB1c2luZyB0aGUgcHJpbWFyeSBVUkwgb3B0aW9uLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBhbGxvdyBhIHVzZXIgb3IKICBvdGhlciBvdXRzaWRlcnMgY29udHJvbCB3aGF0IFVSTCB0byBwYXNzIHRvIGxpYmN1cmwgYW5kIHlldCBub3QgYWxsb3cgYWxsCiAgcHJvdG9jb2xzIGxpYmN1cmwgbWF5IGhhdmUgYmVlbiBidWlsdCB0byBzdXBwb3J0LgoKRGFuaWVsIFN0ZW5iZXJnICgyNyBGZWIgMjAwOSkKLSBTZW50aGlsIFJhamEgVmVsdSByZXBvcnRlZCBhIHByb2JsZW0gd2hlbiBDVVJMT1BUX0lOVEVSRkFDRSBhbmQKICBDVVJMT1BUX0xPQ0FMUE9SVCB3ZXJlIHVzZWQgdG9nZXRoZXIgKHRoZSBsb2NhbCBwb3J0IGJpbmQgZmFpbGVkKSwgYW5kCiAgTWFya3VzIEtvZXR0ZXIgcHJvdmlkZWQgdGhlIGZpeCEKCkRhbmllbCBTdGVuYmVyZyAoMjUgRmViIDIwMDkpCi0gQXMgRGFuaWVsIEZhbmRyaWNoIGZpZ3VyZWQgb3V0LCB3ZSBtdXN0IGRvIHRoZSBHbnVUTFMgaW5pdGluZyBpbiB0aGUKICBjdXJsX2dsb2JhbF9pbml0KCkgZnVuY3Rpb24gdG8gcHJvcGVybHkgbWFpbnRhaW4gdGhlIHBlcmZvcm1pbmcgZnVuY3Rpb25zCiAgdGhyZWFkLXNhZmUuIFdlJ3ZlIHByZXZpb3VzbHkgKDI4IEFwcmlsIDIwMDcpIG1vdmVkIHRoZSBpbml0IHRvIGEgbGF0ZXIgdGltZQogIGp1c3QgdG8gYXZvaWQgaXQgdG8gZmFpbCB2ZXJ5IGVhcmx5IHdoZW4gbGliZ2NyeXB0IGRpc2xpa2VzIHRoZSBzaXR1YXRpb24sCiAgYnV0IHRoYXQgbW92ZSB3YXMgYmFkIGFuZCB0aGUgZml4IHNob3VsZCByYXRoZXIgYmUgaW4gbGliZ2NyeXB0IG9yCiAgZWxzZXdoZXJlLgogIApEYW5pZWwgU3RlbmJlcmcgKDI0IEZlYiAyMDA5KQotIEJyaWFuIEouIE11cnJlbGwgZm91bmQgb3V0IHRoYXQgTmVnb3RpYXRlIHByb3h5IGF1dGhlbnRpY2F0aW9uIGRpZG4ndCB3b3JrLgogIEl0IGhhcHBlbmVkIGJlY2F1c2UgdGhlIGNvZGUgdXNlZCB0aGUgc3RydWN0IGZvciBzZXJ2ZXItYmFzZWQgYXV0aCBhbGwgdGhlCiAgdGltZSBmb3IgYm90aCBwcm94eSBhbmQgc2VydmVyIGF1dGggd2hpY2ggb2YgY291cnNlIHdhcyB3cm9uZy4KCkRhbmllbCBTdGVuYmVyZyAoMjMgRmViIDIwMDkpCi0gQWZ0ZXIgYSBidWcgcmVwb3J0ZWQgYnkgSmFtZXMgQ2hlbmcgSSd2ZSBtYWRlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZm9yCiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRCByZXR1cm4KICAtMSBpZiB0aGUgc2l6ZXMgYXJlbid0IGtub3cuIFByZXZpb3VzbHkgdGhlc2UgcmV0dXJuZWQgMCwgbWFrZSBpdCBpbXBvc3NpYmxlCiAgdG8gZGV0ZWN0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYWN0dWFsbHkgemVybyBhbmQgdW5rbm93bi4KCllhbmcgVHNlICgyMyBGZWIgMjAwOSkKLSBEYW5pZWwgSm9obnNvbiBwcm92aWRlZCBhIHNoZWxsIHNjcmlwdCB0aGF0IHdpbGwgcGVyZm9ybSBhbGwgdGhlIHN0ZXBzIG5lZWRlZAogIHRvIGJ1aWxkIGEgTWFjIE9TIFggZmF0IHBwYy9pMzg2IG9yIHBwYzY0L3g4Nl82NCBsaWJjdXJsLmZyYW1ld29yawoKRGFuaWVsIFN0ZW5iZXJnICgyMyBGZWIgMjAwOSkKLSBJIHJlbmFtZWQgZXZlcnl0aGluZyBpbiB0aGUgd2luZG93cyBidWlsZHMgZmlsZXMgdGhhdCB1c2VkIHRoZSBuYW1lICdjdXJsbGliJwogIHRvIHRoZSBwcm9wZXIgJ2xpYmN1cmwnIGFzIGNsZWFybHkgdGhpcyBjYXVzZWQgY29uZnVzaW9uLgoKWWFuZyBUc2UgKDIwIEZlYiAyMDA5KQotIERvIG5vdCBoYWx0IGNvbXBpbGF0aW9uIHdoZW4gdXNpbmcgVlMyMDA4IHRvIGJ1aWxkIGEgV2luZG93cyAyMDAwIHRhcmdldC4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRmViIDIwMDkpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZXBvcnRlZCBhbmQgaGVscGVkIG1lIHJlcGVhdCBhbmQgZml4IGEgcHJvYmxlbSB3aXRoCiAgRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHRyYW5zZmVyIGZhaWxzLCBsaWtlIHdoZW4gYWJvcnRlZCBieSBhCiAgd3JpdGUgY2FsbGJhY2ssIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2FzIHdyb25nbHkgY2xvc2VkIGFuZCB0aHVzIG5vdAogIHJlLXVzZWQgcHJvcGVybHkuCgogIFRoaXMgY2hhbmdlIGlzIGFsc28gYW4gYXR0ZW1wdCB0byBjbGVhbnVwIHRoZSBjb2RlIHNvbWV3aGF0IGluIHRoaXMgYXJlYSwgYXMKICBub3cgdGhlIEZUUCBjb2RlIGF0dGVtcHRzIHRvIGtlZXAgKGJldHRlcikgdHJhY2sgb24gcGVuZGluZyByZXNwb25zZXMKICBuZWNlc3NhcnkgdG8gZ2V0IHJlYWQgaW4gZnRwX2RvbmUoKS4KCkRhbmllbCBTdGVuYmVyZyAoMTkgRmViIDIwMDkpCi0gUGF0cmlrIFRodW5zdHJvbSByZXBvcnRlZCBhIHByb2JsZW0gYW5kIGhlbHBlZCBtZSByZXBlYXQgaXQuIEl0IHR1cm5lZCBvdXQgCiAgbGliY3VybCBkaWQgYSBzdXBlcmZsdW91cyAxMDAwbXMgd2FpdCB3aGVuIGRvaW5nIFNGVFAgZG93bmxvYWRzIQoKICBXZSByZWFkIGRhdGEgd2l0aCBsaWJzc2gyIHdoaWxlIGRvaW5nIHRoZSAiRE8iIG9wZXJhdGlvbiBmb3IgU0ZUUCBhbmQgdGhlbgogIHdoZW4gd2Ugd2VyZSBhYm91dCB0byBzdGFydCBnZXR0aW5nIGRhdGEgZm9yIHRoZSBhY3R1YWwgZmlsZSBwYXJ0LCB0aGUKICAiVFJBTlNGRVIiIHBhcnQsIHdlIHdhaXRlZCBmb3Igc29ja2V0IGFjdGlvbiAoaW4gMTAwMG1zKSBiZWZvcmUgZG9pbmcgYQogIGxpYnNzaDItcmVhZC4gQnV0IGluIHRoaXMgY2FzZSBsaWJzc2gyIGhhZCBhbHJlYWR5IHJlYWQgYW5kIGJ1ZmZlcmVkIHRoZQogIGRhdGEgc28gd2UgZW5kZWQgdXAgYWx3YXlzIGp1c3Qgd2FpdGluZyAxMDAwbXMgYmVmb3JlIHdlIGdldCB3b3JraW5nIG9uIHRoZQogIGRhdGEhCgpQYXRyaWNrIE1vbm5lcmF0ICgxOCBGZWIgMjAwOSkKLSBGVFAgZG93bmxvYWRzIChpLmUuOiBSRVRSKSBlbmRpbmcgd2l0aCBjb2RlIDU1MCBub3cgcmV0dXJuIGVycm9yCiAgQ1VSTEVfUkVNT1RFX0ZJTEVfTk9UX0ZPVU5EIGluc3RlYWQgb2YgQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFLgoKRGFuaWVsIFN0ZW5iZXJnICgxNyBGZWIgMjAwOSkKLSBLYW1pbCBEdWRrYSBtYWRlIE5TUy1wb3dlcmVkIGJ1aWxkcyBjb21waWxlIGFuZCBydW4gYWdhaW4hCgotIEEgc2Vjb25kIGZvbGxvdy11cCBjaGFuZ2UgYnkgQW5kcmUgR3VpYmVydCBkZSBCcnVldCB0byBmaXggYSByZWxhdGVkIG1lbW9yeQogIGxlYWsgbGlrZSB0aGF0IGZpeGVkIG9uIHRoZSAxNHRoLiBXaGVuIHpsaWIgcmV0dXJucyBmYWlsdXJlLCB3ZSBuZWVkIHRvCiAgY2xlYW51cCBwcm9wZXJseSBiZWZvcmUgcmV0dXJuaW5nIGVycm9yLgoKLSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIGNhbiBub3cgYmUgc2V0IHRvIDIgaW4gYWRkaXRpb24gdG8gMSBmb3IKICBwbGFpbiBGVFAgY29ubmVjdGlvbnMsIGFuZCBpdCB3aWxsIHRoZW4gYWxsb3cgTUtEIHRvIGZhaWwgb25jZSBhbmQgcmV0cnkgdGhlCiAgQ1dEIGFmdGVyd2FyZHMuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwgaWYgeW91J3JlIGRvaW5nIG1hbnkgc2ltdWx0YW5vZXMKICBjb25uZWN0aW9ucyBhZ2FpbnN0IHRoZSBzYW1lIHNlcnZlciBhbmQgdGhleSBhbGwgaGF2ZSB0aGlzIG9wdGlvbiBlbmFibGVkLAogIGFzIHRoZW4gQ1dEIG1heSBmaXJzdCBmYWlsIGJ1dCB0aGVuIGFub3RoZXIgY29ubmVjdGlvbiBkb2VzIE1LRCBiZWZvcmUgdGhpcwogIGNvbm5lY3Rpb24gYW5kIHRodXMgTUtEIGZhaWxzIGJ1dCB0cnlpbmcgQ1dEIHdvcmtzISBUaGUgbnVtYmVycyBjYW4KICAoc2hvdWxkPykgbm93IGJlIHNldCB3aXRoIHRoZSBjb252ZW5pZW5jZSBlbnVtcyBub3cgY2FsbGVkCiAgQ1VSTEZUUF9DUkVBVEVfRElSIGFuZCBDVVJMRlRQX0NSRUFURV9ESVJfUkVUUlkuCgogIFRlc3RzIGhhcyBwcm92ZW4gdGhhdCBpZiB5b3UncmUgbWFraW5nIGFuIGFwcGxpY2F0aW9uIHRoYXQgdXBsb2FkcyBhIHNldCBvZgogIGZpbGVzIHRvIGFuIGZ0cCBzZXJ2ZXIsIHlvdSB3aWxsIGdldCBhIG5vdGljYWJsZSBnYWluIGluIHNwZWVkIGlmIHlvdSdyZQogIHVzaW5nIG11bHRpcGxlIGNvbm5lY3Rpb25zIGFuZCB0aGlzIG9wdGlvbiB3aWxsIGJlIHRoZW4gYmUgdmVyeSB1c2VmdWwuCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEZlYiAyMDA5KQotIEFuZHJlIEd1aWJlcnQgZGUgQnJ1ZXQgZm91bmQgYW5kIGZpeGVkIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvbnRlbnQgZW5jb2RpbmcKICBjb2RlLCB3aGljaCBjb3VsZCBoYXBwZW4gb24gbGlieiBlcnJvcnMuCgpEYW5pZWwgRmFuZHJpY2ggKDEyIEZlYiAyMDA5KQotIEFkZGVkIHN1cHBvcnQgZm9yIERpZ2VzdCBhbmQgTlRMTSBhdXRoZW50aWNhdGlvbiB1c2luZyBHbnVUTFMuCgpEYW5pZWwgU3RlbmJlcmcgKDExIEZlYiAyMDA5KQotIENVUkxJTkZPX0NPTkRJVElPTl9VTk1FVCB3YXMgYWRkZWQgdG8gYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZ2V0IHRvIGtub3cgaWYKICB0aGUgY29uZGl0aW9uIGluIHRoZSBwcmV2aW91cyByZXF1ZXN0IHdhcyB1bm1ldC4gVGhpcyBpcyB0eXBpY2FsbHkgYSB0aW1lCiAgY29uZGl0aW9uIHNldCB3aXRoIENVUkxPUFRfVElNRUNPTkRJVElPTiBhbmQgd2FzIHByZXZpb3VzbHkgbm90IHBvc3NpYmxlIHRvCiAgcmVsaWFibHkgZmlndXJlIG91dC4gRnJvbSBidWcgcmVwb3J0ICMyNTY1MTI4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1NjUxMjgpIGZpbGVkIGJ5IEpvY2VseW4gSmF1YmVydC4KCkRhbmllbCBGYW5kcmljaCAoNCBGZWIgMjAwOSkKLSBEb24ndCBhZGQgdGhlIHN0YW5kYXJkIC91c3IvbGliIG9yIC91c3IvaW5jbHVkZSBwYXRocyB0byBMREZMQUdTIGFuZCBDUFBGTEFHUwogIChyZXNwZWN0aXZlbHkpIHdoZW4gLS13aXRoLXNzbD0vdXNyIGlzIHVzZWQgKHBhdGNoIGJhc2VkIG9uIEZyZWVCU0QpLgoKLSBBZGRlZCBhbiBleHBsaWNpdCBidWZmZXIgbGltaXQgY2hlY2sgaW4gbXNkb3NpZnkoKSAocGF0Y2ggYmFzZWQgb24gRnJlZUJTRCkuCiAgVGhpcyBjb3VsZG4ndCBldmVyIG92ZXJmbG93IGluIGN1cmwsIGJ1dCBtaWdodCBpZiB0aGUgY29kZSB3ZXJlIHVzZWQKICBlbHNld2hlcmUgb3IgdW5kZXIgZGlmZmVyZW50IGNvbmRpdGlvbnMuCgpEYW5pZWwgU3RlbmJlcmcgKDMgRmViIDIwMDkpCi0gSGlkZW1vdG8gTmFrYWRhIHByb3ZpZGVkIGEgc21hbGwgZml4IHRoYXQgbWFrZXMgaXQgcG9zc2libGUgdG8gZ2V0IHRoZQogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIHNpemUgZnJvbSBmaWxlOi8vICJ0cmFuc2ZlcnMiIHdpdGgKICBDVVJMT1BUX05PQk9EWSBzZXQgdHJ1ZS4KCkRhbmllbCBTdGVuYmVyZyAoMiBGZWIgMjAwOSkKLSBQYXRyaWNrIFNjb3R0IGZvdW5kIGEgcmF0aGVyIGxhcmdlIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpCiAgaW50ZXJmYWNlIGFuZCBzZXR0aW5nIENVUkxNT1BUX01BWENPTk5FQ1RTIHRvIHNvbWV0aGluZyBsZXNzIHRoYW4gdGhlIG51bWJlcgogIG9mIGhhbmRsZXMgeW91IGFkZCB0byB0aGUgbXVsdGkgaGFuZGxlLiBBbGwgdGhlIGNvbm5lY3Rpb25zIHRoYXQgZGlkbid0IGZpdAogIGluIHRoZSBjYWNoZSB3b3VsZCBub3QgYmUgcHJvcGVybHkgZGlzY29ubmVjdGVkIG5vciBmcmVlZCEKCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgdXM6IGxpYmN1cmwgbm93IGRlZmF1bHRzIHRvIGRvIENPTk5FQ1Qgd2l0aCBIVFRQCiAgdmVyc2lvbiAxLjEgaW5zdGVhZCBvZiAxLjAgbGlrZSBiZWZvcmUuIFRoaXMgY2hhbmdlIGFsc28gaW50cm9kdWNlcyB0aGUgbmV3CiAgcHJveHkgdHlwZSBmb3IgbGliY3VybCBjYWxsZWQgJ0NVUkxQUk9YWV9IVFRQXzFfMCcgdGhhdCB0aGVuIGFsbG93cyBhcHBzIHRvCiAgc3dpdGNoIChiYWNrKSB0byBDT05ORUNUIDEuMCByZXF1ZXN0cy4gVGhlIGN1cmwgdG9vbCBhbHNvIGdvdCBhIC0tcHJveHkxLjAKICBvcHRpb24gdGhhdCB3b3JrcyBleGFjdGx5IGxpa2UgLS1wcm94eSBidXQgc2V0cyBDVVJMUFJPWFlfSFRUUF8xXzAuCgogIEkgdXBkYXRlZCBhbGwgdGVzdCBjYXNlcyBjYXNlcyB0aGF0IHVzZSBDT05ORUNUIGFuZCBJIHRyaWVkIHRvIGRvIHNvbWUgdXNpbmcKICAtLXByb3h5MS4wIGFuZCBzb21lIHVwZGF0ZWQgdG8gZG8gQ09OTkVDVCAxLjEgdG8gZ2V0IGJvdGggdmVyc2lvbnMgcnVuLgoKRGFuaWVsIFN0ZW5iZXJnICgzMSBKYW4gMjAwOSkKLSBXaGVuIGJ1aWxkaW5nIHdpdGggYy1hcmVzIDEuNi4xIChub3QgeWV0IHJlbGVhc2VkKSBvciBsYXRlciBhbmQgSVB2NiBzdXBwb3J0CiAgZW5hYmxlZCwgd2UgY2FuIG5vdyB0YWtlIGFkdmFudGFnZSBvZiBpdHMgYnJhbmQgbmV3IEFGX1VOU1BFQyBzdXBwb3J0IGluCiAgYXJlc19nZXRob3N0YnluYW1lKCkuIFRoaXMgbWFrZXMgdGVzdCBjYXNlIDI0MSBmaW5hbGx5IHJ1biBmaW5lIGZvciBtZSB3aXRoCiAgdGhpcyBzZXR1cCBzaW5jZSBpdCBub3cgcGFyc2VzIHRoZSAiOjoxIGlwNi1sb2NhbGhvc3QiIGxpbmUgZmluZSBpbiBteQogIC9ldGMvaG9zdHMgZmlsZSEKCkRhbmllbCBTdGVuYmVyZyAoMzAgSmFuIDIwMDkpCi0gU2NvdHQgQ2FudG9yIGZpbGVkIGJ1ZyByZXBvcnQgIzI1NTAwNjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjU1MDA2MSkgbWVudGlvbmluZyB0aGF0IEkgZmFpbGVkIHRvCiAgcHJvcGVybHkgbWFrZSBzdXJlIHRoYXQgdGhlIFZDOSBtYWtlZmlsZXMgZ290IGluY2x1ZGVkIGluIHRoZSBsYXRlc3QKICByZWxlYXNlLiBJJ3ZlIG5vdyBmaXhlZCB0aGUgcmVsZWFzZSBzY3JpcHQgYW5kIHZlcmlmaWVkIGl0IHNvIG5leHQgcmVsZWFzZQogIHdpbGwgaG9wZWZ1bGx5IGluY2x1ZGUgdGhlbSBwcm9wZXJseSEKCkRhbmllbCBGYW5kcmljaCAoMzAgSmFuIDIwMDkpCi0gRml4ZWQgLS1kaXNhYmxlLXByb3h5IGZvciBGVFAgYW5kIFNPQ0tTLiBUaGFua3MgdG8gRGFuaWVsIEVnZ2VyIGZvcgogIHJlcG9ydGluZy4KCllhbmcgVHNlICgyOSBKYW4gMjAwOSkKLSBJbnRyb2R1Y2VkIGN1cmxfc3NwaS5jIGFuZCBjdXJsX3NzcGkuaCBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIGZ1bmN0aW9ucwogIEN1cmxfc3NwaV9nbG9iYWxfaW5pdCgpIGFuZCBDdXJsX3NzcGlfZ2xvYmFsX2NsZWFudXAoKSB3aGljaCBwcmV2aW91c2x5IHdlcmUKICBuYW1lZCBDdXJsX250bG1fZ2xvYmFsX2luaXQoKSBhbmQgQ3VybF9udGxtX2dsb2JhbF9jbGVhbnVwKCkgaW4gaHR0cF9udGxtLmMKICBBbHNvIGFkanVzdGVkIHNvY2tzX3NzcGkuYyB0byByZW1vdmUgdGhlIGxpbmstdGltZSBkZXBlbmRlbmN5IG9uIHRoZSBXaW5kb3dzCiAgU1NQSSBsaWJyYXJ5IHVzaW5nIGl0IG5vdyBpbiB0aGUgc2FtZSB3YXkgYXMgaXQgd2FzIGRvbmUgaW4gaHR0cF9udGxtLmMuCgpEYW5pZWwgU3RlbmJlcmcgKDI4IEphbiAyMDA5KQotIE1hcmt1cyBNb2VsbGVyIGludHJvZHVjZWQgdHdvIG5ldyBvcHRpb25zIHRvIGxpYmN1cmw6CiAgQ1VSTE9QVF9TT0NLUzVfR1NTQVBJX1NFUlZJQ0UgYW5kIENVUkxPUFRfU09DS1M1X0dTU0FQSV9ORUMgdG8gYWxsb3cgbGliY3VybAogIHRvIGRvIEdTUy1zdHlsZSBhdXRoZW50aWNhdGlvbiB3aXRoIFNPQ0tTNSBwcm94aWVzLiBUaGUgY3VybCB0b29sIGdvdCB0aGUKICBvcHRpb25zIGNhbGxlZCAtLXNvY2tzNS1nc3NhcGktc2VydmljZSBhbmQgLS1zb2NrczUtZ3NzYXBpLW5lYyB0byBlbmFibGUKICB0aGVzZS4KCkRhbmllbCBTdGVuYmVyZyAoMjYgSmFuIDIwMDkpCi0gQ2hhZCBNb25yb2UgcHJvdmlkZWQgdGhlIG5ldyBDVVJMT1BUX1RGVFBfQkxLU0laRSBvcHRpb24gdGhhdCBhbGxvd3MgYW4gYXBwCiAgdG8gc2V0IGRlc2lyZWQgYmxvY2sgc2l6ZSB0byB1c2UgZm9yIFRGVFAgdHJhbnNmZXJzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQKICA1MTIgYnl0ZXMuCgotIFRoZSAiLW5vX3RpY2tldCIgb3B0aW9uIHdhcyBpbnRyb2R1Y2VkIGluIE9wZW5zc2wwLjkuOGouIEl0J3MgYSBmbGFnIHRvCiAgZGlzYWJsZSAicmZjNDUwN2JpcyBzZXNzaW9uIHRpY2tldCBzdXBwb3J0Ii4gIHJmYzQ1MDdiaXMgd2FzIGxhdGVyIHR1cm5lZAogIGludG8gdGhlIHByb3BlciBSRkM1MDc3IGl0IHNlZW1zOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM1MDc3CgogIFRoZSBlbmFibGVkIGV4dGVuc2lvbiBjb25jZXJucyB0aGUgc2Vzc2lvbiBtYW5hZ2VtZW50LiBJIHdvbmRlciBob3cgb2Z0ZW4KICBsaWJjdXJsIHN0b3BzIGEgY29ubmVjdGlvbiBhbmQgdGhlbiByZXN1bWVzIGEgVExTIHNlc3Npb24uIGFsc28sIHNlbmRpbmcgdGhlCiAgc2Vzc2lvbiBkYXRhIGlzIHNvbWUgb3ZlcmhlYWQuIC5JIHN1Z2dlc3QgdGhhdCB5b3UganVzdCB1c2UgeW91ciBwcm9wb3NlZAogIHBhdGNoICh3aGljaCBleHBsaWNpdGx5IGRpc2FibGVzIFRJQ0tFVCkuCgogIElmIHNvbWVvbmUgd3JpdGVzIGFuIGFwcGxpY2F0aW9uIHdpdGggbGliY3VybCBhbmQgb3BlbnNzbCB3aG8gd2FudHMgdG8KICBlbmFibGUgdGhlIGZlYXR1cmUsIG9uZSBjYW4gZG8gdGhpcyBpbiB0aGUgU1NMIGNhbGxiYWNrLgoKICBTaGFyYWQgR3VwdGEgYnJvdWdodCB0aGlzIHRvIG15IGF0dGVudGlvbi4gUGV0ZXIgU3lsdmVzdGVyIGhlbHBlZCBtZSBkZWNpZGUKICBvbiB0aGUgcHJvcGVyIGFjdGlvbi4KCi0gQWxleGV5IEJvcnpvdiBmaWxlZCBidWcgcmVwb3J0ICMyNTM1NTA0CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI1MzU1MDQpIHBvaW50aW5nIG91dCB0aGF0IHJlYWxtcyB3aXRoCiAgcXVvdGVkIHF1b3RhdGlvbiBtYXJrcyBpbiBIVFRQIERpZ2VzdCBoZWFkZXJzIGRpZG4ndCB3b3JrLiBJJ3ZlIG5vdyBhZGRlZCAKICB0ZXN0IGNhc2UgMTA5NSB0aGF0IHZlcmlmaWVzIG15IGZpeC4KCi0gQ3JhaWcgQSBXZXN0IGJyb3VnaHQgQ1VSTE9QVF9OT1BST1hZIGFuZCB0aGUgY29ycmVzcG9uZGluZyAtLW5vcHJveHkgb3B0aW9uLgogIFRoZXkgYmFzaWNhbGx5IG9mZmVyIHRoZSBzYW1lIHRoaW5nIHRoZSBOT19QUk9YWSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvbmx5CiAgb2ZmZXJlZCBwcmV2aW91c2x5OiBsaXN0IGEgc2V0IG9mIGhvc3QgbmFtZXMgdGhhdCBzaGFsbCBub3QgdXNlIHRoZSBwcm94eQogIGV2ZW4gaWYgb25lIGlzIHNwZWNpZmllZC4KCkRhbmllbCBGYW5kcmljaCAoMjAgSmFuIDIwMDkpCi0gQ2FsbCBzZXRsb2NhbGUoKSBmb3IgbGlidGVzdCB0ZXN0cyB0byB0ZXN0IHRoZSBlZmZlY3RzIG9mIGxvY2FsZS1pbmR1Y2VkCiAgbGliYyBjaGFuZ2VzIG9uIGxpYmN1cmwuCgotIEZpeGVkIGEgY291cGxlIG1vcmUgbG9jYWxlLWRlcGVuZGVudCB0b3VwcGVyIGNvbnZlcnNpb25zLCBtYWlubHkgZm9yCiAgY2xhcml0eS4gIFRoaXMgZG9lcyBmaXggb25lIHByb2JsZW0gdGhhdCBjYXVzZXMgO3R5cGU9aSBGVFAgVVJMcwogIHRvIGZhaWwgaW4gdGhlIFR1cmtpc2ggbG9jYWxlIHdoZW4gQ1VSTE9QVF9QUk9YWV9UUkFOU0ZFUl9NT0RFIGlzCiAgdXNlZCAodGVzdCBjYXNlIDU2MSkKCi0gQWRkZWQgdGVzdHMgNTYxIGFuZCAxMDkxIHRocm91Z2ggMTA5NCB0byB0ZXN0IHZhcmlvdXMgY29tYmluYXRpb25zCiAgb2YgO3R5cGU9IGFuZCA7bW9kZT0gVVJMcyB0aGF0IGNvdWxkIHBvdGVudGlhbGx5IGZhaWwgaW4gdGhlIFR1cmtpc2gKICBsb2NhbGUuCgpEYW5pZWwgU3RlbmJlcmcgKDIwIEphbiAyMDA5KQotIExpc2EgWHUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgc3NoLm9iaiBmaWxlIHdhcyBtaXNzaW5nIGZyb20gdGhlCiAgbGliL01ha2VmaWxlLnZjNiBmaWxlIChhbmQgdGh1cyBmcm9tIHRoZSB2YzggYW5kIHZjOSBvbmVzIHRvbykuCgpWZXJzaW9uIDcuMTkuMyAoMTkgSmFudWFyeSAyMDA5KQoKRGFuaWVsIFN0ZW5iZXJnICgxNiBKYW4gMjAwOSkKLSBBbmRyZXcgZGUgbG9zIFJleWVzIGZpeGVkIGN1cmxidWlsZC5oIGZvciAiZ2VuZXJpYyIgZ2NjIGJ1aWxkcyBvbiBQUEMsIGJvdGgKICAzMiBiaXQgYW5kIDY0IGJpdC4KCkRhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDIwMDkpCi0gVGltIEFuc2VsbCBmaXhlZCBhIGNvbXBpbGVyIHdhcm5pbmcgaW4gbGliL2Nvb2tpZS5jCgpEYW5pZWwgU3RlbmJlcmcgKDE0IEphbiAyMDA5KQotIEdyYW50IEVyaWNrc29uIGZpeGVkIHRpbWVvdXRzIGZvciBURlRQIHN1Y2ggdGhhdCBzcGVjaWZ5aW5nIGEKICBjb25uZWN0LXRpbWVvdXQsIGEgbWF4LXRpbWUgb3IgYm90aCBvcHRpb25zIHdvcmsgY29ycmVjdGx5IGFuZCBhcyBleHBlY3RlZAogIGJ5IHBhc3NpbmcgdGhlIGNvcnJlY3QgYm9vbGVhbiB2YWx1ZSB0byBDdXJsX3RpbWVsZWZ0IHZpYSB0aGUKICAnZHVyaW5nY29ubmVjdCcgcGFyYW1ldGVyLgoKICBXaXRoIHRoaXMgc21hbGwgY2hhbmdlLCBjdXJsIFRGVFAgbm93IGJlaGF2ZXMgYXMgZXhwZWN0ZWQgKGFuZCBsaWtlbHkgYXMKICBvcmlnaW5hbGx5LWRlc2lnbmVkKToKCiAgMSkgRm9yIG5vbi1leGlzdGVudCBvciB1bnJlYWNoYWJsZSBkb3R0ZWQgSVAgYWRkcmVzc2VzOgoKICAgYSkgV2l0aCBubyBvcHRpb25zLCBmb2xsb3dzIHRoZSBkZWZhdWx0IGN1cmwgMzAwcyB0aW1lb3V0Li4uCiAgIGIpIFdpdGggLS1jb25uZWN0LXRpbWVvdXQgb25seSwgZm9sbG93cyB0aGF0IHZhbHVlLi4uCiAgIGMpIFdpdGggLS1tYXgtdGltZSBvbmx5LCBmb2xsb3dzIHRoYXQgdmFsdWUuLi4KICAgZCkgV2l0aCBib3RoIC0tY29ubmVjdC10aW1lb3V0IGFuZCAtLW1heC10aW1lLCBmb2xsb3dzIHRoZSBzbWFsbGVyIHZhbHVlLi4uCgogICBhbmQgdGltZXMgb3V0IHdpdGggYSAiY3VybDogKDcpIENvdWxkbid0IGNvbm5lY3QgdG8gc2VydmVyIiBlcnJvci4KCiAgMikgRm9yIHRyYW5zZmVycyB0by9mcm9tIGEgdmFsaWQgaG9zdDoKCiAgIGEpIFdpdGggbm8gb3B0aW9ucywgZm9sbG93cyBkZWZhdWx0IGN1cmwgMzAwcyB0aW1lb3V0IGZvciB0aGUKICAgICAgZmlyc3QgWFJRL0RBVEEvQUNLIHRyYW5zYWN0aW9uIGFuZCB0aGUgZGVmYXVsdCBURlRQIDM2MDBzCiAgICAgIHRpbWVvdXQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlIHRyYW5zZmVyLi4uCgogICBiKSBXaXRoIC0tY29ubmVjdC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZSBmb3IgdGhlCiAgICAgIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGRlZmF1bHQgVEZUUCAzNjAwcwogICAgICB0aW1lb3V0IGZvciB0aGUgcmVtYWluZGVyIG9mIHRoZSB0cmFuc2Zlci4uLgoKICAgYykgV2l0aCAtLW1heC10aW1lIG9ubHksIGZvbGxvd3MgdGhhdCB2YWx1ZSBmb3IgdGhlIGZpcnN0CiAgICAgIFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgZm9yIHRoZSByZW1haW5kZXIgb2YgdGhlCiAgICAgIHRyYW5zZmVyLi4uCgogICBkKSBXaXRoIGJvdGggLS1jb25uZWN0LXRpbWVvdXQgYW5kIC0tbWF4LXRpbWUsIGZvbGxvd3MgdGhlIGZvcm1lcgogICAgICBmb3IgdGhlIGZpcnN0IFhSUS9EQVRBL0FDSyB0cmFuc2FjdGlvbiBhbmQgdGhlIGxhdHRlciBmb3IgdGhlCiAgICAgIHJlbWFpbmRlciBvZiB0aGUgdHJhbnNmZXIuLi4KCiAgIGFuZCB0aW1lcyBvdXQgd2l0aCBhICJjdXJsOiAoMjgpIFRpbWVvdXQgd2FzIHJlYWNoZWQiIGVycm9yIGFzCiAgIGFwcHJvcHJpYXRlLgoKRGFuaWVsIFN0ZW5iZXJnICgxMyBKYW4gMjAwOSkKLSBNaWNoYWVsIFdhbGxuZXIgZml4ZWQgYSBOVUxMIHBvaW50ZXIgZGVyZWYgd2hlbiBjYWxsaW5nCiAgY3VybF9lYXN5X3NldHVwKGN1cmwsIENVUkxPUFRfQ09PS0lFTElTVCwgIlNFU1MiKSBvbiBhIENVUkwgaGFuZGxlIHdpdGggbm8KICBjb29raWVzIGRhdGEuCgotIFN0ZWZhbiBUZWxlbWFuIGJyb3VnaHQgYSBwYXRjaCB0byBmaXggdGhlIGRlZmF1bHQgY3VybGJ1aWxkLmggZmlsZSBmb3IgdGhlCiAgU3VuUHJvIGNvbXBpbGVycy4KCkRhbmllbCBTdGVuYmVyZyAoMTIgSmFuIDIwMDkpCi0gQmFzZWQgb24gYnVnIHJlcG9ydCAjMjQ5ODY2NSAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjQ5ODY2NSkKICBieSBEYW5pZWwgQmxhY2ssIEkndmUgbm93IGFkZGVkIG1hZ2ljIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFrZXMgaXQKICB1c2UgcGtnLWNvbmZpZyB0byBkZXRlY3QgZ251dGxzIGRldGFpbHMgYXMgd2VsbCBpZiB0aGUgZXhpc3RpbmcgbWV0aG9kCiAgKHVzaW5nIGxpYmdudXRscy1jb25maWcpIGZhaWxzLiBXaGlsZSBkb2luZyB0aGlzLCBJIGNsZWFuZWQgdXAgYW5kIHVuaWZpZWQKICB0aGUgcGtnLWNvbmZpZyB1c2FnZSB3aGVuIGRldGVjdGluZyBvcGVuc3NsIGFuZCBuc3MgYXMgd2VsbC4KCkRhbmllbCBTdGVuYmVyZyAoMTEgSmFuIDIwMDkpCi0gS2FybCBNb2VyZGVyIGJyb3VnaHQgdGhlIHBhdGNoIHRoYXQgY3JlYXRlcyB2YzkgTWFrZWZpbGVzLCBhbmQgSSBtYWRlCiAgJ21ha2V0Z3onIG5vdyB1c2UgdGhlIGFjdHVhbCBtYWtlZmlsZSB0YXJnZXRzIHRvIGRvIHRoZSBWQzggYW5kIFZDOQogIG1ha2VmaWxlcy4KCkRhbmllbCBTdGVuYmVyZyAoMTAgSmFuIDIwMDkpCi0gRW1pbCBSb21hbnVzIGZpeGVkOgoKICBXaGVuIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb3ZlciBIVFRQIGFuZCB0aGUgc2VydmVyIHJldHVybnMgYSBMb2NhdGlvbgogIGhlYWRlciwgdGhlIHJ1bm5pbmcgZWFzeSBoYW5kbGUgd2lsbCBnZXQgc3R1Y2sgaW4gdGhlIENVUkxNX1NUQVRFX1BFUkZPUk0KICBzdGF0ZSwgbGVhdmluZyB0aGUgZXh0ZXJuYWwgZXZlbnQgbG9vcCBzdHVjayB3YWl0aW5nIGZvciBkYXRhIGZyb20gdGhlCiAgaW5nb2luZyBzb2NrZXQgKHdoZW4gdXNpbmcgdGhlIGN1cmxfbXVsdGlfc29ja2V0X2FjdGlvbiBzdHVmZikuIFdoaWxlIHRoaXMKICBidWcgd2FzIHByZXR0eSBoYXJkIHRvIGZpbmQsIGl0IHNlZW1zIHRvIHJlcXVpcmUgb25seSBhIG9uZS1saW5lIGZpeC4gVGhlCiAgYnJlYWsgc3RhdGVtZW50IG9uIGxpbmUgMTM3NCBpbiBtdWx0aS5jIGNhdXNlZCB0aGUgZnVuY3Rpb24gdG8gc2tpcCB0aGUgY2FsbAogIHRvIG11bHRpc3RhdGUoKS4KCiAgSG93IHRvIHJlcHJvZHVjZSB0aGlzIGJ1Zz8gV2VsbCwgdGhhdCdzIGFub3RoZXIgcXVlc3Rpb24uICBldmhpcGVyZmlmby5jIGluCiAgdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSBjaG9rZXMgb24gdGhpcyBidWcgb25seSBfc29tZXRpbWVzXywgcHJvYmFibHkKICBkZXBlbmRpbmcgb24gaG93IGZhc3QgdGhlIFVSTHMgYXJlIGFkZGVkLiBPbmUgd2F5IG9mIHRlc3RpbmcgdGhlIGJ1ZyBvdXQgaXMKICB3cml0aW5nIHRvIGhpcGVyLmZpZm8gZnJvbSBtb3JlIHRoYW4gb25lIHNvdXJjZSBhdCB0aGUgc2FtZSB0aW1lLgoKRGFuaWVsIEZhbmRyaWNoICg3IEphbiAyMDA5KQotIFVuaWZpZWQgbXVjaCBvZiB0aGUgU2Vzc2lvbkhhbmRsZSBpbml0aWFsaXphdGlvbiBkb25lIGluIEN1cmxfb3BlbigpIGFuZAogIGN1cmxfZWFzeV9yZXNldCgpIGJ5IGNyZWF0aW5nIEN1cmxfaW5pdF91c2VyZGVmaW5lZCgpLiBUaGlzIGhhZCB0aGUgc2lkZQogIGVmZmVjdCBvZiBmaXhpbmcgY3VybF9lYXN5X3Jlc2V0KCkgc28gaXQgbm93IGFsc28gcmVzZXRzCiAgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCBhbmQgQ1VSTE9QVF9TU0xfU0VTU0lPTklEX0NBQ0hFCgpEYW5pZWwgU3RlbmJlcmcgKDcgSmFuIDIwMDkpCi0gUm9iIENyaXR0ZW5kZW4gZGlkIG9uY2UgYWdhaW4gcHJvdmlkZSBhbiBOU1MgdXBkYXRlOgoKICBJIGhhdmUgdG8ganVtcCB0aHJvdWdoIGEgZmV3IGhvb3BzIG5vdyB3aXRoIHRoZSBOU1MgbGlicmFyeSBpbml0aWFsaXphdGlvbgogIHNpbmNlIGFub3RoZXIgcGFydCBvZiBhbiBhcHBsaWNhdGlvbiBtYXkgaGF2ZSBhbHJlYWR5IGluaXRpYWxpemVkIE5TUyBieSB0aGUKICB0aW1lIEN1cmwgZ2V0cyBpbnZva2VkLiBUaGlzIHBhdGNoIGlzIG1vcmUgY2FyZWZ1bCB0byBvbmx5IHNodXRkb3duIHRoZSBOU1MKICBsaWJyYXJ5IGlmIEN1cmwgZGlkIHRoZSBpbml0aWFsaXphdGlvbi4KCiAgSXQgYWxzbyBhZGRzIGluIGEgYml0IG9mIGNvZGUgdG8gc2V0IHRoZSBkZWZhdWx0IGNpcGhlcnMgaWYgdGhlIGFwcCB0aGF0CiAgY2FsbCBOU1NfSW5pdCogZGlkIG5vdCBjYWxsIE5TU19TZXREb21lc3RpY1BvbGljeSgpIG9yIHNldCBzcGVjaWZpYwogIGNpcGhlcnMuIE9uZSBtaWdodCBhcmd1ZSB0aGF0IHRoaXMgbGV0cyBvdGhlciBhcHBsaWNhdGlvbiBkZXZlbG9wZXJzIGdldAogIGxhenkgYW5kL29yIHRoZXkgYXJlbid0IHVzaW5nIHRoZSBOU1MgQVBJIGNvcnJlY3RseSwgYW5kIHlvdSdkIGJlIHJpZ2h0LgogIEJ1dCBzdGlsbCwgdGhpcyB3aWxsIGF2b2lkIHRlcnJpYmx5IGRpZmZpY3VsdC10by10cmFjZSBjcmFzaGVzIGFuZCBpcwogIGdlbmVyYWxseSBoZWxwZnVsLgoKRGFuaWVsIFN0ZW5iZXJnICgxIEphbiAyMDA5KQotICdyZWNvbmYnIGlzIHJlbW92ZWQgc2luY2Ugd2UgcmF0aGVyIGhhdmUgdXNlcnMgdXNlICdidWlsZGNvbmYnCgpEYW5pZWwgU3RlbmJlcmcgKDMxIERlYyAyMDA4KQotIEJhcyBNZXZpc3NlbiByZXBvcnRlZCBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yNDc5MDMwIHBvaW50aW5nCiAgb3V0IHRoYXQgJ3JlY29uZicgZGlkbid0IHByb3Blcmx5IHBvaW50IG91dCB0aGUgbTQgc3ViZGlyZWN0b3J5IHdoZW4gcnVubmluZwogIGFjbG9jYWwuCgpEYW5pZWwgU3RlbmJlcmcgKDI5IERlYyAyMDA4KQogLSBQaGlsIExpc2llY2tpIGZpbGVkIGJ1ZyByZXBvcnQgIzI0MTMwNjcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjQxMzA2NykgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0CiAgd291bGQgY2F1c2UgbGliY3VybCB0byBtYXJrIGEgRE5TIGNhY2hlIGVudHJ5ICJpbiB1c2UiIGV0ZXJuYWxseSBpZiB0aGUKICBzdWJzZXF1ZW5jZSBUQ1AgY29ubmVjdCBmYWlsZWQuIEl0IHdvdWxkIHRodXMgbmV2ZXIgZ2V0IHBydW5lZCBhbmQgcmVmcmVzaGVkCiAgYXMgaXQgc2hvdWxkJ3ZlIGJlZW4uCgogIFBoaWwgcHJvdmlkZWQgaGlzIG93biBwYXRjaCB0byB0aGlzIHByb2JsZW0gdGhhdCB3aGlsZSBpdCBzZWVtZWQgdG8gd29yawogIHdhc24ndCBjb21wbGV0ZSBhbmQgdGh1cyBJIHdyb3RlIG15IG93biBmaXggdG8gdGhlIHByb2JsZW0uCgpEYW5pZWwgU3RlbmJlcmcgKDI4IERlYyAyMDA4KQotIFBldGVyIEtvcnNnYWFyZCBmaXhlZCBidWlsZGluZyBsaWJjdXJsIHdpdGggImNvbmZpZ3VyZSAtLXdpdGgtc3NsCiAgLS1kaXNhYmxlLXZlcmJvc2UiLgogIAotIEFudGhvbnkgQnJ5YW4gZml4ZWQgbW9yZSBsYW5ndWFnZSBhbmQgc3BlbGxpbmcgZmxhd3MgaW4gbWFuIHBhZ2VzLgoKRGFuaWVsIFN0ZW5iZXJnICgyMiBEZWMgMjAwOCkKLSBHaXZlbiBhIHJlY2VudCBlbm91Z2ggbGlic3NoMiwgbGliY3VybCBjYW4gbm93IHNlZWsvcmVzdW1lIHdpdGggU0ZUUCBldmVuCiAgb24gZmlsZSBpbmRleGVzIGJleW9uZCAyIG9yIDRHQi4KCi0gQW50aG9ueSBCcnlhbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgY2xlYW5lZCB1cCBtYW51YWwgbGFuZ3VhZ2UsCiAgY29ycmVjdGVkIHNwZWxsaW5ncyBhbmQgbW9yZS4KCkRhbmllbCBTdGVuYmVyZyAoMjAgRGVjIDIwMDgpCi0gSWdvciBOb3Zvc2VsdHNldiBmaXhlZCBhIGJhZCBzaXR1YXRpb24gZm9yIHRoZSBtdWx0aV9zb2NrZXQoKSBBUEkgd2hlbiBkb2luZwogIHBpcGVsaW5pbmcsIGFzIGxpYmN1cmwgY291bGQgdGhlbiBlYXNpbHkgZ2V0IGNvbmZ1c2VkIGFuZCBBKSB3b3JrIG9uIHRoZQogIGhhbmRsZSB0aGF0IHdhcyBub3QgImZpcnN0IGluIHF1ZXVlIiBvbiBhIHBpcGVsaW5lLCBvciBldmVuIEIpIHRlbGwgdGhlIGFwcAogIHRvIFJFTU9WRSBhIHNvY2tldCB3aGlsZSBpdCB3YXMgaW4gdXNlIGJ5IGEgc2Vjb25kIGhhbmRsZSBpbiBhIHBpcGVsaW5lLiBCb3RoCiAgZXJyb3JzIGNhdXNlZCBoYW5naW5nIG9yIHN0YWxsaW5nIGFwcGxpY2F0aW9ucy4KCkRhbmllbCBTdGVuYmVyZyAoMTkgRGVjIDIwMDgpCi0gY3VybF9tdWx0aV90aW1lb3V0KCkgY291bGQgcmV0dXJuIGEgdGltZW91dCB2YWx1ZSBvZiAwIGV2ZW4gdGhvdWdoIG5vdGhpbmcKICB3YXMgYWN0dWFsbHkgcmVhZHkgdG8gZ2V0IGRvbmUsIGFzIHRoZSBpbnRlcm5hbCB0aW1lIHJlc29sdXRpb24gaXMgaGlnaGVyCiAgdGhhbiB0aGUgcmV0dXJuZWQgbWlsbGlzZWNvbmQgdGltZXIuIFRoZXJlZm9yZSBpdCBjb3VsZCBjYXVzZSBhcHBsaWNhdGlvbnMKICBydW5uaW5nIG9uIGZhc3QgcHJvY2Vzc29ycyB0byBkbyBzaG9ydCBidXJzdHMgb2YgYnVzeS1sb29wcy4KICBjdXJsX211bHRpX3RpbWVvdXQoKSB3aWxsIG5vdyBvbmx5IHJldHVybiAwIGlmIHRoZSB0aW1lb3V0IGlzIGFjdHVhbGx5CiAgYWxyZWF5IHRyaWdnZXJlZC4KCi0gVXNpbmcgdGhlIGxpYnNzaDIgMC4xOSBmdW5jdGlvbiBsaWJzc2gyX3Nlc3Npb25fYmxvY2tfZGlyZWN0aW9ucygpLCBsaWJjdXJsCiAgbm93IGhhcyBhbiBpbXByb3ZlZCBhYmlsaXR5IHRvIGRvIHJpZ2h0IHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSAoYm90aAogICJyZWd1bGFyIiBhbmQgbXVsdGlfc29ja2V0KSBpcyB1c2VkIGZvciBTQ1AgYW5kIFNGVFAgdHJhbnNmZXJzLiBUaGlzIHNob3VsZAogIHJlc3VsdCBpbiAobXVjaCkgbGVzcyBidXN5LWxvb3Agc2l0dWF0aW9ucyBhbmQgdGh1cyBsZXNzIENQVSB1c2FnZSB3aXRoIG5vCiAgc3BlZWQgbG9zcy4KCkRhbmllbCBTdGVuYmVyZyAoMTcgRGVjIDIwMDgpCi0gU0NQIGFuZCBTRlRQIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBoYWQgdGhlIHNhbWUgZmxhdzogdGhlICdET05FJwogIG9wZXJhdGlvbiBkaWRuJ3QgY29tcGxldGUgcHJvcGVybHkgaWYgdGhlIEVBR0FJTiBlcXVpdmFsZW50IHdhcyByZXR1cm5lZCBidXQKICBsaWJjdXJsIHdvdWxkIHNpbXBseSBjb250aW51ZSB3aXRoIGEgaGFsZi1jb21wbGV0ZWQgY2xvc2Ugb3BlcmF0aW9uCiAgcGVyZm9ybWVkLiBUaGlzIHJ1aW5lZCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gcmUtdXNlIGFuZCBjYXVzZSBzb21lCiAgU1NILXByb3RvY29sIGVycm9ycyBpbiBnZW5lcmFsLiBUaGUgY29ycmVjdGlvbiBpcyB1bmZvcnR1bmF0ZWx5IGFkZGluZyBhCiAgYmxvY2tpbmcgZnVuY3Rpb24gLSBkb2luZyBpdCBlbnRpcmVseSBub24tYmxvY2tpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZm9yCiAgYSBiZXR0ZXIgZml4LgoKR2lzbGUgVmFuZW0gKDE2IERlYyAyMDA4KQotIEFkZGVkIHRoZSBwb3NzaWJpbGl0eSB0byB1c2UgdGhlIFdhdHQtMzIgdGNwL2lwIHN0YWNrIHVuZGVyIFdpbmRvd3MuCiAgVGhlIGNoYW5nZSBzaW1wbHkgaW52b2x2ZWQgYWRkaW5nIGEgVVNFX1dBVFQzMiBzZWN0aW9uIGluIHRoZQogIGNvbmZpZy13aW4zMi5oIGZpbGVzICh1bmRlciAuL2xpYiBhbmQgLi9zcmMpLiBUaGlzIHNlY3Rpb24gZGlzYWJsZXMKICB0aGUgdXNlIG9mIGFueSBXaW5zb2NrIGhlYWRlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IERlYyAyMDA4KQotIGxpYnNzaDJfc2Z0cF9sYXN0X2Vycm9yKCkgd2FzIHdyb25nbHkgdXNlZCBhdCBzb21lIHBsYWNlcyBpbiBsaWJjdXJsIHdoaWNoCiAgbWFkZSBsaWJjdXJsIHNvbWV0aW1lcyBub3QgcHJvcGVybHkgYWJvcnQgcHJvYmxlbWF0aWMgU0ZUUCB0cmFuc2ZlcnMuCgpEYW5pZWwgU3RlbmJlcmcgKDEyIERlYyAyMDA4KQotIE1vcmUgd29yayB3aXRoIElnb3IgTm92b3NlbHRzZXYgdG8gZmlyc3QgZml4IHRoZSByZW1haW5pbmcgc3R1ZmYgZm9yCiAgcmVtb3ZpbmcgZWFzeSBoYW5kbGVzIGZyb20gbXVsdGkgaGFuZGxlcyB3aGVuIHRoZSBlYXN5IGhhbmRsZSBpcy93YXMgd2l0aGluCiAgYSBIVFRQIHBpcGVsaW5lLiBIaXMgYnVnIHJlcG9ydCAjMjM1MTY1MwogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0yMzUxNjUzKSB3YXMgYWxzbyByZWxhdGVkIGFuZCB3YXMKICBldmVudHVhbGx5IGZpeGVkIGJ5IGEgcGF0Y2ggYnkgSWdvciBoaW1zZWxmLgoKWWFuZyBUc2UgKDEyIERlYyAyMDA4KQotIFBhdHJpY2sgTW9ubmVyYXQgZml4ZWQgYSBidWlsZCByZWdyZXNzaW9uLCBpbnRyb2R1Y2VkIGluIDcuMTkuMiwgYWZmZWN0aW5nCiAgT1MvNDAwIGNvbXBpbGF0aW9ucyB3aXRoIElQdjYgZW5hYmxlZC4KCkRhbmllbCBTdGVuYmVyZyAoMTIgRGVjIDIwMDgpCi0gTWFyayBLYXJwZWxlcyBmaWxlZCBidWcgcmVwb3J0ICMyNDE2MTgyIHRpdGxlZCAiY3Jhc2ggaW4gQ29ubmVjdGlvbkV4aXN0cwogIHdoZW4gdXNpbmcgZHVwaGFuZGxlK2N1cmxfbXV0bGkiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTI0MTYxODIpIHdoaWNoIHNob3dlZCB0aGF0CiAgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdyb25nbHkgYWxzbyBjb3BpZWQgdGhlIHBvaW50ZXIgdG8gdGhlIGNvbm5lY3Rpb24KICBjYWNoZSwgd2hpY2ggd2FzIHBsYWluIHdyb25nIGFuZCBjYXVzZWQgYSBzZWdmYXVsdCBpZiB0aGUgaGFuZGxlIHdvdWxkIGJlCiAgdXNlZCBpbiBhIGRpZmZlcmVudCBtdWx0aSBoYW5kbGUgdGhhbiB0aGUgaGFuZGxlIGl0IHdhcyBkdXBsaWNhdGVkIGZyb20uCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEtlc2hhdiBLcml0eSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGZhaWxlZCB0byBkZWFsIHdpdGggZG90dGVkIElQdjYKICBhZGRyZXNzZXMgaWYgdGhleSB3ZXJlIHZlcnkgbG9uZyAoPjM5IGxldHRlcnMpIGR1ZSB0byBhIHRvbyBzdHJpY3QgYWRkcmVzcwogIHZhbGlkaXR5IHBhcnNlci4gSXQgbm93IGFjY2VwdHMgYWRkcmVzc2VzIHVwIHRvIDQ1IGJ5dGVzIGxvbmcuCgpEYW5pZWwgU3RlbmJlcmcgKDExIERlYyAyMDA4KQotIEludGVybmV0IEV4cGxvcmVyIGhhZCBhIGJyb2tlbiBIVFRQIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBiZWZvcmUgdjcgYW5kCiAgdGhlcmUgYXJlIHNlcnZlcnMgIm91dCB0aGVyZSIgdGhhdCByZWxpZXMgb24gdGhlIGNsaWVudCBkb2luZyB0aGlzIGJyb2tlbgogIERpZ2VzdCBhdXRoZW50aWNhdGlvbi4gQXBhY2hlIGV2ZW4gY29tZXMgd2l0aCBhbiBvcHRpb24gdG8gd29yayB3aXRoIHN1Y2gKICBicm9rZW4gY2xpZW50cy4KCiAgVGhlIGRpZmZlcmVuY2UgaXMgb25seSBmb3IgVVJMcyB0aGF0IGNvbnRhaW4gYSBxdWVyeS1wYXJ0IChhICc/Jy1sZXR0ZXIgYW5kCiAgdGV4dCB0byB0aGUgcmlnaHQgb2YgaXQpLgoKICBsaWJjdXJsIG5vdyBzdXBwb3J0cyB0aGlzIHF1aXJrLCBhbmQgeW91IGVuYWJsZSBpdCBieSBzZXR0aW5nIHRoZQogIENVUkxBVVRIX0RJR0VTVF9JRSBiaXQgaW4gdGhlIGJpdG1hc2sgeW91IHBhc3MgdG8gdGhlIENVUkxPUFRfSFRUUEFVVEggb3IKICBDVVJMT1BUX1BST1hZQVVUSCBvcHRpb25zLiBUaGV5IGFyZSB0aHVzIGluZGl2aWR1YWxseSBjb250cm9sbGVkIHRvIHNlcnZlcgogIGFuZCBwcm94eS4KCiAgKG5vdGUgdGhhdCB0aGVyZSdzIG5vIHdheSB0byBhY3RpdmF0ZSB0aGlzIHdpdGggdGhlIGN1cmwgdG9vbCB5ZXQpCgpEYW5pZWwgRmFuZHJpY2ggKDkgRGVjIDIwMDgpCi0gQWRkZWQgdGVzdCBjYXNlcyAxMDg5IGFuZCAxMDkwIHRvIHRlc3QgLS13cml0ZS1vdXQgYWZ0ZXIgYSByZWRpcmVjdCB0bwogIHRlc3QgYSByZXBvcnQgdGhhdCB0aGUgc2l6ZSBkaWRuJ3Qgd29yaywgYnV0IHRoZXNlIHRlc3QgY2FzZXMgcGFzcy4KCi0gRG9jdW1lbnRlZCBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhcyBiZWluZyB1c2VmdWwgb25seSBvbiBIVFRQIFVSTHMuCgpEYW5pZWwgU3RlbmJlcmcgKDkgRGVjIDIwMDgpCi0gS2VuIEhpcnNjaCBzaW1wbGlmaWVkIGhvdyBsaWJjdXJsIGRvZXMgRlRQUzogbm93IGl0IGRvZXNuJ3QgYXNzdW1lIGFueQogIHBhcnRpY3VsYXIgc3RhdGUgZm9yIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gbGlrZSBpdCBkaWQgYmVmb3JlIGZvciBpbXBsaWNpdAogIEZUUFMgKGxpYmN1cmwgYXNzdW1lZCBzdWNoIGNvbnRyb2wgY29ubmVjdGlvbnMgdG8gYmUgZW5jcnlwdGVkIHdoaWxlIHNvbWUKICBGVFBTIHNlcnZlcnMgc3VjaCBhcyBGaWxlWmlsbGEgYXNzdW1lcyBzdWNoIGNvbm5lY3Rpb25zIHRvIGJlIGNsZWFyCiAgbW9kZSkuIFVzZSB0aGUgQ1VSTE9QVF9VU0VfU1NMIG9wdGlvbiB0byBzZXQgeW91ciBkZXNpcmVkIGxldmVsLgoKRGFuaWVsIFN0ZW5iZXJnICg4IERlYyAyMDA4KQotIEZyZWQgTWFjaGFkbyBwb3N0ZWQgYWJvdXQgYSB3ZWlyZCBGVFAgcHJvYmxlbSBvbiB0aGUgY3VybC11c2VycyBsaXN0IGFuZCB3aGVuCiAgcmVzZWFyY2hpbmcgaXQsIGl0IHR1cm5lZCBvdXQgaGUgZ290IGEgNTUwIHJlc3BvbnNlIGJhY2sgZnJvbSBhIFNJWkUgY29tbWFuZAogIGFuZCB0aGVuIEkgZmVsbCBvdmVyIHRoZSB0ZXh0IGluIFJGQzM2NTkgdGhhdCBzYXlzOgoKICAgVGhlIHByZXNlbmNlIG9mIHRoZSA1NTAgZXJyb3IgcmVzcG9uc2UgdG8gYSBTSVpFIGNvbW1hbmQgTVVTVCBOT1QgYmUgdGFrZW4KICAgYnkgdGhlIGNsaWVudCBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgY2Fubm90IGJlIHRyYW5zZmVycmVkIGluIHRoZQogICBjdXJyZW50IE1PREUgYW5kIFRZUEUuCgogIEluIG90aGVyIHdvcmRzOiB0aGUgY2hhbmdlIEkgZGlkIG9uIFNlcHRlbWJlciAzMHRoIDIwMDggYW5kIHRoYXQgaGFzIGJlZW4KICBpbmNsdWRlZCBpbiB0aGUgbGFzdCB0d28gcmVsZWFzZXMgd2VyZSBhIHJlZ3Jlc3Npb24gYW5kIGEgYmFkIGlkZWEuIFdlIE1VU1QKICBOT1QgdGFrZSBhIDU1MCByZXNwb25zZSBmcm9tIFNJWkUgYXMgYSBoaW50IHRoYXQgdGhlIGZpbGUgZG9lc24ndCBleGlzdC4KCi0gQ2hyaXN0aWFuIEtyYXVzZSBmaWxlZCBidWcgIzIyMjEyMzcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjIyMTIzNykgdGhhdCBpZGVudGlmaWVkIGFuIGluZmluaXRlCiAgbG9vcCBkdXJpbmcgR1NTIGF1dGhlbnRpY2F0aW9uIGdpdmVuIHNvbWUgc3BlY2lmaWMgY29uZGl0aW9ucy4gV2l0aCBoaXMKICBwYXRpZW5jZSBhbmQgZ3JlYXQgZmVlZGJhY2sgSSBtYW5hZ2VkIHRvIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtIGFuZAogIGV2ZW50dWFsbHkgZml4IGl0IGFsdGhvdWdoIEkgY2FuJ3QgdGVzdCBhbnkgb2YgdGhpcyBteXNlbGYhCgpEYW5pZWwgRmFuZHJpY2ggKDMgRGVjIDIwMDgpCi0gRml4ZWQgdGhlIGdldGlmYWRkcnMgdmVyc2lvbiBvZiBDdXJsX2lmMmlwIHRvIHdvcmsgb24gc3lzdGVtcyB3aXRob3V0IElQdjYKICBzdXBwb3J0IChlLmcuIE1pbml4KQoKRGFuaWVsIFN0ZW5iZXJnICgzIERlYyAyMDA4KQotIElnb3IgTm92b3NlbHRzZXYgZmlsZWQgYnVnICMyMzUxNjQ1CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTIzNTE2NDUpIHRoYXQgaWRlbnRpZmllZCBhIHByb2JsZW0gd2l0aAogIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBvY2N1cmVkIGlmIHlvdSByZW1vdmVkIGFuIGVhc3kgaGFuZGxlIHdoaWxlIGluCiAgcHJvZ3Jlc3MgYW5kIHRoZSBoYW5kbGUgd2FzIHVzZWQgaW4gYSBIVFRQIHBpcGVsaW5lLgoKLSBQYXdlbCBLaWVyc2tpIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29va2llIGNvZGUgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBiYWQgZmNsb3NlKCkgYWZ0ZXIgYSBmYXRhbCBlcnJvciBoYWQgb2NjdXJlZC4KICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjM4MjIxOSkKCkRhbmllbCBGYW5kcmljaCAoMjUgTm92IDIwMDgpCi0gSWYgYSBIVFRQIHJlcXVlc3QgaXMgQmFzaWMgYW5kIG51bSBpcyBhbHJlYWR5ID49MTAwMCwgdGhlIEhUVFAgdGVzdAogIHNlcnZlciBhZGRzIDEgdG8gbnVtIHRvIGdldCB0aGUgZGF0YSBzZWN0aW9uIHRvIHJldHVybi4gVGhpcyBhbGxvd3MKICB0ZXN0aW5nIGF1dGhlbnRpY2F0aW9uIG5lZ290aWF0aW9ucyB1c2luZyB0aGUgQmFzaWMgYXV0aGVudGljYXRpb24KICBtZXRob2QuCgotIEFkZGVkIHRlc3RzIDEwODcgYW5kIDEwODggdG8gdGVzdCBCYXNpYyBhdXRoZW50aWNhdGlvbiBvbiBhIHJlZGlyZWN0CiAgd2l0aCBhbmQgd2l0aG91dCAtLWxvY2F0aW9uLXRydXN0ZWQKCkRhbmllbCBTdGVuYmVyZyAoMjQgTm92IDIwMDgpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBWbGFkIEdyYWNob3YsIGxpYmN1cmwgbm93IHVzZXMgYSBuZXcgbGlic3NoMiAwLjE5CiAgZnVuY3Rpb24gd2hlbiBidWlsdCB0byBzdXBwb3J0IFNDUCBhbmQgU0ZUUCB0aGF0IGhlbHBzIHRoZSBsaWJyYXJ5IHRvIGtub3cKICBpbiB3aGljaCBkaXJlY3Rpb24gYSBwYXJ0aWN1bGFyIGxpYnNzaDIgb3BlcmF0aW9uIHdvdWxkIHJldHVybiBFQUdBSU4gc28KICB0aGF0IGxpYmN1cmwga25vd3Mgd2hhdCBzb2NrZXQgY29uZGl0aW9ucyB0byB3YWl0IGZvciBiZWZvcmUgdHJ5aW5nIHRoZQogIGZ1bmN0aW9uIGNhbGwgYWdhaW4uIFByZXZpb3VzbHkgKGFuZCBzdGlsbCB3aGVuIHVzaW5nIGxpYnNzaDIgMC4xOCBvcgogIGVhcmxpZXIpLCBsaWJjdXJsIHdpbGwgYnVzeS1sb29wIGluIHRoaXMgc2l0dWF0aW9uIHdoZW4gdGhlIGVhc3kgaW50ZXJmYWNlCiAgaXMgdXNlZCEKCkRhbmllbCBGYW5kcmljaCAoMjAgTm92IDIwMDgpCi0gQXV0b21hdGljYWxseSBkZXRlY3QgT3BlbkJTRCdzIENBIGNlcnQgYnVuZGxlLgoKRGFuaWVsIFN0ZW5iZXJnICgxOSBOb3YgMjAwOCkKLSBJIHJlbW92ZWQgdGhlIGRlZmF1bHQgdXNlIG9mICJQcmFnbWE6IG5vLWNhY2hlIiBmcm9tIGxpYmN1cmwgd2hlbiBhIHByb3h5IGlzCiAgdXNlZC4gSXQgaGFzIGJlZW4gdXNlZCBzaW5jZSBmb3JldmVyIGJ1dCBpdCB3YXMgbmV2ZXIgYSBnb29kIGlkZWEgdG8gdXNlCiAgdW5sZXNzIGV4cGxpY2l0bHkgYXNrZWQgZm9yLgoKLSBKb3NlZiBXb2xmJ3MgZXh0ZW5zaW9uIHRoYXQgYWxsb3dzIGEgJFRFU1RESVIvZ2RiaW5pdCR0ZXN0bnVtIGZpbGUgdGhhdCB3aGVuCiAgeW91IHVzZSBydW50ZXN0cy5wbCAtZywgd2lsbCBiZSBzb3VyY2VkIGJ5IGdkYiB0byBhbGxvdyBhZGRpdGlvbmFsIGZhbmN5IG9yCiAgd2hhdGV2ZXIgeW91IHNlZSBmaXQKCi0gQ2hyaXN0aWFuIEtyYXVzZSByZXBvcnRlZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IHdvdWxkIG9jY3VyIHdpdGggSFRUUAogIEdTUy9rZXJiZXJvcyBhdXRoZW50aWNhdGlvbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MjI4NDM4NikKCi0gQW5kcmVhcyBXdXJmIGFuZCBNYXJrdXMgS29ldHRlciBoZWxwZWQgbWUgYW5hbHl6ZSBhIHByb2JsZW0gdGhhdCBBbmRyZWFzIGdvdAogIHdoZW4gdXBsb2FkaW5nIGZpbGVzIHRvIGEgc2luZ2xlIEZUUCBzZXJ2ZXIgdXNpbmcgbXVsdGlwbGUgZWFzeSBoYW5kbGUKICBoYW5kbGVzIHdpdGggdGhlIG11bHRpIGludGVyZmFjZS4gT2NjYXNpb25hbGx5IGEgaGFuZGxlIHdvdWxkIHN0YWxsIGluCiAgbXlzdGVyaW91cyB3YXlzLgoKICBUaGUgcHJvYmxlbSB0dXJuZWQgb3V0IHRvIGJlIGEgc2lkZS1lZmZlY3Qgb2YgdGhlIENvbm5lY3Rpb25FeGlzdHMoKQogIGZ1bmN0aW9uJ3MgZWFnZXJuZXNzIHRvIHJlLXVzZSBhIGhhbmRsZSBmb3IgSFRUUCBwaXBlbGluaW5nIHNvIGl0IHdvdWxkCiAgc2VsZWN0IGl0IGV2ZW4gaWYgYWxyZWFkeSBiZWluZyBpbiB1c2UsIGR1ZSB0byBhbiBpbmFkZXF1YXRlIGNoZWNrIGZvciBpdHMKICBjaGFuY2VzIG9mIGJlaW5nIHVzZWQgZm9yIHBpcGVsbmluaW5nLgoKRGFuaWVsIEZhbmRyaWNoICgxNyBOb3YgMjAwOCkKLSBBZGRlZCBtb3JlIGNvbXBpbGVyIHdhcm5pbmcgb3B0aW9ucyBmb3IgZ2NjIDQuMwoKWWFuZyBUc2UgKDE3IE5vdiAyMDA4KQotIEZpeCBhIHJlbWFpbmluZyBwcm9ibGVtIGluIHRoZSBpbmV0X3B0b24oKSBydW50aW1lIGNvbmZpZ3VyZSBjaGVjay4gQW5kCiAgZml4IGludGVybmFsIEN1cmxfaW5ldF9wdG9uKCkgZmFpbHVyZXMgdG8gcmVqZWN0IGNlcnRhaW4gbWFsZm9ybWVkIGxpdGVyYWxzLgoKLSBNYWtlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgaWYgaW9jdGwgd2l0aCB0aGUgU0lPQ0dJRkFERFIgY29tbWFuZCBjYW4gYmUKICB1c2VkLCBhbmQgZGVmaW5lIEhBVkVfSU9DVExfU0lPQ0dJRkFERFIgaWYgYXBwcm9wcmlhdGUuCgpEYW5pZWwgU3RlbmJlcmcgKDE2IE5vdiAyMDA4KQotIENocmlzdGlhbiBLcmF1c2UgZml4ZWQgYSBidWlsZCBmYWlsdXJlIHdoZW4gYnVpbGRpbmcgd2l0aCBnc3Mgc3VwcG9ydAogIGVuYWJsZWQgYW5kIEZUUCBkaXNhYmxlZC4KCi0gQWRkZWQgY2hlY2sgZm9yIE5VTEwgcmV0dXJucyBmcm9tIHN0cmR1cCgpIGluIHNyYy9tYWluLmMgYW5kIGxpYi9mb3JtZGF0YS5jCiAgLSByZXBvcnRlZCBieSBKaW0gTWV5ZXJpbmcgYWxzbyBwcmV2ZW50IGJ1ZmZlciBvdmVyZmxvdyBvbiBNU0RPUyB3aGVuIHlvdSBkbwogIGZvciBleGFtcGxlIC1PIG9uIGEgdXJsIHdpdGggYSBmaWxlIG5hbWUgcGFydCBsb25nZXIgdGhhbiBQQVRIX01BWCBsZXR0ZXJzCgotIGxpYi9uc3MuYyBmaXhlcyBiYXNlZCBvbiB0aGUgcmVwb3J0IGJ5IEppbSBNZXllcmluZzogSSB3ZW50IG92ZXIgYW5kIGFkZGVkCiAgY2hlY2tzIGZvciByZXR1cm4gY29kZXMgZm9yIGFsbCBjYWxscyB0byBtYWxsb2MgYW5kIHN0cmR1cCB0aGF0IHdlcmUKICBtaXNzaW5nLiBJIGFsc28gY2hhbmdlZCBhIGZldyBtYWxsb2MoMTMpIHRvIHVzZSBhcnJheXMgb24gdGhlIHN0YWNrIGFuZCBhCiAgZmV3IG1hbGxvYyhQQVRIX01BWCkgdG8gaW5zdGVhZCB1c2UgYXByaW50ZigpIHRvIGxvd2VyIG1lbW9yeSB1c2UuCgotIEkgZml4ZWQgYSBtZW1vcnkgbGVhayBpbiBDdXJsX25zc19jb25uZWN0KCkgd2hlbiBDVVJMT1BUX0lTU1VFUkNFUlQgaXMKICBpbiB1c2UuCgpEYW5pZWwgRmFuZHJpY2ggKDE0IE5vdiAyMDA4KQotIEFkZGVkIC54bWwgYXMgb25lIG9mIHRoZSBmZXcgY29tbW9uIGZpbGUgZXh0ZW5zaW9ucyBrbm93biBieSB0aGUgbXVsdGlwYXJ0CiAgZm9ybSBnZW5lcmF0b3IuCgotIEFkZGVkIHNvbWUgI2lmZGVmcyBhcm91bmQgaGVhZGVyIGZpbGVzIGFuZCBjaGFuZ2UgdGhlIEVBR0FJTiB0ZXN0IHRvCiAgZml4IGNvbXBpbGF0aW9uIG9uIENlbGwgKHJlcG9ydGVkIGJ5IEplZmYgQ3VybGV5KS4KCllhbmcgVHNlICgxNCBOb3YgMjAwOCkKLSBGaXhlZCBzZXZlcmFsIGNvbmZpZ3VyZSBzY3JpcHQgaXNzdWVzIGFmZmVjdGluZyBjaGVja3MgZm9yIGluZXRfbnRvYV9yKCksCiAgaW5ldF9udG9wKCksIGluZXRfcHRvbigpLCBnZXRpZmFkZHJzKCksIGZjbnRsKCkgYW5kIGdldGFkZHJpbmZvKCkuCgpZYW5nIFRzZSAoMTMgTm92IDIwMDgpCi0gUmVmYWN0b3JlZCBjb25maWd1cmUgc2NyaXB0IGRldGVjdGlvbiBvZiBmdW5jdGlvbnMgdXNlZCB0byBzZXQgc29ja2V0cyBpbnRvCiAgbm9uLWJsb2NraW5nIG1vZGUsIGFuZCBkZWNvdXBsZSBmdW5jdGlvbiBkZXRlY3Rpb24gZnJvbSBmdW5jdGlvbiBjYXBhYmlsaXR5LgoK