ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8gICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX198IHwgfCB8ICBfIFx8IHwgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfCAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKF9ffCB8X3wgfCAgXyA8fCB8X19fIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxfX198XF9fXy98X3wgXF9cX19fX198CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGlzdG9yeSBvZiBDaGFuZ2VzCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDAxKQotIEZvdW5kIGFuZCByZW1vdmVkIGEgJ3NvY2tldCBsZWFrJyB0aGF0IHdvdWxkIG9jY3VyIG9uIElQdjYgZW5hYmxlZCBob3N0cwogIHdoZW4gRlRQIFJFVFIgZmFpbGVkLgoKLSBNYWRlIHRoZSBGVFAgdXBsb2FkIHRlc3RzIHJ1biBmaW5lIG9uIG1hY2hpbmVzIHdpdGggSVB2NiBlbmFibGVkLgoKVmVyc2lvbiA3LjktcHJlOAoKRGFuaWVsICgxOSBTZXB0ZW1iZXIgMjAwMSkKLSBWb2p0ZWNoIE1pbmFyaWsgc2V0IHVwIGEgc3BlY2lhbC1wdXJwb3NlIHRlc3Qgc2VydmVyIGFuZCBwcm92aWRlZCBtZSB3aXRoCiAgdGVzdCBjZXJ0aWZpY2F0ZXMgaW4gb3JkZXIgZm9yIG1lIHRvIHJlcGVhdCB0aGUgYnVnIHJlcG9ydHMgIzQ0MDA2OCBhbmQKICAjNDQwMzczLiBJdCB0dXJuZWQgb3V0IHdlIGRpZG4ndCBjaGVjayBhbGwgdGhlIGVycm9yIGNvZGVzIHByb3Blcmx5LiBXZSBkbwogIG5vdywgYW5kIGNvbm5lY3Rpbmcgd2l0aCBhIHVuYWNjZXB0YWJsZSBjZXJ0aWZpY2F0ZSB3aWxsIG1ha2UgbGliY3VybCBmYWlsCiAgdG8gY29ubmVjdCB3aXRoIGFuIGVycm9yIGNvZGUgcmV0dXJuZWQuCgotIFJhbWFuYSBNb2trYXBhdGkgZm91bmQgYSBjYXNlIHdoZW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgY29kZSBkaWQgd3JvbmcuCiAgSSB3cm90ZSBhIHRlc3QgY2FzZSBmb3IgdGhpcyAoNDUpLgoKVmVyc2lvbiA3LjktcHJlNwoKRGFuaWVsICgxNyBTZXB0ZW1iZXIgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGZpeGVkIHRlbG5ldCBmb3Igd2luMzIuIEl0IG1ha2VzIGxpYmN1cmwgcmVxdWlyZQogIHdpbnNvY2sgMi4wLgoKVmVyc2lvbiA3LjktcHJlNgoKLSBsaWJ0b29sIDEuNC4yIGlzIG5vdyBpbiB1c2UhCgpWZXJzaW9uIDcuOS1wcmU1CgpEYW5pZWwgKDE0IFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGFub3RoZXIgMTQgZnRwIHRlc3RzLgoKRGFuaWVsICgxMyBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgdG8gdGhlIGVhc3kuaCBoZWFkZXIgZmlsZS4gSXQgaGFzIG5vdyBiZWVuCiAgdGVzdGVkIGFuZCBwcm92ZWQgdG8gd29yayBpbiBhIHJlYWwtd29ybGQgdGVzdHMgYnkgVCBCaGFyYXRoLiBXZSBzdGlsbCBuZWVkCiAgdG8gd3JpdGUgdXAgc29tZSBkb2NzIGZvciB0aGlzIGZ1bmN0aW9uLgoKLSBBZGRlZCBmb3VyIG1vcmUgZnRwIHRlc3RzIHRvIHRoZSB0ZXN0IHN1aXRlLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIgMjAwMSkKLSBDVVJMT1BUX1NTTF9DSVBIRVJfTElTVCB3YXMgYWRkZWQsIGFuZCB0aGUgY3VybCB0b29sIG9wdGlvbiBpcyBuYW1lZAogIC0tY2lwaGVycy4gVXNlIHRoZW0gdG8gc3BlY2lmeSBhIGxpc3Qgb2YgY2lwaGVycyB0byB1c2UgaW4gdGhlIFNTTAogIGNvbm5lY3Rpb24uCgotIFQuIEJoYXJhdGggZm91bmQgYSBtZW1vcnkgbGVhayBpbiBsaWJjdXJsJ3Mgd2luZG93cyB2ZXJzaW9uLiBJdCB0dXJuZWQgb3V0CiAgdG8gYmUgdGhlIG5ldyBkdXBoYW5kbGUoKSB0aGF0IGRpZG4ndCBxdWl0ZSB3b3JrIHlldC4KClZlcnNpb24gNy45LXByZTQKCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdmVyYm9zZSBvdXRwdXQgZm9yIFNTTCBjb25uZWN0aW9ucyB0aGF0IG91dHB1dCB0aGUgc2VydmVyCiAgY2VydGlmaWNhdGUncyBzdGFydCBhbmQgZXhwaXJlIGRhdGVzLiBBcyBzdWdnZXN0ZWQgYnkgUGF1bCBIYXJyaW5ndG9uLgoKLSBIZWlra2kgS29ycGVsYSBmb3VuZCBwcm9ibGVtcyBpbiB0aGUgcGVybCBmdHAgc2VydmVyIHVzZWQgZm9yIHRoZSB0ZXN0CiAgc3VpdGUsIHdoZW4gaGUgcnVucyBvbiBvbiBPcGVuQlNEIHdpdGggcGVybCA1LjYuIFNvbWUgY2hhbmdlcyBoYXZlIGJlZW4KICBtYWRlLCBidXQgbm90aGluZyByZWFsbHkgY2VydGFpbi4KCi0gVC4gQmhhcmF0aCBoYXMgZXhwZXJpZW5jZWQgcHJvYmxlbXMgd2l0aCBsaWJjdXJsJ3Mgc3RhY2sgdXNhZ2Ugb24gd2luZG93cwogIGFuZCB3b3JrcyBvbiByZWR1Y2luZyBpdC4KCkRhbmllbCAoMTAgU2VwdGVtYmVyIDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBwZXJsIGludGVyZmFjZS4gSXQgc3RvcHBlZCB3b3JraW5nIHNpbmNlIHRoZSBjaGFuZ2VkCiAgYmVoYXZpb3Igd2l0aCBXUklURUhFQURFUiBhbmQgTlVMTCBwb2ludGVycy4KCi0gVGhlICJvdXRwdXQgY29va2llcyIgZnVuY3Rpb24gY291bGQgZHVtcCBjb3JlIGlmIG5vIGNvb2tpZXMgd2VyZSBlbmFibGVkLgoKRGFuaWVsICg3IFNlcHRlbWJlciAyMDAxKQotIFNNIHBvaW50ZWQgb3V0IHRoYXQgdGhlIFNTTCBjb2RlIGRpZG4ndCBjb21waWxlIGFueSBsb25nZXIgaWYgU1NMIHdhcwogIGRpc2FibGVkLi4uIEFsc28sIHdlIG5lZWRlZCB0byBjb3JyZWN0IHRoZSAjaW5jbHVkZSBmb3IgdGhlIHV0aW1lIHN0dWZmIG9uCiAgd2luZG93cy4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwMSkKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgU1NMIHNlc3Npb24gY2FjaGUgY29kZSB0aGF0IG1hZGUgaXQKICBzb21ldGltZXMgcmVhZCBmcm9tIGEgTlVMTCBwb2ludGVyLgoKVmVyc2lvbiA3LjktcHJlMwoKRGFuaWVsICgzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIHRoZSAtUi8tLXJlbW90ZS10aW1lIG9wdGlvbiwgdGhhdCB1c2VzIHRoZSByZW1vdGUgZmlsZSdzIGRhdGVzdGFtcCB0bwogIHNldCB0aGUgbG9jYWwgZmlsZSdzIGRhdGVzdGFtcC4gVGh1cywgd2hlbiB5b3UgZ2V0IGEgcmVtb3RlIGZpbGUgeW91ciBsb2NhbAogIGZpbGUgd2lsbCBnZXQgdGhlIHNhbWUgdGltZSBhbmQgZGF0ZS4gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyB3aGVuIHlvdSB1c2UKICAtbyBvciAtTy4KCi0gSW5zdGFsbGVkIGxpYnRvb2wgMS40LjEsIGxpYnRvb2xpemVkIGFuZCBldmVyeXRoaW5nLgoKRGFuaWVsICgxIFNlcHRlbWJlciAyMDAxKQotIEhlaWtraSBLb3JwZWxhIHBvaW50ZWQgb3V0IHRoYXQgSSBkaWQgbm90IHNoaXAgdGhlIHByb3BlciBsaWJ0b29sIHN0dWZmIGluIAogIHRoZSBwcmUtcmVsZWFzZXMsIGV2ZW4gdGhvdWdoIHRoYXQgd2FzIG15IGludGVudGlvbi4gbGlidG9vbGl6ZSBoYXMgbm93CiAgYmVlbiByZS1ydW4uCgotIEhlaWtraSBhbHNvIHBhdGNoZWQgYXdheSB0aGUgYmFkIHVzZSBvZiAnbWFrZSAtQycgaW4gdGhlIHRlc3Qgc3VpdGUKICBtYWtlZmlsZS4gbWFrZSAtQyBpcyBub3QgdmVyeSBwb3J0YWJsZSBhbmQgaXMgbm93IGJhbm5lZCBmcm9tIGhlcmUuCgpWZXJzaW9uIDcuOS1wcmUyCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAxKQotIEkganVzdCBtYWRlIGEgaHVnZSBpbnRlcm5hbCBzdHJ1Y3QgcmVoYXVsLCBhbmQgYWxsIHRoZSBiaWcgaW50ZXJuYWxseSB1c2VkCiAgc3RydWN0cyBoYXZlIGJlZW4gcmVuYW1lZCwgcmVkZXNpZ25lZCBhbmQgc3R1ZmYgaGF2ZSBiZWVuIG1vdmVkIGFyb3VuZCBhIGJpdAogIHRvIG1ha2UgdGhlIHNvdXJjZSBlYXNpZXIgdG8gZm9sbG93LCBtb3JlIGxvZ2ljYWxseSBncm91cGVkIGFuZCB0byBob3BlZnVsbHkKICBkZWNyZWFzZSBmdXR1cmUgYnVncy4gSSBhbHNvIGhvcGUgdGhhdCB0aGlzIHdpbGwgbWFrZSBuZXcgZnVuY3Rpb25zIHRvIGdldAogIGVhc2llciB0byBhZGQsIGFuZCBtYWtlIGl0IGxlc3MgbGlrZWx5IHRoYXQgd2UgaGF2ZSBidWdzIGxlZnQgbGlrZSB0aGUgVVJMLQogIGZyZWUgYnVnIGZyb20gQXVndXN0IDIzLgoKVmVyc2lvbiA3LjktcHJlMQoKRGFuaWVsICgyOSBBdWd1c3QgMjAwMSkKLSBUaGUgbmV3IGNvb2tpZSBjb2RlIGhhdmUgZW5hYmxlZCB0aGUgYnJhbmQgbmV3ICctYy8tLWNvb2tpZS1qYXInIG9wdGlvbi4gVXNlCiAgdGhhdCB0byBzcGVjaWZ5IHRoZSBmaWxlIG5hbWUgaW4gd2hpY2ggeW91IHdhbnQgdG8gaGF2ZSBhbGwgY29va2llcyBjdXJsCiAga25vd3Mgb2YsIGR1bXBlZCB0by4gSXQnbGwgYmUgd3JpdHRlbiB1c2luZyB0aGUgbmV0c2NhcGUgY29va2llIGZvcm1hdC4KCiAgVGhpcyBpcyBpbnRlcm5hbGx5IGRvbmUgd2l0aCB0aGUgbmV3IENVUkxPUFRfQ09PS0lFSkFSIG9wdGlvbiB0byBsaWJjdXJsLAogIHdoaWNoIGluIHR1cm4gZHVtcHMgdGhpcyBpbmZvcm1hdGlvbiB3aGVuIGN1cmxfZWFzeV9jbGVhbnVwKCkgaXMgaW52b2tlZC4KICBUaGVyZSBtaWdodCBiZSByZWFzb25zIHRvIHJlLWNvbnNpZGVyIG15IGNob2ljZSBvZiBwdXR0aW5nIGl0IHRoZXJlLiBQZXJoYXBzCiAgaXQgaXMgYmV0dGVyIHBsYWNlZCB0byBnZXQgZG9uZSBqdXN0IGJlZm9yZSAqX3BlcmZvcm0oKSBpcyBkb25lLiBJdCBpcyBhbGwKICBvZiBjb3Vyc2UgZGVwZW5kaW5nIG9uIGhvdyB5b3UgZ3V5cyB3YW50IHRvIHVzZSB0aGlzIGZlYXR1cmUuLi4KCi0gQWRkZWQgZnRwdXBsb2FkLmMgaW4gdGhlIHNvdXJjZSBleGFtcGxlcyBzZWN0aW9uLCBiYXNlZCBvbiBzb3VyY2UgY29kZSBwb3N0ZWQKICBieSBFcmljayBOdXdlbmRhbS4KCkRhbmllbCAoMjggQXVndXN0IDIwMDEpCi0gTm93IHJ1bm5pbmcgbGlidG9vbCBDVlMgYnJhbmNoLTEtNCB0byBnZW5lcmF0ZSBzdHVmZi4gU2hvdWxkIGZpeCBwcm9ibGVtcwogIG9uIE9wZW5CU0QgYW5kIGhvcGVmdWxseSBvbiBGcmVlQlNEIGFzIHdlbGwhCgotIEdlb3JnIEh1ZXR0ZW5lZ2dlciBtb2RpZmllZCB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb25hbGl0eSBzbGlnaHRseSwgYW5kCiAgYWRkZWQgc3VwcG9ydCBmb3IgZXJyb3IgY29kZSA0MTcgd2hlbiBkb2luZyBmb3JtIHBvc3QgYW5kIHVzaW5nIHRoZSBFeHBlY3Q6CiAgaGVhZGVyLiBHcmVhdCB3b3JrIQoKLSBNYWRlIHNvbWUgdGVzdHMgd2l0aCBjYWNoZWQgU1NMIHNlc3Npb24gSURzLCBhbmQgdGhleSBzZWVtIHRvIHdvcmsuIFRoZXJlCiAgc2hvdWxkIGJlIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQgaW4gdGhlIFNTTCBjb25uZWN0aW9uIHBoYXNlLCBidXQKICBpbiBteSB0aW55IHRlc3RzIGl0IGp1c3QgaXNuJ3QgcG9zc2libGUgdG8gbm90aWNlIGFueSBkaWZmZXJlbmNlLiBMaWtlIG90aGVyCiAgY2FjaGluZyBpbiBsaWJjdXJsLCB5b3UgbXVzdCByZXVzZSB0aGUgc2FtZSBoYW5kbGUgZm9yIHRoZSBjYWNoaW5nIHRvIHRha2UKICBlZmZlY3QuIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgaXMgZG9uZSBvbiBhIHBlciBob3N0LW5hbWUgYW5kIGRlc3RpbmF0aW9uCiAgcG9ydCBudW1iZXIgYmFzaXMuCgogIFNldCB2ZXJib3NlLCBhbmQgeW91J2xsIGdldCBpbmZvcm1hdGlvbmFsIHRlc3RzIHdoZW4gbGliY3VybCBkZXRlY3RzIGFuZAogIHVzZXMgYSBwcmV2aW91cyBTU0wgc2Vzc2lvbiBJRC4KCi0gVXBncmFkZWQgdG8gYXV0b21ha2UgMS41IG9uIG15IGRldmVsb3BtZW50L3JlbGVhc2UgbWFjaGluZS4KCkRhbmllbCAoMjcgQXVndXN0IDIwMDEpCi0gU2xvd2x5IHN0YXJ0ZWQgd3JpdGluZyBTU0wgc2Vzc2lvbiBJRCBjYWNoaW5nIGNvZGUKCkRhbmllbCAoMjQgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCByZW1vdmVkIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHdpbmRvd3MgYW5kIHVwZGF0ZWQgdGhlIE1TIHByb2plY3QKICBmaWxlcy4KCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0d28ga2luZHMgb2YgY29tbWFuZCBsaW5lIGNvbnN0cnVjdHMgd2l0aCB0aGUgbmV3IC1HIHRoYXQKICBjdXJsIGRpZG4ndCByZWFsbHkgZGVhbCB3aXRoIHRoZSB3YXkgb25lIHdvdWxkIGxpa2UuCgotIFRpbSBDb3N0ZWxsbyBwYXRjaGVkIGF3YXkgYSB1c2Ugb2Ygc3RyY2FzZWNtcCgpIGluIHRoZSBTU0wgY29kZS4gV2UgaGF2ZSBvdXIKICBvd24gcG9ydGFibGUgdmVyc2lvbiBuYW1lZCBzdHJlcXVhbCgpIHRoYXQgc2hvdWxkIGJlIHVzZWQhCgotIFRpbSBhbHNvIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSBpbiB0aGUgbGliL01ha2VmaWxlLnZjNiBmaWxlIHRoYXQgbWFkZSBpdCBtaXgKICBkZWJ1ZyBvYmplY3QgbW9kdWxlcyBjYXVzaW5nIGNvbmZ1c2lvbnMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDAxKQotIFQuIEJoYXJhdGggYWNjdXJhdGVseSBmb3VuZCBhIGxpYmN1cmwgYnVnIHRoYXQgd291bGQgaGFwcGVuIHdoZW4gZG9pbmcgYQogIHNlY29uZCBpbnZva2Ugb2YgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRoIGEgbmV3IFVSTCB3aGVuIHRoZSBwcmV2aW91cyBpbnZva2UKICBmb2xsb3dlZCBhIExvY2F0aW9uOiBoZWFkZXIuCgotIFN0YXJ0ZWQgdGhlIGltcHJvdmVtZW50IHdvcmsgb24gdGhlIGNvb2tpZSBlbmdpbmU6CiAgLSBOb3cga2VlcHMgY29va2llcyBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgY29va2llIGZpbGUKICAtIEEgd3JpdGUgdG8gdGhlIHBvc3NpYmx5IHN0YXRpYyBzdHJpbmcgd2FzIHJlbW92ZWQKICAtIEFkZGVkIGEgZnVuY3Rpb24gdGhhdCBjYW4gb3V0cHV0IGFsbCBjb29raWVzCiAgLSBOb3cgc3VwcG9ydHMgcmVhZGluZyBtdWx0aXBsZSBjb29raWUgZmlsZXMKCi0gU3RldmUgTGhvbW1lIGNvcnJlY3RlZCBhIERMTCBuYW1pbmcgaXNzdWUgaW4gdGhlIE1TVkMrKyBwcm9qZWN0IGZpbGUuCgotIFNwbGl0IHVwIHRoZSBtb25zdGVyIGZ1bmN0aW9uIGluIGxpYi9mdHAuYyB0byB1c2UgbW9yZSBzbWFsbGlzaCBmdW5jdGlvbnMgdG8KICBpbmNyZWFzZSByZWFkYWJpbGl0eSBhbmQgbWFpbnRhaW5hYmlsaXR5LgoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMSkKLSBHZW9yZyBIdWV0dGVuZWdnZXIncyBiaWcgcGF0Y2ggd2FzIGFwcGxpZWQuIE5vdyB3ZSBoYXZlOgogIG8gIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBzdXBwb3J0LiBXZSB3aWxsIGZyb20gbm93IG9uIHNlbmQgdGhhdCBoZWFkZXIgaW4KICAgIGFsbCByZmMxODY3LXBvc3RzLCBhcyB0aGF0IG1ha2VzIHVzIGFib3J0IG11Y2ggZmFzdGVyIHdoZW4gdGhlIHNlcnZlcgogICAgcmVqZWN0cyBvdXIgUE9TVC4gUG9zdGluZyB3aXRob3V0IHRoZSBFeHBlY3Q6IGhlYWRlciBpcyBzdGlsbCBwb3NzaWJsZSBpbgogICAgdGhlIHN0YW5kYXJkIHJlcGxhY2UtaW50ZXJuYWwtaGVhZGVyIHN0eWxlLgogIG8gY3VybF9mb3JtYWRkKCkgaXMgYSBuZXcgZm9ybXBvc3QgYnVpbGRpbmcgZnVuY3Rpb24gdGhhdCBpcyBpbnRyb2R1Y2VkIHRvCiAgICByZXBsYWNlIHRoZSBub3cgZGVwcmVjYXRlZCBjdXJsX2Zvcm1wYXJzZSgpIGZ1bmN0aW9uLiBUaGUgbGF0dGVyIGZ1bmN0aW9uCiAgICB3aWxsIHN0aWxsIGhhbmcgYXJvdW5kIGZvciBhIHdoaWxlLCBidXQgdGhlIGN1cmxfZm9ybWFkZCgpIGlzIHRoZSBuZXcgd2F5CiAgICBhbmQgY29ycmVjdCB3YXkgdG8gYnVpbGQgZm9ybSBwb3N0cy4KICBvIERvY3VtZW50YXRpb24gaGFzIGJlZW4gdXBkYXRlZCB0byByZWZsZWN0IHRoZXNlIGNoYW5nZXMKCiAgVGhlc2UgY2hhbmdlcyBhcmUgcmVhc29uIGVub3VnaCB0byBuYW1lIHRoZSBuZXh0IGN1cmwgcmVsZWFzZSA3LjkuLi4KCi0gV2Ugbm93IGNvbnZlcnQgbWFuIHBhZ2VzIHRvIEhUTUwgcGFnZXMgYW5kIGluY2x1ZGUgdGhlbSBpbiB0aGUgcmVsZWFzZQogIGFyY2hpdmUuIEZvciB0aGUgcGxlYXN1cmUgb2YgZXZlcnlvbmUgd2l0aG91dCBucm9mZiB3aXRoaW4gcmVhY2guCgotIEFuZHLpcyBHYXJj7WEncyBzdWdnZXN0ZWQgZmx1c2hpbmcgb2YgdGhlIHByb2dyZXNzIG1ldGVyIG91dHB1dCBzdHJlYW0gd2FzCiAgYWRkZWQuIEl0IHNob3VsZCBtYWtlIHRoZSBwcm9ncmVzcyBtZXRlciBsb29rIGJldHRlciBvbiBXaW5kb3dzLgoKLSBUcm95IEVuZ2VsIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbAogIG9uIG1hbnkgUmVkIEhhdCBib3hlcyEKCkRhbmllbCAoMjAgQXVndXN0IDIwMDEpCi0gV2UgbmVlZCBhbiB1cGRhdGVkIGxpYnRvb2wgdG8gbWFrZSBhIGJldHRlciBidWlsZCBlbnZpcm9ubWVudCBmb3IgT3BlbkJTRAogIGFzIHdlbGwgYXMgRnJlZUJTRAoKVmVyc2lvbiA3LjguMQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBCcmFkIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2hpcCB0d28gZXh0cmEgbGlidG9vbCBmaWxlcyBpbiB0aGUgdGFyYmFsbHMgdGhhdAogIHdlIHJlYWxseSBkb24ndCBuZWVkIHRvISBSZW1vdmluZyB0aGVtIG1ha2VzIHRoZSBnei1hcmNoaXZlIGFib3V0IDYwSwogIHNtYWxsZXIhCgotIEFsYmVydCBDaGluIGJyb3VnaHQgZml4ZXMgZm9yIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzb2NrbGVuX3QKICBwcm9wZXJseSBhcyB3ZWxsIGFzIG1vdmluZyBsb3RzIG9mIG91ciBjdXN0b20gYXV0b2NvbmYgbWFjcm9zIHRvCiAgYWNpbmNsdWRlLm00LgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwMSkKLSBNb29uZXNhbXkgaW1wcm92ZWQgaGlzIC1HIGZlYXR1cmUgZm9yIGhvc3QgbmFtZXMgb25seSBVUkxzLi4uCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDAxKQotIEZpbmFsbHkgY2xlYW5lZCB1cCB0aGUga2VyYmVyb3MgY29kZSB0byB1c2UgQ3VybF8gcHJlZml4ZXMgb24gYWxsIGdsb2JhbAogIHN5bWJvbHMgYW5kIHRvIG5vdCB1c2UgZ2xvYmFsIHZhcmlhYmxlcy4KClZlcnNpb24gNy44LjEtcHJlNgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwMSkKLSBTLiBNb29uZXNhbXkgYWRkZWQgdGhlIC1HIG9wdGlvbiB0byBjdXJsLCB0aGF0IGNvbnZlcnRzIHRoZSBkYXRhIHNwZWNpZmllZAogIHdpdGggLWQgdG8gYSBHRVQgcmVxdWVzdC4gRGVmYXVsdCBhY3Rpb24gd2hlbiB1c2luZyAtZCBpcyBQT1NULiBXaGVuIC1HIGlzCiAgdXNlZCwgdGhlIC1kIHNwZWNpZmllZCBkYXRhIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIFVSTCB3aXRoIGEgJz8nCiAgc2VwYXJhdG9yLiBBcyBzdWdnZXN0ZWQgcHJldmlvdXNseSBieSBLZXZpbiBSb3RoLgoKLSBjdXJsLWNvbmZpZyAtLWxpYnMgc2hvdWxkIG5vdyBkaXNwbGF5IGFsbCBsaW5rZXIgb3B0aW9ucyByZXF1aXJlZCB0byBsaW5rCiAgd2l0aCBsaWJjdXJsLiBJdCBpbmNsdWRlcyB0aGUgcGF0aCBhbmQgb3B0aW9ucyBmb3IgbGliY3VybCBpdHNlbGYuCiAgY3VybC1jb25maWcgLS1jZmxhZ3MgZGlzcGxheXMgdGhlIGNvbXBpbGVyIG9wdGlvbihzKSBuZWVkZWQgdG8gY29tcGlsZQogIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSBsaWJjdXJsIGZ1bmN0aW9ucy4gQmFzaWNhbGx5LCB0aGF0IHNldHMgdGhlIGluY2x1ZGUKICBwYXRoIGNvcnJlY3QuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDAxKQotIEFya2FkaXVzeiBNaXNraWV3aWN6IHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBpbiBob3cgSVB2Ni1zdHlsZSBJUC1hZGRyZXNzZXMKICB3ZXJlIHBhcnNlZCBhbmQgdXNlZC4gKFJGQzI3MzItZm9ybWF0KQoKLSBCdWcgIzEyNzMzIG92ZXIgb24gcGhwLm5ldCBpZGVudGlmaWVkIGEgcHJvYmxlbSBpbiBsaWJjdXJsIHRoYXQgbWFkZSBpdCBjb3JlCiAgZHVtcCBpZiB5b3UgdXNlZCBDVVJMT1BUX1BPU1Qgd2l0aG91dCBzZXR0aW5nIGFueSBkYXRhIHRvIHBvc3Qgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyEgVGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UuIE5vdCB1c2luZyBDVVJMT1BUX1BPU1RGSUVMRFMKICBub3cgZXF1YWxzIHNldHRpbmcgaXQgdG8gbm8gZGF0YSBhdCBhbGwuCgotIFJhbWFuYSBNb2trYXBhdGkgcmVwb3J0ZWQgdGhhdCBjdXJsIHdpdGggJy13ICV7aHR0cF9jb2RlfScgZGlkbid0IHdvcmsKICBwcm9wZXJseSB3aGVuIHVzZWQgZm9yIG11bHRpcGxlIFVSTHMgb24gYSBzaW5nbGUgY29tbWFuZCBsaW5lLiBJbmRlZWQsIHRoZQogIHZhcmlhYmxlIHdhcyBub3QgcmVzZXQgYmV0d2VlbiB0aGUgcmVxdWVzdHMuIFRoaXMgaXMgbm93IGZpeGVkLgoKLSBEYXZpZCBKYW1lcyBmaXhlZCB0aGUgQm9ybGFuZCBtYWtlZmlsZSBzbyB0aGF0IGxpYmN1cmwgc3RpbGwgY29tcGlsZXMgYW5kCiAgYnVpbGRzIHdpdGggdGhhdCBjb21waWxlci4KCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gT29wcy4gSSBydWluZWQgTmljbydzIHNvY2tsZW5fdCBkZWZpbmUgaW4gY29uZmlnLXZtcy5oLCBjb3JyZWN0ZWQgaXQgbm93LgoKLSBBbiBvbGRlciBpdGVtIG5vdCBtZW50aW9uZWQgaGVyZSBiZWZvcmU6IENVUkxfR0xPQkFMX1dJTjMyIGlzIGEgZGVmaW5lIGZvcgogIHdpbmRvd3MgdXNlcnMgdG8gY3VybF9nbG9iYWxfaW5pdCgpLCB0aGF0IG1ha2VzIGxpYmN1cmwgaW5pdCB0aGUgd2luc29jawogIHN0dWZmLiBJZiBsaWJjdXJsIGlzIGFsbCBzb2NrZXQgc3R1ZmYgeW91IGRvLCB0aGVuIGFsbG93aW5nIGl0IHRvIGZpZGRsZQogIHdpdGggdGhpcyBpcyBhIGNvbWZvcnRhYmxlIHNob3J0Y3V0IHRvIGZhbWUuCgpWZXJzaW9uIDcuOC4xLXByZTUKCkRhbmllbCAoMTQgQXVndXN0IDIwMDEpCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgbW9yZSBmZWVkYmFjayBmcm9tIGhpcyBWTVMgcG9ydGluZyBlZmZvcnRzIGFuZCBhIGZldwogIG1pbm9yIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnkuCgotIEkgbW9kaWZpZWQgY29uZmlndXJlLmluIHNvIHRoYXQgLS1lbmFibGUtZGVidWcgc2V0cyBtb3JlIHBpY2t5IGdjYyBvcHRpb25zLgogIEkgdGhlbiByZW1vdmVkIGFsbW9zdCBhbGwgdGhlIG5ldyB3YXJuaW5ncyB0aGF0IGFwcGVhcmVkLCBhbmQgYnkgZG9pbmcgc28gSQogIGNvcnJlY3RlZCB0aGUgc2l6ZV90LXRyZWF0ZWQtYXMtc2lnbmVkIHByb2JsZW0gdGhhdCBoYXMgYmVlbiBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0IHByZXZpb3VzbHkuIEkgYWxzbyByZW1vdmVkIGEgYnVuY2ggb2YgdGhlIGp1c3QgcmVjZW50bHkKICBhZGRlZCAjaWZkZWYgVk1TIGxpbmVzLgoKLSBJIHJlbW92ZWQgdGhlIHVzZSBvZiBhIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgU1NMIGNvZGUuIEl0IHdhcyBvbmNlCiAgbmVjZXNzYXJ5IGJ1dCBoYXNuJ3QgYmVlbiBuZWVkZWQgc2luY2UgT3BlblNTTCAwLjkuNC4gVGhlIG9sZCBjb2RlIHNob3VsZAogIChob3BlZnVsbHkpIHN0aWxsIHdvcmsgaWYgbGliY3VybCBpcyBidWlsdCBhZ2FpbnN0IGFuIGFuY2llbnQgdmVyc2lvbiBvZgogIE9wZW5TU0wuCgpEYW5pZWwgKDEzIEF1Z3VzdCAyMDAxKQotIFBldGVyIFRvZGQgcG9zdGVkIGEgcGF0Y2ggdGhhdCBub3cgYWxsb3dzIG5vbi1maWxlIHJjMTg2Ny1zdHlsZSBmb3JtIHBvc3RzCiAgdG8gYmUgbGFyZ2VyIHRoYW4gNEsuCgpEYW5pZWwgKDEwIEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBmaXhlZCBidWdzIGZvciBidWlsZGluZyBkZWJ1ZyBhbmQgU1NMIGxpYiBpbiBWQyBtYWtlZmlsZQoKRGFuaWVsICg5IEF1Z3VzdCAyMDAxKQotIFRoZSByZWRpcmVjdGVkIGVycm9yIHN0cmVhbSB3YXMgY2xvc2VkIGJlZm9yZSB0aGUgY3VybF9lYXN5X2NsZWFudXAoKSBjYWxsCiAgd2FzIG1hZGUsIGFuZCB3aGVuIFZFUkJPU0Ugd2FzIGVuYWJsZWQsIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIHRyaWVkIHRvIHVzZQogIHRoZSBzdHJlYW0uIEl0IGNvdWxkIGxlYWQgdG8gYSBzZWdtZW50YXRpb24gZmF1bHQuIEFsc28sIHRoZSBzdHJlYW0gd2FzCiAgY2xvc2VkIGV2ZW4gaWYgd2UgbG9vcGVkIHRvIGdldCBtb3JlIGZpbGVzLiAgQ29ycmVjdHMgRHVzdGluIEJvc3dlbGwncyBidWcKICByZXBvcnQgIzQ0MTYxMAoKLSBOb3cgZ2VuZXJhdGVzIHRoZSByZWxlYXNlIGNvbmZpZ3VyZSBzY3JpcHQgd2l0aCBhdXRvY29uZiAyLjUyCgpWZXJzaW9uIDcuOC4xLXByZTQKCkRhbmllbCAoOCBBdWd1c3QgMjAwMSkKLSBjdXJsIC1FIHVzZXMgYSBjb2xvbiB0byBzZXBhcmF0ZSBhIGZpbGUgbmFtZSBmcm9tIGEgcGFzc3BocmFzZS4gVGhpcyB0dXJuZWQKICBvdXQgcmVhbGx5IGJhZCBmb3IgdGhlIHdpbmRvd3MgcGVvcGxlIHdobyB3YW50cyB0byBpbmNsdWRlIGEgZHJpdmUgbGV0dGVyIGluCiAgdGhlIGZpbGUgbmFtZSBsaWtlICJjOlxjZXJ0LnBlbSIuIFRoZXJlJ3Mgbm93IGEgd2luMzIgd29yay1hcm91bmQKICBpbXBsZW1lbnRlZCB0aGF0IHRyaWVzIHdvcmsgYXJvdW5kIHRoYXQsIHdoZW4gdGhlIGNvbG9uIHNlZW1zIHRvIGJlIHVzZWQgZm9yCiAgdGhpcyBraW5kIG9mIGNvbnN0cnVjdC4KCi0gUGF0cmljayBCaWhhbi1GYW91IGludHJvZHVjZWQgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCwgd2hpY2ggbWFrZXMgY3VybAogIHZlcmlmeSB0aGUgc2VydmVyJ3MgQ04gZmllbGQgd2hlbiB0YWxraW5nIGh0dHBzOi8vLiBJZiAtLWNhY2VydCBpcyBub3QgdXNlZCwKICBhbnkgZmFpbHVyZXMgaW4gbWF0Y2hpbmcgaXMgb25seSBkaXNwbGF5ZWQgYXMgaW5mb3JtYXRpb24gKC12KS4KCkRhbmllbCAoNyBBdWd1c3QgMjAwMSkKLSBXcm90ZSB1cCBuaW5lIG1vcmUgdGVzdCBjYXNlcywgbW9yZSBvciBsZXNzIGNvbnZlcnRlZCBmcm9tIHRoZSBmb3JtZXIgdGVzdAogIHN1aXRlLgoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEhlaWtraSBLb3JwZWxhIHBvc3RlZCBhIHBhdGNoIHRoYXQgbWFrZXMgJ2N1cmwtY29uZmlnIC0tbGlicycgaW5jbHVkZSB0aGUKICBkaXJlY3RvcnkgaW4gd2hpY2ggbGliY3VybCBpdHNlbGYgaXMgaW5zdGFsbGVkIGluLiBXaGlsZSB0aGlzIHdhc24ndCBteQogIGluaXRpYWwgaW50ZW50aW9uIHdpdGggdGhpcyBvcHRpb24sIGl0IG1ha2VzIHNlbnNlIGFuZCBtYWtlcyBsaW5raW5nIHdpdGgKICBsaWJjdXJsIGVhc2llci4KCi0gU3RlZmFuIFVscmljaCBwb2ludGVkIG91dCB0byB1cyB0aGF0IG90aGVyIHRvb2xzIGFuZCBsaWJyYXJpZXMgdHJlYXQgZmlsZTovLwogIFVSTHMgd2l0aCBvbmx5IG9uZSBzbGFzaCBhZnRlciB0aGUgaG9zdCBuYW1lIHNsaWdobHkgZGlmZmVyZW50IHRoYW4gbGliY3VybAogIGRvZXMuIFNpbmNlIGFsbCB0aGUgb3RoZXJzIHNlZW0gdG8gYWdyZWUsIHdlIGJldHRlciBmb2xsb3cgdGhlbS4KCi0gTmljbyBCYWdndXMgcHJvdmlkZWQgdXMgd2l0aCBhIGh1Z2Ugc2V0IG9mIGZpeGVzIHRvIG1ha2UgY3VybCBjb21waWxlIGFuZAogIGJ1aWxkIHVuZGVyIE9wZW5WTVMuCgpWZXJzaW9uIDcuOC4xLXByZTMKCkRhbmllbCAoNiBBdWd1c3QgMjAwMSkKLSBKb25hdGhhbiBIc2V1IG5vdGljZWQgdGhhdCB5b3UgY291bGRuJ3QgZ2V0IGEgaGVhZGVyIGNhbGxiYWNrIHVubGVzcyB5b3UKICBzZXQgQ1VSTE9QVF9XUklURUhFQURFUiB0byBub24tTlVMTCwgZXZlbiBpZiB5b3UgZGlkbid0IGNhcmUgYWJvdXQgdGhhdAogIGRhdGEuIFRoaXMgaXMgbm93IGZpeGVkLgoKRGFuaWVsICg1IEF1Z3VzdCAyMDAxKQotIFNlcmdpbyBCYWxsZXN0cmVybyBwcm92aWRlZCBhIHBhdGNoIGZvciByZWFkaW5nIHJlc3BvbnNlcyBmcm9tIE5DU0EgaHR0cGQKICAxLjUueCBzZXJ2ZXJzLCBhcyB0aGV5IHJldHVybiByZWFsbHkgc2NyZXdlZCB1cCByZXNwb25zZSBoZWFkZXJzIHdoZW4gYXNrZWQKICBmb3Igd2l0aCBIVFRQIDEuMS4KCi0gY3VybF9lc2NhcGUoKSBubyBsb25nZXIgdHJlYXRzIGFscmVhZHkgZW5jb2RlZCBjaGFyYWN0ZXJzIGluIHRoZSBpbnB1dAogIHN0cmluZyBlc3BlY2lhbGx5LgoKRGFuaWVsICgzIEF1Z3VzdCAyMDAxKQotIEkgcmVwbGFjZWQgdGhlIGZvcm1lciBsaWIvYXJwYV90ZWxuZXQuaCBmaWxlIHdpdGggb25lIEkgd3JvdGUgbXlzZWxmLCB0bwogIGF2b2lkIHRoZSBCU0QgYW5ub3VjZW1lbnQgY2xhdXNlIG9mIHRoZSBsaWNlbnNlIGluIHRoZSBmb3JtZXIgZmlsZS4KCi0gQW5kcmV3IEZyYW5jaXMgcHJvdmlkZWQgYSBuZXcgdmVyc2lvbiBvZiBiYXNlNjQuYyB0byB3b3JrIGFyb3VuZCB0aGUgbGljZW5zZQogIGJvaWxlciBwbGF0ZSB0aGF0IGNhbWUgd2l0aCB0aGUgcHJldmlvdXMgb25lLiBJIHBhdGNoZWQgaXQsIGJ1dCB0aGUgZ2xvcnkKICBzaG91bGQgZ28gdG8gQW5kcmV3IGZvciBoaXMgaGVhZHMgdXAuCgotIFRvbWFzeiBMYWNraSBub3RpY2VkIHRoYXQgd2hlbiB5b3UgZG8gcmVwZWF0ZWQgdHJhbnNmZXJzIHdpdGggbGliY3VybCB5b3UKICBjb3VsZG4ndCBhbHdheXMgcmVsaWFibHkgY2hhbmdlIEhUVFAgcmVxdWVzdC4gVGhpcyBoYXMgbm93IGJlZW4gZml4ZWQgYW5kIGEKICBuZXcgbGliY3VybCBvcHRpb24gd2FzIGFkZGVkOiBDVVJMT1BUX0hUVFBHRVQsIHRoYXQgY2FuIGZvcmNlIHRoZSBIVFRQCiAgcmVxdWVzdHIgKGJhY2spIHRvIEdFVC4KCi0gTGludXMgTmllbHNlbiBGZWx0emluZyBwb2ludGVkIG91dCB0aGF0IGh0dHBzc2VydmVyLnBsIHdhc24ndCBpbmNsdWRlZCBpbgogIHJlbGVhc2UgYXJjaGl2ZXMuIEl0IHNob3VsZCBiZSBub3cuCgpEYW5pZWwgKDIgQXVndXN0IDIwMDEpCi0gRnJhbmsgS2VlbmV5IHBvaW50ZWQgb3V0IGEgbWFudWFsIG1pc3Rha2UgZm9yIGNlcnRpZmljYXRlIGNvbnZlcnRpb25zLgoKLSBUb21hc3ogTGFja2kgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSB0cmFuc2ZlciBsb29wIHRoYXQgY291bGQgbWFrZSB0aGUKICBzZWxlY3QoKSBsb29wIHVzZSBmYXIgdG9vIG11Y2ggQ1BVLgoKLSBQYXdlbCBBLiBHYWpkYSBwb2ludGVkIG91dCBhbiBvdXRwdXQgbWlzdGFrZSBkb25lIHdoZW4gdXNpbmcgbGliY3VybCdzCiAgcHJvZ3Jlc3MgY2FsbGJhY2suCgpEYW5pZWwgKDI5IEp1bmUgMjAwMSkKLSBOYXZlZW4gTm9lbCBub3RpY2VkIHRoYXQgdGhlIEJvcmxhbmQgbGlicmFyeSBtYWtlZmlsZSB3YXNuJ3QgdXBkYXRlZC4KCi0gTmljIFJvZXRzIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gd2hlbiB1c2luZyBTU0wuCgpEYW5pZWwgKDI3IEp1bmUgMjAwMSkKLSBNYWRlIHRoZSBGVFAgdGVzdHMgcnVuIE9LIGV2ZW4gb24gbWFjaGluZXMgcnVubmluZyBjdXJsIElQdjYtZW5hYmxlZC4KCi0gVHJveSBFbmdlbCBjb3JyZWN0ZWQgc29tZSBSUE0gcGFja2FnZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjguMS1wcmUyCgpEYW5pZWwgKDI1IEp1bmUgMjAwMSkKLSBCavZybiBTdGVuYmVyZyBjb3JyZWN0bHkgaWRlbnRpZmllZCBhIHByb2JsZW0gdGhhdCBvY2N1cnJlZCB3aGVuIGRvd25sb2FkaW5nCiAgc2V2ZXJhbCBmaWxlcyB3aXRoIGN1cmwsIGFuZCB1c2luZyByZXN1bWUuIFRoZSBmaXJzdCBmaWxlJ3MgcmVzdW1lIGluZGV4IHdhcwogIHRoZW4gdXNlZCBmb3IgYWxsIGZpbGVzLCByZXN1bHRpbmcgaW4gd2VpcmQgcmVzdWx0cy4uLgoKLSBBbnRvbiBLYWxteWtvdiBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGN1cmwgd29yayB3aXRoIGZvcm0gZmllbGQgbmFtZXMKICB3aXRoIHNwYWNlcyBsaWtlIHdoZW4gLUYgaXMgdXNlZC4KClZlcnNpb24gNy44LjEtcHJlMQoKRGFuaWVsICgyMCBKdW5lIDIwMDEpCi0gTWlrZSBCeXRuYXIgcHJvdmlkZWQgYSBmaW5lIHJlcG9ydCB0aGF0IHByb3ZlZCB0aGF0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbgogIGZvciBjb25maWd1cmUgbmVlZGVkIHR3ZWFraW5nLiBJdCBubyBsb25nZXIgc2VhcmNoZXMgdGhlIGRlZmF1bHQgZGlyZWN0b3JpZXMKICBmb3IgT3BlblNTTCBsaWJzIG9yIGRpcmVjdG9yaWVzIHdoZW4gYSBzcGVjaWZpZWQgcGF0aCBpcyBnaXZlbi4KCkRhbmllbCAoMTkgSnVuZSAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIGlzIGN1dCBvZmYgZHVyaW5nIHRyYW5zZmVyLCBjdXJsIGNvdWxkIHByZXNlbnQgYSB0cnVseQogIGdhcmJhZ2VkIGVycm9yIG1lc3NhZ2UgYW5kIGluIHdvcnN0IGNhc2UgZHVtcCBjb3JlLiBUaGFua3MgdG8gZGV0YWlsZWQKICByZXBvcnRzIGZyb20gU2hhd24gUG91bHNvbiB3ZSBuYWlsZWQgdGhpcy4KCkRhbmllbCAoMTIgSnVuZSAyMDAxKQotIFNhbHZhZG9yIEThdmlsYSBwcm92aWRlZCBhIGZpeCBmb3IgRlRQIHJhbmdlIGRvd25sb2Fkcy4KCi0gQWRkZWQgYSBmZXcgbW9yZSB0ZXN0IGNhc2VzIGZyb20gdGhlIGZvcm1lciB0ZXN0IHN1aXRlIHRvIHRoZSBuZXcgZmlsZQogIGZvcm1hdC4gV2UncmUgbm93IGF0IGEgdG90YWwgb2YgMjYgdGVzdHMuCgpEYW5pZWwgKDExIEp1bmUgMjAwMSkKLSBsaWJjdXJsJ3MgdmVyc2lvbi1pbmZvIHdhcyB3cm9uZywgYXMgbm90ZWQgYnkgYm90aCBEb21lbmljbyBBbmRyZW9saSBhbmQKICBEYXZpZCBPZGluLgoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBK9nJuIGZpeGVkIHRoZSBjdXJsX3VuZXNjYXBlIGR1cGxpY2F0ZSBlbnRyeSBpbiBsaWIvbGliY3VybC5kZWYKCi0gSSBtYWRlIFNTTCBjZXJ0aWZpY2F0ZSBmYWlsdXJlIG1lc3NhZ2VzIHRvIGJlIG1vcmUgZGV0YWlsZWQuCgpWZXJzaW9uIDcuOAoKRGFuaWVsICg3IEp1bmUgMjAwMSkKLSBTRGF2aWxhIHByb3ZpZGVkIGEgcmVzdW1lZCBkb3dubG9hZCBmaXguCgpWZXJzaW9uIDcuOC1wcmU0CgpEYW5pZWwgKDEgSnVuZSAyMDAxKQotIFN0ZXJsaW5nIHByb3ZpZGVkIHNvbWUgbmV3IFBIUCBleGFtcGxlcy4KCi0gQ2hhbmdlZCB0aGUgQ1ZTIGhpZXJhcmNoeSBhbmQgdGhlIG9sZGVyIGNoZWNrb3V0IGluc3RydWN0aW9uIGRvZXMgbm8gbG9uZ2VyCiAgd29yay4gV2UgbW92ZWQgdGhlIGVudGlyZSBzb3VyY2UgY29kZSBpbnRvIGEgQ1ZTIG1vZHVsZSBuYW1lZCAnY3VybCcuCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIENVUkxPUFRfTVVURSBkb2VzIG5vdCBleGlzdCBhbnltb3JlLiBJdCBpcyBzdGlsbCBwcmVzZW50IGluIHRoZSBpbmNsdWRlIGZpbGUKICB0byBub3QgY2F1c2UgY29tcGlsZXIgZXJyb3JzIGZvciBhcHBsaWNhdGlvbnMgdXNpbmcgaXQsIGJ1dCBpdCBpc24ndCB1c2VkCiAgYW55d2hlcmUgaW4gdGhlIGxpYnJhcnkuCgpWZXJzaW9uIDcuOC1wcmUzCgpEYW5pZWwgKDMxIE1heSAyMDAxKQotIE9uY2UgYW5kIGZvciBhbGwgZml4ZWQgdGhlIF9SRUVOVFJBTlQgbWVzcyBmb3IgU29sYXJpcyBjb21waWxlcyB0byBwcmVzZW50CiAgbGVzcyB3YXJuaW5ncy4KCi0gU3RlcmxpbmcgSHVnaGVzIHRpcmVsZXNzbHkgcG9pbnRzIG91dCBhbmQgY29ycmVjdHMgbXkgbWlzdGFrZXMuLi4hIFNvLAogIGN1cmxfZ2xvYmFsX2luaXQoKSBub3cgbGV0cyB0aGUgYXJndW1lbnQgZmxhZ3MgKlNFVCogd2hhdCBwYXJ0cyB0bwogIGluaXQuIENVUkxfR0xPQkFMX0RFRkFVTFQgbWFrZXMgYSBuaWNlIGRlZmF1bHQsIENVUkxfR0xPQkFMX0FMTCBpbml0cyBhbGwKICBrbm93biBzdWJzeXN0ZW1zIGFuZCBDVVJMX0dMT0JBTF9OT05FIGluaXRzIG5vdGhpbmcgbW9yZSB0aGFuIGFic29sdXRlbHkKICBuZWNlc3NhcnkuIE1hbiBwYWdlIHVwZGF0ZWQgYWNjb3JkaW5nbHkuCgotIEZpeGVkIHRoZSBzdHJ0b2suaCBpbmNsdWRlIGZpbGUgYXMgaXQgd291bGRuJ3QgY29tcGlsZSBvbiBhbGwgcGxhdGZvcm1zIQoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBNYWRlIGxpYmN1cmwgYnkgZGVmYXVsdCBhY3QgYXMgaWYgQ1VSTE9QVF9NVVRFIGFuZCBDVVJMT1BUX05PUFJPR1JFU1Mgd2VyZQogIHNldCBUUlVFLiBTZXQgdGhlbSB0byBGQUxTRSB0byBtYWtlIGxpYmN1cmwgbW9yZSB0YWxrYXRpdmUuIFRoZSAqX01VVEUKICBvcHRpb24gaXMgc3ViamVjdCBmb3IgY29tcGxldGUgcmVtb3ZhbC4uLgoKVmVyc2lvbiA3LjgtcHJlMgoKRGFuaWVsICgzMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgd3JvdGUgYSBtYWtlZmlsZSBmb3IgYnVpbGRpbmcgU29sYXJpcyBwYWNrYWdlcy4KCi0gU3RlcmxpbmcgSHVnaGVzIGJyb3VnaHQgZml4ZXMgZm9yICdidWlsZGNvbmYnICh0aGUgYnVpbGQtZnJvbS1DVlMgdG9vbCkgYW5kCiAgd2UgZGlzY3Vzc2VkIGFuZCBhZGRlZCBhIGZldyBDVVJMX0dMT0JBTF8qIGZsYWdzIGluIGluY2x1ZGUvY3VybC5oCgotIEtqZXRpbCBKYWNvYnNlbiBwcml2YXRlbHkgYW5ub3VuY2VkIGhpcyBweXRob24gaW50ZXJmYWNlIHRvIGxpYmN1cmwsCiAgYXZhaWxhYmxlIGF0IGh0dHA6Ly9weWN1cmwuc291cmNlZm9yZ2UubmV0LwoKRGFuaWVsICgyOSBNYXkgMjAwMSkKLSBTdGVybGluZyBIdWdoZXMgZml4ZWQgYSBzdHJ0b2soKSBwcm9ibGVtIGluIGxpYmN1cmwuIEl0IGlzIG5vdCBhIHRocmVhZC0KICBzYWZlIGZ1bmN0aW9uLiBOb3cgY29uZmlndXJlIGNoZWNrcyBmb3IgYSB0aHJlYWQtc2FmZSB2ZXJzaW9uLCBhbmQKICBsaWIvc3RydG9rLmMgb2ZmZXJzIG9uZSBmb3IgdGhlIHN5c3RlbXMgdGhhdCBkb24ndCBjb21lIHdpdGggb25lIGluY2x1ZGVkIQoKLSBNZXR0Z3V0IEphbWFsbGEgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIC0jIHByb2dyZXNzIGJhciB3YXMgd3JpdHRlbgogIHRvIHN0ZGVyciBldmVuIHRob3VnaCAtLXN0ZGVyciByZWRpcmVjdGlvbiB3YXMgdXNlZC4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKLSBJIG1vdmVkIG91dCB0aGUgbGlzdCBvZiBjb250cmlidXRvcnMgZnJvbSB0aGUgY3VybC4xIG1hbiBwYWdlIGFuZCBtYWRlIGEKICBzZXBhcmF0ZSBkb2NzL1RIQU5LUyBmaWxlLiBJdCBtYWtlcyB0aGUgbGlzdCBlYXNpZXIgdG8gZmluZCwgYW5kIG1hZGUgaXQKICBlYXNpZXIgZm9yIG1lIHRvIG1ha2UgYSBzZXBhcmF0ZSB3ZWIgcGFnZSB3aXRoIHRoYXQgc2FtZSBpbmZvcm1hdGlvbi4KCiAgSSByZWFsbHkgZG8gd2FudCBhbGwgeW91IGd1eXMgbWVudGlvbmVkIGluIHRoZXJlIHRvIGZlZWwgeW91IGdldCB0aGUgY3JlZGl0CiAgeW91IGRlc2VydmUuCgotIGxpYi9lYXN5LmMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgaW4gdGhlIDcuOC1wcmUxIGR1ZSB0byBhIHNpbGx5IG1pc3Rha2UKClZlcnNpb24gNy44LXByZTEKCkRhbmllbCAoMjggTWF5IDIwMDEpCi0gY3VybC1jb25maWcgbm93IHN1cHBvcnRzICctLXZlcm51bScgdGhhdCBvdXRwdXRzIGEgcGxhaW4gaGV4YWRlY2ltYWwgdmVyc2lvbgogIG9mIHRoZSBsaWJjdXJsIHZlcnNpb24gbnVtYmVyICh1c2luZyA4IGJpdHMgZm9yIGVhY2ggMyBudW1iZXJzKS4gVmVyc2lvbgogIDcuNy40IGFwcGVhcnMgYXMgMDcwNzA0CgotIFdyb3RlIG1hbiBwYWdlcyBmb3IgY3VybF9nbG9iYWxfaW5pdCBhbmQgY3VybF9nbG9iYWxfY2xlYW51cC4uLgoKLSBULiBCaGFyYXRoIGJyb3VnaHQgbmV3cyBhYm91dCB0aGUgdXNhZ2Ugb2YgdGhlIE9wZW5TU0wgaW50ZXJmYWNlIHRoYXQgd2FzCiAgbm90IHByZXZpb3VzbHkgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIGFuZCB0aHVzIGNhdXNlZCBsaWJjdXJsIHRvIGxlYWsKICBtZW1vcnkuICBUaGUgb25seSBzb21ld2hhdCBzYW5lIGFwcHJvYWNoIHRvIGZpeCB0aGlzIGRpbGVtbWEsIGlzIGFkZGluZyB0d28KICB0d28gbmV3IGZ1bmN0aW9ucyBjdXJsX2dsb2JhbF9pbml0KCkgYW5kIGN1cmxfZ2xvYmFsX2NsZWFudXAoKSB0aGF0IHNob3VsZAogIGJlIGNhbGxlZCAqT05DRSogYnkgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIGxpYmN1cmwuIFRoZSBpbml0IHNob3VsZCBiZSBkb25lCiAgb25seSBhdCBzdGFydHVwLCBubyBtYXR0ZXIgaG93IG1hbnkgdGhyZWFkcyB0aGUgYXBwbGljYXRpb24gaXMgZ29ubmEgdXNlLAogIGFuZCB0aGUgY2xlYW51cCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGFwcGxpY2F0aW9uIGhhcyBmaW5pc2hlZCB1c2luZwogIGxpYmN1cmwgY29tcGxldGVseS4KCiAgKioqIFVQR1JBREUgTk9USUNFICoqKgoKICBJZiB5b3Ugd3JpdGUgYXBwbGljYXRpb25zIHVzaW5nIGxpYmN1cmwsIHlvdSByZWFsbHkgd2FudCB0byB1c2UgdGhlIHR3bwogIGZ1bmN0aW9ucyBtZW50aW9uZWQgYWJvdmUgISEhCgogIEkgY2FuJ3Qgc2F5IEkgdGhpbmsgdGhpcyBpcyBhIHZlcnkgYmVhdXRpZnVsIHNvbHV0aW9uLCBidXQgYXMgT3BlblNTTAogIGluc2lzdHMgb24gbWFraW5nIGxvdHMgb2Ygc3R1ZmYgb24gYSAiZ2xvYmFsIiBzY29wZSwgd2UncmUgZm9yY2VkIHRvIHdhbGsKICB0aGUgcGF0aCB0aGV5IHBvaW50IHVzIHRvLgoKLSBNb3ZpbmcgbW9yZSB0ZXN0IGNhc2VzIGludG8gdGhlIG5ldyBmaWxlIGZvcm1hdC4KClZlcnNpb24gNy43LjQtcHJlMwoKRGFuaWVsICgyMyBNYXkgMjAwMSkKLSBJbnRyb2R1Y2VkIGEgbmV3IGZpbGUgZm9ybWF0IGZvciBzdG9yaW5nIHRlc3QgY2FzZXMsIGFuZCB0aHVzIEkgaGFkIHRvCiAgbW9kaWZ5IGFsbCB0aGUgcGVybCB0ZXN0IHNjcmlwdHMgYW5kIG1vcmUgKEkgYWRkZWQgYSBuZXcgb25lKS4gSSBoYXZlIG5vdAogICJwb3J0ZWQiIGFsbCB0aGUgb2xkIHRlc3QgY2FzZXMgdG8gdGhlIG5ldyBmb3JtYXQgeWV0LCBidXQgaXQnbGwgY29tZS4KCiAgVGhlIG1haW4gYWR2YW50YWdlIG9mIHRoaXMgbmV3IGZvcm1hdCBpcyB0aGF0IGFsbCB0ZXN0IGRhdGEgZm9yIGVhY2ggdGVzdAogIGNhc2UgaXMgc3RvcmVkIGluIGEgc2luZ2xlIGZpbGUuIEl0IGdpdmVzIGEgYmV0dGVyIG92ZXJ2aWV3IGZvciBlYWNoIHRlc3QKICBjYXNlIGFuZCBhIGxvdCBsZXNzIGZpbGVzLgoKLSBBbmRy6XMgR2FyY+1hIGJyb3VnaHQgYSBmaXggZm9yIHRoZSBuZXRzY2FwZS9tb3ppbGxhIGNvb2tpZSBmaWxlIHBhcnNpbmcKICBmdW5jdGlvbiwgYXMgaXQgdHVybnMgb3V0IGl0IGRvZXNuJ3QgYWx3YXlzIHN0b3JlIHRoZSBwYXRoIQoKRGFuaWVsICgyMiBNYXkgMjAwMSkKLSBBcyB3YXMgcmVwb3J0ZWQgYW5vbnltb3VzbHksIHdoZW4gRkFJTE9ORVJST1Igd2FzIHVzZWQsIHRoZSBodHRwY29kZSB3YXMKICBub3Qgc3RvcmVkIHByb3Blcmx5IGFuZCB0aHVzIHdhc24ndCBwb3NzaWJseSB0byByZWFkIGFmdGVyIGEgdHJhbnNmZXIgd2l0aAogIHRoZSBjdXJsX2Vhc3lfZ2V0aW5mbygpIGZ1bmN0aW9uLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEluc3RhbGxlZCBhbmQgbWFkZSB1c2Ugb2YgdGhlIGZvbGxvd2luZyB0b29sIHZlcnNpb25zOgogICAgYXV0b2NvbmYgMi41MAogICAgbGlidG9vbCAxLjQKICAgIGF1dG9tYWtlIDEuNC1wMQoKICBJIHdvdWxkbid0IHJlY29tbWVuZCBhbnkgZGV2ZWxvcGVyIHRvIHRyeSB0byBnZW5lcmF0ZSB0aGluZ3Mgd2l0aCBvbGRlcgogIHZlcnNpb25zIHRoYW4gdGhlc2UuIEJ1aWxkaW5nIGZyb20gQ1ZTIHdpbGwgcHJvYmFibHkgbW9yZSBvciBsZXNzIHJlcXVpcmUKICBhdCBsZWFzdCB0aGVzZSB2ZXJzaW9ucy4KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZ3JldyB0byBtb3JlIHRoYW4gZG91YmxlIGl0cwogIHByZXZpb3VzIHNpemUhCgogIEFya2FkaXVzeiBNaXNraWV3aWN6IGhlbHBlZCBtZSBieSBwb2ludGluZyBvdXQgSSBoYWQgdG8gcmVtb3ZlIG15CiAgYWNpbmNsdWRlLm00IGZpbGUgYmVmb3JlIEkgY291bGQgZ2V0IGl0IHdvcmtpbmchCgpEYW5pZWwgKDIxIE1heSAyMDAxKQotIEkgbWFkZSBmdHBzOi8vIHdvcmsuIEFkZGVkIHRlc3QgY2FzZSA0MDAgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSwgYXMgdGhlCiAgZmlyc3QgZnRwczovLyB0ZXN0IGNhc2UuIFJlcXVpcmVzIHN0dW5uZWwuCgotIEFsc28gbWFkZSB0aGUgdGVzdCBjYXNlcyB0aGF0IHJ1bnMgc3NsIHRlc3RzIG5vdCBydW4gaWYgbGliY3VybCBpc24ndCBidWlsdAogIHdpdGggc3NsIHN1cHBvcnQuCgpEYW5pZWwgKDE5IE1heSAyMDAxKQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBub3QgYWRkIGFueSBleHRyYSAtTCBMREZMQUdTIG9yIC1JIENQUEZMQUdTIHVubGVzcyB0aGV5CiAgYXJlIGFjdHVhbGx5IG5lZWRlZC4gQWxiZXJ0IENoaW4ncyBhbmQgRG9tZW5pY28gQW5kcmVvbGkncyBzdWdnZXN0aW9ucwogIGhlbHBlZCBvdXQuCgpWZXJzaW9uIDcuNy40LXByZTIKCkRhbmllbCAoMTggTWF5IDIwMDEpCi0gTmljZXIgY29uZmlndXJlLWNoZWNrIGZvciB0aGUgT3BlblNTTCBoZWFkZXJzLCB3aGljaCB0aGVuIHNldHMgdGhlIHByb3BlcgogIHZhcmlhYmxlIHRvIGhhdmUgY3VybC1jb25maWcgYmUgZ29vZC4gKEFsYmVydCBDaGluIHByb3ZpZGVkIHRoZSBmaXgpCgotIEZvciBzeXN0ZW1zIHRoYXQgZG9uJ3QgaGF2ZSB0aGVpdyBvd24gJ3N0cmxjYXQoKScgbGliY3VybCBwcm92aWRlcyBpdHMgb3duLgogIEl0IHdhcyBub3cgcmVuYW1lZCB0byBwcmV2ZW50IGNvbGxpZGVzIHdpdGggb3RoZXIgbGlicy4gKEFmdGVyIGRpc2N1c3Npb25zCiAgd2l0aCBTdGVybGluZyBIdWdoZXMgYW5kIHRoZSBpbXBsaWNhdGlvbnMgdGhpcyBoYWQgb24gUEhQIGJ1aWxkcy4pCgpEYW5pZWwgKDE3IE1heSAyMDAxKQotIENvbG0gQnVja2xleSBwb3N0ZWQgYSBkZXRhaWxlZCBidWcgcmVwb3J0IG9uICh0aGUgZGViaWFuaXplZCkgNy43LjMsIHRoYXQKICB0dXJuZWQgb3V0IHRvIGJlIGEgcHJvYmxlbSB3aXRoIHRoZSBkZWJpYW4tYnVpbHQgNy43LjMtcGFja2FnZSB0aGF0CiAgY29udGFpbmVkIGZpbGVzIGZyb20gdGhlIDcuNy4yIHJlbGVhc2UhCgotIEkgYWRkZWQgdGhlIENVUkxFX0FMUkVBRFlfQ09NUExFVEUgYWdhaW4sIGJ1dCB3aXRoIGEgZmFrZSB2YWx1ZSwganVzdCB0bwogIG1ha2UgcHJvZ3JhbXMgdGhhdCB1c2UgaXQsIG5vdCBmYWlsIHdoZW4gY29tcGlsaW5nIGFnYWluc3QgdGhpcyB2ZXJzaW9uIG9mCiAgbGliY3VybC4KCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gUGF3ZWwgQS4gR2FqZGEgZml4ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCB0cmFuc2ZlcnMgb24gcmUtdXNlZCBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbnMuCgpWZXJzaW9uIDcuNy40LXByZTEKCkRhbmllbCAoMTQgTWF5IDIwMDEpCi0gSnVuLWljaGlybyBpdG9qdW4gSGFnaW5vIGZpeGVkIEZUUCBQT1JUIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybC4KCi0gQWRkZWQgdGhlIGZpcnN0IEhUVFBTIHRlc3QgdG8gdGhlIHRlc3Qgc3VpdGUgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoMTIgTWF5IDIwMDEpCi0gSnVra2EgUGlobCBzdWdnZXN0ZWQgdGhhdCBpZiAobGliKWN1cmwgaXMgdG9sZCB0byB2ZXJpZnkgdGhlIHBlZXIncwogIGNlcnRpZmljYXRlIGFuZCB0aGUgcGVlciBjYW4ndCBiZSB2ZXJpZmllZCwgaXQgc2hvdWxkIGZhaWwgYW5kIHJldHVybiBhCiAgcHJvcGVyIGVycm9yIGNvZGUuIEkgYWRkZWQgYSBicmFuZCBuZXcgZXJyb3IgY29kZSBuYW1lZAogIENVUkxFX1NTTF9QRUVSX0NFUlRJRklDQVRFIGZvciB0aGlzIHB1cnBvc2UuCgpEYW5pZWwgKDExIE1heSAyMDAxKQotIEFzIHdhcyBkaXNjdXNzZWQgd2l0aCBGcmVkZXJpYyBMZXBpZWQgYSB3aGlsZSBhZ28sIEkgbm93IG1hZGUgbGliY3VybCBub3QKICByZXR1cm4gZXJyb3IgZXZlbiB0aG91Z2ggbm8gZGF0YSB3YXMgdHJhbnNmZXJlZCBvbiB1cGxvYWQvZG93bmxvYWQgcmVzdW1lCiAgd2hlbiB0aGUgbm8gdHJhbnNmZXIgaXMgbmVlZGVkLiBUaGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBlcnJvciB3YXMgcmVtb3ZlZAogIGZyb20gdGhlIGhlYWRlciBmaWxlIHRvIG1ha2UgYW55IGltcGxlbWVuYXRvciB0aGF0IHVzZXMgdGhhdCB0byBiZSBhd2FyZSBvZgogIHRoZSBmYWN0IHRoYXQgaXQgY2FuJ3QgYmUgcmV0dXJuZWQgYW55bW9yZSEKCi0gSW1wcm92ZWQgZ2VuZXJhbCBoZWFkZXItcGFyc2luZyB0byBiZXR0ZXIgYWxsb3cgd2hpdGUgc3BhY2VzIGFuZCBtb3JlLgoKLSBSb2RuZXkgU2ltbW9ucyBwcm92ZWQgdGhlIGZpeCBJIGRpZCB5ZXN0ZXJkYXkgd2FzIGJhZCBhbmQgSSBoYWQgdG8gcG9zdAogIGFub3RoZXIgb25lLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgdHdvIHJlZGlyZWN0IHByb2JsZW1zIG1vcmUhCiAgCkRhbmllbCAoMTAgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGNvcnJlY3RseSBub3RlZCB0aGF0IHRoZSBzcGFjZS1hZnRlci1oZWFkZXIgcHJvYmxlbSB3aXRoCiAgTG9jYXRpb246IGlzIHByZXNlbnQgb24gc2V2ZXJhbCBvdGhlciBwbGFjZXMgaW4gdGhlIGxpYmN1cmwgc291cmNlcy4KCi0gSW5nbyBXaWxrZW4gcGF0Y2hlZCBhd2F5IGEgcHJvYmxlbSBsaWJjdXJsIGhhZCB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICBoZWFkZXJzIHdpdGggYW4gZXh0cmEgc3BhY2UgYWZ0ZXIgdGhlIGNvbG9uLgoKLSBSb2RuZXkgU2ltbW9ucyBmb3VuZCBvdXQgdGhhdCBtdWx0aXBsZSBGVFAgdHJhbnNmZXJzIGRpZCBub3QgdHJlYXQgcmVsYXRpdmUKICBkaXJlY3RvcmllcyBjb3JyZWN0bHkuCgpEYW5pZWwgKDkgTWF5IDIwMDEpCi0gR2V0dGluZyBhbiBGVFAgZmlsZSB3aXRoIENVUkxPUFRfTk9CT0RZIHNldCAob3IgLUkgZnJvbSB0aGUgY29tbWFuZCBsaW5lKSwKICBtYWtlcyBjdXJsIHVzZSB0aGUgbm9uLXN0YW5kYXJkIGZ0cCBjb21tYW5kICJTSVpFIi4gSWYgaXQgZmFpbGVkLCBsaWJjdXJsCiAgcmV0dXJuZWQgZXJyb3IuIFN0YXJ0aW5nIG5vdywgaXQganVzdCBkb24ndCBvdXRwdXQgdGhlIGZpbGUgc2l6ZSBpbnN0ZWFkLgogIEFub255bW91cyBidWcgcmVwb3J0LgoKLSBzdHVubmVsLnBtIHdhcyBhY2NpZGVudGFsbHkgbGVmdCBvdXQgZnJvbSB0aGUgcmVsZWFzZSBhcmNoaXZlLCBpdCBpcyBub3cKICBhZGRlZCAoc3R1bm5lbCBpcyBuZWVkZWQgdG8gcnVuIHRoZSBodHRwcy10ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSkKICAKRGFuaWVsICg3IE1heSAyMDAxKQotIENvcnJlY3RlZCB0d28gbWlub3IgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRoZSBGSUxFICogdG8gdm9pZCAqIGNvbnZlcnNpb24KICB0aGF0IEkgbWlzc2VkIGF0IHR3byBwbGFjZXMuIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBwYXRjaGVzLiBTYW5kZXIgR2F0ZXMKICBmaWxlZCBhIGJ1ZyByZXBvcnQgb24gdGhpcy4KClZlcnNpb24gNy43LjMKCkRhbmllbCAoNCBNYXkgMjAwMSkKLSBBbGwgY2FsbGJhY2sgZnVuY3Rpb25zIG5vdyB0YWtlICd2b2lkIConIGluc3RlYWQgb2YgJ0ZJTEUgKicuIFRoaXMgaXMgbWFkZQogIHRoaXMgd2F5IHRvIG1ha2UgaXQgbW9yZSBvYnZpb3VzIHRvIHBlb3BsZSB0aGF0IGFueXRoaW5nIGNhbiBiZSBwYXNzZWQgdG8KICB0aGVtIChieSB1c2luZyB0aGUgYXByb3ByaWF0ZSBvcHRpb24pLiBBZnRlciBkaXNjdXNzaW9ucyB3aXRoIFN0ZXJsaW5nCiAgSHVnaGVzLgoKRGFuaWVsICgzIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGNodW5rZWQgdHJhbnNmZXIgZW5jb2RpbmcgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHRoYXQgbWFkZSBsaWJjdXJsIGZhaWwgaWYgdGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbiB1c2VkIG1peGVkCiAgY2h1bmtlZCBhbmQgbm9uLWNodW5rZWQgdHJhbnNmZXJzLgoKLSBDcmlzIEJhaWxpZmYgZml4ZWQgYSBiYWQgdHJlYXRtZW50IG9mIDMwNC1yZXBsaWVzLCBhcyB0aGV5IHdvdWxkIG5vdCBiZQogIHRyZWF0ZWQgYXMgY29udGVudC1sZW5ndGggMCByZXBsaWVzIGJ1dCB3b3VsZCBjYXVzZSBhICJoYW5nIiB1bnRpbCB0aGUKICBzZXJ2ZXIgdGltZWQtb3V0IGFuZCBjbG9zZWQgdGhlIGNvbm5lY3Rpb24uCgotIEJyYWQgQnVyZGljayBmb3VuZCBhIG1pbm9yIHByb2JsZW0gaW4gdGhlIGRvY3MvZXhhbXBsZXMvTWFrZWZpbGUuYW0KCkRhbmllbCAoMjcgQXByaWwgMjAwMSkKLSBVcGRhdGVkIHRoZSBJTlRFUkFMUyBkb2N1bWVudCBhZ2Fpbi4gSXQgd2FzIGxhZ2dpbmcgYSBiaXQuIEkgdGhpbmsgSSBtYWRlIGl0CiAgbW9yZSBlYXN5IHRvIGZvbGxvdyBub3cgYXMgd2VsbC4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgcHJvYmxlbSB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbiBjdXJsIHJlY2VpdmVkCiAgYSAiQ29udGVudC1MZW5ndGg6IDAiIGhlYWRlci4KCi0gR2l1c2VwcGUgRCdBbWJyb3NpbyB3YXMgZmlyc3Qgb3V0IHRvIHJlcG9ydCB0aGF0IFRFTE5FVCBkb2Vzbid0IHdvcmsgaW4gY3VybAogIGNvbXBpbGVkL2J1aWx0IG9uIHdpbjMyLiBJdCBzZWVtcyB0byB3b3JrIGZvciB1bml4ZXMgdGhvdWdoIQoKLSBEYXZlIEhhbWlsdG9uIHJlcG9ydGVkIHdlaXJkIHByb2JsZW1zIHdpdGggQ1VSTC9QSFAgdGhhdCBJIHJlYWxseSBjYW4ndAogIGV4cGxhaW4gYXQgdGhlIG1vbWVudC4gSSdtIGhvcGluZyBvbiBzb21lIGhlbHAgZnJvbSB0aGUgUEhQIGNyZXcuCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDEpCi0gSSByZXdyb3RlIHRoZSBGVFAgY29tbWFuZCByZXNwb25zZSBmdW5jdGlvbi4gSSBoYWQgdG8gZG8gaXQgdG8gbWFrZSBmdHBzCiAgd29yaywgYXMgdGhlIE9wZW5TU0wgcmVhZCgpLWZ1bmN0aW9uIGRpZG4ndCB3b3JrIHRoZSBzYW1lIHdheSB0aGUgbm9ybWFsCiAgdW5peCByZWFkKCkgZG9lcywgYnV0IGl0IHdhcyBhbHNvIGEgaHVnZSBwZXJmb3JtYW5jZSBib29zdC4gUHJldmlvdXNseSB0aGUKICBmdW5jdGlvbiByZWFkIG9uZSBieXRlIGF0IGEgdGltZSwgbm93IGl0IHJlYWRzIHZlcnkgbGFyZ2UgY2h1bmtzLCBhbmQgaXQKICBtYWtlcyBhIG5vdGFibGUgc3BlZWQgZGlmZmVyZW5jZS4KCkRhbmllbCAoMjUgQXByaWwgMjAwMSkKLSBDb25uZWN0aW9uIHJlLXVzZSB3aGVuIG5vdCB1c2luZyBhIHByb3h5IGRpZG4ndCB3b3JrIHByb3Blcmx5IGZvcgogIG5vbi1kZWZhdWx0IHBvcnQgbnVtYmVycy4KCkRhbmllbCAoMjQgQXByaWwgMjAwMSkKLSBJJ3ZlIG5vdGljZWQgdGhhdCBGVFBTIGRvZXNuJ3Qgd29yay4gV2UgYXR0ZW1wdCB0byB1c2Ugc3NsIGV2ZW4gZm9yIHRoZQogIGRhdGEgdHJhbnNmZXIsIHdoaWNoIGNhdXNlcyB0aGUgdHJhbnNmZXIgdG8gJ2hhbmcnLi4uIFdlIG5lZWQgdG8gZml4IHRoaXMuCgotIEltcHJvdmVkIHRoZSB0ZXN0IHN1aXRlIHRvIHVzZSAnc3R1bm5lbCcgdG8gZG8gSFRUUFMgYW5kIEZUUFMgdGVzdGluZyBvbgogIHRoZSBhbHJlZHkgd3JpdHRlbiBwZXJsIHNlcnZlcnMgZWFzaWx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDAxKQotIFRoZSBPcGVuU1NMIHZlcnNpb24gc3RyaW5nIHJlY2VudGx5IG1vZGlmaWVkIGRpZG4ndCB6ZXJvIHRlcm1pbmF0ZSBvbmUKICBvZiB0aGUgZ2VuZXJhdGVkIHN0cmluZ3MgcHJvcGVybHksIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjcmFzaCBvciBzaW1wbHkKICB3ZWlyZCB2ZXJzaW9uIHN0cmluZyBvdXRwdXQhCgpWZXJzaW9uIDcuNy4yCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDEpCi0gUm9zaW1pbGRvIGRhIFNpbHZhIHVwZGF0ZWQgdGhlIE1ha2VmaWxlcyBmb3IgQm9ybGFuZC9XaW5kb3dzLgoKLSBFcmljIFJhdXRtYW4gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB0aGF0IHdvdWxkCiAgbGVhZCB0byBicm9rZW4gSG9zdDogaGVhZGVycyBpbiB0aGUgc2Vjb25kIEhUVFAgcmVxdWVzdC4KCkRhbmllbCAoMjAgQXByaWwgMjAwMSkKLSBBZGRlZCBtYW4gcGFnZXMgZm9yIHRoZSBjdXJsX3N0cmVxdWFsKCkgYW5kIGN1cmxfbXByaW50ZigpIGZhbWlsaWVzLiBXcm90ZQogIGEgJ2xpYmN1cmwgb3ZlcnZpZXcnIG1hbiBwYWdlLgoKLSBTcGVsbC1maXhlZCBzb21lIGRvY3VtZW50cy4KCi0gUy4gTW9vbmVzYW15IGNvcnJlY3RlZCBtaXN0YWtlcyBpbiB0aGUgbWFuIHBhZ2UuCgotIENyaXMgQmFpbGlmZiBmaXhlZCB0aGUgY3VybF9zbGlzdHMgb3B0aW9ucyBpbiB0aGUgcGVybCBpbnRlcmZhY2UsIHByZXNlbnQKICBzZXBhcmF0ZWx5IGluIHRoZSBDdXJsOjplYXN5IDEuMS40IHBhY2thZ2UuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDEpCi0gTGludXMgTmllbHNlbiBGZWx0emluZyByZW1vdmVkIHRoZSBkZWNpbWFscyBmcm9tIHRoZSBzaXplIHZhcmlhYmxlcyBpbiB0aGUKICAtLXdyaXRlLW91dCBvdXRwdXQuIFdlIGhhcmRseSBldmVyIGdldCBmcmFjdGlvbiBvZiBieXRlcyEgOi0pCgpWZXJzaW9uIDcuNy4yLXByZTEKCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKCi0gQWxiZXJ0IENoaW4gcHJvdmlkZWQgYSBjb25maWd1cmUgcGF0Y2ggZm9yIHRoZSBBQ19TWVNfTEFSR0VGSUxFIG1hY3JvLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAxKQotIElucHV0IGZyb20gTWljaGFlbCBNZWFsbGluZyBtYWRlIG1lIGFkZCAtLWZlYXR1cmUgdG8gY3VybC1jb25maWcuIEl0CiAgZGlzcGxheXMgYSBsaXN0IG9mIGZlYXR1cmVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0LWluIGluIHRoZSBjdXJyZW50CiAgbGliY3VybC4gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgZmVhdHVyZXMgdGhhdCBjYW4gYmUgbGlzdGVkIGFyZTogU1NMLCBLUkI0CiAgYW5kIElQdjYuCgotIEkgY29tbWl0dGVkIENyaXMgYW5kIEdlb3JnJ3MgcGVybCBpbnRlcmZhY2Ugd29yay4gVGhleSd2ZSBnb3QgY2FsbGJhY2tzCiAgd29ya2luZyBhbmQgb3B0aW9ucyB0aGF0IHJlY2VpdmVzIHRob3NlIHNsaXN0IHBvaW50ZXJzLgoKLSBQdW5lZXQgUGF3YWlhIGRldGVjdGVkIGEgcHJvYmxlbSB3aXRoIHJlc3VtZWQgZG93bmxvYWRzIHRoYXQgdXNlIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucyBhbmQgSSBtYWRlIGEgcmF0aGVyIGxhcmdlIHdyaXRldXAgdG8gY29ycmVjdCB0aGlzLiBJdCBpcwogIGltcG9ydGFudCB0aGF0IGFsbCBzZXNzaW9uLWRhdGEgaXMgc3RvcmVkIGluIHRoZSBjb25uZWN0ZGF0YSBzdHJ1Y3QgYW5kIG5vdAogIGluIHRoZSBtYWluIHN0cnVjdCBhcyB0aGlzIHByZXZpb3VzbHkgZGlkLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAxKQotIEZyZWRlcmljIExlcGllZCBmaXhlZCBhIGZ0cCByZXN1bWVkIGRvd25sb2FkIHByb2JsZW0gYW5kIGludHJvZHVjZWQgYSBuZXcKICBlcnJvciBjb2RlIHRoYXQgbGV0cyBhcHBsaWNhdGlvbnMgYmUgYWJsZSB0byBkZXRlY3Qgd2hlbiBhIHJlc3VtZWQgZG93bmxvYWQKICBhY3R1YWxseSBkaWRuJ3QgZG93bmxvYWQgYW55dGhpbmcgc2luY2UgdGhlIHdob2xlIGZpbGUgaXMgYWxyZWFkeSBwcmVzZW50LgogIFNob3VsZCB0aGlzIHJldHVybiBPSyBpbnN0ZWFkPwoKLSBJIGFkZGVkICdjdXJsLWNvbmZpZy5pbicgdG8gdGhlIHJvb3QgZGlyIGFuZCBjb25maWd1cmUgc2NyaXB0LiBOb3csIGEKICBjdXJsLWNvbmZpZyBzY3JpcHQgaXMgbWFkZSB3aGVuIGN1cmwgaXMgYnVpbHQuIFRoZSBzY3JpcHQgY2FuIGJlIHVzZWQgdG8KICBmaWd1cmUgb3V0IGNvbXBpbGUgdGltZSBvcHRpb25zIHVzZWQgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCwgd2hpY2ggaW4gdHVybgogIHNob3VsZCBiZSBvcHRpb25zIFlPVSBzaG91bGQgdXNlIHRvIGJ1aWxkIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSBsaWJjdXJsLgoKICBUaGlzICotY29uZmlnIHN0eWxlIGlzIG5vdCBhIG5ldyBpZGVhLCBidXQgc29tZXRoaW5nIHRoYXQgaGFzIGJlZW4gdXNlZAogIHN1Y2Nlc3NmdWxseSBpbiBvdGhlciAobGlicmFyeSBiYXNlZCkgcHJvamVjdHMuCgotIFBoaWwgS2FybiBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgd3JvbmdseSBkaWQgbm90IGFsd2F5cyB1c2UgR01UIHRpbWUgem9uZQogIGZvciB0aGUgSWYtTW9kaWZpZWQtU2luY2Ugc3R5bGUgaGVhZGVycy4KCi0gR2VvcmcgU2Nod2FyeiBwb2ludGVkIG91dCBhbiBleHRyYSBuZWVkZWQgI2luY2x1ZGUgZmlsZSBuZWVkZWQgaW4gc3JjL21haW4uYwogIGZvciBjdXJsIHRvIGJ1aWxkIG9uIFVsdHJpeC4KCkRhbmllbCAoMTEgQXByaWwgMjAwMSkKLSBDcmlzIEJhaWxpZmYgcG9pbnRlZCBvdXQgdHdvIHByb2JsZW1zIHRoYXQgSSBjb3JyZWN0ZWQuIEZpcnN0LCBsaWJjdXJsJ3MgdXNlCiAgb2YgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEhUVFBfUFJPWFkgaW4gdXBwZXJjYXNlIG1heSBiZWNvbWUgYSBzZWN1cml0eQogIGhhemFyZCB3aGVuIHBlb3BsZSB1c2UgbGliY3VybCBpbiBhIHNlcnZlci9jZ2kgc2l0dWF0aW9uIHdoZXJlIHRoZSBzZXJ2ZXIKICBzZXRzIHRoZSBIVFRQXyotdmFyaWFibGVzIGFjY29yZGluZyB0byBpbmNvbWluZyBoZWFkZXJzIGluIHRoZSBIVFRQCiAgcmVxdWVzdC4gVGh1cywgYSAiUHJveHk6Ii1oZWFkZXIgd291bGQgc2V0IHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGUhCgogIFRoZW4sIGludm9raW5nIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2l0aG91dCBoYXZpbmcgYW4gVVJMIHNldCBjYXVzZWQgYSBjcmFzaC4KCi0gUy4gTW9vbmVzYW15IGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2UgY3VybCB1c2Ugbm9uLWJsb2NraW5nIGNvbm5lY3RzIG9uCiAgd2luZG93cyB3aGVuIGNvbm5lY3Rpb24gdGltZW91dCBpcyBzZXQsIGFzIGl0IGFsbG93cyB3aW5kb3dzIHVzZXJzIHRvIHNldAogIHRoYXQgdGltZW91dCEKCi0gSGlyb3Rha2EgTWF0c3V5dWtpIHdyb3RlIGEgUnVieSBpbnRlcmZhY2UgdG8gbGliY3VybCEKCi0gQ3JpcyBCYWlsaWZmLCBGb3JyZXN0IENhaG9vbiBhbmQgR2VvcmcgSG9ybiB3b3JrIG9uIHRoZSBQZXJsIGludGVyZmFjZS4KCi0gSSd2ZSB3cml0dGVuIGEgZmlyc3Qgc2hvdCBhdCBhIEphdmEgaW50ZXJmYWNlIHRvIGxpYmN1cmwuIE1hbnkgdGhhbmtzIHRvCiAgRGFuaWVsIE1hcmVsbCBmb3IgdGlyZWxlc3NseSBhbnN3ZXJpbmcgdG8gYWxsIG15IGJhc2ljIEphdmEgcXVlc3Rpb25zLiBJdAogIHdvcmtzLCBidXQgaXQgaXMgc3RpbGwgdmVyeSBiYXNpYy4KCkRhbmllbCAoMTAgQXByaWwgMjAwMSkKLSBUaGUgcHJvZ3Jlc3MgZGlzcGxheSBjb3VsZCBnZXQgc2lsbHkgd2hlbiBkb2luZyBtdWx0aXBsZSBmaWxlIHRyYW5zZmVycywgYXMKICBpdCB3YXNuJ3QgcHJvcGVybHkgcmVzZXQgYmV0d2VlbiB0cmFuc2ZlcnMhCgotIERpc2N1c3Npb25zIHdpdGggQ3JpcyBCYWlsaWZmIHdobyB3cml0ZXMgYSBQZXJsIGludGVyZmFjZSB0byBsaWJjdXJsLCBtYWRlCiAgbWUgYWRkIENVUkxPUFRfSEVBREVSRlVOQ1RJT04uIEl0IGNhbiBiZSB1c2VkIHRvIHNldCBhIHNlcGFyYXRlIGNhbGxiYWNrCiAgZnVuY3Rpb24gZm9yIHdyaXRpbmcgaGVhZGVycy4gUHJldmlvdXNseSB5b3UgY291bGQgb25seSBzZXQgYSBkaWZmZXJlbnQgRklMRQogICogd2hlbiBoZWFkZXJzIGFyZSB3cml0dGVuIGZyb20gd2l0aGluIGxpYmN1cmwuCgpEYW5pZWwgKDcgQXByaWwgMjAwMSkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGEgcHJvYmxlbSBpbiBjdXJsX2VzY2FwZSgpIGFuZCBwb2ludGVkIG91dCBhIGZsYXcgaW4KICB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZS4KCkRhbmllbCAoNiBBcHJpbCAyMDAxKQotIEFkanVzdGVkIHRoZSB2ZXJzaW9uIGNvZGUgdG8gcHJvcGVybHkgZGlzcGxheSBPcGVuU1NMIDAuOS42YS4gVGhleSBzdXJlCiAgY2hhbmdlIHRoZWlyIHZlcnNpb24gZGVmaW5lIGZvcm1hdCBvZnRlbi4uLgoKLSBjdXJsX2Zvcm1mcmVlKCkgbm93IGFjY2VwdHMgYSBOVUxMIHBvaW50ZXIgd2l0aG91dCBjcmFzaGluZyEKClZlcnNpb24gNy43LjEKCkRhbmllbCAoMyBBcHJpbCAyMDAxKQotIFB1bmVldCBQYXdhaWEgcG9pbnRlZCBvdXQgdHdvIHNlcmlvdXMgcHJvYmxlbXMuIExpYmN1cmwgd291bGQgYXR0ZW1wdCB0bwogIHJlYWQgYmFkIG1lbW9yeSBkdXJpbmcgc2l0dWF0aW9ucyB3aGVuIGFuIChmdHApIGNvbm5lY3Rpb24gYXR0ZW1wdCBmYWlsZWQuCiAgQWxzbywgdGhlIGxpYi9NYWtlZmlsZS52YzYgd2FzIGNvcnJlY3RlZC4KCi0gTW9yZSBpbnZlc3RpZ2F0aW9ucyBpbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIG1hZGUgbWUgcmVhbGl6ZSB0aGF0CiAgaXQgd2FzIG5vdCBjbGVhbiBlbm91Z2ggdG8gd29yayB0cmFuc3BhcmFudGx5IHdpdGggcGVyc2lzdGVudCBhbmQgbm9uLQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIEkgdGhpbmsgSSd2ZSBmaXhlZCBpdCBub3cuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDEpCi0gR2VvcmcgSG9ybiBtYWlsZWQgbWUgc29tZSBjb3JyZWN0aW9ucyBmb3IgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UuCgotIEV4cGVyaW1lbnRhbCBmdHBzOi8vIHN1cHBvcnQgYWRkZWQuIEl0IGlzIGJhc2ljYWxseSBGVFAgb3ZlciBTU0wgZm9yIHRoZQogIGNvbnRyb2wgY29ubmVjdGlvbi4gSXQgc3RpbGwgbWFrZXMgYWxsIGRhdGEgdHJhbnNmZXJzIGdvaW5nIG92ZXIgdW5lbmNyeXB0ZWQKICBjb25uZWN0aW9ucy4gUmFpbmVyIFdlaWt1c2F0J3MgZnRwZC1zc2wgc2VydmVyIGhhY2sgc3VwcG9ydHMgdGhpcyBhbmQgSSB1c2VkCiAgdGhhdCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI3IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBzZXQgYSBDVVJMT1BUX1RJTUVPVVQgYW5kIHRoZW4gdHJpZWQKICB0byBnZXQgYSBmaWxlIGZyb20gYSBzaXRlIGFuZCBpdCBmYWlscywgdGhlIFNJR0FMUk0gd291bGQgc3RpbGwgYmUgc2VudAogIGFmdGVyIHRoZSB0aW1lb3V0LXRpbWUsIHF1aXRlIGluZXhwZWN0ZWRseSEKCi0gSSBhZGRlZCBhbiBmdHAgdHJhbnNmZXIgZXhhbXBsZSB0byBkb2NzL2V4YW1wbGVzLyBhbmQgSSBhbHNvIHdyb3RlIGEgdGlueQogIGV4YW1wbGUgbWFrZWZpbGUgdGhhdCBjYW4gYmUgdXNlZCBhcyBhIHN0YXJ0IHdoZW4gYnVpbGRpbmcgb25lIG9mIHRoZQogIGV4YW1wbGVzLgoKVmVyc2lvbiA3LjcuMS1iZXRhMQoKRGFuaWVsICgyNiBNYXJjaCAyMDAxKQotIE1vaGFtZWQgTHJoYXppIHJlcG9ydGVkIHByb2JsZW1zIHdpdGggNy42LjEgYW5kIHBlcnNpc3RlbnQgSFRUUC8xLjAKICBjb25uZWN0aW9ucyAod2hlbiB0aGUgc2VydmVyIHJlcGxpZWQgYSBDb25uZWN0aW9uOiBLZWVwLUFsaXZlKSBhbmQgdGhpcwogIHByb2JsZW0gd2FzIG5vdCBwcm9wZXJseSBkZWFsdCB3aXRoIGluIDcuNyBlaXRoZXIuIEEgcGF0Y2ggd2FzIHBvc3RlZCB0byB0aGUKICBjdXJsLWFuZC1waHAgbWFpbGluZyBsaXN0LgoKRGFuaWVsICgyNCBNYXJjaCAyMDAxKQotIENvbGluIFdhdHNvbiByZXBvcnRlZCBhYm91dCBhIHByb2JsZW0gYW5kIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBpdCwKICB3aGljaCB3YXMgYWJvdXQgdGhlIG1hbiBwYWdlIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoIGEgc2luZ2xlIHF1b3RlICgnKSBpbiBhCiAgd2F5IHRoYXQgZ25yb2ZmIGRvZXNuJ3QgbGlrZS4KCkRhbmllbCAoMjMgTWFyY2ggMjAwMSkKLSBQZXRlciBCcmF5IHJlcG9ydGVkIGNvcnJlY3RseSB0aGF0IHRoZSByb290IG1ha2VmaWxlIHVzZWQgbWFrZSBpbnN0ZWFkIG9mCiAgJChNQUtFKSBmb3IgdGhlIHRlc3QgdGFyZ2V0LgoKLSBDb3JyZWN0ZWQgdGhlIEN1cmw6OmVhc3kgcGVybCBpbnRlcmZhY2UgdG8gdXNlIGN1cmxfZWFzeV9zZXRvcHQoKSBhbmQgbm90CiAgY3VybF9zZXRvcHQoKSB3aGljaCB3YXMgcmVtb3ZlZCBpbiA3LjchCgotIFMuIE1vb25lc2FteSBwcm92aWRlZCB1cGRhdGVzIG9uIHRocmVlIGRvY3VtZW50cyAoTUFOVUFMLCBJTlNUQUxMIGFuZCBGQVEpLgoKLSBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiwgbGliY3VybCB3b3VsZCBzb21ldGltZXMgd3JpdGUgdG8gdGhlIFVSTCBzdHJpbmcKICBpbiBhIHdheSBpdCBzaG91bGRuJ3QuIEFzIHRoZSBwb2ludGVyIGlzIHBhc3NlZC1pbiB0byBsaWJjdXJsIGZyb20gYW4KICBhcHBsaWNhdGlvbiwgd2UgY2FuJ3QgYmUgYWxsb3dlZCB0byB3cml0ZSB0byBpdC4gVGhlIHBhcnRpY3VsYXIgYnVnIHJlcG9ydAogIGZyb20gJ25rJyB0aGF0IGJyb3VnaHQgdGhpcyB1cCB3YXMgYmVjYXVzZSBoZSBoYWQgYSByZWFkLW9ubHkgVVJMIHRoYXQgdGhlbgogIGNhdXNlZCBhIGxpYmN1cmwgY3Jhc2ghCgotIE5vIGxvbmdlciByZWFkcyBIRUFEIHJlc3BvbnNlcyBsb25nZXIgdGhhbiB0byB0aGUgbGFzdCBoZWFkZXIuIFByZXZpb3VzbHksCiAgY3VybCB3b3VsZCByZWFkIHRoZSBmdWxsIHJlcGx5IGlmIHRoZSBjb25uZWN0aW9uIHdhcyBhICJjbG9zZSIgb25lLgoKLSBsaWJjdXJsIGRpZCByZS11c2UgY29ubmVjdGlvbnMgd2F5IHRvbyBtdWNoLiBEb2luZyAiY3VybAogIGh0dHA6Ly93d3cue21pY3Jvc29mdCxpYm19LmNvbSIgd291bGQgbWFrZSBpdCByZS11c2UgdGhlIGNvbm5lY3Rpb24gd2hpY2gKICBtYWRlIHRoZSBzZWNvbmQgcmVxdWVzdCByZXR1cm4gdmVyeSBvZGQgcmVzdWx0cy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwMSkKLSBFZGluIEthZHJpYmFzaWMgbWFkZSBtZSBhd2FyZSB0aGF0IGN1cmwgc2hvdWxkIG5vdCByZS1zZW5kIFBPU1QgcmVxdWVzdHMKICB3aGVuIGZvbGxvd2luZyAzMDItcmVkaXJlY3RzLiBJIG1hZGUgMzAyIHdvcmsgbGlrZSAzMDMgd2hpY2ggbWVhbnMgY3VybCB1c2VzCiAgR0VUIGluIHRoZSBmb2xsb3dpbmcgcmVxdWVzdChzKS4KCi0gbGliY3VybCBub3cgcmVzZXQgdGhlICJmb2xsb3dlZC1sb2NhdGlvbiIgY291bnRlciBvbiBlYWNoIGludm9rZSBvZgogIGN1cmxfZWFzeV9wZXJmb3JtKCkgYXMgaXQgb3RoZXJ3aXNlIHdvdWxkIHN1bSB1cCBhbGwgcmVkaXJlY3RzIG9uIHRoZSBzYW1lCiAgY29ubmVjdGlvbiBhbmQgdGh1cyBjb3VsZCByZWFjaCB0aGUgbWF4cmVkaXJzIGNvdW50ZXIgd3JvbmdseS4KCi0gSmltIERyYXNoIHN1Z2dlc3RlZCBjdXJsX2VzY2FwZSgpIHNob3VsZCBub3QgcmUtZW5jb2RlIHdoYXQgYWxyZWFkeSBsb29rcwogIGxpa2UgYW4gZW5jb2RlZCBzZXF1ZW5jZSBhbmQgSSB0aGluayB0aGF0J3MgYSBmYWlyIHN1Z2dlc3Rpb24uCgpWZXJzaW9uIDcuNwoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBmYWlscyB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgZ2V0aG9zdGJ5bmFtZV9yKCkgaXMKICBkZXRlY3RlZCBidXQgaXQgY291bGRuJ3QgZmlndXJlIG91dCBob3cgdG8gaW52b2tlIGl0ICh3aGF0IGFtb3VudCBvZgogIGFyZ3VtZW50cyBpdCBpcyBzdXBwb3NlZCB0byBnZXQpLiBSZXBvcnRzIGZyb20gQW5kculzIEdhcmPtYSBtYWRlIG1lIGF3YXJlCiAgb2YgdGhpcyBuZWVkLgoKLSBUYWxraW5nIHdpdGggSmltIERyYXNoIG1hZGUgbWUgZmluYWxseSBwdXQgdGhlIGN1cmxfZXNjYXBlIGFuZCBjdXJsX3VuZXNjYXBlCiAgZnVuY3Rpb25zIGluIHRoZSBjdXJsLmggaW5jbHVkZSBmaWxlIGFuZCB3cml0ZSBtYW4gcGFnZXMgZm9yIHRoZW0uIFRoZQogIGVzY2FwZSBmdW5jdGlvbiB3YXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBzYW1lIGludGVyZmFjZSBhcyB0aGUgdW5lc2NhcGUgb25lCiAgaGFkLgoKLSBObyBidWcgcmVwb3J0cyBhdCBhbGwgb24gdGhlIGxhdGVzdCBiZXRhcy4gUmVsZWFzZSB0aW1lIGNvbWluZyB1cC4KClZlcnNpb24gNy43LWJldGE1CgpEYW5pZWwgKDE5IE1hcmNoIDIwMDEpCi0gR2VvcmcgT3R0aW5nZXIgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCB1c2luZyAtQyB0b2dldGhlciB3aXRoIC1MIGluIHRoZSBzZW5zZQogIHRoYXQgdGhlIC1DIGluZm8gZ290IGxvc3Qgd2hlbiBpdCB3YXMgcmVkaXJlY3RlZC4gSSBjb3VsZCBub3QgcmVwZWF0IHRoaXMKICBwcm9ibGVtIG9uIHRoZSA3LjcgYnJhbmNoIHdoeSBJIGxlYXZlIHRoaXMgZm9yIHRoZSBtb21lbnQuIFRlc3QgY2FzZSAzOSB3YXMKICBhZGRlZCB0byBkbyBleGFjdGx5IHRoaXMsIGFuZCBpdCBzZWVtcyB0byBkbyByaWdodC4KCi0gQ2hyaXN0aWFuIFJvYm90dG9tIFJlaXMgcmVwb3J0ZWQgaG93IGhpcyA3LjcgYmV0YSBkaWRuJ3Qgc3VjY2Vzc2Z1bGx5IGRvCiAgZm9ybSBwb3N0cyBhcyBlbGVnYW50bHkgYXMgNy42LjEgZGlkLiBJbmRlZWQsIHRoaXMgd2FzIGEgZmxhdyBpbiB0aGUgaGVhZGVyCiAgZW5naW5lLCBhcyBIVFRQIDEuMSBoYXMgaW50cm9kdWNlZCBhIG5ldyAxMDAgInRyYW5zaWVudCIgcmV0dXJuIGNvZGUgZm9yIFBVVAogIGFuZCBQT1NUIG9wZXJhdGlvbnMgdGhhdCBJIG5lZWQgdG8gYWRkIHN1cHBvcnQgZm9yLiBTZWN0aW9uIDguMi4zIGluIFJGQzI2MTYKICBoYXMgYWxsIHRoZSBkZXRhaWxzLiBTZWVtcyB0byB3b3JrIG5vdyEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMSkKLSBBZnRlciBoYXZpbmcgZXhwZXJpZW5jZWQgYW5vdGhlciBtYWNoaW5lIGJyZWFrLWRvd24sIHdlJ3JlIGJhY2suCgotIEdlb3JnIEhvcm4ncyBwZXJsIGludGVyZmFjZSBDdXJsOjplYXN5IGlzIG5vdyBpbmNsdWRlZCBpbiB0aGUgY3VybCByZWxlYXNlCiAgYXJjaGl2ZS4gVGhlIHBlcmwvIGRpcmVjdG9yeSBpcyBub3cgcHJlc2VudC4gUGxlYXNlIGhlbHAgbWUgd2l0aCBkb2NzLAogIGV4YW1wbGVzIGFuZCB1cGRhdGVzIHlvdSB0aGluayBmaXQuCgotIE1hZGUgYSBuZXcgcGhwLyBkaXJlY3RvcnkgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZSBhbmQgbW92ZWQgdGhlIFBIUCBleGFtcGxlcwogIGludG8gYSBzdWJkaXJlY3RvcnkgaW4gdGhlcmUuIE5vdCBtdWNoIFBIUCBpbmZvIHlldCwgYnV0IEkgcGxhbiB0by4gUGxlYXNlCiAgaGVscCBtZSBoZXJlIGFzIHdlbGwhCgotIE1hZGUgbGliY3VybCByZXR1cm4gZXJyb3IgaWYgYSB0cmFuc2ZlciBpcyBhYm9ydGVkIGluIHRoZSBtaWRkbGUgb2YgYQogICJjaHVuayIuIEl0IGFjdHVhbGx5IGVuYWJsZXMgbGliY3VybCB0byBkaXNjb3ZlciBwcmVtYXR1cmUgdHJhbnNmZXIgYWJvcnRzCiAgZXZlbiBpZiB0aGUgQ29udGVudC1MZW5ndGg6IHNpemUgaXMgdW5rbm93bi4KCkRhbmllbCAoMTUgTWFyY2ggMjAwMSkKLSBBZGRlZCAtLWNvbm5lY3QtdGltZW91dCB0byBjdXJsLCB3aGljaCBzZXRzIHRoZSBuZXcgQ1VSTE9QVF9DT05ORUNUVElNRU9VVAogIG9wdGlvbiBpbiBsaWJjdXJsLiBJdCBsaW1pdHMgdGhlIHRpbWUgY3VybCBpcyBhbGxvd2VkIHRvIHNwZW5kIGluIHRoZQogIGNvbm5lY3Rpb24gcGhhc2UuIFRoaXMgZGlmZmVycyBmcm9tIC1tLy0tbWF4LXRpbWUgdGhhdCBsaW1pdHMgdGhlIGVudGlyZQogIGZpbGUgdHJhbnNmZXIgb3BlcmF0aW9uLiBSZXF1ZXN0ZWQgYnkgTGFycnkgRmFobm9lIGFuZCBvdGhlcnMuCgogIEkgYWxzbyB1cGRhdGVkIHRoZSBjdXJsLjEgYW5kIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZXMgYW5kIHJlbW92ZWQgdGhlCiAgaXRlbSBmcm9tIHRoZSBUT0RPLgoKVmVyc2lvbiA3LjctYmV0YTQKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBNYWRlIGN1cmwgZ3JvayBJUHY2IHdpdGggSFRUUCBwcm94aWVzIGFuZCBnb3QgZXZlcnl0aGluZyB0byBjb21waWxlIG5pY2VseQogIGFnYWluIHdoZW4gRU5BQkxFX0lQVjYgaXMgc2V0LgoKICBJIG5lZWQgdG8gcmVtYWtlIHRoaW5ncyBpbiB0aGUgdGVzdCBzdWl0ZS4gSSBjYW4ndCB0ZXN0IHRoZSBGVFAgcGFydHMgd2l0aAogIGN1cmwgYnVpbHQgZm9yIElQdjYgYXMgaXQgdXNlcyBhIGRpZmZlcmVudCBzZXQgb2YgRlRQIGNvbW1hbmRzIHRoZW4hCgotIEkgZmVsbCBvbnRvIGEgYnVnIHJlcG9ydCBvbiBwaHAubmV0IChwb3N0ZWQgYnkgTGFycyBUb3JiZW4gV2lsc29uKSB0aGF0IHdhcwogIGEgcmVwb3J0IG1lYW50IGZvciBvdXIgcHJvamVjdC4gQW55d2F5LCBpdCBzYWlkIHRoZSAubmV0cmMgcGFyc2luZyBkaWRuJ3QKICB3b3JrIGFzIHN1cHBvc2VkLCBhbmQgYXMgSSBhZ3JlZWQgd2l0aCBMYXJzLCBJIG1hZGUgdGhlIG5ldHJjIHBhcnNlciB1c2UKICBnZXRwd3VpZCgpIHRvIGZpZ3VyZSBvdXQgdGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBlZmZlY3RpdmUgdXNlciBhbmQgdHJ5CiAgdGhhdCBuZXRyYy4gSXQgc3RpbGwgdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSE9NRSBmb3IgdGhvc2UgdGhhdCBkb24ndAogIGhhdmUgdGhhdCBmdW5jdGlvbiBvciBpZiB0aGUgdXNlciBkb2Vzbid0IHJldHVybiB2YWxpZCBwd2QgaW5mby4KCi0gRWRpbiBLYWRyaWJhaWMgcG9zdGVkIGEgYnVnIHJlcG9ydCB3aGVyZSBoZSBnb3QgYSBjcmFzaCB3aGVuIGEgZmV0Y2ggd2l0aAogIHVzZXIrcGFzc3dvcmQgaW4gdGhlIFVSTCBmb2xsb3dlZCBhIExvY2F0aW9uOiB0byBhIHNlY29uZCBVUkwgKGFic29sdXRlLAogIHdpdGhvdXQgbmFtZStwYXNzd29yZCkuIFRoaXMgYnVnIGhhcyBiZWVuIGFyb3VuZCBmb3IgYSBsb25nIHdoaWxlIGFuZAogIGNyYXNoZXMgZHVlIHRvIGEgcmVhZCBhdCBhZGRyZXNzIHplcm8uIEZpeGVkIG5vdy4gV3JvdGUgdGVzdCBjYXNlIDM4LCB0aGF0CiAgdGVzdHMgdGhpcy4KCi0gTW9kaWZpZWQgdGhlIHRlc3Qgc3VpdGUncyBodHRwc2VydmVyIHNsaWdodGx5IHRvIGFwcGVuZCBhbGwgY2xpZW50IHJlcXVlc3QKICBkYXRhIHRvIGl0cyBsb2cgZmlsZSBzbyB0aGF0IHRoZSB0ZXN0IHNjcmlwdCBub3cgYmV0dGVyIGNhbiB2ZXJpZnkgYSByYW5nZQogIG9mIHJlcXVlc3RzIGFuZCBub3Qgb25seSB0aGUgbGFzdCBvbmUsIGFzIGl0IGRpZCBwcmV2aW91c2x5LgoKLSBVcGRhdGVkIHRoZSBjdXJsIG1hbiBwYWdlIHdpdGggLS1yYW5kb20tZmlsZSBhbmQgLS1lZ2QtZmlsZSBkZXRhaWxzLgoKVmVyc2lvbiA3LjctYmV0YTMKCkRhbmllbCAoMTQgTWFyY2ggMjAwMSkKLSBCavZybiBTdGVuYmVyZyBwcm92aWRlZCBzaW1pbGFyIGZpeGVzIGFzIEr2cm4gZGlkIGFuZCBzb21lIGFkZGl0aW9uYWwgcGF0Y2hlcwogIGZvciBub24tU1NMIGNvbXBpbGVzLgoKLSBJIGluY3JlYXNlZCB0aGUgaW50ZXJmYWNlIG51bWJlciBmb3IgbGliY3VybCBhcyBJJ3ZlIHJlbW92ZWQgdGhlIGxvdyBsZXZlbAogIGZ1bmN0aW9ucyBmcm9tIHRoZSBpbnRlcmZhY2UuIEkgYWxzbyB0b29rIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVuYW1lIHRoZQogIEN1cmxfc3RyZXF1YWwgZnVuY3Rpb24gdG8gY3VybF9zdHJlcXVhbCBhbmQgQ3VybF9zdHJuZXF1YWwgdG8KICBjdXJsX3N0cm5lcXVhbCwgYXMgdGhleSdyZSBwdWJsaWMgbGliY3VybCBmdW5jdGlvbnMgKGV2ZW4gaWYgdGhleSdyZSBzdGlsbAogIHVuZG9jdW1lbnRlZCkuCgogIFRoaXMgd2lsbCBtYWtlIG9sZGVyIHByb2dyYW1zIG5vdCBjYXBhYmxlIG9mIHVzaW5nIHRoZSBuZXcgbGliY3VybCB3aXRoCiAganVzdCBhIGRyb3AtaW4gcmVwbGFjZW1lbnQuCgotIEr2cm4gSGFydHJvdGggdXBkYXRlZCBzdHVmZiBmb3Igd2luMzIgY29tcGlsZXM6CiAgbyBjb25maWctd2luMzIuaCB3YXMgZml4ZWQgZm9yIHNvY2tsZW5fdAogIG8gbGliL3NzbHVzZS5jIGhhZCBhIGJhZCAjZW5kaWYgcGxhY2VtZW50CiAgbyBsaWIvZmlsZS5jIHdhcyBtYWRlIHRvIGNvbXBpbGUgb24gd2luMzIgYWdhaW4KICBvIGxpYi9NYWtlZmlsZS5tMzIgd2FzIHVwZGF0ZWQgd2l0aCB0aGUgbmV3IGZpbGVzCiAgbyBsaWIvbGliY3VybC5kZWYgbWF0Y2hlcyB0aGUgY3VycmVudCBpbnRlcmZhY2Ugc3RhdGUKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBJdCBvbmx5IHRvb2sgYW4gaG91ciBvciBzbyBiZWZvcmUgSvZybiBIYXJ0cm90aCBmb3VuZCBhIHByb2JsZW0gaW4gdGhlCiAgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZy4gR2l2ZW4gaGlzIGZpbmUgZXhhbXBsZS1zaXRlLCBJIGNvdWxkIGVhc2lseSBzcG90CiAgdGhlIHByb2JsZW0gYW5kIHdoZW4gSSByZS1yZWFkIHRoZSBzcGVjICh0aGUgcGFydCBJIGhhdmUgcGFzdGVkIGluIHRoZSB0b3AKICBvZiB0aGUgaHR0cF9jaHVua3MuaCBmaWxlKSwgSSByZWFsaXplZCBJIGhhZCBtYWRlIG15IHN0YXRlLW1hY2hpbmUgc2xpZ2h0bHkKICB3cm9uZyBhbmQgZGlkbid0IGV4cGVjdC9oYW5kbGUgdGhlIHRyYWlsaW5nIENSTEYgdGhhdCBjb21lcyBhZnRlciB0aGUgZGF0YQogIGluIGVhY2ggY2h1bmsgKGFuZCB0aG9zZSBleHRyYSB0d28gYnl0ZXMgc3VyZSBmZWVsIHdhc3RlZCkuCgogIEhhZCB0byBtb2RpZnkgdGVzdCBjYXNlIDM0IHRvIG1hdGNoIHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy43LWJldGEyCgpEYW5pZWwgKDEzIE1hcmNoIDIwMDEpCi0gQWRkZWQgdGhlIHBvbGljeSBzdHVmZiB0byB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4gcGFnZSBmb3IgdGhlIHR3byBzdXBwb3J0ZWQKICBwb2xpY2llcy4KCi0gSW1wbGVtZW50ZWQgc29tZSBzdXBwb3J0IGZvciB0aGUgQ1VSTE9QVF9DTE9TRVBPTElDWSBvcHRpb24uIFRoZSBwb2xpY2llcwogIENVUkxDTE9TRVBPTElDWV9MRUFTVF9SRUNFTlRMWV9VU0VEIGFuZCBDVVJMQ0xPU0VQT0xJQ1lfT0xERVNUIGFyZSBub3cKICBzdXBwb3J0ZWQsIGFuZCB0aGUgImxlYXN0IHJlY2VudGx5IHVzZWQiIGlzIHVzZWQgYXMgZGVmYXVsdCBpZiBubyBwb2xpY3kKICBpcyBjaG9zZW4uCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDEpCi0gQWRkZWQgQ1VSTE9QVF9SQU5ET01fRklMRSBhbmQgQ1VSTE9QVF9FR0RTT0NLRVQgdG8gbGliY3VybCBmb3Igc2VlZGluZyB0aGUKICBTU0wgcmFuZG9tIGVuZ2luZS4gVGhlIHJhbmRvbSBzZWVkaW5nIHN1cHBvcnQgd2FzIGFsc28gYnJvdWdodCB0byB0aGUgY3VybAogIGNsaWVudCB3aXRoIHRoZSBuZXcgb3B0aW9ucyAtLXJhbmRvbS1maWxlIDxmaWxlPiBhbmQgLS1lZ2QtZmlsZSA8ZmlsZT4uIEkKICBuZWVkIHNvbWUgcGVvcGxlIHRvIHJlYWxseSB0ZXN0IHRoaXMgdG8ga25vdyB0aGV5IHdvcmsgYXMgc3VwcG9zZWQuIFJlbWVtYmVyCiAgdGhhdCBsaWJjdXJsIG5vdyBpbmZvcm1zIChpZiB2ZXJib3NlIGlzIG9uKSBpZiB0aGUgcmFuZG9tIHNlZWQgaXMgY29uc2lkZXJlZAogIHdlYWsgKEhUVFBTIGNvbm5lY3Rpb25zKS4KCi0gTWFkZSB0aGUgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGluZyBlbmdpbmUgZGV0ZWN0ZWQgYmFkIGZvcm1hdHRlZCBkYXRhIGxlbmd0aAogIGFuZCByZXR1cm4gZXJyb3IgaWYgc28gKHdlIGNhbid0IHBvc3NpYmx5IGV4dHJhY3Qgc2Vuc2libGUgZGF0YSBpZiB0aGlzIGlzCiAgdGhlIGNhc2UpLiBBZGRlZCBhIHRlc3QgY2FzZSB0aGF0IGRldGVjdHMgdGhpcy4gTnVtYmVyIDM2LiBOb3cgdGhlcmUgYXJlIDYwCiAgdGVzdCBjYXNlcy4KCi0gQWRkZWQgNSBuZXcgbGliY3VybCBvcHRpb25zIHRvIGN1cmwvY3VybC5oIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29udHJvbCB0aGUKICBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gc3VwcG9ydCBpbiBsaWJjdXJsLiBUaGV5J3JlIGFsc28gZG9jdW1lbnRlZCAoZmFpcmx5CiAgdGhvcm91Z2hseSkgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQuMyBtYW4gcGFnZS4gVGhyZWUgb2YgdGhlbSBhcmUgbm93CiAgaW1wbGVtZW50ZWQsIGFsdGhvdWdoIG5vdCByZWFsbHkgdGVzdGVkIGF0IHRoaXMgcG9pbnQuLi4gQW55d2F5LCB0aGUgbmV3CiAgaW1wbGVtZW50ZWQgb3B0aW9ucyBhcmUgbmFtZWQgQ1VSTE9QVF9NQVhDT05ORUNUUywgQ1VSTE9QVF9GUkVTSF9DT05ORUNULAogIENVUkxPUFRfRk9SQklEX1JFVVNFLiBUaGUgb25lcyBzdGlsbCBsZWZ0IHRvIHdyaXRlIGNvZGUgZm9yIGFyZToKICBDVVJMT1BUX0NMT1NFUE9MSUNZIGFuZCBpdHMgcmVsYXRlZCBvcHRpb24gQ1VSTE9QVF9DTE9TRUZVTkNUSU9OLgoKLSBNYWRlIGN1cmwgKHRoZSBhY3R1YWwgY29tbWFuZCBsaW5lIHRvb2wpIHVzZSB0aGUgbmV3IGxpYmN1cmwgNy43IHBlcnNpc3RlbnQKICBjb25uZWN0aW9uIHN1cHBvcnQgYnkgcmUtdXNpbmcgdGhlIHNhbWUgY3VybCBoYW5kbGUgZm9yIGV2ZXJ5IHNwZWNpZmllZCBmaWxlCiAgdHJhbnNmZXIgYW5kIGFmdGVyIHNvbWUgbW9yZSB0ZXN0IGNhc2UgdHdlYWtpbmcgd2UgaGF2ZSAxMDAlIHRlc3QgY2FzZSBPSy4KICBJIG1hZGUgc29tZSB0ZXN0IGNhc2VzIHJldHVybiBIVFRQLzEuMCBub3cgdG8gbWFrZSBzdXJlIHRoYXQgd29ya3MgYXMgd2VsbC4KCi0gSGFkIHRvIGFkZCAnQ29ubmVjdGlvbjogY2xvc2UnIHRvIHRoZSBoZWFkZXJzIG9mIGEgYnVuY2ggb2YgdGVzdCBjYXNlcyBzbwogIHRoYXQgY3VybCBiZWhhdmVzICJvbGQtc3R5bGUiIHNpbmNlIHRoZSB0ZXN0IGh0dHAgc2VydmVyIGRvZXNuJ3QgZG8gbXVsdGlwbGUKICBjb25uZWN0aW9ucy4uLiBOb3cgSSBnZXQgMTAwJSB0ZXN0IGNhc2UgT0suCgotIFRoZSBjdXJsLmhheHguc2Ugc2l0ZSwgdGhlIG1haW4gY3VybCBtYWlsaW5nIGxpc3QgYW5kIG15IHBlcnNvbmFsIGVtYWlsIGFyZQogIGFsbCBkZWFkIHRvZGF5IGR1ZSB0byBwb3dlciBibGFja291dCBpbiB0aGUgYXJlYSB3aGVyZSB0aGUgbWFpbiBzZXJ2ZXJzIGFyZQogIGxvY2F0ZWQuIEhvcnJpYmxlLgoKLSBJJ3ZlIG1hZGUgcGVyc2lzdGFuY2Ugd29yayBvdmVyIGEgc3F1aWQgSFRUUCBwcm94eS4gSSBmaW5kIGl0IGRpc3R1cmJpbmcKICB0aGF0IGl0IHVzZXMgaGVhZGVycyB0aGF0IGFyZW4ndCBwcmVzZW50IGluIGFueSBIVFRQIHN0YW5kYXJkIHRob3VnaAogIChQcm94eS1Db25uZWN0aW9uOikgYW5kIHRoYXQgbWFrZXMgbWUgZmVlbCB0aGF0IEknbSBub3cgb24gdGhlIGVkZ2Ugb2Ygd2hhdAogIHRoZSBzdGFuZGFyZCBhY3R1YWxseSBkZWZpbmVzLiBJIG5lZWQgdG8gZ2V0IHRoaXMgY29kZSBleGNlcmNpc2VkIG9uIGEgbG90CiAgb2YgZGlmZmVyZW50IEhUVFAgcHJveGllcyBiZWZvcmUgSSBmZWVsIHNhZmUuCgogIE5vdyBJJ20gZmFjaW5nIHRoZSBwcm9ibGVtIHdpdGggbXkgdGVzdCBzdWl0ZSBzZXJ2ZXJzIChib3RoIEZUUCBhbmQgSFRUUCkKICBub3Qgc3VwcG9ydGluZyBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIGFuZCBsaWJjdXJsIGlzIGRvaW5nIHRoZW0gbm93LiBJIGhhdmUKICB0byBmaXggdGhlIHRlc3Qgc2VydmVycyB0byBnZXQgYWxsIHRoZSB0ZXN0IGNhc2VzIGRvIE9LLgoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gR3Vlbm9sZSBCZXNjb24gcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIGRpZCBvdXRwdXQgZXJyb3JzIHRvIHN0ZGVyciBldmVuIGlmCiAgTVVURSBhbmQgTk9QUk9HUkVTUyB3YXMgc2V0LiBJdCB0dXJuZWQgb3V0IHRvIGJlIGEgYnVnIGFuZCBoYXBwZW5zIGlmCiAgdGhlcmUncyBhbiBlcnJvciBhbmQgbm8gRVJST1JCVUZGRVIgaXMgc2V0LiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgpWZXJzaW9uIDcuNy1iZXRhMQoKRGFuaWVsICg4IE1hcmNoIDIwMDEpCi0gIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIiBpcyBubyBsb25nZXIgYW55IHRyb3VibGUgZm9yIGxpYmN1cmwuIEkndmUKICBhZGRlZCB0d28gc291cmNlIGZpbGVzIGFuZCBJJ3ZlIHJ1biBzb21lIHRlc3QgZG93bmxvYWRzIHRoYXQgbG9vayBmaW5lLgoKLSBIVFRQIEhFQUQgd29ya3MgdG9vLCBldmVuIG9uIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICg1IE1hcmNoIDIwMDEpCi0gVGhlIGN1cnJlbnQgNTcgdGVzdCBjYXNlcyBub3cgcGFzcyBPSy4gSXQgd291bGQgc3VnZ2VzdCB0aGF0IGxpYmN1cmwgd29ya3MKICB1c2luZyB0aGUgb2xkLXN0eWxlIHdpdGggb25lIGNvbm5lY3Rpb24gcGVyIGhhbmRsZS4gVGhlIHRlc3Qgc3VpdGUgZG9lc24ndAogIGhhbmRsZSBtdWx0aXBsZSBjb25uZWN0aW9ucyB5ZXQgc28gdGhlcmUgYXJlIG5vIHRlc3QgY2FzZXMgZm9yIHRoaXMuCgotIEkgcGF0Y2hlZCB0aGUgdGVsbmV0LmMgaGVhdmlseSB0byBub3QgdXNlIGFueSBnbG9iYWwgdmFyaWFibGVzIGFueW1vcmUuIEl0CiAgc2hvdWxkIG1ha2UgaXQgYSBsb3QgbmljZXIgbGlicmFyeS13aXNlLgoKLSBUaGUgZmlsZTovLyBzdXBwb3J0IHdhcyBtb2RpZmllZCBzbGlnaHRseSB0byB1c2UgdGhlIGludGVybmFsIGNvbm5lY3QtZmlyc3QtCiAgdGhlbi1kbyBhcHByb2FjaC4KCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE1vcmUgYnVncyBlcmFzZWQuCgpWZXJzaW9uIDcuNy1hbHBoYTIKCkRhbmllbCAoNCBNYXJjaCAyMDAxKQotIE5vdywgdGhlcmUncyBldmVuIGEgYmFzaWMgY2hlY2sgdGhhdCBhIHJlLXVzZWQgY29ubmVjdGlvbiBpcyBzdGlsbCBhbGl2ZQogIGJlZm9yZSBpdCBpcyBhc3N1bWVkIHNvLiBBIGZldyBmaXJzdCB0ZXN0cyBoYXZlIHByb3ZlbiB0aGF0IGxpYmN1cmwgd2lsbAogIHRoZW4gcmUtY29ubmVjdCBpbnN0ZWFkIG9mIHJlLXVzZSB0aGUgZGVhZCBjb25uZWN0aW9uIQoKRGFuaWVsICgyIE1hcmNoIDIwMDEpCi0gTm93IHRoZXkgd29yayBpbnRlcm1peGVkIGFzIHdlbGwuIE1ham9yIGNvb2xuZXNzIQoKLSBNb3JlIGZpZGRsaW5nIGFyb3VuZCwgbXkgJ3RpbnknIGNsaWVudCBJIGhhdmUgZm9yIHRlc3RpbmcgcHVycG9zZXMgbm93IGhhcwogIHByb3ZlZCB0byBkb3dubG9hZCBib3RoIEZUUCBhbmQgSFRUUCB3aXRoIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMuIFRoZXkgZG8KICBub3Qgd29yayBpbnRlcm1peGVkIHlldCB0aG91Z2guCgpEYW5pZWwgKDEgTWFyY2ggMjAwMSkKLSBXaWxmcmVkbyBTYW5jaGV6IHBvaW50ZWQgb3V0IGEgbWlub3Igc3BlbGxpbmcgbWlzdGFrZSBpbiBhIG1hbiBwYWdlIGFuZCB0aGF0CiAgY3VybF9zbGlzdF9hcHBlbmQoKSBzaG91bGQgdGFrZSBhIGNvbnN0IGNoYXIgKiBhcyBzZWNvbmQgYXJndW1lbnQuIEl0IGRvZXMKICBub3cuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDEpCi0gVGhlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc3RhcnQgdG8gbG9vayBnb29kIGZvciBIVFRQLiBPbiBhIHN1YnNlcXVlbnQKICByZXF1ZXN0LCBpdCBzZWVtcyB0aGF0IGxpYmN1cmwgbm93IGNhbiBwaWNrIGFuIGFscmVhZHkgZXhpc3RpbmcgY29ubmVjdGlvbgogIGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgb3IgaXQgb3BlbnMgYSBuZXcgb25lLgoKLSBEb3VnbGFzIFIuIEhvcm5lciBtYWlsZWQgbWUgY29ycmVjdGlvbnMgdG8gdGhlIGN1cmxfZm9ybXBhcnNlKCkgbWFuIHBhZ2UKICB0aGF0IEkgYXBwbGllZC4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwMSkKLSBBZGRlZCB0aGUgZG9jcy9leGFtcGxlcy93aW4zMnNvY2tldHMuYyBmaWxlIGZvciBvdXIgd2luZG93cyBmcmllbmRzLgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHByb3ZpZGVkIGJyYW5kIG5ldyBURUxORVQgZnVuY3Rpb25hbGl0eSBhbmQKICBpbXByb3ZlbWVudHM6CgogICogTmVnb3RpYXRpb24gaXMgbm93IHBhc3NpdmUuIEN1cmwgZG9lcyBub3QgbmVnb3RpYXRlIHVudGlsIHRoZSBwZWVyIGRvZXMuCiAgKiBQb3NzaWJpbGl0eSB0byBzZXQgbmVnb3RpYXRpb24gb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lLCBjdXJyZW50bHkgb25seQogICAgWERJU1BMT0MsIFRUWVBFIGFuZCBORVdfRU5WSVJPTiAoY2FsbGVkIE5FV19FTlYpLgogICogTm93IHNlbmRzIHRoZSBVU0VSIGVudmlyb25tZW50IHZhcmlhYmxlIGlmIHRoZSAtdSBzd2l0Y2ggaXMgdXNlZC4KICAqIFVzZSAtdCB0byBzZXQgdGVsbmV0IG9wdGlvbnMgKExpbnVzIGV2ZW4gdXBkYXRlZCB0aGUgbWFuIHBhZ2UsIGF3ZXNvbWUhKQoKLSBIYXZlbid0IGRvbmUgdGhpcyBiaWcgY2hhbmdlcyB0byBjdXJsIGZvciBhIHdoaWxlLiBNb3ZlZCBhcm91bmQgYSBsb3Qgb2YKICBzdHJ1Y3QgZmllbGRzIGFuZCBzdHVmZiB0byBtYWtlIG11bHRpcGxlIGNvbm5lY3Rpb25zIGdldCBjb25uZWN0aW9uIHNwZWNpZmljCiAgZGF0YSBpbiBzZXBhcmF0ZSBzdHJ1Y3RzIHNvIHRoYXQgdGhleSBjYW4gY28tZXhpc3QgaW4gYSBuaWNlIHdheS4gU2VlIHRoZQogIG1haWxpbmcgbGlzdHMgZm9yIGRpc2N1c3Npb25zIGFyb3VuZCBob3cgdGhpcyBpcyBnb25uYSBiZSBpbXBsZW1lbnRlZC4gRG9jcwogIGFuZCBtb3JlIHdpbGwgZm9sbG93LgoKICBTdHVkaWVkIHRoZSBIVFRQIFJGQyB0byBmaW5kIG91dCBiZXR0ZXIgaG93IHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgc2hvdWxkCiAgd29yay4gU2VlbXMgY29vbCBlbm91Z2guCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDEpCi0gQm9iIFNjaGFkZXIgYnJvdWdodCBtZSB0d28gZmlsZXMgdGhhdCBoZWxwIHNldCB1cCBhIE1TIFZDKysgbGliY3VybCBwcm9qZWN0CiAgZWFzaWVyLiBIZSBhbHNvIHByb3ZpZGVkIG1lIHdpdGggYW4gdXAtdG8tZGF0ZSBsaWJjdXJsLmRlZiBmaWxlLgoKLSBJIG1vdmVkIGEgYnVuY2ggb2YgcHJvdG90eXBlcyBmcm9tIHRoZSBwdWJsaWMgPGN1cmwvY3VybC5oPiBmaWxlIHRvIHRoZQogIGxpYnJhcnkgcHJpdmF0ZSB1cmxkYXRhLmguIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgdXBjb21pbmcgY2hhbmdlcy4gVGhlCiAgbG93IGxldmVsIGludGVyZmFjZSBpcyBubyBsb25nZXIgYmVpbmcgcGxhbm5lZCB0byBiZWNvbWUgcmVhbGl0eS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwMSkKLSBDVVJMT1BUX1BPU1QgaXMgbm90IHJlcXVpcmVkIGFueW1vcmUuIEp1c3Qgc2V0dGluZyB0aGUgUE9TVCBzdHJpbmcgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUyB3aWxsIHN3aXRjaCBvbiB0aGUgSFRUUCBQT1NULiBNb3N0IG90aGVyIHRoaW5ncyBpbgogIGxpYmN1cmwgYWxyZWFkeSB3b3JrcyB0aGlzIHdheSwgaS5lIHRoZXkgcmVxdWlyZSBvbmx5IHRoZSBwYXJhbWV0ZXIgdG8KICBzd2l0Y2ggb24gYSBmZWF0dXJlIHNvIEkgdGhpbmsgdGhpcyB3b3JrcyB3ZWxsIHdpdGggdGhlIHJlc3QuIFNldHRpbmcgYSBOVUxMCiAgc3RyaW5nIHN3aXRjaGVzIG9mZiB0aGUgUE9TVCBhZ2Fpbi4KCi0gRXhjZWxsZW50IHN1Z2dlc3Rpb25zIGZyb20gUmljaCBHcmF5LCBSaWNrIEpvbmVzLCBKb2hhbiBOaWxzc29uIGFuZCBCam9ybgogIFJlZXNlIGhlbHBlZCBtZSBkZWZpbmUgYSB3YXkgaG93IHRvIGluY29ycG9yYXRlIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgaW50bwogIGxpYmN1cmwgaW4gYSB2ZXJ5IHNtb290aCB3YXkuIElmIGRvbmUgcmlnaHQsIG5vIGNoYW5nZSBtYXkgaGF2ZSB0byBiZSBtYWRlCiAgdG8gb2xkZXIgcHJvZ3JhbXMgYW5kIHRoZXkgd2lsbCBqdXN0IHN0YXJ0IHVzaW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgd2hlbgogIGFwcGxpY2FibGUhCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDEpCi0gQ2hhbmdlZCB0aGUgd29yZCAndGltZW91dGVkJyB0byAndGltZWQgb3V0JyBpbiB0d28gZGlmZmVyZW50IGVycm9yIG1lc3NhZ2VzLgogIFN1Z2dlc3RlZCBieSBMYXJyeSBGYWhub2UuCgpWZXJzaW9uIDcuNi4xCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwMSkKLSBGcmFuayBSZWlkIGFuZCBDYWluIEhvcHdvb2QgcHJvdmlkZWQgaW5mb3JtYXRpb24gYW5kIHJlc2VhcmNoIGFyb3VuZCBhIEhUVFBTCiAgUFVUL3VwbG9hZCBwcm9ibGVtIHdlIHNlZW0gdG8gaGF2ZS4gTm8gc29sdXRpb24gZm91bmQgeWV0LgoKRGFuaWVsICg4IEZlYnJ1YXJ5IDIwMDEpCi0gQW4gaW50ZXJlc3RpbmcgZGlzY3Vzc2lvbiBpcyBob3cgdG8gc3BlY2lmeSBhbiBlbXB0eSBwYXNzd29yZCB3aXRob3V0IGhhdmluZwogIGN1cmwgYXNrIGZvciBpdCBpbnRlcmFjdGl2ZWx5PyBUaGUgY3VycmVudCBpbXBsbWVudGF0aW9uIHRha2VzIGFuIGVtcHR5CiAgcGFzc3dvcmQgYXMgYSByZXF1ZXN0IGZvciBhIHBhc3N3b3JkIHByb21wdC4gSG93ZXZlciwgSSBzdGlsbCB3YW50IHRvCiAgc3VwcG9ydCBhIGJsYW5rIHVzZXIgZmllbGQuIFRodXMsIHRvZGF5IGlmIHlvdSBlbnRlciAiLXUgOiIgKHdpdGhvdXQgdXNlcgogIGFuZCBwYXNzd29yZCkgY3VybCB3aWxsIHByb21wdCBmb3IgdGhlIHBhc3N3b3JkLiBUcmlja3kuIEhvdyB3b3VsZCB5b3UKICBzcGVjaWZ5IHlvdSB3YW50IHRoZSBwcm9tcHQgb3RoZXJ3aXNlPwoKLSBNYWRlIHRoZSBuZXRyYyBwYXJzZSByZXN1bHQgcG9zc2libGUgdG8gdXNlIGZvciBvdGhlciBwcm90b2NvbHMgdGhhbiBGVFAgYW5kCiAgSFRUUCAoc3VjaCBhcyB0aGUgdXBjb21pbmcgVEVMTkVUIGZpeGVzKS4KCi0gVGhlIHByZXZpb3VzbHkgbWVudGlvbmVkICJNU1ZDKysgcHJvYmxlbXMiIHR1cm5lZCBvdXQgdG8gYmUgYSBub24taXNzdWUuCgotIEFkZGVkIGEgSFRUUCBmaWxlIHVwbG9hZCBjb2RlIGV4YW1wbGUgaW4gdGhlIGRvY3MvZXhhbXBsZXMvIHNlY3Rpb24gb24KICByZXF1ZXN0LgoKLSBBZGp1c3RlZCB0aGUgRlRQIHJlc3BvbnNlIGZpeCBzbGlnaHRseS4KClZlcnNpb24gNy42LjEtcHJlMwoKRGFuaWVsICg3IEZlYnJ1YXJ5IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZvdW5kIGEgZmxhdyBpbiB0aGUgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbiBmb3IgRlRQIHRoYXQKICBjb3VsZCBtYWtlIGxpYmN1cmwgbm90IGdldCBvdXQgb2YgdGhlIGxvb3AgcHJvcGVybHkgd2hlbiBpdCBzaG91bGQsIGlmCiAgbGliY3VybCBnb3QgLTEgcmV0dXJuZWQgd2hlbiByZWFkaW5nIHRoZSBzb2NrZXQuCgotIEkgZm91bmQgYSBzaW1pbGFyIG1pc3Rha2UgaW4gaHR0cC5jIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgcmVhZGluZyB0aGUKICByZXN1bHRzIGZyb20gdGhlIHByb3h5IGNvbm5lY3Rpb24uCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgVkMgbWFrZWZpbGUgaW4gc3JjLyBuZWVkZWQgdGhlIGxpYnBhdGggc2V0CiAgZm9yIHRoZSBkZWJ1ZyBidWlsZCB0byB3b3JrLgoKLSBEYW5pZWwgR2VocmlnZXIgc3RlcHBlZCBpbiB0byBhc3Npc3Qgd2l0aCB0aGUgVkMrKyBzdHVmZiBSb2JlcnQgV2VhdmVyCiAgYnJvdWdodCB1cCB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gYnJvdWdodCBhIGJpZyBwYXRjaCB0aGF0IGJyaW5ncyBJUHY2LWF3YXJlbmVzcyB0bwogIGEgYnVuY2ggb2YgZGlmZmVyZW50IGFyZWFzIHdpdGhpbiBsaWJjdXJsLgoKLSBSb2JlcnQgV2VhdmVyIHRvbGQgbWUgYWJvdXQgdGhlIHByb2JsZW1zIHRoZSBNUyBWQysrIDYuMCBjb21waWxlciBoYXMgd2l0aAogIHRoZSAnc3RhdGljJyBrZXl3b3JkIG9uIGEgbnVtYmVyIG9mIGxpYmN1cmwgZnVuY3Rpb25zLiBJIG1pZ2h0IG5lZWQgdG8gYWRkIGEKICBwYXRjaCB0aGF0IHJlZGVmaW5lcyBzdGF0aWMgd2hlbiBsaWJjdXJsIGlzIGNvbXBpbGVkIHdpdGggdGhhdCBjb21waWxlci4KICBIb3cgZG8gSSBrbm93IHdoZW4gVkMrKyBjb21waWxlcywgYW55b25lPwoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDEpCi0gY3VybF9nZXRpbmZvKCkgd2FzIGV4dGVuZGVkIHdpdGggdHdvIG5ldyBvcHRpb25zOgogIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGFuZCBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9VUExPQUQuIFRoZXkKICByZXR1cm4gdGhlIGZ1bGwgYXNzdW1lZCBjb250ZW50IGxlbmd0aCBvZiB0aGUgdHJhbnNmZXIgaW4gdGhlIGdpdmVuCiAgZGlyZWN0aW9uLiBUaGUgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgd2lsbCBiZSB0aGUgQ29udGVudC1MZW5ndGg6CiAgc2l6ZSBvZiBhIEhUVFAgZG93bmxvYWQuIEFkZGVkIGRlc2NyaXB0aW9ucyB0byB0aGUgbWFuIHBhZ2UgYXMgd2VsbC4gVGhpcwogIHdhcyBkb25lIGFmdGVyIGRpc2N1c3Npb25zIHdpdGggQm9iIFNjaGFkZXIuCgpEYW5pZWwgKDMgRmVicnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBwcm92aWRlZCBhbm90aGVyIGZpeCB0aGF0IG1ha2VzIGN1cmwgYnVpbGQgdW5kZXIgdGhlIG1vcmUKICByZWNlbnQgY3lnd2luIGluc3RhbGxhdGlvbnMuIEl0IHNlZW1zIHRoZXkndmUgY2hhbmdlZCB0aGUgcHJlc2V0IGRlZmluZXMgdG8KICBub3QgaW5jbHVkZSBXSU4zMiBhbnltb3JlLgoKVmVyc2lvbiA3LjYuMS1wcmUyCgpEYW5pZWwgKDMxIEphbnVhcnkgMjAwMSkKLSBDdXJsX3JlYWQoKSBhbmQgY3VybF9yZWFkKCkgbm93IHJldHVybiBhIHNzaXplX3QgZm9yIHRoZSBzaXplLCBhcyBpdCBoYWQgdG8KICBiZSBhYmxlIHRvIHJldHVybiAtMS4gVGhlIHRlbG5ldCBzdXBwb3J0IGNyYXNoZWQgZHVlIHRvIHRoaXMgYW5kIHRoZXJlIHdhcyBhCiAgcG9zc2liaWxpdHkgdG8gd2VpcmQgYmVoYXZpb3IgYWxsIG92ZXIuIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgaGVscGVkIG1lCiAgZmluZCB0aGlzLgoKLSBBZGRlZCBhIGNvbmZpZ3VyZS5pbiBjaGVjayBmb3IgYSB3b3JraW5nIGdldGFkZHJpbmZvKCkgaWYgSVB2NiBpcyByZXF1ZXN0ZWQuCiAgSSBhbHNvIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmVhdHVyZSAtLWVuYWJsZS1kZWJ1ZyB3aGljaCBzZXRzIGEgY291cGxlCiAgb2YgY29tcGlsZXIgb3B0aW9ucyB3aGVuIHVzZWQuIEl0IGFzc3VtZXMgZ2NjLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDEpCi0gSSBmaW5hbGx5IHRvb2sgYSBzdGFiIGF0IHRoZSBsb25nLXRlcm0gRklYTUUgaXRlbSBJJ3ZlIGhhZCBvbiBteXNlbGYsIGFuZAogIG5vdyBsaWJjdXJsIHdpbGwgcHJvcGVybHkgd29yayB3aGVuIGRvaW5nIGEgSFRUUCByYW5nZS1yZXF1ZXN0IHRoYXQgZm9sbG93cwogIGEgTG9jYXRpb246LiBQcmV2aW91c2x5IHRoYXQgd291bGQgbWFrZSBsaWJjdXJsIGZhaWwgc2F5aW5nIHRoYXQgdGhlIHNlcnZlcgogIGRvZXNuJ3Qgc2VlbSB0byBzdXBwb3J0IHJhbmdlIHJlcXVlc3RzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gSSBhZGRlZCBhIHRlc3QgY2FzZSBmb3IgdGhlIEhUVFAgUFVUIHJlc3VtZSB0aGluZyAodGVzdCBjYXNlIDMzKS4KClZlcnNpb24gNy42LjEtcHJlMQoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDEpCi0gWWV0IGFub3RoZXIgQ29udGVudC1SYW5nZSBjaGFuZ2UuIE9rIG5vdz8gQm9iIFNjaGFkZXIgY2hlY2tzIGZyb20gaGlzIGVuZCAKICBhbmQgaXQgd29ya3MgZm9yIGhpbS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDAxKQotIFNvIHRoZSBIVFRQIFBVVCByZXN1bWUgZml4IHdhc24ndCBnb29kLiBUaGVyZSBzaG91bGQgYXBwZWFyYW50bHkgYmUgYQogIENvbnRlbnQtUmFuZ2UgaGVhZGVyIHdoZW4gcmVzdW1pbmcgYSBQVVQuCgotIEkgbm90aWNlZCBJIGJyb2tlIHRoZSBkb3dubG9hZC1jaGVjayB0aGF0IHZlcmlmaWVzIHRoYXQgYSByZXN1bWVkIEhUVFAKICBkb3dubG9hZCBpcyBhY3R1YWxseSByZXN1bWVkLiBJdCBnb3QgYnJva2UgYmVjYXVzZSBteSBuZXcgJ2h0dHByZXEnIGZpZWxkCiAgaW4gdGhlIG1haW4gY3VybCBzdHJ1Y3QuIEkgc2hvdWxkIGdldCBzbGFwcGVkLiBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvcgogIHRoaXMgbm93LCBzbyBJIHdvbid0IGJlIGFibGUgdG8gcnVpbiB0aGlzIGFnYWluIHdpdGhvdXQgbm90aWNpbmcuCgotIEFkZGVkIGEgdGVzdCBjYXNlIGZvciBjb250ZW50LWxlbmd0aCB2ZXJpZnlpbmcgd2hlbiBkb3dubG9hZGluZyBIVFRQLgoKLSBNYWRlIHRoZSBwcm9ncmVzcyBtZXRlciB0aXRsZSBzYXkgaWYgdGhlIHRyYW5zZmVyIGlzIGJlaW5nIHRyYW5zZmVyZWQuIEl0CiAgbWFrZXMgdGhlIG91dHB1dCBzbGlnaHRseSBiZXR0ZXIgZm9yIHJlc3VtZXMuCgotIFdoZW4gZGVhbGluZyB3aXRoIExvY2F0aW9uOiBhbmQgSFRUUCByZXR1cm4gY29kZXMsIGxpYmN1cmwgd2lsbCBub3QgYXR0ZW1wdAogIHRvIGZvbGxvdyB0aGUgc3Bpcml0IG9mIFJGQzI2MTYgYmV0dGVyLiBJdCBtZWFucyB0aGF0IHdoZW4gUE9TVGluZyB0byBhCiAgVVJMIHRoYXQgaXMgYmVpbmcgZm9sbG93aW5nIHRvIGEgc2Vjb25kIHBsYWNlLCB0aGUgc3RhbmRhcmQgd2lsbCBqdWRnZSBvbgogIHdoYXQgdG8gZG8uIEFsbCBIVFRQIGNvZGVzIGV4Y2VwdCAzMDMgYW5kIDMwNSB3aWxsIGNhdXNlIGN1cmwgdG8gbWFrZSBhCiAgc2Vjb25kIFBPU1Qgb3BlcmF0aW9uLiAzMDMgd2lsbCBtYWtlIGEgR0VUIGFuZCAzMDUgaXMgbm90IHlldCBzdXBwb3J0ZWQuCgogIEkgYWxzbyB3cm90ZSB0d28gdGVzdCBjYXNlcyBmb3IgdGhpcyBQT1NUL0dFVC9Mb2NhdGlvbiBzdHVmZi4KClZlcnNpb24gNy42CgpEYW5pZWwgKDI2IEphbnVhcnkgMjAwMSkKLSBMb3RzIG9mIG1haWxzIGJhY2sgYW5kIGZvcnRoIHdpdGggQm9iIFNjaGFkZXIgZmluYWxseSBtYWRlIG1lIGFkZCBhIHNtYWxsCiAgcGllY2Ugb2YgY29kZSBpbiB0aGUgSFRUUCBlbmdpbmUgc28gdGhhdCBIVFRQIHVwbG9hZCByZXN1bWUgd29ya3MuIFlvdSBjYW4KICBub3cgZG8gYW4gb3BlcmF0aW9uIGxpa2UgJ2N1cmwgLVQgZmlsZSAtQyA8b2Zmc2V0PiA8VVJMPicgYW5kIGN1cmwgd2lsbCBQVVQKICB0aGUgZW5kaW5nIHBhcnQgb2YgdGhlIGZpbGUgc3RhcnRpbmcgYXQgZ2l2ZW4gb2ZmZXQgdG8gdGhlIHNwZWNpZmllZCBVUkwuCgpWZXJzaW9uIDcuNi1wcmU0CgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMSkKLSBJIHRvb2sgaG9sZCBvZiBSaWNrIEpvbmVzJyBxdWVzdGlvbiB3aHkgd2UgZG9uJ3QgdXNlIHJlY3YoKSBhbmQgc2VuZCgpIGZvcgogIHJlYWRpbmcvd3JpdGluZyB0byB0aGUgc29ja2V0cyBhbmQgSSd2ZSBub3cgbW9kaWZpZWQgdGhlIHNyZWFkKCkgYW5kCiAgc3dyaXRlKCkgbWFjcm9zIHRvIHVzZSB0aGVtIGluc3RlYWQuIElmIG5vdGhpbmcgZWxzZSwgdGhleSBjb3VsZCBiZSB0ZXN0ZWQKICBpbiB0aGUgbmV4dCBiZXRhLXJvdW5kIGNvbWluZyByaWdodCB1cC4KCi0gSmVmZiBNb3Jyb3cgZm91bmQgYSBwcm9ibGVtIHdpdGggbGliY3VybCdzIHVzYWdlIG9mIFNTTF9yZWFkKCkgYW5kIHN1cHBsaWVkCiAgaGlzIHJlc2VhcmNoIHJlc3VsdHMgaW4gaG93IHRvIGZpeCB0aGlzLiBJdCB0dXJucyBvdXQgd2UgaGF2ZSB0byBpbnZva2UgdGhlCiAgZnVuY3Rpb24gc2V2ZXJhbCB0aW1lcyBpbiBzb21lIGNhc2VzLiBUaGUgc2FtZSBnb2VzIGZvciB0aGUgU1NMX3dyaXRlKCkuCgogIEkgbWFkZSBzb21lIHJhdGhlciBkcmFzdGljIGNoYW5nZXMgYWxsIG92ZXIgbGliY3VybCB0byBtYWtlIGFsbCB3cml0ZXMgYW5kCiAgcmVhZHMgZ2V0IGRvbmUgb24gb25lIHNpbmdsZSBwbGFjZSBzbyB0aGF0IHRoaXMgcmVwZWF0ZWQtYXR0ZW1wdHMgdGhpbmcKICB3b3VsZCBvbmx5IGhhdmUgdG8gYmUgaW1wbGVtZW50ZWQgYXQgb25lIHBvaW50LgoKLSBSaWNrIEpvbmVzIHNwb3R0ZWQgdGhhdCB0aGUgJ3RvdGFsIHRpbWUnIGNvdW50ZXIgcmVhbGx5IGRpZG4ndCBtZWFzdXJlIHRoZQogIHRvdGFsIHRpbWUgdmVyeSBhY2N1cmF0ZSBvbiBzdWJzZWNvbmQgbGV2ZWxzLgoKLSBKb2hhbiBOaWxzc29uIHBvaW50ZWQgb3V0IHRoZSBuZWVkIHRvIG1vcmUgY2xlYXJseSBzcGVjaWZ5IHRoYXQgdGhlIHRpbWVvdXQKICB2YWx1ZSB5b3Ugc2V0IGZvciBhIGRvd25sb2FkIGlzIGZvciB0aGUgKmVudGlyZSogZG93bmxvYWQuIFRoZXJlJ3MgY3VycmVudGx5CiAgbm8gb3B0aW9uIGF2YWlsYWJsZSB0aGF0IHNldHMgYSB0aW1lb3V0IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSBvbmx5LgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDEpCi0gSW5nbyBSYWxmIEJsdW0gc3VibWl0dGVkIGEgc2VyaWVzIG9mIHBhdGNoZXMgcmVxdWlyZWQgdG8gZ2V0IGN1cmwgdG8gY29tcGlsZQogIHByb3Blcmx5IHdpdGggY3lnd2luLgoKLSBSb2JlcnQgV2VhdmVyIHBvc3RlZCBhIGZpeCBmb3IgdGhlIHdpbjMyIHNlY3Rpb24gb2YgdGhlIGN1cmxfZ2V0ZW52KCkgY29kZQogIHRoYXQgY29ycmVjdGVkIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLgoKLSBBZGRlZCBjb21tZW50cyBpbiBhIGZldyBmaWxlcyBpbiBhIHN1ZGRlbiBhdHRlbXB0IHRvIG1ha2UgdGhlIHNvdXJjZXMgbW9yZQogIGVhc3kgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZCEKCkRhbmllbCAoMjMgSmFudWFyeSAyMDAxKQotIEFkZGVkIHNpbXBsZSBJUHY2IGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgbWFkZSB0aGUgdmVyc2lvbgogIHN0cmluZyBhZGQgJ2lwdjYnIHRvIHRoZSBlbmFibGUgc2VjdGlvbiBpbiB0aGF0IGNhc2UuIEVOQUJMRV9JUFY2IHdpbGwgYmUKICBzZXQgaWYgY3VybCBpcyBjb21waWxlZCB3aXRoIElQdjYgc3VwcG9ydCBlbmFibGVkLgoKLSBBZGRlZCBhIHBhcnNlciBmb3IgSVB2Ni1zdHlsZSBzcGVjaWZpZWQgSVAtYWRkcmVzc2VzIGluIGEgVVJMLiBUaHVzLCB3aGVuCiAgSVB2NiBnZXRzIGVuYWJsZWQgc29vbiwgd2UgY2FuIHVzZSBVUkxzIGxpa2UgJ1swOjoxXTo4MCcuLi4KCi0gTWFkZSB0aGUgVVJMIGdsb2JiaW5nIGluIHRoZSBjbGllbnQgcG9zc2libGUgdG8gZmFpbCBzaWxlbnRseSBpZiB0aGVyZSdzIGFuCiAgZXJyb3IgaW4gdGhlIGdsb2JiaW5nLiBJdCBtYWtlcyBpdCBhbG1vc3QgaW50dWl0aXZlLCBzbyB3aGVuIHlvdSBkb24ndAogIGZvbGxvdyB0aGUgc3ludGF4IHJ1bGVzLCBnbG9iYmluZyBpcyBzaW1wbHkgc3dpdGNoZWQgb2ZmIGFuZCB0aGUgcmF3IHN0cmluZwogIGlzIHVzZWQgaW5zdGVhZC4KCiAgSSBzdGlsbCB0aGluayB3ZSdsbCBnZXQgcHJvYmxlbXMgd2l0aCBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcyB3aGVuIHdlICp3YW50KgogIGdsb2JiaW5nIG9uIHBhcnRzIG9mIHRoZSBVUkwgYXMgdGhlIGluaXRpYWwgcGFydCBvZiB0aGUgVVJMIHdpbGwgZm9yIHN1cmUKICBzZXJpb3VzbHkgY29uZnVzZSB0aGUgZ2xvYmJlci4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcHJvZ3Jlc3MgbWV0ZXIgcGF0Y2ggdGhhdCBtYWtlcyBpdCBsb29rIGJldHRlciBldmVuCiAgZHVyaW5nIHNsb3cgc3RhcnRzLiBQcmV2aW91c2x5IGl0IG1hZGUgc29tZSBzaWxseSBhc3N1bXB0aW9ucy4uLgoKLSBBZGRlZCB0d28gRlRQIHRlc3RzIGZvciAtUSBhbmQgLVEgLSBzdHVmZiBzaW5jZSBpdCB3YXMgYmVpbmcgZGlzY3Vzc2VkIG9uCiAgdGhlIG1haWxpbmcgbGlzdC4gSGFkIHRvIGNvcnJlY3QgdGhlIGZ0cHNlcnZlci5wbCB0b28gYXMgaXQgYnVnZ2VkIHNsaWdodGx5LgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDEpCi0gTWFkZSB0aGUgTG9jYXRpb246IHBhcnNlcnMgZGVhbCB3aXRoIGFueS1sZW5ndGggVVJMcy4gVGh1cyBJIHJlbW92ZWQgdGhlIGxhc3QKICBjb2RlIHRoYXQgcmVzdHJpY3RzIHRoZSBsZW5ndGggb2YgVVJMcyB0aGF0IGN1cmwgc3VwcG9ydHMuCgotIEFkZGVkIGEgLS1nbG9ib2ZmIHRlc3QgY2FzZSAoIzI4KSBhbmQgaXQgcXVpY2tseSBpZGVudGlmaWVkIGEgbWVtb3J5IHByb2JsZW0KICBpbiBzcmMvbWFpbi5jIHRoYXQgSSB0b29rIGNhcmUgb2YuCgpWZXJzaW9uIDcuNi1wcmUzCgpEYW5pZWwgKDE3IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSB0d28gZm9ybWVyIGZpbGVzIGxpYi9kb3dubG9hZC5jIGFuZCBsaWIvaGlnaGxldmVsLmMgYmVjb21lIHRoZSBuZXcKICBsaWIvdHJhbnNmZXIuYyB3aGljaCBtYWtlcyBtb3JlIHNlbnNlLiBJIGFsc28gZGlkIHRoZSByZW5hbWUgZnJvbSBUcmFuc2ZlcigpCiAgdG8gQ3VybF9UcmFuc2ZlcigpIGluIHRoZSBvdGhlciBzb3VyY2UgZmlsZXMgdGhhdCB1c2UgdGhlIHRyYW5zZmVyIGZ1bmN0aW9uCiAgaW4gdGhlIHNwaXJpdCBvZiB1c2luZyBDdXJsXyBwcmVmaXggZm9yIGxpYnJhcnktc2NvcGVkIGdsb2JhbCBzeW1ib2xzLgoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgLWcvLS1nbG9ib2ZmIHRoYXQgc3dpdGNoZXMgT0ZGIHRoZSBVUkwgZ2xvYmJpbmcgYW5kIHRodXMgZW5hYmxlcyB7fVtdCiAgbGV0dGVycyB0byBiZSBwYXJ0IG9mIHRoZSBVUkwuIERvIG5vdGUgdGhhdCBSRkMyMzk2IHNlY3Rpb24gMi40LjMgZXhwbGljaXRseQogIG1lbnRpb24gdGhlc2UgbGV0dGVycyB0byBiZSBlc2NhcGVkLiBUaGlzIHdhcyBwb3N0ZWQgYXMgYSBmZWF0dXJlIHJlcXVlc3QgYnkKICBKb3JnZSBHdXRpZXJyZXogYW5kIGFzIGEgYnVnIGJ5IFRlcnJ5LgoKLSBTaG9ydCBvcHRpb25zIHRvIGN1cmwgdGhhdCByZXF1aXJlcyBwYXJhbWV0ZXJzIGNhbiBub3cgYmUgc3BlY2lmaWVkIHdpdGhvdXQKICBoYXZpbmcgdGhlIG9wdGlvbiBhbmQgaXRzIHBhcmFtZXRlciBzcGFjZSBzZXBhcmF0ZWQuIC1vZmlsZSB3b3JrcyBhcyBnb29kIGFzCiAgLW8gZmlsZS4gLW0yMCBpcyBlcXVhbCB0byAtbSAyMC4gRG8gbm90ZSB0aGF0IHRoaXMgZ29lcyBmb3Igc2luZ2xlLWxldHRlcgogIG9wdGlvbnMgb25seSwgdmVyYm9zZSAtLWxvbmctc3R5bGUgb3B0aW9ucyBzdGlsbCBtdXN0IGJlIHNlcGFyYXRlZCB3aXRoCiAgc3BhY2UgZnJvbSB0aGVpciBwYXJhbWV0ZXJzLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwMSkKLSBGcmFuY2lzIERhZ2VuYWlzIHJlcG9ydGVkIHRoYXQgdGhlIFNDTyBjb21waWxlciBzdGlsbCBmYWlscyB3aGVuIGNvbXBpbGluZwogIGN1cmwgZHVlIHRvIHRoYXQgZ2V0cGFzc19yKCkgcHJvdG90eXBlLiBJJ3ZlIG5vdyBwdXQgaXQgYXJvdW5kICNpZm5kZWYKICBIQVZFX0dFVFBBU1NfUiBpbiBhbiBhdHRlbXB0IHRvIHBsZWFzZSB0aGUgU0NPIHN5c3RlbXMuCgotIE1hZGUgc29tZSBtaW5vciBjb3JyZWN0aW9ucyB0byBnZXQgdGhlIGNsaWVudCB0byBjbGVhbnVwIHByb3Blcmx5IGFuZCBJIG1hZGUKICB0aGUgc2VwYXJhdG9yIHdvcmsgYWdhaW4gd2hlbiBnZXR0aW5nIG11bHRpcGxlIGdsb2JiZWQgVVJMcyB0byBzdGRvdXQuCgotIFdvcmtlZCB3aXRoIExvaWMgRGFjaGFyeSB0byBnZXQgdGhlIG1ha2UgZGlzdCBhbmQgbWFrZSBkaXN0Y2hlY2sgd29yawogIGNvcnJlY3RseS4gVGhlICdtYWtldGd6JyBzY3JpcHQgaXMgbm93IHVzaW5nIHRoZSBhdXRvbWFrZSBnZW5lcmF0ZWQgJ21ha2UKICBkaXN0JyB3aGVuIGNyZWF0aW5nIHJlbGVhc2UgYXJjaGl2ZXMuIExvaWMgc3VjY2Vzc2Z1bGx5IG1hZGUgJ21ha2UgcnBtcycKICBhdXRvbWF0aWNhbGx5IGJ1aWxkIFJQTXMhCgpMb2ljIERhY2hhcnkgKDYgSmFudWFyeSAyMDAxKQotIEF1dG9tYXRlZCBnZW5lcmF0aW9uIG9mIHJwbSBwYWNrYWdlcywgbm8gbmVlZCB0byBiZSByb290LgoKLSBtYWtlIGRpc3RjaGVjayBnZW5lcmF0ZXMgYSBwcm9wZXIgZGlzdHJpYnV0aW9uIChFWFRSQV9ESVNUCiAgaW4gYWxsIE1ha2VmaWxlLmFtIG1vZGlmaWVkIHRvIG1hdGNoIEZJTEVTKS4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDEpCi0gSHVnZSBjbGllbnQtc2lkZSBoYWNrOiBub3cgbXVsdGlwbGUgVVJMcyBhcmUgc3VwcG9ydGVkLiBBbnkgbnVtYmVyIG9mIFVSTHMKICBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGFuZCB0aGV5J2xsIGFsbCBiZSBkb3dubG9hZGVkLiBUaGVyZQogIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIC1vIG9yIC1PIGZvciBlYWNoIFVSTCBvciB0aGUgZGF0YSB3aWxsIGJlIHdyaXR0ZW4gdG8KICBzdGRvdXQuIFRoaXMgbmVlZHMgbW9yZSB0ZXN0aW5nLCB0aW1lIHRvIHJlbGVhc2UgYSA3LjYtcHJlIHBhY2thZ2UuCgotIFRoZSBrcmI0IHN1cHBvcnQgd2FzIGJyb2tlbiBpbiB0aGUgcmVsZWFzZS4gRml4ZWQgbm93LgoKLSBIdWdlIGludGVybmFsIHN5bWJvbCByZW5hbWUgb3BlcmF0aW9uLiBBbGwgbm9uLXN0YXRpYyBidXQgc3RpbGwgbGliLWludGVybmFsCiAgc3ltYm9scyBzaG91bGQgbm93IGJlIHByZWZpeGVkIHdpdGggJ0N1cmxfJyB0byBwcmV2ZW50IGNvbGxpc2lvbnMgd2l0aCBvdGhlcgogIGxpYnMuIEFsbCBwdWJsaWMgc3ltYm9scyBzaG91bGQgYmUgcHJlZml4ZWQgd2l0aCAnY3VybF8nIGFuZCB0aGUgcmVzdCBzaG91bGQKICBiZSBzdGF0aWMgYW5kIHRodXMgaW52aXNpYmxlIHRvIHRoZSBvdXRzaWRlIHdvcmxkLiBJIHVwZGF0ZWQgdGhlIElOVEVSTkFMUwogIGRvY3VtZW50IHRvIHNheSB0aGlzIGFzIHdlbGwuCgpWZXJzaW9uIDcuNS4yCgpEYW5pZWwgKDQgSmFudWFyeSAyMDAxKQotIEFzIEtldmluIFAgUm90aCBzdWdnZXN0ZWQsIEkndmUgYWRkZWQgdGV4dCB0byB0aGUgbWFuIHBhZ2UgZm9yIGV2ZXJ5IGNvbW1hbmQKICBsaW5lIG9wdGlvbiBhbmQgd2hhdCBoYXBwZW5zIHdoZW4geW91IHNwZWNpZnkgdGhhdCBvcHRpb24gbW9yZSB0aGFuCiAgb25jZS4gVGhhdCBoYXNuJ3QgYmVlbiBleGFjdGx5IGNyeXN0YWwgY2xlYXIgYmVmb3JlLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IHBvc3NpYmxlIHRvIHJ1biBmcm9tIG91dHNpZGUgdGhlIHNvdXJjZS10cmVlLiBGb3IKICBvZGQgcmVhc29ucyBJIGNhbid0IGJ1aWxkIGN1cmwgcHJvcGVybHkgb3V0c2lkZSB0aG91Z2guIEl0IGhhcyB0byBkbyB3aXRoCiAgY3VybCdzIGRlcGVuZGVuY2llcyBvbiBsaWJjdXJsLi4uCgotIEN1dCBvZmYgYWxsIG9sZGVyIChkYXRlZCAxOTk5IGFuZCBlYXJsaWVyKSBDSEFOR0VTIGVudHJpZXMgZnJvbSB0aGlzIGZpbGUuCiAgVGhlIG9sZGVyIHBpZWNlIGlzIG5hbWVkIENIQU5HRVMuMCBhbmQgaXMgYWRkZWQgdG8gdGhlIENWUyByZXBvc2l0b3J5IGluCiAgY2FzZSBhbnlvbmUgd291bGQgbmVlZCBpdC4KCi0gSSBhZGRlZCBhbm90aGVyIGZpbGUgJ0NWUy1JTkZPJyB0byB0aGUgQ1ZTLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dAogIGZpbGVzIGluIHRoZSBDVlMgdGhhdCBhcmVuJ3QgaW5jbHVkZWQgaW4gcmVsZWFzZSBhcmNoaXZlcyBhbmQgaG93IHRvIGJ1aWxkCiAgY3VybCB3aGVuIHlvdSBnZXQgdGhlIHNvdXJjZXMgb2ZmIENWUy4KCi0gVXBkYXRlZCBDT05UUklCVVRFIGFuZCBGQVEgZHVlIHRvIHRoZSBuZXcgbGljZW5zZS4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDEpCi0gUmVuYW1lZCBSRUFETUUubGliY3VybCB0byBMSUJDVVJMCgotIENoYW5nZWQgaGVhZGVycyBpbiBhbGwgc291cmNlcyBmaWxlcyB0byB0aGUgbmV3IGR1YWwgbGljZW5zZSBjb25jZXB0IG9mCiAgY3VybDogdXNlIHRoZSBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlICpvciogTVBMLiBUaGUgTEVHQUwgZmlsZSB3YXMgdXBkYXRlZAogIGFjY29yZGluZ2x5IGFuZCB0aGUgTVBMIDEuMSBhbmQgTUlUL1ggZGVyaXZhdGUgbGljZW5zZXMgYXJlIG5vdyBwYXJ0IG9mIHRoZQogIHJlbGVhc2UgYXJjaGl2ZS4K