DQogICAgICAgICAgICAgICAgQ2hhbmdlTG9nIGZpbGUgZm9yIHpsaWINCg0KQ2hhbmdlcyBpbiAxLjIuOCAoMjggQXByIDIwMTMpDQotIFVwZGF0ZSBjb250cmliL21pbml6aXAvaW93aW4zMi5jIGZvciBXaW5kb3dzIFJUIFtWb2xsYW50XQ0KLSBEbyBub3QgZm9yY2UgWl9DT05TVCBmb3IgQysrDQotIENsZWFuIHVwIGNvbnRyaWIvdnN0dWRpbyBbUm+nXQ0KLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIHpsaWIuaA0KLSBGaXggbWl4ZWQgbGluZSBlbmRpbmdzIGluIGNvbnRyaWIvdnN0dWRpbw0KDQpDaGFuZ2VzIGluIDEuMi43LjMgKDEzIEFwciAyMDEzKQ0KLSBGaXggdmVyc2lvbiBudW1iZXJzIGFuZCBETEwgbmFtZXMgaW4gY29udHJpYi92c3R1ZGlvLyovemxpYi5yYw0KDQpDaGFuZ2VzIGluIDEuMi43LjIgKDEzIEFwciAyMDEzKQ0KLSBDaGFuZ2UgY2hlY2sgZm9yIGEgZm91ci1ieXRlIHR5cGUgYmFjayB0byBoZXhhZGVjaW1hbA0KLSBGaXggdHlwbyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MNCi0gQWRkIGNhc3RzIGluIGd6d3JpdGUuYyBmb3IgcG9pbnRlciBkaWZmZXJlbmNlcw0KDQpDaGFuZ2VzIGluIDEuMi43LjEgKDI0IE1hciAyMDEzKQ0KLSBSZXBsYWNlIHVzZSBvZiB1bnNhZmUgc3RyaW5nIGZ1bmN0aW9ucyB3aXRoIHNucHJpbnRmIGlmIGF2YWlsYWJsZQ0KLSBBdm9pZCBpbmNsdWRpbmcgc3RkZGVmLmggb24gV2luZG93cyBmb3IgWl9TT0xPIGNvbXBpbGUgW05pZXNzaW5rXQ0KLSBGaXggZ3pnZXRjIHVuZGVmaW5lIHdoZW4gWl9QUkVGSVggc2V0IFtUdXJrXQ0KLSBFbGltaW5hdGUgdXNlIG9mIG1rdGVtcCBpbiBNYWtlZmlsZSAobm90IGFsd2F5cyBhdmFpbGFibGUpDQotIEZpeCBidWcgaW4gJ0YnIG1vZGUgZm9yIGd6b3BlbigpDQotIEFkZCBpbmZsYXRlR2V0RGljdGlvbmFyeSgpIGZ1bmN0aW9uDQotIENvcnJlY3QgY29tbWVudCBpbiBkZWZsYXRlLmgNCi0gVXNlIF9zbnByaW50ZiBmb3Igc25wcmludGYgaW4gTWljcm9zb2Z0IEMNCi0gT24gRGFyd2luLCBvbmx5IHVzZSAvdXNyL2Jpbi9saWJ0b29sIGlmIGxpYnRvb2wgaXMgbm90IEFwcGxlDQotIERlbGV0ZSAiLS12ZXJzaW9uIiBmaWxlIGlmIGNyZWF0ZWQgYnkgImFyIC0tdmVyc2lvbiIgW1JpY2hhcmQgRy5dDQotIEZpeCBjb25maWd1cmUgY2hlY2sgZm9yIHZlcmFjaXR5IG9mIGNvbXBpbGVyIGVycm9yIHJldHVybiBjb2Rlcw0KLSBGaXggQ01ha2UgY29tcGlsYXRpb24gb2Ygc3RhdGljIGxpYiBmb3IgTVNWQzIwMTAgeDY0DQotIFJlbW92ZSB1bnVzZWQgdmFyaWFibGUgaW4gaW5mYmFjazkuYw0KLSBGaXggYXJndW1lbnQgY2hlY2tzIGluIGd6bG9nX2NvbXByZXNzKCkgYW5kIGd6bG9nX3dyaXRlKCkNCi0gQ2xlYW4gdXAgdGhlIHVzYWdlIG9mIHpfY29uc3QgYW5kIHJlc3BlY3QgY29uc3QgdXNhZ2Ugd2l0aGluIHpsaWINCi0gQ2xlYW4gdXAgZXhhbXBsZXMvZ3psb2cuW2NoXSBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnQgdHlwZXMNCi0gQXZvaWQgc2hpZnQgZXF1YWwgdG8gYml0cyBpbiB0eXBlIChjYXVzZWQgZW5kbGVzcyBsb29wKQ0KLSBGaXggdW5pbnRpYWxpemVkIHZhbHVlIGJ1ZyBpbiBnenB1dGMoKSBpbnRyb2R1Y2VkIGJ5IGNvbnN0IHBhdGNoZXMNCi0gRml4IG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yIGluIGV4YW1wbGVzL3pyYW4uYyBbTm9yXQ0KLSBGaXggYnVnIHdoZXJlIGd6b3BlbigpLCBnemNsb3NlKCkgd291bGQgd3JpdGUgYW4gZW1wdHkgZmlsZQ0KLSBGaXggYnVnIGluIGd6Y2xvc2UoKSB3aGVuIGd6d3JpdGUoKSBydW5zIG91dCBvZiBtZW1vcnkNCi0gQ2hlY2sgZm9yIGlucHV0IGJ1ZmZlciBtYWxsb2MgZmFpbHVyZSBpbiBleGFtcGxlcy9nemFwcGVuZC5jDQotIEFkZCBub3RlIHRvIGNvbnRyaWIvYmxhc3QgdG8gdXNlIGJpbmFyeSBtb2RlIGluIHN0ZGlvDQotIEZpeCBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnRseSBzaWduZWQgaW50ZWdlcnMgaW4gY29udHJpYi9ibGFzdA0KLSBDaGVjayBmb3IgaW52YWxpZCBjb2RlIGxlbmd0aCBjb2RlcyBpbiBjb250cmliL3B1ZmYNCi0gRml4IHNlcmlvdXMgYnV0IHZlcnkgcmFyZSBkZWNvbXByZXNzaW9uIGJ1ZyBpbiBpbmZ0cmVlcy5jDQotIFVwZGF0ZSBpbmZsYXRlQmFjaygpIGNvbW1lbnRzLCBzaW5jZSBpbmZsYXRlKCkgY2FuIGJlIGZhc3Rlcg0KLSBVc2UgdW5kZXJzY29yZWQgSS9PIGZ1bmN0aW9uIG5hbWVzIGZvciBXSU5BUElfRkFNSUxZDQotIEFkZCBfdHJfZmx1c2hfYml0cyB0byB0aGUgZXh0ZXJuYWwgc3ltYm9scyBwcmVmaXhlZCBieSAtLXpwcmVmaXgNCi0gQWRkIGNvbnRyaWIvdnN0dWRpby92YzEwIHByZS1idWlsZCBzdGVwIGZvciBzdGF0aWMgb25seQ0KLSBRdW90ZSAtLXZlcnNpb24tc2NyaXB0IGFyZ3VtZW50IGluIENNYWtlTGlzdHMudHh0DQotIERvbid0IHNwZWNpZnkgLS12ZXJzaW9uLXNjcmlwdCBvbiBBcHBsZSBwbGF0Zm9ybXMgaW4gQ01ha2VMaXN0cy50eHQNCi0gRml4IGNhc3RpbmcgZXJyb3IgaW4gY29udHJpYi90ZXN0emxpYi90ZXN0emxpYi5jDQotIEZpeCB0eXBlcyBpbiBjb250cmliL21pbml6aXAgdG8gbWF0Y2ggcmVzdWx0IG9mIGdldF9jcmNfdGFibGUoKQ0KLSBTaW1wbGlmeSBjb250cmliL3ZzdHVkaW8vdmMxMCB3aXRoICdkJyBzdWZmaXgNCi0gQWRkIFRPUCBzdXBwb3J0IHRvIHdpbjMyL01ha2VmaWxlLm1zYw0KLSBTdXBvcnQgaTY4NiBhbmQgYW1kNjQgYXNzZW1ibGVyIGJ1aWxkcyBpbiBDTWFrZUxpc3RzLnR4dA0KLSBGaXggdHlwb3MgaW4gdGhlIHVzZSBvZiBfTEFSR0VGSUxFNjRfU09VUkNFIGluIHpjb25mLmgNCi0gQWRkIHZjMTEgYW5kIHZjMTIgYnVpbGQgZmlsZXMgdG8gY29udHJpYi92c3R1ZGlvDQotIEFkZCBnenZwcmludGYoKSBhcyBhbiB1bmRvY3VtZW50ZWQgZnVuY3Rpb24gaW4gemxpYg0KLSBGaXggY29uZmlndXJlIGZvciBTdW4gc2hlbGwNCi0gUmVtb3ZlIHJ1bnRpbWUgY2hlY2sgaW4gY29uZmlndXJlIGZvciBmb3VyLWJ5dGUgaW50ZWdlciB0eXBlDQotIEFkZCBjYXN0cyBhbmQgY29uc3RzIHRvIGVhc2UgdXNlciBjb252ZXJzaW9uIHRvIEMrKw0KLSBBZGQgbWFuIHBhZ2VzIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXANCi0gSW4gTWFrZWZpbGUgdW5pbnN0YWxsLCBkb24ndCBybSBpZiBwcmVjZWRpbmcgY2QgZmFpbHMNCi0gRG8gbm90IHJldHVybiBaX0JVRl9FUlJPUiBpZiBkZWZsYXRlUGFyYW0oKSBoYXMgbm90aGluZyB0byB3cml0ZQ0KDQpDaGFuZ2VzIGluIDEuMi43ICgyIE1heSAyMDEyKQ0KLSBSZXBsYWNlIHVzZSBvZiBtZW1tb3ZlKCkgd2l0aCBhIHNpbXBsZSBjb3B5IGZvciBwb3J0YWJpbGl0eQ0KLSBUZXN0IGZvciBleGlzdGVuY2Ugb2Ygc3RyZXJyb3INCi0gUmVzdG9yZSBnemdldGNfIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggMS4yLjYNCi0gRml4IGJ1aWxkIHdpdGggbm9uLUdOVSBtYWtlIG9uIFNvbGFyaXMNCi0gUmVxdWlyZSBnY2MgNC4wIG9yIGxhdGVyIG9uIE1hYyBPUyBYIHRvIHVzZSB0aGUgaGlkZGVuIGF0dHJpYnV0ZQ0KLSBJbmNsdWRlIHVuaXN0ZC5oIGZvciBXYXRjb20gQw0KLSBVc2UgX19XQVRDT01DX18gaW5zdGVhZCBvZiBfX1dBVENPTV9fDQotIERvIG5vdCB1c2UgdGhlIHZpc2liaWxpdHkgYXR0cmlidXRlIGlmIE5PX1ZJWiBkZWZpbmVkDQotIEltcHJvdmUgdGhlIGRldGVjdGlvbiBvZiBubyBoaWRkZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUNCi0gQXZvaWQgdXNpbmcgX19pbnQ2NCBmb3IgZ2NjIG9yIHNvbG8gY29tcGlsYXRpb24NCi0gQ2FzdCB0byBjaGFyICogaW4gZ3pwcmludGYgdG8gYXZvaWQgd2FybmluZ3MgW1ppbnNlcl0NCi0gRml4IG1ha2Vfdm1zLmNvbSBmb3IgVkFYIFtaaW5zZXJdDQotIERvbid0IHVzZSBsaWJyYXJ5IG9yIGJ1aWx0LWluIGJ5dGUgc3dhcHMNCi0gU2ltcGxpZnkgdGVzdCBhbmQgdXNlIG9mIGdjYyBoaWRkZW4gYXR0cmlidXRlDQotIEZpeCBidWcgaW4gZ3pjbG9zZV93KCkgd2hlbiBnendyaXRlKCkgZmFpbHMgdG8gYWxsb2NhdGUgbWVtb3J5DQotIEFkZCAieCIgKE9fRVhDTCkgYW5kICJlIiAoT19DTE9FWEVDKSBtb2RlcyBzdXBwb3J0IHRvIGd6b3BlbigpDQotIEZpeCBidWcgaW4gdGVzdC9taW5pZ3ppcC5jIGZvciBjb25maWd1cmUgLS1zb2xvDQotIEZpeCBjb250cmliL3ZzdHVkaW8gcHJvamVjdCBsaW5rIGVycm9ycyBbTW9oYW5hdGhhc10NCi0gQWRkIGFiaWxpdHkgdG8gY2hvb3NlIHRoZSBidWlsZGVyIGluIG1ha2Vfdm1zLmNvbSBbU2Nod2VkYV0NCi0gQWRkIERFU1RESVIgc3VwcG9ydCB0byBtaW5ndzMyIHdpbjMyL01ha2VmaWxlLmdjYw0KLSBGaXggY29tbWVudHMgaW4gd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBwcm9wZXIgdXNhZ2UNCi0gQWxsb3cgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBpbnN0YWxsIGxvY2F0aW9ucyBmb3IgY21ha2UNCi0gR2VuZXJhdGUgYW5kIGluc3RhbGwgdGhlIHBrZy1jb25maWcgZmlsZSB3aXRoIGNtYWtlDQotIEJ1aWxkIGJvdGggYSBzdGF0aWMgYW5kIGEgc2hhcmVkIHZlcnNpb24gb2YgemxpYiB3aXRoIGNtYWtlDQotIEluY2x1ZGUgdmVyc2lvbiBzeW1ib2xzIGZvciBjbWFrZSBidWlsZHMNCi0gSWYgdXNpbmcgY21ha2Ugd2l0aCBNU1ZDLCBhZGQgdGhlIHNvdXJjZSBkaXJlY3RvcnkgdG8gdGhlIGluY2x1ZGVzDQotIFJlbW92ZSB1bm5lZWRlZCBFWFRSQV9DRkxBR1MgZnJvbSB3aW4zMi9NYWtlZmlsZS5nY2MgW1RydXRhXQ0KLSBNb3ZlIG9ic29sZXRlIGVteCBtYWtlZmlsZSB0byBvbGQgW1RydXRhXQ0KLSBBbGxvdyB0aGUgdXNlIG9mIC1XdW5kZWYgd2hlbiBjb21waWxpbmcgb3IgdXNpbmcgemxpYg0KLSBBdm9pZCB0aGUgdXNlIG9mIHRoZSAtdSBvcHRpb24gd2l0aCBta3RlbXANCi0gSW1wcm92ZSBpbmZsYXRlKCkgZG9jdW1lbnRhdGlvbiBvbiB0aGUgdXNlIG9mIFpfRklOSVNIDQotIFJlY29nbml6ZSBjbGFuZyBhcyBnY2MNCi0gQWRkIGd6b3Blbl93KCkgaW4gV2luZG93cyBmb3Igd2lkZSBjaGFyYWN0ZXIgcGF0aCBuYW1lcw0KLSBSZW5hbWUgemNvbmYuaCBpbiBDTWFrZUxpc3RzLnR4dCB0byBtb3ZlIGl0IG91dCBvZiB0aGUgd2F5DQotIEFkZCBzb3VyY2UgZGlyZWN0b3J5IGluIENNYWtlTGlzdHMudHh0IGZvciBidWlsZGluZyBleGFtcGxlcw0KLSBMb29rIGluIGJ1aWxkIGRpcmVjdG9yeSBmb3IgemxpYi5wYyBpbiBDTWFrZUxpc3RzLnR4dA0KLSBSZW1vdmUgZ3pmbGFncyBmcm9tIHpsaWJ2Yy5kZWYgaW4gdmM5IGFuZCB2YzEwDQotIEZpeCBjb250cmliL21pbml6aXAgY29tcGlsYXRpb24gaW4gdGhlIE1pbkdXIGVudmlyb25tZW50DQotIFVwZGF0ZSAuL2NvbmZpZ3VyZSBmb3IgU29sYXJpcywgc3VwcG9ydCAtLTY0IFtNb29uZXldDQotIFJlbW92ZSAtUi4gZnJvbSBTb2xhcmlzIHNoYXJlZCBidWlsZCAocG9zc2libGUgc2VjdXJpdHkgaXNzdWUpDQotIEF2b2lkIHJhY2UgY29uZGl0aW9uIGZvciBwYXJhbGxlbCBtYWtlICgtaikgcnVubmluZyBleGFtcGxlDQotIEZpeCB0eXBlIG1pc21hdGNoIGJldHdlZW4gZ2V0X2NyY190YWJsZSgpIGFuZCBjcmNfdGFibGUNCi0gRml4IHBhcnNpbmcgb2YgdmVyc2lvbiB3aXRoICItIiBpbiBDTWFrZUxpc3RzLnR4dCBbU25pZGVyLCBaaWVnbGVyXQ0KLSBGaXggdGhlIHBhdGggdG8gemxpYi5tYXAgaW4gQ01ha2VMaXN0cy50eHQNCi0gRm9yY2UgdGhlIG5hdGl2ZSBsaWJ0b29sIGluIE1hYyBPUyBYIHRvIGF2b2lkIEdOVSBsaWJ0b29sIFtCZWViZV0NCi0gQWRkIGluc3RydWN0aW9ucyB0byB3aW4zMi9NYWtlZmlsZS5nY2MgZm9yIHNoYXJlZCBpbnN0YWxsIFtUb3JyaV0NCg0KQ2hhbmdlcyBpbiAxLjIuNi4xICgxMiBGZWIgMjAxMikNCi0gQXZvaWQgdGhlIHVzZSBvZiB0aGUgT2JqZWN0aXZlLUMgcmVzZXJ2ZWQgbmFtZSAiaWQiDQotIEluY2x1ZGUgaW8uaCBpbiBnemd1dHMuaCBmb3IgTWljcm9zb2Z0IGNvbXBpbGVycw0KLSBGaXggcHJvYmxlbSB3aXRoIC4vY29uZmlndXJlIC0tcHJlZml4IGFuZCBnemdldGMgbWFjcm8NCi0gSW5jbHVkZSBnel9oZWFkZXIgZGVmaW5pdGlvbiB3aGVuIGNvbXBpbGluZyB6bGliIHNvbG8NCi0gUHV0IGd6ZmxhZ3MoKSBmdW5jdGlvbmFsaXR5IGJhY2sgaW4genV0aWwuYw0KLSBBdm9pZCBsaWJyYXJ5IGhlYWRlciBpbmNsdWRlIGluIGNyYzMyLmMgZm9yIFpfU09MTw0KLSBVc2UgbmFtZSBpbiBHQ0NfQ0xBU1NJQyBhcyBDIGNvbXBpbGVyIGZvciBjb3ZlcmFnZSB0ZXN0aW5nLCBpZiBzZXQNCi0gTWlub3IgY2xlYW51cCBpbiBjb250cmliL21pbml6aXAvemlwLmMgW1ZvbGxhbnRdDQotIFVwZGF0ZSBtYWtlX3Ztcy5jb20gW1ppbnNlcl0NCi0gUmVtb3ZlIHVubmVjZXNzYXJ5IGd6Z2V0Y18gZnVuY3Rpb24NCi0gVXNlIG9wdGltaXplZCBieXRlIHN3YXAgb3BlcmF0aW9ucyBmb3IgTWljcm9zb2Z0IGFuZCBHTlUgW1NueWRlcl0NCi0gRml4IG1pbm9yIHR5cG8gaW4gemxpYi5oIGNvbW1lbnRzIFtSemVzbmlvd2llY2tpXQ0KDQpDaGFuZ2VzIGluIDEuMi42ICgyOSBKYW4gMjAxMikNCi0gVXBkYXRlIHRoZSBQYXNjYWwgaW50ZXJmYWNlIGluIGNvbnRyaWIvcGFzY2FsDQotIEZpeCBmdW5jdGlvbiBudW1iZXJzIGZvciBnemdldGNfIGluIHpsaWJ2Yy5kZWYgZmlsZXMNCi0gRml4IGNvbmZpZ3VyZS5hYyBmb3IgY29udHJpYi9taW5pemlwIFtTY2hpZmZlcl0NCi0gRml4IGxhcmdlLWVudHJ5IGRldGVjdGlvbiBpbiBtaW5pemlwIG9uIDY0LWJpdCBzeXN0ZW1zIFtTY2hpZmZlcl0NCi0gSGF2ZSAuL2NvbmZpZ3VyZSB1c2UgdGhlIGNvbXBpbGVyIHJldHVybiBjb2RlIGZvciBlcnJvciBpbmRpY2F0aW9uDQotIEZpeCBDTWFrZUxpc3RzLnR4dCBmb3IgY3Jvc3MgY29tcGlsYXRpb24gW01jQ2x1cmVdDQotIEZpeCBjb250cmliL21pbml6aXAvemlwLmMgZm9yIDY0LWJpdCBhcmNoaXRlY3R1cmVzIFtEYWxzbmVzXQ0KLSBGaXggY29tcGlsYXRpb24gb2YgY29udHJpYi9taW5pemlwIG9uIEZyZWVCU0QgW01hcnF1ZXpdDQotIENvcnJlY3Qgc3VnZ2VzdGVkIHVzYWdlcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1NoYWNoYXIsIEhvcnZhdGhdDQotIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQyBvbiBhbGwgcGxhdGZvcm1zIFtUcnV0YV0NCi0gTWFrZSB2ZXJzaW9uIGV4cGxpY2l0IGluIGNvbnRyaWIvbWluaXppcC9jb25maWd1cmUuYWMgW0Jvc21hbnNdDQotIEF2b2lkIHdhcm5pbmcgZm9yIG5vIGVuY3J5cHRpb24gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIFtWb2xsYW50XQ0KLSBNaW5vciBjbGVhbnVwIHVwIGNvbnRyaWIvbWluaXppcC91bnppcC5jIFtWb2xsYW50XQ0KLSBGaXggYnVnIHdoZW4gY29tcGlsaW5nIG1pbml6aXAgd2l0aCBDKysgW1ZvbGxhbnRdDQotIFByb3RlY3QgZm9yIGxvbmcgbmFtZSBhbmQgZXh0cmEgZmllbGRzIGluIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0NCi0gQXZvaWQgc29tZSB3YXJuaW5ncyBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdDQotIEFkZCAtSS4uLy4uIC1MLi4vLi4gdG8gQ0ZMQUdTIGZvciBtaW5pemlwIGFuZCBtaW5pdW56aXANCi0gQWRkIG1pc3NpbmcgbGlicyB0byBtaW5pemlwIGxpbmtlciBjb21tYW5kDQotIEFkZCBzdXBwb3J0IGZvciBWUEFUSCBidWlsZHMgaW4gY29udHJpYi9taW5pemlwDQotIEFkZCBhbiAtLWVuYWJsZS1kZW1vcyBvcHRpb24gdG8gY29udHJpYi9taW5pemlwL2NvbmZpZ3VyZQ0KLSBBZGQgdGhlIGdlbmVyYXRpb24gb2YgY29uZmlndXJlLmxvZyBieSAuL2NvbmZpZ3VyZQ0KLSBFeGl0IHdoZW4gcmVxdWlyZWQgcGFyYW1ldGVycyBub3QgcHJvdmlkZWQgdG8gd2luMzIvTWFrZWZpbGUuZ2NjDQotIEhhdmUgZ3pwdXRjIHJldHVybiB0aGUgY2hhcmFjdGVyIHdyaXR0ZW4gaW5zdGVhZCBvZiB0aGUgYXJndW1lbnQNCi0gVXNlIHRoZSAtbSBvcHRpb24gb24gbGRjb25maWcgZm9yIEJTRCBzeXN0ZW1zIFtUb2JpYXNdDQotIENvcnJlY3QgaW4gemxpYi5tYXAgd2hlbiBkZWZsYXRlUmVzZXRLZWVwIHdhcyBhZGRlZA0KDQpDaGFuZ2VzIGluIDEuMi41LjMgKDE1IEphbiAyMDEyKQ0KLSBSZXN0b3JlIGd6Z2V0YyBmdW5jdGlvbiBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHkNCi0gRG8gbm90IHVzZSBfbHNlZWtpNjQgdW5kZXIgQm9ybGFuZCBDKysgW1RydXRhXQ0KLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0NCi0gUmVtb3ZlIG9sZC92aXN1YWxjNiBnaXZlbiBDTWFrZWZpbGUgYW5kIG90aGVyIGFsdGVybmF0aXZlcw0KLSBVcGRhdGUgQVM0MDAgYnVpbGQgZmlsZXMgYW5kIGRvY3VtZW50YXRpb24gW01vbm5lcmF0XQ0KLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUuZ2NjIHRvIGJ1aWxkIHRlc3QvKi5jIFtUcnV0YV0NCi0gUGVybWl0IHN0cm9uZ2VyIGZsdXNoZXMgYWZ0ZXIgWl9CTE9DSyBmbHVzaGVzDQotIEF2b2lkIGV4dHJhbmVvdXMgZW1wdHkgYmxvY2tzIHdoZW4gZG9pbmcgZW1wdHkgZmx1c2hlcw0KLSBQZXJtaXQgWl9OVUxMIGFyZ3VtZW50cyB0byBkZWZsYXRlUGVuZGluZw0KLSBBbGxvdyBkZWZsYXRlUHJpbWUoKSB0byBpbnNlcnQgYml0cyBpbiB0aGUgbWlkZGxlIG9mIGEgc3RyZWFtDQotIFJlbW92ZSBzZWNvbmQgZW1wdHkgc3RhdGljIGJsb2NrIGZvciBaX1BBUlRJQUxfRkxVU0gNCi0gV3JpdGUgb3V0IGFsbCBvZiB0aGUgYXZhaWxhYmxlIGJpdHMgd2hlbiB1c2luZyBaX0JMT0NLDQotIEluc2VydCB0aGUgZmlyc3QgdHdvIHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgYWZ0ZXIgYSBmbHVzaA0KDQpDaGFuZ2VzIGluIDEuMi41LjIgKDE3IERlYyAyMDExKQ0KLSBmaXggbGQgZXJyb3I6IHVuYWJsZSB0byBmaW5kIHZlcnNpb24gZGVwZW5kZW5jeSAnWkxJQl8xLjIuNScNCi0gdXNlIHJlbGF0aXZlIHN5bWxpbmtzIGZvciBzaGFyZWQgbGlicw0KLSBBdm9pZCBzZWFyY2hpbmcgcGFzdCB3aW5kb3cgZm9yIFpfUkxFIHN0cmF0ZWd5DQotIEFzc3VyZSB0aGF0IGhpZ2gtd2F0ZXIgbWFyayBpbml0aWFsaXphdGlvbiBpcyBhbHdheXMgYXBwbGllZCBpbiBkZWZsYXRlDQotIEFkZCBhc3NlcnRpb25zIHRvIGZpbGxfd2luZG93KCkgaW4gZGVmbGF0ZS5jIHRvIG1hdGNoIGNvbW1lbnRzDQotIFVwZGF0ZSBweXRob24gbGluayBpbiBSRUFETUUNCi0gQ29ycmVjdCBzcGVsbGluZyBlcnJvciBpbiBnenJlYWQuYw0KLSBGaXggYnVnIGluIGd6Z2V0cygpIGZvciBhIGNvbmNhdGVuYXRlZCBlbXB0eSBnemlwIHN0cmVhbQ0KLSBDb3JyZWN0IGVycm9yIGluIGNvbW1lbnQgZm9yIGd6X21ha2UoKQ0KLSBDaGFuZ2UgZ3pyZWFkKCkgYW5kIHJlbGF0ZWQgdG8gaWdub3JlIGp1bmsgYWZ0ZXIgZ3ppcCBzdHJlYW1zDQotIEFsbG93IGd6cmVhZCgpIGFuZCByZWxhdGVkIHRvIGNvbnRpbnVlIGFmdGVyIGd6Y2xlYXJlcnIoKQ0KLSBBbGxvdyBnenJld2luZCgpIGFuZCBnenNlZWsoKSBhZnRlciBhIHByZW1hdHVyZSBlbmQtb2YtZmlsZQ0KLSBTaW1wbGlmeSBnenNlZWsoKSBub3cgdGhhdCByYXcgYWZ0ZXIgZ3ppcCBpcyBpZ25vcmVkDQotIENoYW5nZSBnemdldGMoKSB0byBhIG1hY3JvIGZvciBzcGVlZCAofjQwJSBzcGVlZHVwIGluIHRlc3RpbmcpDQotIEZpeCBnemNsb3NlKCkgdG8gcmV0dXJuIHRoZSBhY3R1YWwgZXJyb3IgbGFzdCBlbmNvdW50ZXJlZA0KLSBBbHdheXMgYWRkIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3Igd2luZG93cw0KLSBJbmNsdWRlIHpjb25mLmggZm9yIHdpbmRvd3MgbGFyZ2UgZmlsZSBzdXBwb3J0DQotIEluY2x1ZGUgemNvbmYuaC5jbWFrZWluIGZvciB3aW5kb3dzIGxhcmdlIGZpbGUgc3VwcG9ydA0KLSBVcGRhdGUgemNvbmYuaC5jbWFrZWluIG9uIG1ha2UgZGlzdGNsZWFuDQotIE1lcmdlIHZlc3RpZ2lhbCB2c25wcmludGYgZGV0ZXJtaW5hdGlvbiBmcm9tIHp1dGlsLmggdG8gZ3pndXRzLmgNCi0gQ2xhcmlmeSBob3cgZ3pvcGVuKCkgYXBwZW5kcyBpbiB6bGliLmggY29tbWVudHMNCi0gQ29ycmVjdCBkb2N1bWVudGF0aW9uIG9mIGd6ZGlyZWN0KCkgc2luY2UganVuayBhdCBlbmQgbm93IGlnbm9yZWQNCi0gQWRkIGEgdHJhbnNwYXJlbnQgd3JpdGUgbW9kZSB0byBnem9wZW4oKSB3aGVuICdUJyBpcyBpbiB0aGUgbW9kZQ0KLSBVcGRhdGUgcHl0aG9uIGxpbmsgaW4gemxpYiBtYW4gcGFnZQ0KLSBHZXQgaW5mZml4ZWQuaCBhbmQgTUFLRUZJWEVEIHJlc3VsdCB0byBtYXRjaA0KLSBBZGQgYSAuL2NvbmZpZyAtLXNvbG8gb3B0aW9uIHRvIG1ha2UgemxpYiBzdWJzZXQgd2l0aCBubyBsaWJhcnkgdXNlDQotIEFkZCB1bmRvY3VtZW50ZWQgaW5mbGF0ZVJlc2V0S2VlcCgpIGZ1bmN0aW9uIGZvciBDQUIgZmlsZSBkZWNvZGluZw0KLSBBZGQgLS1jb3ZlciBvcHRpb24gdG8gLi9jb25maWd1cmUgZm9yIGdjYyBjb3ZlcmFnZSB0ZXN0aW5nDQotIEFkZCAjZGVmaW5lIFpMSUJfQ09OU1Qgb3B0aW9uIHRvIHVzZSBjb25zdCBpbiB0aGUgel9zdHJlYW0gaW50ZXJmYWNlDQotIEFkZCBjb21tZW50IHRvIGd6ZG9wZW4oKSBpbiB6bGliLmggdG8gdXNlIGR1cCgpIHdoZW4gdXNpbmcgZmlsZW5vKCkNCi0gTm90ZSBiZWhhdmlvciBvZiB1bmNvbXByZXNzKCkgdG8gcHJvdmlkZSBhcyBtdWNoIGRhdGEgYXMgaXQgY2FuDQotIEFkZCBmaWxlcyBpbiBjb250cmliL21pbml6aXAgdG8gYWlkIGluIGJ1aWxkaW5nIGxpYm1pbml6aXANCi0gU3BsaXQgb2ZmIEFSIG9wdGlvbnMgaW4gTWFrZWZpbGUuaW4gYW5kIGNvbmZpZ3VyZQ0KLSBDaGFuZ2UgT04gbWFjcm8gdG8gWl9BUkcgdG8gYXZvaWQgYXBwbGljYXRpb24gY29uZmxpY3RzDQotIEZhY2lsaXRhdGUgY29tcGlsYXRpb24gd2l0aCBCb3JsYW5kIEMrKyBmb3IgcHJhZ21hcyBhbmQgdnNucHJpbnRmDQotIEluY2x1ZGUgaW8uaCBmb3IgVHVyYm8gQyAvIEJvcmxhbmQgQysrDQotIE1vdmUgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIHRvIHRlc3QvDQotIFNpbXBsaWZ5IGluY29tcGxldGUgY29kZSB0YWJsZSBmaWxsaW5nIGluIGluZmxhdGVfdGFibGUoKQ0KLSBSZW1vdmUgY29kZSBmcm9tIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jIHRoYXQgaXMgaW1wb3NzaWJsZSB0byBleGVjdXRlDQotIFRlc3QgdGhlIGluZmxhdGUgY29kZSB3aXRoIGZ1bGwgY292ZXJhZ2UNCi0gQWxsb3cgZGVmbGF0ZVNldERpY3Rpb25hcnksIGluZmxhdGVTZXREaWN0aW9uYXJ5IGF0IGFueSB0aW1lIChpbiByYXcpDQotIEFkZCBkZWZsYXRlUmVzZXRLZWVwIGFuZCBmaXggaW5mbGF0ZVJlc2V0S2VlcCB0byByZXRhaW4gZGljdGlvbmFyeQ0KLSBGaXggZ3p3cml0ZS5jIHRvIGFjY29tbW9kYXRlIHJlZHVjZWQgbWVtb3J5IHpsaWIgY29tcGlsYXRpb24NCi0gSGF2ZSBpbmZsYXRlKCkgd2l0aCBaX0ZJTklTSCBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBhIHdpbmRvdw0KLSBEbyBub3Qgc2V0IHN0cm0tPmFkbGVyIHdoZW4gZG9pbmcgcmF3IGluZmxhdGUNCi0gRml4IGd6ZW9mKCkgdG8gYmVoYXZlIGp1c3QgbGlrZSBmZW9mKCkgd2hlbiByZWFkIGlzIG5vdCBwYXN0IGVuZCBvZiBmaWxlDQotIEZpeCBidWcgaW4gZ3pyZWFkLmMgd2hlbiBlbmQtb2YtZmlsZSBpcyByZWFjaGVkDQotIEF2b2lkIHVzZSBvZiBaX0JVRl9FUlJPUiBpbiBneiogZnVuY3Rpb25zIGV4Y2VwdCBmb3IgcHJlbWF0dXJlIEVPRg0KLSBEb2N1bWVudCBnenJlYWQoKSBjYXBhYmlsaXR5IHRvIHJlYWQgY29uY3VycmVudGx5IHdyaXR0ZW4gZmlsZXMNCi0gUmVtb3ZlIGhhcmQtY29kaW5nIG9mIHJlc291cmNlIGNvbXBpbGVyIGluIENNYWtlTGlzdHMudHh0IFtCbGFtbW9dDQoNCkNoYW5nZXMgaW4gMS4yLjUuMSAoMTAgU2VwIDIwMTEpDQotIFVwZGF0ZSBGQVEgZW50cnkgb24gc2hhcmVkIGJ1aWxkcyAoIzEzKQ0KLSBBdm9pZCBzeW1ib2xpYyBhcmd1bWVudCB0byBjaG1vZCBpbiBNYWtlZmlsZS5pbg0KLSBGaXggYnVnIGFuZCBhZGQgY29uc3RzIGluIGNvbnRyaWIvcHVmZiBbT2Jlcmh1bWVyXQ0KLSBVcGRhdGUgY29udHJpYi9wdWZmL3plcm9zLnJhdyB0ZXN0IGZpbGUgdG8gaGF2ZSBhbGwgYmxvY2sgdHlwZXMNCi0gQWRkIGZ1bGwgY292ZXJhZ2UgdGVzdCBmb3IgcHVmZiBpbiBjb250cmliL3B1ZmYvTWFrZWZpbGUNCi0gRml4IHN0YXRpYy1vbmx5LWJ1aWxkIGluc3RhbGwgaW4gTWFrZWZpbGUuaW4NCi0gRml4IGJ1ZyBpbiB1bnpHZXRDdXJyZW50RmlsZUluZm8oKSBpbiBjb250cmliL21pbml6aXAgW0t1bm9dDQotIEFkZCBsaWJ6LmEgZGVwZW5kZW5jeSB0byBzaGFyZWQgaW4gTWFrZWZpbGUuaW4gZm9yIHBhcmFsbGVsIGJ1aWxkcw0KLSBTcGVsbCBvdXQgIm51bWJlciIgKGluc3RlYWQgb2YgIm5iIikgaW4gemxpYi5oIGZvciB0b3RhbF9pbiwgdG90YWxfb3V0DQotIFJlcGxhY2UgJCguLi4pIHdpdGggYC4uLmAgaW4gY29uZmlndXJlIGZvciBub24tYmFzaCBzaCBbQm93bGVyXQ0KLSBBZGQgZGFyd2luKiB0byBEYXJ3aW4qIGFuZCBzb2xhcmlzKiB0byBTdW5PU1wgNSogaW4gY29uZmlndXJlIFtHcm9mZmVuXQ0KLSBBZGQgc29sYXJpcyogdG8gTGludXgqIGluIGNvbmZpZ3VyZSB0byBhbGxvdyBnY2MgdXNlIFtHcm9mZmVuXQ0KLSBBZGQgKmJzZCogdG8gTGludXgqIGNhc2UgaW4gY29uZmlndXJlIFtCYXItTGV2XQ0KLSBBZGQgaW5mZmFzdC5vYmogdG8gZGVwZW5kZW5jaWVzIGluIHdpbjMyL01ha2VmaWxlLm1zYw0KLSBDb3JyZWN0IHNwZWxsaW5nIGVycm9yIGluIGRlZmxhdGUuaCBbS29obGVyXQ0KLSBDaGFuZ2UgbGliemRsbC5hIGFnYWluIHRvIGxpYnouZGxsLmEgKCEpIGluIHdpbjMyL01ha2VmaWxlLmdjYw0KLSBBZGQgdGVzdCB0byBjb25maWd1cmUgZm9yIEdOVSBDIGxvb2tpbmcgZm9yIGdjYyBpbiBvdXRwdXQgb2YgJGNjIC12DQotIEFkZCB6bGliLnBjIGdlbmVyYXRpb24gdG8gd2luMzIvTWFrZWZpbGUuZ2NjIFtXZWlnZWx0XQ0KLSBGaXggYnVnIGluIHpsaWIuaCBmb3IgX0ZJTEVfT0ZGU0VUX0JJVFMgc2V0IGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFIG5vdA0KLSBBZGQgY29tbWVudCBpbiB6bGliLmggdGhhdCBhZGxlcjMyX2NvbWJpbmUgd2l0aCBsZW4yIDwgMCBtYWtlcyBubyBzZW5zZQ0KLSBNYWtlIE5PX0RJVklERSBvcHRpb24gaW4gYWRsZXIzMi5jIG11Y2ggZmFzdGVyICh0aGFua3MgdG8gSm9obiBSZWlzZXIpDQotIE1ha2Ugc3Ryb25nZXIgdGVzdCBpbiB6Y29uZi5oIHRvIGluY2x1ZGUgdW5pc3RkLmggZm9yIExGUw0KLSBBcHBseSBEYXJ3aW4gcGF0Y2hlcyBmb3IgNjQtYml0IGZpbGUgb2Zmc2V0cyB0byBjb250cmliL21pbml6aXAgW1NsYWNrXQ0KLSBGaXggemxpYi5oIExGUyBzdXBwb3J0IHdoZW4gWl9QUkVGSVggdXNlZA0KLSBBZGQgdXBkYXRlZCBhczQwMCBzdXBwb3J0IChyZW1vdmVkIGZyb20gb2xkKSBbTW9ubmVyYXRdDQotIEF2b2lkIGRlZmxhdGUgc2Vuc2l0aXZpdHkgdG8gdm9sYXRpbGUgaW5wdXQgZGF0YQ0KLSBBdm9pZCBkaXZpc2lvbiBpbiBhZGxlcjMyX2NvbWJpbmUgZm9yIE5PX0RJVklERQ0KLSBDbGFyaWZ5IHRoZSB1c2Ugb2YgWl9GSU5JU0ggd2l0aCBkZWZsYXRlQm91bmQoKSBhbW91bnQgb2Ygc3BhY2UNCi0gU2V0IGJpbmFyeSBmb3Igb3V0cHV0IGZpbGUgaW4gcHVmZi5jDQotIFVzZSB1NCB0eXBlIGZvciBjcmNfdGFibGUgdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncw0KLSBBcHBseSBjYXN0cyBpbiB6bGliLmggdG8gYXZvaWQgY29udmVyc2lvbiB3YXJuaW5ncw0KLSBBZGQgT0YgdG8gcHJvdG90eXBlcyBmb3IgYWRsZXIzMl9jb21iaW5lXyBhbmQgY3JjMzJfY29tYmluZV8gW01pbGxlcl0NCi0gSW1wcm92ZSBpbmZsYXRlU3luYygpIGRvY3VtZW50YXRpb24gdG8gbm90ZSBpbmRldGVybWluYW5jeQ0KLSBBZGQgZGVmbGF0ZVBlbmRpbmcoKSBmdW5jdGlvbiB0byByZXR1cm4gdGhlIGFtb3VudCBvZiBwZW5kaW5nIG91dHB1dA0KLSBDb3JyZWN0IHRoZSBzcGVsbGluZyBvZiAic3BlY2lmaWNhdGlvbiIgaW4gRkFRIFtSYW5kZXJzLVBlaHJzb25dDQotIEFkZCBhIGNoZWNrIGluIGNvbmZpZ3VyZSBmb3Igc3RkYXJnLmgsIHVzZSBmb3IgZ3pwcmludGYoKQ0KLSBDaGVjayB0aGF0IHBvaW50ZXJzIGZpdCBpbiBpbnRzIHdoZW4gZ3pwcmludCgpIGNvbXBpbGVkIG9sZCBzdHlsZQ0KLSBBZGQgZHVtbXkgbmFtZSBiZWZvcmUgJChTSEFSRURMSUJWKSBpbiBNYWtlZmlsZSBbQmFyLUxldiwgQm93bGVyXQ0KLSBEZWxldGUgbGluZSBpbiBjb25maWd1cmUgdGhhdCBhZGRzIC1MLiBsaWJ6LmEgdG8gTERGTEFHUyBbV2VpZ2VsdF0NCi0gQWRkIGRlYnVnIHJlY29yZHMgaW4gYXNzbWVibGVyIGNvZGUgW0xvbmRlcl0NCi0gVXBkYXRlIFJGQyByZWZlcmVuY2VzIHRvIHVzZSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC8uLi4gW0xpXQ0KLSBBZGQgLS1hcmNocyBvcHRpb24sIHVzZSBvZiBsaWJ0b29sIHRvIGNvbmZpZ3VyZSBmb3IgTWFjIE9TIFggW0JvcnN0ZWxdDQoNCkNoYW5nZXMgaW4gMS4yLjUgKDE5IEFwciAyMDEwKQ0KLSBEaXNhYmxlIHZpc2liaWxpdHkgYXR0cmlidXRlIGluIHdpbjMyL01ha2VmaWxlLmdjYyBbQmFyLUxldl0NCi0gRGVmYXVsdCB0byBsaWJkaXIgYXMgc2hhcmVkbGliZGlyIGluIGNvbmZpZ3VyZSBbTmllZGVyXQ0KLSBVcGRhdGUgY29weXJpZ2h0IGRhdGVzIG9uIG1vZGlmaWVkIHNvdXJjZSBmaWxlcw0KLSBVcGRhdGUgdHJlZXMuYyB0byBiZSBhYmxlIHRvIGdlbmVyYXRlIG1vZGlmaWVkIHRyZWVzLmgNCi0gRXhpdCBjb25maWd1cmUgZm9yIE1pbkdXLCBzdWdnZXN0aW5nIHdpbjMyL01ha2VmaWxlLmdjYw0KLSBDaGVjayBmb3IgTlVMTCBwYXRoIGluIGd6X29wZW4gW0hvbXVybHVdDQoNCkNoYW5nZXMgaW4gMS4yLjQuNSAoMTggQXByIDIwMTApDQotIFNldCBzaGFyZWRsaWJkaXIgaW4gY29uZmlndXJlIFtUb3Jva10NCi0gU2V0IExERkxBR1MgaW4gTWFrZWZpbGUuaW4gW0Jhci1MZXZdDQotIEF2b2lkIG1rZGlyIG9ianMgcmFjZSBjb25kaXRpb24gaW4gTWFrZWZpbGUuaW4gW0Jvd2xlcl0NCi0gQWRkIFpMSUJfSU5URVJOQUwgaW4gZnJvbnQgb2YgaW50ZXJuYWwgaW50ZXItbW9kdWxlIGZ1bmN0aW9ucyBhbmQgYXJyYXlzDQotIERlZmluZSBaTElCX0lOVEVSTkFMIHRvIGhpZGUgaW50ZXJuYWwgZnVuY3Rpb25zIGFuZCBhcnJheXMgZm9yIEdOVSBDDQotIERvbid0IHVzZSBoaWRkZW4gYXR0cmlidXRlIHdoZW4gaXQgaXMgYSB3YXJuaW5nIGdlbmVyYXRvciAoZS5nLiBTb2xhcmlzKQ0KDQpDaGFuZ2VzIGluIDEuMi40LjQgKDE4IEFwciAyMDEwKQ0KLSBGaXggQ1JPU1NfUFJFRklYIGV4ZWN1dGFibGUgdGVzdGluZywgQ0hPU1QgZXh0cmFjdCwgbWluZ3cqIFtUb3Jva10NCi0gVW5kZWZpbmUgX0xBUkdFRklMRTY0X1NPVVJDRSBpbiB6Y29uZi5oIGlmIGl0IGlzIHplcm8sIGJ1dCBub3QgaWYgZW1wdHkNCi0gVHJ5IHRvIHVzZSBiYXNoIG9yIGtzaCByZWdhcmRsZXNzIG9mIGZ1bmN0aW9uYWxpdHkgb2YgL2Jpbi9zaA0KLSBGaXggY29uZmlndXJlIGluY29tcGF0aWJpbGl0eSB3aXRoIE5ldEJTRCBzaA0KLSBSZW1vdmUgYXR0ZW1wdCB0byBydW4gdW5kZXIgYmFzaCBvciBrc2ggc2luY2UgaGF2ZSBiZXR0ZXIgTmV0QlNEIGZpeA0KLSBGaXggd2luMzIvTWFrZWZpbGUuZ2NjIGZvciBNaW5HVyBbQmFyLUxldl0NCi0gQWRkIGRpYWdub3N0aWMgbWVzc2FnZXMgd2hlbiB1c2luZyBDUk9TU19QUkVGSVggaW4gY29uZmlndXJlDQotIEFkZGVkIC0tc2hhcmVkbGliZGlyIG9wdGlvbiB0byBjb25maWd1cmUgW1dlaWdlbHRdDQotIFVzZSBoaWRkZW4gdmlzaWJpbGl0eSBhdHRyaWJ1dGUgd2hlbiBhdmFpbGFibGUgW0ZyeXNpbmdlcl0NCg0KQ2hhbmdlcyBpbiAxLjIuNC4zICgxMCBBcHIgMjAxMCkNCi0gT25seSB1c2UgQ1JPU1NfUFJFRklYIGluIGNvbmZpZ3VyZSBmb3IgYXIgYW5kIHJhbmxpYiBpZiB0aGV5IGV4aXN0DQotIFVzZSBDUk9TU19QUkVGSVggZm9yIG5tIFtCYXItTGV2XQ0KLSBBc3N1bWUgX0xBUkdFRklMRTY0X1NPVVJDRSBkZWZpbmVkIGlzIGVxdWl2YWxlbnQgdG8gdHJ1ZQ0KLSBBdm9pZCB1c2Ugb2YgdW5kZWZpbmVkIHN5bWJvbHMgaW4gI2lmIHdpdGggJiYgYW5kIHx8DQotIE1ha2UgKjY0IHByb3RvdHlwZXMgaW4gZ3pndXRzLmggY29uc2lzdGVudCB3aXRoIGZ1bmN0aW9ucw0KLSBBZGQgLXNoYXJlZCBsb2FkIG9wdGlvbiBmb3IgTWluR1cgaW4gY29uZmlndXJlIFtCb3dsZXJdDQotIE1vdmUgel9vZmY2NF90IHRvIHB1YmxpYyBpbnRlcmZhY2UsIHVzZSBpbnN0ZWFkIG9mIG9mZjY0X3QNCi0gUmVtb3ZlICEgZnJvbSBzaGVsbCB0ZXN0IGluIGNvbmZpZ3VyZSAobm90IHBvcnRhYmxlIHRvIFNvbGFyaXMpDQotIENoYW5nZSArMCBtYWNybyB0ZXN0cyB0byAtMCBmb3IgcG9zc2libHkgaW5jcmVhc2VkIHBvcnRhYmlsaXR5DQoNCkNoYW5nZXMgaW4gMS4yLjQuMiAoOSBBcHIgMjAxMCkNCi0gQWRkIGNvbnNpc3RlbnQgY2FycmlhZ2UgcmV0dXJucyB0byByZWFkbWUudHh0J3MgaW4gbWFzbXg4NiBhbmQgbWFzbXg2NA0KLSBSZWFsbHkgcHJvdmlkZSBwcm90b3R5cGVzIGZvciAqNjQgZnVuY3Rpb25zIHdoZW4gYnVpbGRpbmcgd2l0aG91dCBMRlMNCi0gT25seSBkZWZpbmUgdW5saW5rKCkgaW4gbWluaWd6aXAuYyBpZiB1bmlzdGQuaCBub3QgaW5jbHVkZWQNCi0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBjb250cmliL3ZzdHVkaW8gcHJvamVjdCBmaWxlcw0KLSBNb3ZlIHByb2plY3RzL3ZjNiB0byBvbGQvIGFuZCByZW1vdmUgcHJvamVjdHMvDQotIEluY2x1ZGUgc3RkbGliLmggaW4gbWluaWd6aXAuYyBmb3Igc2V0bW9kZSgpIGRlZmluaXRpb24gdW5kZXIgV2luQ0UNCi0gQ2xlYW4gdXAgYXNzZW1ibGVyIGJ1aWxkcyBpbiB3aW4zMi9NYWtlZmlsZS5tc2MgW1Jvd2VdDQotIEluY2x1ZGUgc3lzL3R5cGVzLmggZm9yIE1pY3Jvc29mdCBmb3Igb2ZmX3QgZGVmaW5pdGlvbg0KLSBGaXggbWVtb3J5IGxlYWsgb24gZXJyb3IgaW4gZ3pfb3BlbigpDQotIFN5bWJvbGl6ZSBubSBhcyAkTk0gaW4gY29uZmlndXJlIFtXZWlnZWx0XQ0KLSBVc2UgVEVTVF9MRFNIQVJFRCBpbnN0ZWFkIG9mIExEU0hBUkVEIHRvIGxpbmsgdGVzdCBwcm9ncmFtcyBbV2VpZ2VsdF0NCi0gQWRkICswIHRvIF9GSUxFX09GRlNFVF9CSVRTIGFuZCBfTEZTNjRfTEFSR0VGSUxFIGluIGNhc2Ugbm90IGRlZmluZWQNCi0gRml4IGJ1ZyBpbiBnemVvZigpIHRvIHRha2UgaW50byBhY2NvdW50IHVudXNlZCBpbnB1dCBkYXRhDQotIEF2b2lkIGluaXRpYWxpemF0aW9uIG9mIHN0cnVjdHVyZXMgd2l0aCB2YXJpYWJsZXMgaW4gcHVmZi5jDQotIFVwZGF0ZWQgd2luMzIvUkVBRE1FLVdJTjMyLnR4dCBbUm93ZV0NCg0KQ2hhbmdlcyBpbiAxLjIuNC4xICgyOCBNYXIgMjAxMCkNCi0gUmVtb3ZlIHRoZSB1c2Ugb2YgW2Etel0gY29uc3RydWN0cyBmb3Igc2VkIGluIGNvbmZpZ3VyZSBbZ2VudG9vIDMxMDIyNV0NCi0gUmVtb3ZlICQoU0hBUkVETElCKSBmcm9tIExJQlMgaW4gTWFrZWZpbGUuaW4gW0NyZWVjaF0NCi0gUmVzdG9yZSAiZm9yIGRlYnVnZ2luZyIgY29tbWVudCBvbiBzcHJpbnRmKCkgaW4gZ3psaWIuYw0KLSBSZW1vdmUgZmRvcGVuIGZvciBNVlMgZnJvbSBnemd1dHMuaA0KLSBQdXQgbmV3IFJFQURNRS1XSU4zMi50eHQgaW4gd2luMzIgW1Jvd2VdDQotIEFkZCBjaGVjayBmb3Igc2hlbGwgdG8gY29uZmlndXJlIGFuZCBpbnZva2UgYW5vdGhlciBzaGVsbCBpZiBuZWVkZWQNCi0gRml4IGJpZyBmYXQgc3RpbmtpbmcgYnVnIGluIGd6c2VlaygpIG9uIHVuY29tcHJlc3NlZCBmaWxlcw0KLSBSZW1vdmUgdmVzdGlnaWFsIEZfT1BFTjY0IGRlZmluZSBpbiB6dXRpbC5oDQotIFNldCBhbmQgY2hlY2sgdGhlIHZhbHVlIG9mIF9MQVJHRUZJTEVfU09VUkNFIGFuZCBfTEFSR0VGSUxFNjRfU09VUkNFDQotIEF2b2lkIGVycm9ycyBvbiBub24tTEZTIHN5c3RlbXMgd2hlbiBhcHBsaWNhdGlvbnMgZGVmaW5lIExGUyBtYWNyb3MNCi0gU2V0IEVYRSB0byAiLmV4ZSIgaW4gY29uZmlndXJlIGZvciBNSU5HVyBbS2FobGVdDQotIE1hdGNoIGNyYzMyKCkgaW4gY3JjMzIuYyBleGFjdGx5IHRvIHRoZSBwcm90b3R5cGUgaW4gemxpYi5oIFtTaGVycmlsbF0NCi0gQWRkIHByZWZpeCBmb3IgY3Jvc3MtY29tcGlsYXRpb24gaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQ0KLSBBZGQgRExMIGluc3RhbGwgaW4gd2luMzIvbWFrZWZpbGUuZ2NjIFtCYXItTGV2XQ0KLSBBbGxvdyBMaW51eCogb3IgbGludXgqIGZyb20gdW5hbWUgaW4gY29uZmlndXJlIFtCYXItTGV2XQ0KLSBBbGxvdyBsZGNvbmZpZyB0byBiZSByZWRlZmluZWQgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBbQmFyLUxldl0NCi0gQWRkIGNyb3NzLWNvbXBpbGF0aW9uIHByZWZpeGVzIHRvIGNvbmZpZ3VyZSBbQmFyLUxldl0NCi0gTWF0Y2ggdHlwZSBleGFjdGx5IGluIGd6X2xvYWQoKSBpbnZvY2F0aW9uIGluIGd6cmVhZC5jDQotIE1hdGNoIHR5cGUgZXhhY3RseSBvZiB6Y2FsbG9jKCkgaW4genV0aWwuYyB0byB6bGliLmggYWxsb2NfZnVuYw0KLSBQcm92aWRlIHByb3RvdHlwZXMgZm9yICo2NCBmdW5jdGlvbnMgd2hlbiBidWlsZGluZyB6bGliIHdpdGhvdXQgTEZTDQotIERvbid0IHVzZSAtbGMgd2hlbiBsaW5raW5nIHNoYXJlZCBsaWJyYXJ5IG9uIE1pbkdXDQotIFJlbW92ZSBlcnJuby5oIGNoZWNrIGluIGNvbmZpZ3VyZSBhbmQgdmVzdGlnaWFsIGVycm5vIGNvZGUgaW4genV0aWwuaA0KDQpDaGFuZ2VzIGluIDEuMi40ICgxNCBNYXIgMjAxMCkNCi0gRml4IFZFUjMgZXh0cmFjdGlvbiBpbiBjb25maWd1cmUgZm9yIG5vIGZvdXJ0aCBzdWJ2ZXJzaW9uDQotIFVwZGF0ZSB6bGliLjMsIGFkZCBkb2NzIHRvIE1ha2VmaWxlLmluIHRvIG1ha2UgLnBkZiBvdXQgb2YgaXQNCi0gQWRkIHpsaWIuMy5wZGYgdG8gZGlzdHJpYnV0aW9uDQotIERvbid0IHNldCBlcnJvciBjb2RlIGluIGd6ZXJyb3IoKSBpZiBwYXNzZWQgcG9pbnRlciBpcyBOVUxMDQotIEFwcGx5IGRlc3RpbmF0aW9uIGRpcmVjdG9yeSBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQ0KLSBNb3ZlICNjbWFrZWRlZmluZSdzIHRvIGEgbmV3IHpjb25mLmluLmNtYWtlaW4NCi0gUmVzdG9yZSB6Y29uZi5oIGZvciBidWlsZHMgdGhhdCBkb24ndCB1c2UgY29uZmlndXJlIG9yIGNtYWtlDQotIEFkZCBkaXN0Y2xlYW4gdG8gZHVtbXkgTWFrZWZpbGUgZm9yIGNvbnZlbmllbmNlDQotIFVwZGF0ZSBhbmQgaW1wcm92ZSBJTkRFWCwgUkVBRE1FLCBhbmQgRkFRDQotIFVwZGF0ZSBDTWFrZUxpc3RzLnR4dCBmb3IgdGhlIHJldHVybiBvZiB6Y29uZi5oIFtMb3dtYW5dDQotIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM5IGFuZCB2YzEwIFtWb2xsYW50XQ0KLSBDaGFuZ2UgbGliei5kbGwuYSBiYWNrIHRvIGxpYnpkbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MNCi0gQXBwbHkgbGljZW5zZSBhbmQgcmVhZG1lIGNoYW5nZXMgdG8gY29udHJpYi9hc202ODYgW1JhaXRlcl0NCi0gQ2hlY2sgZmlsZSBuYW1lIGxlbmd0aHMgYW5kIGFkZCAtYyBvcHRpb24gaW4gbWluaWd6aXAuYyBbTGldDQotIFVwZGF0ZSBjb250cmliL2FtZDY0IGFuZCBjb250cmliL21hc214ODYvIFtWb2xsYW50XQ0KLSBBdm9pZCB1c2Ugb2YgImVvZiIgcGFyYW1ldGVyIGluIHRyZWVzLmMgdG8gbm90IHNoYWRvdyBsaWJyYXJ5IHZhcmlhYmxlDQotIFVwZGF0ZSBtYWtlX3Ztcy5jb20gZm9yIHJlbW92YWwgb2YgemxpYmRlZnMuaCBbWmluc2VyXQ0KLSBVcGRhdGUgYXNzZW1ibGVyIGNvZGUgYW5kIHZzdHVkaW8gcHJvamVjdHMgaW4gY29udHJpYiBbVm9sbGFudF0NCi0gUmVtb3ZlIG91dGRhdGVkIGFzc2VtYmxlciBjb2RlIGNvbnRyaWIvbWFzbTY4NiBhbmQgY29udHJpYi9hc201ODYNCi0gUmVtb3ZlIG9sZCB2YzcgYW5kIHZjOCBmcm9tIGNvbnRyaWIvdnN0dWRpbw0KLSBVcGRhdGUgd2luMzIvTWFrZWZpbGUubXNjLCBhZGQgWkxJQl9WRVJfU1VCUkVWSVNJT04gW1Jvd2VdDQotIEZpeCBtZW1vcnkgbGVha3MgaW4gZ3pjbG9zZV9yKCkgYW5kIGd6Y2xvc2VfdygpLCBmaWxlIGxlYWsgaW4gZ3pfb3BlbigpDQotIEFkZCBjb250cmliL2djY19ndm1hdDY0IGZvciBsb25nZXN0X21hdGNoIGFuZCBpbmZsYXRlX2Zhc3QgW1ZvbGxhbnRdDQotIFJlbW92ZSAqNjQgZnVuY3Rpb25zIGZyb20gd2luMzIvemxpYi5kZWYgKHRoZXkncmUgbm90IDY0LWJpdCB5ZXQpDQotIEZpeCBidWcgaW4gdm9pZC1yZXR1cm5pbmcgdnNwcmludGYoKSBjYXNlIGluIGd6d3JpdGUuYw0KLSBGaXggbmFtZSBjaGFuZ2UgZnJvbSBpbmZsYXRlLmggaW4gY29udHJpYi9pbmZsYXRlODYvaW5mZmFzODYuYw0KLSBDaGVjayBpZiB0ZW1wb3JhcnkgZmlsZSBleGlzdHMgYmVmb3JlIHJlbW92aW5nIGluIG1ha2Vfdm1zLmNvbSBbWmluc2VyXQ0KLSBGaXggbWFrZSBpbnN0YWxsIGFuZCB1bmluc3RhbGwgZm9yIC0tc3RhdGljIG9wdGlvbg0KLSBGaXggdXNhZ2Ugb2YgX01TQ19WRVIgaW4gZ3pndXRzLmggYW5kIHp1dGlsLmggW1RydXRhXQ0KLSBVcGRhdGUgcmVhZG1lLnR4dCBpbiBjb250cmliL21hc214NjQgYW5kIG1hc214ODYgdG8gYXNzZW1ibGUNCg0KQ2hhbmdlcyBpbiAxLjIuMy45ICgyMSBGZWIgMjAxMCkNCi0gRXhwdW5nZSBnemlvLmMNCi0gTW92ZSBhczQwMCBidWlsZCBpbmZvcm1hdGlvbiB0byBvbGQNCi0gRml4IHVwZGF0ZXMgaW4gY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8NCi0gQWRkIGNvbnN0IHRvIHZzbnByaW50ZiB0ZXN0IGluIGNvbmZpZ3VyZSB0byBhdm9pZCB3YXJuaW5ncyBbV2VpZ2VsdF0NCi0gRGVsZXRlIHpjb25mLmggKG1hZGUgYnkgY29uZmlndXJlKSBbV2VpZ2VsdF0NCi0gQ2hhbmdlIHpjb25mLmluLmggdG8gemNvbmYuaC5pbiBwZXIgY29udmVudGlvbiBbV2VpZ2VsdF0NCi0gQ2hlY2sgZm9yIE5VTEwgYnVmIGluIGd6Z2V0cygpDQotIFJldHVybiBlbXB0eSBzdHJpbmcgZm9yIGd6Z2V0cygpIHdpdGggbGVuID09IDEgKGxpa2UgZmdldHMoKSkNCi0gRml4IGRlc2NyaXB0aW9uIG9mIGd6Z2V0cygpIGluIHpsaWIuaCBmb3IgZW5kLW9mLWZpbGUsIE5VTEwgcmV0dXJuDQotIFVwZGF0ZSBtaW5pemlwIHRvIDEuMSBbVm9sbGFudF0NCi0gQXZvaWQgTVNWQyBsb3NzIG9mIGRhdGEgd2FybmluZ3MgaW4gZ3pyZWFkLmMsIGd6d3JpdGUuYw0KLSBOb3RlIGluIHpsaWIuaCB0aGF0IGd6ZXJyb3IoKSBzaG91bGQgYmUgdXNlZCB0byBkaXN0aW5ndWlzaCBmcm9tIEVPRg0KLSBSZW1vdmUgdXNlIG9mIHNucHJpbnRmKCkgZnJvbSBnemxpYi5jDQotIEZpeCBidWcgaW4gZ3pzZWVrKCkNCi0gVXBkYXRlIGNvbnRyaWIvdnN0dWRpbywgYWRkaW5nIHZjOSBhbmQgdmMxMCBbS3VubywgVm9sbGFudF0NCi0gRml4IHpjb25mLmggZ2VuZXJhdGlvbiBpbiBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQ0KLSBJbXByb3ZlIGNvbW1lbnRzIGluIHpjb25mLmggd2hlcmUgbW9kaWZpZWQgYnkgY29uZmlndXJlDQoNCkNoYW5nZXMgaW4gMS4yLjMuOCAoMTMgRmViIDIwMTApDQotIENsZWFuIHVwIHRleHQgZmlsZXMgKHRhYnMsIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGV0Yy4pIFtPYmVyaHVtZXJdDQotIFVzZSB6X29mZjY0X3QgaW4gZ3pfemVybygpIGFuZCBnel9za2lwKCkgdG8gbWF0Y2ggc3RhdGUtPnNraXANCi0gQXZvaWQgY29tcGFyaXNvbiBwcm9ibGVtIHdoZW4gc2l6ZW9mKGludCkgPT0gc2l6ZW9mKHpfb2ZmNjRfdCkNCi0gUmV2ZXJ0IHRvIE1ha2VmaWxlLmluIGZyb20gMS4yLjMuNiAobGl2ZSB3aXRoIHRoZSBjbHV0dGVyKQ0KLSBGaXggbWlzc2luZyBlcnJvciByZXR1cm4gaW4gZ3pmbHVzaCgpLCBhZGQgemxpYi5oIG5vdGUNCi0gQWRkICo2NCBmdW5jdGlvbnMgdG8gemxpYi5tYXAgW0xldmluXQ0KLSBGaXggc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb24gaW4gZ3pfY29tcCgpDQotIFVzZSBTRkxBR1Mgd2hlbiB0ZXN0aW5nIHNoYXJlZCBsaW5raW5nIGluIGNvbmZpZ3VyZQ0KLSBBZGQgLS02NCBvcHRpb24gdG8gLi9jb25maWd1cmUgdG8gdXNlIC1tNjQgd2l0aCBnY2MNCi0gRml4IC4vY29uZmlndXJlIC0taGVscCB0byBjb3JyZWN0bHkgbmFtZSBvcHRpb25zDQotIEhhdmUgbWFrZSBmYWlsIGlmIGEgdGVzdCBmYWlscyBbTGV2aW5dDQotIEF2b2lkIGJ1ZmZlciBvdmVycnVuIGluIGNvbnRyaWIvbWFzbXg2NC9ndm1hdDY0LmFzbSBbU2ltcHNvbl0NCi0gUmVtb3ZlIGFzc2VtYmxlciBvYmplY3QgZmlsZXMgZnJvbSBjb250cmliDQoNCkNoYW5nZXMgaW4gMS4yLjMuNyAoMjQgSmFuIDIwMTApDQotIEFsd2F5cyBnem9wZW4oKSB3aXRoIE9fTEFSR0VGSUxFIGlmIGF2YWlsYWJsZQ0KLSBGaXggZ3pkaXJlY3QoKSB0byB3b3JrIGltbWVkaWF0ZWx5IGFmdGVyIGd6b3BlbigpIG9yIGd6ZG9wZW4oKQ0KLSBNYWtlIGd6ZGlyZWN0KCkgbW9yZSBwcmVjaXNlIHdoZW4gdGhlIHN0YXRlIGNoYW5nZXMgd2hpbGUgcmVhZGluZw0KLSBJbXByb3ZlIHpsaWIuaCBkb2N1bWVudGF0aW9uIGluIG1hbnkgcGxhY2VzDQotIENhdGNoIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZ3pfb3BlbigpDQotIENvbXBsZXRlIGNsb3NlIG9wZXJhdGlvbiBpZiBzZWVrIGZvcndhcmQgaW4gZ3pjbG9zZV93KCkgZmFpbHMNCi0gUmV0dXJuIFpfRVJSTk8gZnJvbSBnemNsb3NlX3IoKSBpZiBjbG9zZSgpIGZhaWxzDQotIFJldHVybiBaX1NUUkVBTV9FUlJPUiBpbnN0ZWFkIG9mIEVPRiBmb3IgZ3pjbG9zZSgpIGJlaW5nIHBhc3NlZCBOVUxMDQotIFJldHVybiB6ZXJvIGZvciBnendyaXRlKCkgZXJyb3JzIHRvIG1hdGNoIHpsaWIuaCBkZXNjcmlwdGlvbg0KLSBSZXR1cm4gLTEgb24gZ3pwdXRzKCkgZXJyb3IgdG8gbWF0Y2ggemxpYi5oIGRlc2NyaXB0aW9uDQotIEFkZCB6Y29uZi5pbi5oIHRvIGFsbG93IHJlY292ZXJ5IGZyb20gY29uZmlndXJlIG1vZGlmaWNhdGlvbiBbV2VpZ2VsdF0NCi0gRml4IHN0YXRpYyBsaWJyYXJ5IHBlcm1pc3Npb25zIGluIE1ha2VmaWxlLmluIFtXZWlnZWx0XQ0KLSBBdm9pZCB3YXJuaW5ncyBpbiBjb25maWd1cmUgdGVzdHMgdGhhdCBoaWRlIGZ1bmN0aW9uYWxpdHkgW1dlaWdlbHRdDQotIEFkZCAqQlNEIGFuZCBEcmFnb25GbHkgdG8gTGludXggY2FzZSBpbiBjb25maWd1cmUgW2dlbnRvbyAxMjM1NzFdDQotIENoYW5nZSBsaWJ6ZGxsLmEgdG8gbGliei5kbGwuYSBpbiB3aW4zMi9NYWtlZmlsZS5nY2MgW2dlbnRvbyAyODgyMTJdDQotIEF2b2lkIGFjY2VzcyBvZiB1bmluaXRpYWxpemVkIGRhdGEgZm9yIGZpcnN0IGluZmxhdGVSZXNldDIgY2FsbCBbR29tZXNdDQotIEtlZXAgb2JqZWN0IGZpbGVzIGluIHN1YmRpcmVjdG9yaWVzIHRvIHJlZHVjZSB0aGUgY2x1dHRlciBzb21ld2hhdA0KLSBSZW1vdmUgZGVmYXVsdCBNYWtlZmlsZSBhbmQgemxpYmRlZnMuaCwgYWRkIGR1bW15IE1ha2VmaWxlDQotIEFkZCBuZXcgZXh0ZXJuYWwgZnVuY3Rpb25zIHRvIFpfUFJFRklYLCByZW1vdmUgZHVwbGljYXRlcywgel96XyAtPiB6Xw0KLSBSZW1vdmUgemxpYmRlZnMuaCBjb21wbGV0ZWx5IC0tIG1vZGlmeSB6Y29uZi5oIGluc3RlYWQNCg0KQ2hhbmdlcyBpbiAxLjIuMy42ICgxNyBKYW4gMjAxMCkNCi0gQXZvaWQgdm9pZCAqIGFyaXRobWV0aWMgaW4gZ3pyZWFkLmMgYW5kIGd6d3JpdGUuYw0KLSBNYWtlIGNvbXBpbGVycyBoYXBwaWVyIHdpdGggY29uc3QgY2hhciAqIGZvciBnel9lcnJvciBtZXNzYWdlDQotIEF2b2lkIHVudXNlZCBwYXJhbWV0ZXIgd2FybmluZyBpbiBpbmZsYXRlLmMNCi0gQXZvaWQgc2lnbmVkLXVuc2lnbmVkIGNvbXBhcmlzb24gd2FybmluZyBpbiBpbmZsYXRlLmMNCi0gSW5kZW50ICNwcmFnbWEncyBmb3IgdHJhZGl0aW9uYWwgQw0KLSBGaXggdXNhZ2Ugb2Ygc3Ryd2luZXJyb3IoKSBpbiBnbGliLmMsIGNoYW5nZSB0byBnel9zdHJ3aW5lcnJvcigpDQotIENvcnJlY3QgZW1haWwgYWRkcmVzcyBpbiBjb25maWd1cmUgZm9yIHN5c3RlbSBvcHRpb25zDQotIFVwZGF0ZSBtYWtlX3Ztcy5jb20gYW5kIGFkZCBtYWtlX3Ztcy5jb20gdG8gY29udHJpYi9taW5pemlwIFtaaW5zZXJdDQotIFVwZGF0ZSB6bGliLm1hcCBbQnJvd25dDQotIEZpeCBNYWtlZmlsZS5pbiBmb3IgU29sYXJpcyAxMCBtYWtlIG9mIGV4YW1wbGU2NCBhbmQgbWluaXppcDY0IFtUb3Jva10NCi0gQXBwbHkgdmFyaW91cyBmaXhlcyB0byBDTWFrZUxpc3RzLnR4dCBbTG93bWFuXQ0KLSBBZGQgY2hlY2tzIG9uIGxlbiBpbiBnenJlYWQoKSBhbmQgZ3p3cml0ZSgpDQotIEFkZCBlcnJvciBtZXNzYWdlIGZvciBubyBtb3JlIHJvb20gZm9yIGd6dW5nZXRjKCkNCi0gUmVtb3ZlIHpsaWIgdmVyc2lvbiBjaGVjayBpbiBnendyaXRlKCkNCi0gRGVmZXIgY29tcHJlc3Npb24gb2YgZ3pwcmludGYoKSByZXN1bHQgdW50aWwgbmVlZCB0bw0KLSBVc2Ugc25wcmludGYoKSBpbiBnemRvcGVuKCkgaWYgYXZhaWxhYmxlDQotIFJlbW92ZSBVU0VfTU1BUCBjb25maWd1cmF0aW9uIGRldGVybWluYXRpb24gKG9ubHkgdXNlZCBieSBtaW5pZ3ppcCkNCi0gUmVtb3ZlIGV4YW1wbGVzL3BpZ3ouYyAoYXZhaWxhYmxlIHNlcGFyYXRlbHkpDQotIFVwZGF0ZSBleGFtcGxlcy9ndW4uYyB0byAxLjYNCg0KQ2hhbmdlcyBpbiAxLjIuMy41ICg4IEphbiAyMDEwKQ0KLSBBZGQgc3BhY2UgYWZ0ZXIgI2lmIGluIHp1dGlsLmggZm9yIHNvbWUgY29tcGlsZXJzDQotIEZpeCByZWxhdGl2ZWx5IGhhcm1sZXNzIGJ1ZyBpbiBkZWZsYXRlX2Zhc3QoKSBbRXhhcmV2c2t5XQ0KLSBGaXggc2FtZSBwcm9ibGVtIGluIGRlZmxhdGVfc2xvdygpDQotIEFkZCAkKFNIQVJFRExJQlYpIHRvIExJQlMgaW4gTWFrZWZpbGUuaW4gW0Jyb3duXQ0KLSBBZGQgZGVmbGF0ZV9ybGUoKSBmb3IgZmFzdGVyIFpfUkxFIHN0cmF0ZWd5IHJ1bi1sZW5ndGggZW5jb2RpbmcNCi0gQWRkIGRlZmxhdGVfaHVmZigpIGZvciBmYXN0ZXIgWl9IVUZGTUFOX09OTFkgZW5jb2RpbmcNCi0gQ2hhbmdlIG5hbWUgb2YgIndyaXRlIiB2YXJpYWJsZSBpbiBpbmZmYXN0LmMgdG8gYXZvaWQgbGlicmFyeSBjb2xsaXNpb25zDQotIEZpeCBwcmVtYXR1cmUgRU9GIGZyb20gZ3pyZWFkKCkgaW4gZ3ppby5jIFtCcm93bl0NCi0gVXNlIHpsaWIgaGVhZGVyIHdpbmRvdyBzaXplIGlmIHdpbmRvd0JpdHMgaXMgMCBpbiBpbmZsYXRlSW5pdDIoKQ0KLSBSZW1vdmUgY29tcHJlc3NCb3VuZCgpIGNhbGwgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIGxpbmtpbmcgY29tcHJlc3Mubw0KLSBSZXBsYWNlIHVzZSBvZiBlcnJubyBpbiBneiogd2l0aCBmdW5jdGlvbnMsIHN1cHBvcnQgV2luQ0UgW0FsdmVzXQ0KLSBQcm92aWRlIGFsdGVybmF0aXZlIHRvIHBlcnJvcigpIGluIG1pbmlnemlwLmMgZm9yIFdpbkNFIFtBbHZlc10NCi0gRG9uJ3QgdXNlIF92c25wcmludGYgb24gbGF0ZXIgdmVyc2lvbnMgb2YgTVNWQyBbTG93bWFuXQ0KLSBBZGQgQ01ha2UgYnVpbGQgc2NyaXB0IGFuZCBpbnB1dCBmaWxlIFtMb3dtYW5dDQotIFVwZGF0ZSBjb250cmliL21pbml6aXAgdG8gMS4xIFtTdmVuc3NvbiwgVm9sbGFudF0NCi0gTW92ZWQgbmludGVuZG9kcyBkaXJlY3RvcnkgZnJvbSBjb250cmliIHRvIC4NCi0gUmVwbGFjZSBnemlvLmMgd2l0aCBhIG5ldyBzZXQgb2Ygcm91dGluZXMgd2l0aCB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5DQotIEFkZCBnemJ1ZmZlcigpLCBnem9mZnNldCgpLCBnemNsb3NlX3IoKSwgZ3pjbG9zZV93KCkgYXMgcGFydCBvZiBhYm92ZQ0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIHRvIDEuMWINCi0gQ2hhbmdlIGd6ZW9mKCkgdG8gcmV0dXJuIDAgb24gZXJyb3IgaW5zdGVhZCBvZiAtMSB0byBhZ3JlZSB3aXRoIHpsaWIuaA0KDQpDaGFuZ2VzIGluIDEuMi4zLjQgKDIxIERlYyAyMDA5KQ0KLSBVc2Ugb2xkIHNjaG9vbCAuU1VGRklYRVMgaW4gTWFrZWZpbGUuaW4gZm9yIEZyZWVCU0QgY29tcGF0aWJpbGl0eQ0KLSBVcGRhdGUgY29tbWVudHMgaW4gY29uZmlndXJlIGFuZCBNYWtlZmlsZS5pbiBmb3IgZGVmYXVsdCAtLXNoYXJlZA0KLSBGaXggdGVzdCAteidzIGluIGNvbmZpZ3VyZSBbTWFycXVlc3NdDQotIEJ1aWxkIGV4YW1wbGVzaCBhbmQgbWluaWd6aXBzaCB3aGVuIG5vdCB0ZXN0aW5nDQotIENoYW5nZSBOVUxMJ3MgdG8gWl9OVUxMJ3MgaW4gZGVmbGF0ZS5jIGFuZCBpbiBjb21tZW50cyBpbiB6bGliLmgNCi0gSW1wb3J0IExERkxBR1MgZnJvbSB0aGUgZW52aXJvbm1lbnQgaW4gY29uZmlndXJlDQotIEZpeCBjb25maWd1cmUgdG8gcG9wdWxhdGUgU0ZMQUdTIHdpdGggZGlzY292ZXJlZCBDRkxBR1Mgb3B0aW9ucw0KLSBBZGFwdCBtYWtlX3Ztcy5jb20gdG8gdGhlIG5ldyBNYWtlZmlsZS5pbiBbWmluc2VyXQ0KLSBBZGQgemxpYjJhbnNpIHNjcmlwdCBmb3IgQysrIGNvbXBpbGF0aW9uIFtNYXJxdWVzc10NCi0gQWRkIF9GSUxFX09GRlNFVF9CSVRTPTY0IHRlc3QgdG8gbWFrZSB0ZXN0ICh3aGVuIGFwcGxpY2FibGUpDQotIEFkZCBBTUQ2NCBhc3NlbWJsZXIgY29kZSBmb3IgbG9uZ2VzdCBtYXRjaCB0byBjb250cmliIFtUZXRlcmluXQ0KLSBJbmNsdWRlIG9wdGlvbnMgZnJvbSAkU0ZMQUdTIHdoZW4gZG9pbmcgJExEU0hBUkVEDQotIFNpbXBsaWZ5IDY0LWJpdCBmaWxlIHN1cHBvcnQgYnkgaW50cm9kdWNpbmcgel9vZmY2NF90IHR5cGUNCi0gTWFrZSBzaGFyZWQgb2JqZWN0IGZpbGVzIGluIG9ianMgZGlyZWN0b3J5IHRvIHdvcmsgYXJvdW5kIG9sZCBTdW4gY2MNCi0gVXNlIG9ubHkgdGhyZWUtcGFydCB2ZXJzaW9uIG51bWJlciBmb3IgRGFyd2luIHNoYXJlZCBjb21waWxlcw0KLSBBZGQgcmMgb3B0aW9uIHRvIGFyIGluIE1ha2VmaWxlLmluIGZvciB3aGVuIC4vY29uZmlndXJlIG5vdCBydW4NCi0gQWRkIC1XSSwtcnBhdGgsLiB0byBMREZMQUdTIGZvciBPU0YgMSBWNCoNCi0gU2V0IExEX0xJQlJBUllOMzJfUEFUSCBmb3IgU0dJIElSSVggc2hhcmVkIGNvbXBpbGUNCi0gUHJvdGVjdCBhZ2FpbnN0IF9GSUxFX09GRlNFVF9CSVRTIGJlaW5nIGRlZmluZWQgd2hlbiBjb21waWxpbmcgemxpYg0KLSBSZW5hbWUgTWFrZWZpbGUuaW4gdGFyZ2V0cyBhbGxzdGF0aWMgdG8gc3RhdGljIGFuZCBhbGxzaGFyZWQgdG8gc2hhcmVkDQotIEZpeCBzdGF0aWMgYW5kIHNoYXJlZCBNYWtlZmlsZS5pbiB0YXJnZXRzIHRvIGJlIGluZGVwZW5kZW50DQotIENvcnJlY3QgZXJyb3IgcmV0dXJuIGJ1ZyBpbiBnel9vcGVuKCkgYnkgc2V0dGluZyBzdGF0ZSBbQnJvd25dDQotIFB1dCBzcGFjZXMgYmVmb3JlIDs7J3MgaW4gY29uZmlndXJlIGZvciBiZXR0ZXIgc2ggY29tcGF0aWJpbGl0eQ0KLSBBZGQgcGlnei5jIChwYXJhbGxlbCBpbXBsZW1lbnRhdGlvbiBvZiBnemlwKSB0byBleGFtcGxlcy8NCi0gQ29ycmVjdCBjb25zdGFudCBpbiBjcmMzMi5jIHRvIFVMIFtMZXZlbnRoYWxdDQotIFJlamVjdCBuZWdhdGl2ZSBsZW5ndGhzIGluIGNyYzMyX2NvbWJpbmUoKQ0KLSBBZGQgaW5mbGF0ZVJlc2V0MigpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSBpbmZsYXRlRW5kKCkvaW5mbGF0ZUluaXQyKCkNCi0gSW5jbHVkZSBzeXMvdHlwZXMuaCBmb3IgX0xBUkdFRklMRTY0X1NPVVJDRSBbQnJvd25dDQotIENvcnJlY3QgdHlwbyBpbiBkb2MvYWxnb3JpdGhtLnR4dCBbSmFuaWtdDQotIEZpeCBidWcgaW4gYWRsZXIzMl9jb21iaW5lKCkgW1podV0NCi0gQ2F0Y2ggbWlzc2luZy1lbmQtb2YtYmxvY2stY29kZSBlcnJvciBpbiBhbGwgaW5mbGF0ZXMgYW5kIGluIHB1ZmYNCiAgICBBc3N1cmVzIHRoYXQgcmFuZG9tIGlucHV0IHRvIGluZmxhdGUgZXZlbnR1YWxseSByZXN1bHRzIGluIGFuIGVycm9yDQotIEFkZGVkIGVub3VnaC5jIChjYWxjdWxhdGlvbiBvZiBFTk9VR0ggZm9yIGluZnRyZWVzLmgpIHRvIGV4YW1wbGVzLw0KLSBVcGRhdGUgRU5PVUdIIGFuZCBpdHMgdXNhZ2UgdG8gcmVmbGVjdCBkaXNjb3ZlcmVkIGJvdW5kcw0KLSBGaXggZ3plcnJvcigpIGVycm9yIHJlcG9ydCBvbiBlbXB0eSBpbnB1dCBmaWxlIFtCcm93bl0NCi0gQWRkIHVzaCBjYXN0cyBpbiB0cmVlcy5jIHRvIGF2b2lkIHBlZGFudGljIHJ1bnRpbWUgZXJyb3JzDQotIEZpeCB0eXBvIGluIHpsaWIuaCB1bmNvbXByZXNzKCkgZGVzY3JpcHRpb24gW1JlaXNzXQ0KLSBDb3JyZWN0IGluZmxhdGUoKSBjb21tZW50cyB3aXRoIHJlZ2FyZCB0byBhdXRvbWF0aWMgaGVhZGVyIGRldGVjdGlvbg0KLSBSZW1vdmUgZGVwcmVjYXRpb24gY29tbWVudCBvbiBaX1BBUlRJQUxfRkxVU0ggKGl0IHN0YXlzKQ0KLSBQdXQgbmV3IHZlcnNpb24gb2YgZ3psb2cgKDIuMCkgaW4gZXhhbXBsZXMgd2l0aCBpbnRlcnJ1cHRpb24gcmVjb3ZlcnkNCi0gQWRkIHB1ZmYgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zDQotIEFkZCBwdWZmIFRFU1QgY29tbWFuZCBvcHRpb25zLCBhYmlsaXR5IHRvIHJlYWQgcGlwZWQgaW5wdXQNCi0gUHJvdG90eXBlIHRoZSAqNjQgZnVuY3Rpb25zIGluIHpsaWIuaCB3aGVuIF9GSUxFX09GRlNFVF9CSVRTID09IDY0LCBidXQNCiAgX0xBUkdFRklMRTY0X1NPVVJDRSBub3QgZGVmaW5lZA0KLSBGaXggWl9GVUxMX0ZMVVNIIHRvIHRydWx5IGVyYXNlIHRoZSBwYXN0IGJ5IHJlc2V0dGluZyBzLT5zdHJzdGFydA0KLSBGaXggZGVmbGF0ZVNldERpY3Rpb25hcnkoKSB0byB1c2UgYWxsIDMySyBmb3Igb3V0cHV0IGNvbnNpc3RlbmN5DQotIFJlbW92ZSBleHRyYW5lb3VzICNkZWZpbmUgTUlOX0xPT0tBSEVBRCBpbiBkZWZsYXRlLmMgKGluIGRlZmxhdGUuaCkNCi0gQ2xlYXIgYnl0ZXMgYWZ0ZXIgZGVmbGF0ZSBsb29rYWhlYWQgdG8gYXZvaWQgdXNlIG9mIHVuaW5pdGlhbGl6ZWQgZGF0YQ0KLSBDaGFuZ2UgYSBsaW1pdCBpbiBpbmZ0cmVlcy5jIHRvIGJlIG1vcmUgdHJhbnNwYXJlbnQgdG8gQ292ZXJpdHkgUHJldmVudA0KLSBVcGRhdGUgd2luMzIvemxpYi5kZWYgd2l0aCBleHBvcnRlZCBzeW1ib2xzIGZyb20gemxpYi5oDQotIENvcnJlY3Qgc3BlbGxpbmcgZXJyb3JzIGluIHpsaWIuaCBbV2lsbGVtLCBTb2JyYWRvXQ0KLSBBbGxvdyBaX0JMT0NLIGZvciBkZWZsYXRlKCkgdG8gZm9yY2UgYSBuZXcgYmxvY2sNCi0gQWxsb3cgbmVnYXRpdmUgYml0cyBpbiBpbmZsYXRlUHJpbWUoKSB0byBkZWxldGUgZXhpc3RpbmcgYml0IGJ1ZmZlcg0KLSBBZGQgWl9UUkVFUyBmbHVzaCBvcHRpb24gdG8gaW5mbGF0ZSgpIHRvIHJldHVybiBhdCBlbmQgb2YgdHJlZXMNCi0gQWRkIGluZmxhdGVNYXJrKCkgdG8gcmV0dXJuIGN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHJhbmRvbSBhY2Nlc3MNCi0gQWRkIE1ha2VmaWxlIGZvciBOaW50ZW5kb0RTIHRvIGNvbnRyaWIgW0Nvc3RhXQ0KLSBBZGQgLXcgaW4gY29uZmlndXJlIGNvbXBpbGUgdGVzdHMgdG8gYXZvaWQgc3B1cmlvdXMgd2FybmluZ3MgW0JldWNsZXJdDQotIEZpeCB0eXBvcyBpbiB6bGliLmggY29tbWVudHMgZm9yIGRlZmxhdGVTZXREaWN0aW9uYXJ5KCkNCi0gRml4IEVPRiBkZXRlY3Rpb24gaW4gdHJhbnNwYXJlbnQgZ3pyZWFkKCkgW01haWVyXQ0KDQpDaGFuZ2VzIGluIDEuMi4zLjMgKDIgT2N0b2JlciAyMDA2KQ0KLSBNYWtlIC0tc2hhcmVkIHRoZSBkZWZhdWx0IGZvciBjb25maWd1cmUsIGFkZCBhIC0tc3RhdGljIG9wdGlvbg0KLSBBZGQgY29tcGlsZSBvcHRpb24gdG8gcGVybWl0IGludmFsaWQgZGlzdGFuY2UtdG9vLWZhciBzdHJlYW1zDQotIEFkZCBpbmZsYXRlVW5kZXJtaW5lKCkgZnVuY3Rpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gZW5hYmxlIGFib3ZlDQotIFJlbW92ZSB1c2Ugb2YgInRoaXMiIHZhcmlhYmxlIG5hbWUgZm9yIEMrKyBjb21wYXRpYmlsaXR5IFtNYXJxdWVzc10NCi0gQWRkIHRlc3Rpbmcgb2Ygc2hhcmVkIGxpYnJhcnkgaW4gbWFrZSB0ZXN0LCBpZiBzaGFyZWQgbGlicmFyeSBidWlsdA0KLSBVc2UgZnRlbGxvKCkgYW5kIGZzZWVrbygpIGlmIGF2YWlsYWJsZSBpbnN0ZWFkIG9mIGZ0ZWxsKCkgYW5kIGZzZWVrKCkNCi0gUHJvdmlkZSB0d28gdmVyc2lvbnMgb2YgYWxsIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGUgel9vZmZfdCB0eXBlIGZvcg0KICBiaW5hcnkgY29tcGF0aWJpbGl0eSAtLSBhIG5vcm1hbCB2ZXJzaW9uIGFuZCBhIDY0LWJpdCBvZmZzZXQgdmVyc2lvbiwNCiAgcGVyIHRoZSBMYXJnZSBGaWxlIFN1cHBvcnQgRXh0ZW5zaW9uIHdoZW4gX0xBUkdFRklMRTY0X1NPVVJDRSBpcw0KICBkZWZpbmVkOyB1c2UgdGhlIDY0LWJpdCB2ZXJzaW9ucyBieSBkZWZhdWx0IHdoZW4gX0ZJTEVfT0ZGU0VUX0JJVFMNCiAgaXMgZGVmaW5lZCB0byBiZSA2NA0KLSBBZGQgYSAtLXVuYW1lPSBvcHRpb24gdG8gY29uZmlndXJlIHRvIHBlcmhhcHMgaGVscCB3aXRoIGNyb3NzLWNvbXBpbGluZw0KDQpDaGFuZ2VzIGluIDEuMi4zLjIgKDMgU2VwdGVtYmVyIDIwMDYpDQotIFR1cm4gb2ZmIHNpbGx5IEJvcmxhbmQgd2FybmluZ3MgW0hheV0NCi0gVXNlIG9mZjY0X3QgYW5kIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFIHdoZW4gcHJlc2VudA0KLSBGaXggbWlzc2luZyBkZXBlbmRlbmN5IG9uIGluZmZpeGVkLmggaW4gTWFrZWZpbGUuaW4NCi0gUmlnIGNvbmZpZ3VyZSAtLXNoYXJlZCB0byBidWlsZCBib3RoIHNoYXJlZCBhbmQgc3RhdGljIFtUZXJlZGVzYWksIFRydXRhXQ0KLSBSZW1vdmUgemNvbmYuaW4uaCBhbmQgaW5zdGVhZCBjcmVhdGUgYSBuZXcgemxpYmRlZnMuaCBmaWxlDQotIEZpeCBjb250cmliL21pbml6aXAvdW56aXAuYyBub24tZW5jcnlwdGVkIGFmdGVyIGVuY3J5cHRlZCBbVm9sbGFudF0NCi0gQWRkIHRyZWVidWlsZC54bWwgKHNlZSBodHRwOi8vdHJlZWJ1aWxkLm1ldHV4LmRlLykgW1dlaWdlbHRdDQoNCkNoYW5nZXMgaW4gMS4yLjMuMSAoMTYgQXVndXN0IDIwMDYpDQotIEFkZCB3YXRjb20gZGlyZWN0b3J5IHdpdGggT3BlbldhdGNvbSBtYWtlIGZpbGVzIFtEYW5pZWxdDQotIFJlbW92ZSAjdW5kZWYgb2YgRkFSIGluIHpjb25mLmluLmggZm9yIE1WUyBbRmVkdGtlXQ0KLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdDQotIFVzZSAtZlBJQyBmb3Igc2hhcmVkIGJ1aWxkIGluIGNvbmZpZ3VyZSBbVGVyZWRlc2FpLCBOaWNob2xzb25dDQotIFVzZSBvbmx5IG1ham9yIHZlcnNpb24gbnVtYmVyIGZvciBsaWJ6LnNvIG9uIElSSVggYW5kIE9TRjEgW1JlaW5ob2xkdHNlbl0NCi0gVXNlIGZkb3BlbigpIChub3QgX2Zkb3BlbigpKSBmb3IgSW50ZXJpeCBpbiB6dXRpbC5oIFtCimNrXQ0KLSBBZGQgc29tZSBGQVEgZW50cmllcyBhYm91dCB0aGUgY29udHJpYiBkaXJlY3RvcnkNCi0gVXBkYXRlIHRoZSBNVlMgcXVlc3Rpb24gaW4gdGhlIEZBUQ0KLSBBdm9pZCBleHRyYW5lb3VzIHJlYWRzIGFmdGVyIEVPRiBpbiBnemlvLmMgW0Jyb3duXQ0KLSBDb3JyZWN0IHNwZWxsaW5nIG9mICJzdWNjZXNzZnVsbHkiIGluIGd6aW8uYyBbUmFuZGVycy1QZWhyc29uXQ0KLSBBZGQgY29tbWVudHMgdG8gemxpYi5oIGFib3V0IGd6ZXJyb3IoKSB1c2FnZSBbQnJvd25dDQotIFNldCBleHRyYSBmbGFncyBpbiBnemlwIGhlYWRlciBpbiBnem9wZW4oKSBsaWtlIGRlZmxhdGUoKSBkb2VzDQotIE1ha2UgY29uZmlndXJlIG9wdGlvbnMgbW9yZSBjb21wYXRpYmxlIHdpdGggZG91YmxlLWRhc2ggY29udmVudGlvbnMNCiAgW1dlaWdlbHRdDQotIENsZWFuIHVwIGNvbXBpbGF0aW9uIHVuZGVyIFNvbGFyaXMgU3VuU3R1ZGlvIGNjIFtSb3dlLCBSZWluaG9sZHRzZW5dDQotIEZpeCB1bmluc3RhbGwgdGFyZ2V0IGluIE1ha2VmaWxlLmluIFtUcnV0YV0NCi0gQWRkIHBrZ2NvbmZpZyBzdXBwb3J0IFtXZWlnZWx0XQ0KLSBVc2UgJChERVNURElSKSBtYWNybyBpbiBNYWtlZmlsZS5pbiBbUmVpbmhvbGR0c2VuLCBXZWlnZWx0XQ0KLSBSZXBsYWNlIHNldF9kYXRhX3R5cGUoKSB3aXRoIGEgbW9yZSBhY2N1cmF0ZSBkZXRlY3RfZGF0YV90eXBlKCkgaW4NCiAgdHJlZXMuYywgYWNjb3JkaW5nIHRvIHRoZSB0eHR2c2Jpbi50eHQgZG9jdW1lbnQgW1RydXRhXQ0KLSBTd2FwIHRoZSBvcmRlciBvZiAjaW5jbHVkZSA8c3RkaW8uaD4gYW5kICNpbmNsdWRlICJ6bGliLmgiIGluDQogIGd6aW8uYywgZXhhbXBsZS5jIGFuZCBtaW5pZ3ppcC5jIFtUcnV0YV0NCi0gU2h1dCB1cCBhbm5veWluZyBWUzIwMDUgd2FybmluZ3MgYWJvdXQgc3RhbmRhcmQgQyBkZXByZWNhdGlvbiBbUm93ZSwNCiAgVHJ1dGFdICh3aGVyZT8pDQotIEZpeCB0YXJnZXQgImNsZWFuIiBmcm9tIHdpbjMyL01ha2VmaWxlLmJvciBbVHJ1dGFdDQotIENyZWF0ZSAucGRiIGFuZCAubWFuaWZlc3QgZmlsZXMgaW4gd2luMzIvbWFrZWZpbGUubXNjIFtaaWVnbGVyLCBSb3dlXQ0KLSBVcGRhdGUgemxpYiB3d3cgaG9tZSBhZGRyZXNzIGluIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0NCi0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gZm9yIFZTMjAwNSBbVm9sbGFudCwgVmFuIFdhc3NlbmhvdmVdDQotIEVuYWJsZSBicm93c2UgaW5mbyBpbiB0aGUgIkRlYnVnIiBhbmQgIkFTTSBEZWJ1ZyIgY29uZmlndXJhdGlvbnMgaW4NCiAgdGhlIFZpc3VhbCBDKysgNiBwcm9qZWN0LCBhbmQgc2V0IChub24tQVNNKSAiRGVidWciIGFzIGRlZmF1bHQgW1RydXRhXQ0KLSBBZGQgcGtnY29uZmlnIHN1cHBvcnQgW1dlaWdlbHRdDQotIEFkZCBaTElCX1ZFUl9NQUpPUiwgWkxJQl9WRVJfTUlOT1IgYW5kIFpMSUJfVkVSX1JFVklTSU9OIGluIHpsaWIuaCwNCiAgZm9yIHVzZSBpbiB3aW4zMi96bGliMS5yYyBbUG9sdXNoaW4sIFJvd2UsIFRydXRhXQ0KLSBBZGQgYSBkb2N1bWVudCB0aGF0IGV4cGxhaW5zIHRoZSBuZXcgdGV4dCBkZXRlY3Rpb24gc2NoZW1lIHRvDQogIGRvYy90eHR2c2Jpbi50eHQgW1RydXRhXQ0KLSBBZGQgcmZjMTk1MC50eHQsIHJmYzE5NTEudHh0IGFuZCByZmMxOTUyLnR4dCB0byBkb2MvIFtUcnV0YV0NCi0gTW92ZSBhbGdvcml0aG0udHh0IGludG8gZG9jLyBbVHJ1dGFdDQotIFN5bmNocm9uaXplIEZBUSB3aXRoIHdlYnNpdGUNCi0gRml4IGNvbXByZXNzQm91bmQoKSwgd2FzIGxvdyBmb3Igc29tZSBwYXRob2xvZ2ljYWwgY2FzZXMgW0ZlYXJubGV5XQ0KLSBUYWtlIGludG8gYWNjb3VudCB3cmFwcGVyIHZhcmlhdGlvbnMgaW4gZGVmbGF0ZUJvdW5kKCkNCi0gU2V0IGV4YW1wbGVzL3pwaXBlLmMgaW5wdXQgYW5kIG91dHB1dCB0byBiaW5hcnkgbW9kZSBmb3IgV2luZG93cw0KLSBVcGRhdGUgZXhhbXBsZXMvemxpYl9ob3cuaHRtbCB3aXRoIG5ldyB6cGlwZS5jIChhbHNvIHdlYiBzaXRlKQ0KLSBGaXggc29tZSB3YXJuaW5ncyBpbiBleGFtcGxlcy9nemxvZy5jIGFuZCBleGFtcGxlcy96cmFuLmMgKGl0IHNlZW1zDQogIHRoYXQgZ2NjIGJlY2FtZSBwaWNraWVyIGluIDQuMCkNCi0gQWRkIHpsaWIubWFwIGZvciBMaW51eDogIkFsbCBzeW1ib2xzIGZyb20gemxpYi0xLjEuNCByZW1haW4NCiAgdW4tdmVyc2lvbmVkLCB0aGUgcGF0Y2ggYWRkcyB2ZXJzaW9uaW5nIG9ubHkgZm9yIHN5bWJvbHMgaW50cm9kdWNlZCBpbg0KICB6bGliLTEuMi4wIG9yIGxhdGVyLiAgSXQgYWxzbyBkZWNsYXJlcyBhcyBsb2NhbCB0aG9zZSBzeW1ib2xzIHdoaWNoIGFyZQ0KICBub3QgZGVzaWduZWQgdG8gYmUgZXhwb3J0ZWQuIiBbTGV2aW5dDQotIFVwZGF0ZSBaX1BSRUZJWCBsaXN0IGluIHpjb25mLmluLmgsIGFkZCAtLXpwcmVmaXggb3B0aW9uIHRvIGNvbmZpZ3VyZQ0KLSBEbyBub3QgaW5pdGlhbGl6ZSBnbG9iYWwgc3RhdGljIGJ5IGRlZmF1bHQgaW4gdHJlZXMuYywgYWRkIGEgcmVzcG9uc2UNCiAgTk9fSU5JVF9HTE9CQUxfUE9JTlRFUlMgdG8gaW5pdGlhbGl6ZSB0aGVtIGlmIG5lZWRlZCBbTWFycXVlc3NdDQotIERvbid0IHVzZSBzdHJlcnJvcigpIGluIGd6aW8uYyB1bmRlciBXaW5DRSBbWWFraW1vdl0NCi0gRG9uJ3QgdXNlIGVycm5vLmggaW4genV0aWwuaCB1bmRlciBXaW5DRSBbWWFraW1vdl0NCi0gTW92ZSBhcmd1bWVudHMgZm9yIEFSIHRvIGl0cyB1c2FnZSB0byBhbGxvdyByZXBsYWNpbmcgYXIgW01hcm90XQ0KLSBBZGQgSEFWRV9WSVNJQklMSVRZX1BSQUdNQSBpbiB6Y29uZi5pbi5oIGZvciBNb3ppbGxhIFtSYW5kZXJzLVBlaHJzb25dDQotIEltcHJvdmUgaW5mbGF0ZUluaXQoKSBhbmQgaW5mbGF0ZUluaXQyKCkgZG9jdW1lbnRhdGlvbg0KLSBGaXggc3RydWN0dXJlIHNpemUgY29tbWVudCBpbiBpbmZsYXRlLmgNCi0gQ2hhbmdlIGNvbmZpZ3VyZSBoZWxwIG9wdGlvbiBmcm9tIC0taCogdG8gLS1oZWxwIFtTYW50b3NdDQoNCkNoYW5nZXMgaW4gMS4yLjMgKDE4IEp1bHkgMjAwNSkNCi0gQXBwbHkgc2VjdXJpdHkgdnVsbmVyYWJpbGl0eSBmaXhlcyB0byBjb250cmliL2luZmJhY2s5IGFzIHdlbGwNCi0gQ2xlYW4gdXAgc29tZSB0ZXh0IGZpbGVzIChjYXJyaWFnZSByZXR1cm5zLCB0cmFpbGluZyBzcGFjZSkNCi0gVXBkYXRlIHRlc3R6bGliLCB2c3R1ZGlvLCBtYXNteDY0LCBhbmQgbWFzbXg4NiBpbiBjb250cmliIFtWb2xsYW50XQ0KDQpDaGFuZ2VzIGluIDEuMi4yLjQgKDExIEp1bHkgMjAwNSkNCi0gQWRkIGluZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBzdGFydGluZyBpbmZsYXRpb24gYXQgYml0IGJvdW5kYXJ5DQotIEF2b2lkIHNvbWUgVmlzdWFsIEMgd2FybmluZ3MgaW4gZGVmbGF0ZS5jDQotIEF2b2lkIG1vcmUgc2lsbHkgVmlzdWFsIEMgd2FybmluZ3MgaW4gaW5mbGF0ZS5jIGFuZCBpbmZ0cmVlcy5jIGZvciA2NC1iaXQNCiAgY29tcGlsZQ0KLSBGaXggc29tZSBzcGVsbGluZyBlcnJvcnMgaW4gY29tbWVudHMgW0JldHRzXQ0KLSBDb3JyZWN0IGluZmxhdGVJbml0MigpIGVycm9yIHJldHVybiBkb2N1bWVudGF0aW9uIGluIHpsaWIuaA0KLSBBZGQgenJhbi5jIGV4YW1wbGUgb2YgY29tcHJlc3NlZCBkYXRhIHJhbmRvbSBhY2Nlc3MgdG8gZXhhbXBsZXMNCiAgZGlyZWN0b3J5LCBzaG93cyB1c2Ugb2YgaW5mbGF0ZVByaW1lKCkNCi0gRml4IGNhc3QgZm9yIGFzc2lnbm1lbnRzIHRvIHN0cm0tPnN0YXRlIGluIGluZmxhdGUuYyBhbmQgaW5mYmFjay5jDQotIEZpeCB6bGliQ29tcGlsZUZsYWdzKCkgaW4genV0aWwuYyB0byB1c2UgMUwgZm9yIGxvbmcgc2hpZnRzIFtPYmVyaHVtZXJdDQotIE1vdmUgZGVjbGFyYXRpb25zIG9mIGdmMiBmdW5jdGlvbnMgdG8gcmlnaHQgcGxhY2UgaW4gY3JjMzIuYyBbT2Jlcmh1bWVyXQ0KLSBBZGQgY2FzdCBpbiB0cmVlcy5jIHQgYXZvaWQgYSB3YXJuaW5nIFtPYmVyaHVtZXJdDQotIEF2b2lkIHNvbWUgd2FybmluZ3MgaW4gZml0YmxrLmMsIGd1bi5jLCBnempvaW4uYyBpbiBleGFtcGxlcyBbT2Jlcmh1bWVyXQ0KLSBVcGRhdGUgbWFrZV92bXMuY29tIFtaaW5zZXJdDQotIEluaXRpYWxpemUgc3RhdGUtPndyaXRlIGluIGluZmxhdGVSZXNldCgpIHNpbmNlIGNvcGllZCBpbiBpbmZsYXRlX2Zhc3QoKQ0KLSBCZSBtb3JlIHN0cmljdCBvbiBpbmNvbXBsZXRlIGNvZGUgc2V0cyBpbiBpbmZsYXRlX3RhYmxlKCkgYW5kIGluY3JlYXNlDQogIEVOT1VHSCBhbmQgTUFYRCAtLSB0aGlzIHJlcGFpcnMgYSBwb3NzaWJsZSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5IGZvcg0KICBpbnZhbGlkIGluZmxhdGUgaW5wdXQuICBUaGFua3MgdG8gVGF2aXMgT3JtYW5keSBhbmQgTWFya3VzIE9iZXJodW1lciBmb3INCiAgZGlzY292ZXJpbmcgdGhlIHZ1bG5lcmFiaWxpdHkgYW5kIHByb3ZpZGluZyB0ZXN0IGNhc2VzLg0KLSBBZGQgaWE2NCBzdXBwb3J0IHRvIGNvbmZpZ3VyZSBmb3IgSFAtVVggW1NtaXRoXQ0KLSBBZGQgZXJyb3IgcmV0dXJuIHRvIGd6cmVhZCgpIGZvciBmb3JtYXQgb3IgaS9vIGVycm9yIFtMZXZpbl0NCi0gVXNlIG1hbGxvYy5oIGZvciBPUy8yIFtOZWNhc2VrXQ0KDQpDaGFuZ2VzIGluIDEuMi4yLjMgKDI3IE1heSAyMDA1KQ0KLSBSZXBsYWNlIDFVIGNvbnN0YW50cyBpbiBpbmZsYXRlLmMgYW5kIGluZnRyZWVzLmMgZm9yIDY0LWJpdCBjb21waWxlDQotIFR5cGVjYXN0IGZyZWFkKCkgcmV0dXJuIHZhbHVlcyBpbiBnemlvLmMgW1ZvbGxhbnRdDQotIFJlbW92ZSB0cmFpbGluZyBzcGFjZSBpbiBtaW5pZ3ppcC5jIG91dG1vZGUgKFZDKysgY2FuJ3QgZGVhbCB3aXRoIGl0KQ0KLSBGaXggY3JjIGNoZWNrIGJ1ZyBpbiBnenJlYWQoKSBhZnRlciBnenVuZ2V0YygpIFtIZWluZXJdDQotIEFkZCB0aGUgZGVmbGF0ZVR1bmUoKSBmdW5jdGlvbiB0byBhZGp1c3QgaW50ZXJuYWwgY29tcHJlc3Npb24gcGFyYW1ldGVycw0KLSBBZGQgYSBmYXN0IGd6aXAgZGVjb21wcmVzc29yLCBndW4uYywgdG8gZXhhbXBsZXMgKHVzZSBvZiBpbmZsYXRlQmFjaykNCi0gUmVtb3ZlIGFuIGluY29ycmVjdCBhc3NlcnRpb24gaW4gZXhhbXBsZXMvenBpcGUuYw0KLSBBZGQgQysrIHdyYXBwZXIgaW4gaW5mYmFjazkuaCBbRG9uYWlzXQ0KLSBGaXggYnVnIGluIGluZmxhdGVDb3B5KCkgd2hlbiBkZWNvZGluZyBmaXhlZCBjb2Rlcw0KLSBOb3RlIGluIHpsaWIuaCBob3cgbXVjaCBkZWZsYXRlU2V0RGljdGlvbmFyeSgpIGFjdHVhbGx5IHVzZXMNCi0gUmVtb3ZlIFVTRV9ESUNUX0hFQUQgaW4gZGVmbGF0ZS5jICh3b3VsZCBtZXNzIHVwIGluZmxhdGUgaWYgdXNlZCkNCi0gQWRkIF9XSU4zMl9XQ0UgdG8gZGVmaW5lIFdJTjMyIGluIHpjb25mLmluLmggW1NwZW5jZXJdDQotIERvbid0IGluY2x1ZGUgc3RkZXJyLmggb3IgZXJybm8uaCBmb3IgX1dJTjMyX1dDRSBpbiB6dXRpbC5oIFtTcGVuY2VyXQ0KLSBBZGQgZ3pkaXJlY3QoKSBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0cmFuc3BhcmVudCByZWFkcw0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQ0KLSBGaXggY29tcGlsYXRpb24gb2YgZGVmbGF0ZS5jIHdoZW4gYm90aCBBU01WIGFuZCBGQVNURVNUIFtPYmVyaHVtZXJdDQotIEFkZCBjYXN0cyBpbiBjcmMzMi5jIHRvIGF2b2lkIHdhcm5pbmdzIFtPYmVyaHVtZXJdDQotIEFkZCBjb250cmliL21hc214NjQgW1ZvbGxhbnRdDQotIFVwZGF0ZSBjb250cmliL2FzbTU4NiwgYXNtNjg2LCBtYXNteDg2LCB0ZXN0emxpYiwgdnN0dWRpbyBbVm9sbGFudF0NCg0KQ2hhbmdlcyBpbiAxLjIuMi4yICgzMCBEZWNlbWJlciAyMDA0KQ0KLSBSZXBsYWNlIHN0cnVjdHVyZSBhc3NpZ25tZW50cyBpbiBkZWZsYXRlLmMgYW5kIGluZmxhdGUuYyB3aXRoIHptZW1jcHkgdG8NCiAgYXZvaWQgaW1wbGljaXQgbWVtY3B5IGNhbGxzIChwb3J0YWJpbGl0eSBmb3Igbm8tbGlicmFyeSBjb21waWxhdGlvbikNCi0gSW5jcmVhc2Ugc3ByaW50ZigpIGJ1ZmZlciBzaXplIGluIGd6ZG9wZW4oKSB0byBhbGxvdyBmb3IgbGFyZ2UgbnVtYmVycw0KLSBBZGQgSU5GTEFURV9TVFJJQ1QgdG8gY2hlY2sgZGlzdGFuY2VzIGFnYWluc3QgemxpYiBoZWFkZXINCi0gSW1wcm92ZSBXaW5DRSBlcnJubyBoYW5kbGluZyBhbmQgY29tbWVudHMgW0NoYW5nXQ0KLSBSZW1vdmUgY29tbWVudCBhYm91dCBubyBnemlwIGhlYWRlciBwcm9jZXNzaW5nIGluIEZBUQ0KLSBBZGQgWl9GSVhFRCBzdHJhdGVneSBvcHRpb24gdG8gZGVmbGF0ZUluaXQyKCkgdG8gZm9yY2UgZml4ZWQgdHJlZXMNCi0gQWRkIHVwZGF0ZWQgbWFrZV92bXMuY29tIFtDb2dobGFuXSwgdXBkYXRlIFJFQURNRQ0KLSBDcmVhdGUgYSBuZXcgImV4YW1wbGVzIiBkaXJlY3RvcnksIG1vdmUgZ3phcHBlbmQuYyB0aGVyZSwgYWRkIHpwaXBlLmMsDQogIGZpdGJsay5jLCBnemxvZy5bY2hdLCBnempvaW4uYywgYW5kIHpsaWJfaG93Lmh0bWwuDQotIEFkZCBGQVEgZW50cnkgYW5kIGNvbW1lbnRzIGluIGRlZmxhdGUuYyBvbiB1bmluaXRpYWxpemVkIG1lbW9yeSBhY2Nlc3MNCi0gQWRkIFNvbGFyaXMgOSBtYWtlIG9wdGlvbnMgaW4gY29uZmlndXJlIFtHaWxiZXJ0XQ0KLSBBbGxvdyBzdHJlcnJvcigpIHVzYWdlIGluIGd6aW8uYyBmb3IgU1REQw0KLSBGaXggRGVjb21wcmVzc0J1ZiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBbTWFuQ2hlc1Rlcl0NCi0gVXBkYXRlIGNvbnRyaWIvbWFzbXg4Ni9pbmZmYXMzMi5hc20gYW5kIGd2bWF0MzIuYXNtIFtWb2xsYW50XQ0KLSBVc2Ugel9vZmZfdCBmb3IgYWRsZXIzMl9jb21iaW5lKCkgYW5kIGNyYzMyX2NvbWJpbmUoKSBsZW5ndGhzDQotIE1ha2UgYWRsZXIzMigpIG11Y2ggZmFzdGVyIGZvciBzbWFsbCBsZW4NCi0gVXNlIE9TX0NPREUgaW4gZGVmbGF0ZSgpIGRlZmF1bHQgZ3ppcCBoZWFkZXINCg0KQ2hhbmdlcyBpbiAxLjIuMi4xICgzMSBPY3RvYmVyIDIwMDQpDQotIEFsbG93IGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCBmb3IgcmF3IGluZmxhdGUNCi0gRml4IGluZmxhdGUgaGVhZGVyIGNyYyBjaGVjayBidWcgZm9yIGZpbGUgbmFtZXMgYW5kIGNvbW1lbnRzDQotIEFkZCBkZWZsYXRlU2V0SGVhZGVyKCkgYW5kIGd6X2hlYWRlciBzdHJ1Y3R1cmUgZm9yIGN1c3RvbSBnemlwIGhlYWRlcnMNCi0gQWRkIGluZmxhdGVHZXRoZWFkZXIoKSB0byByZXRyaWV2ZSBnemlwIGhlYWRlcnMNCi0gQWRkIGNyYzMyX2NvbWJpbmUoKSBhbmQgYWRsZXIzMl9jb21iaW5lKCkgZnVuY3Rpb25zDQotIEFkZCBhbGxvY19mdW5jLCBmcmVlX2Z1bmMsIGluX2Z1bmMsIG91dF9mdW5jIHRvIFpfUFJFRklYIGxpc3QNCi0gVXNlIHpzdHJlYW1wIGNvbnNpc3RlbnRseSBpbiB6bGliLmggKGluZmxhdGVfYmFjayBmdW5jdGlvbnMpDQotIFJlbW92ZSBHVU5aSVAgY29uZGl0aW9uIGZyb20gZGVmaW5pdGlvbiBvZiBpbmZsYXRlX21vZGUgaW4gaW5mbGF0ZS5oDQogIGFuZCBpbiBjb250cmliL2luZmxhdGU4Ni9pbmZmYXN0LlMgW1RydXRhLCBBbmRlcnNvbl0NCi0gQWRkIHN1cHBvcnQgZm9yIEFNRDY0IGluIGNvbnRyaWIvaW5mbGF0ZTg2L2luZmZhczg2LmMgW0FuZGVyc29uXQ0KLSBVcGRhdGUgcHJvamVjdHMvUkVBRE1FLnByb2plY3RzIGFuZCBwcm9qZWN0cy92aXN1YWxjNiBbVHJ1dGFdDQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdDQotIEF2b2lkIHdhcm5pbmcgdW5kZXIgTk9fR1pDT01QUkVTUyBpbiBnemlvLmM7IGZpeCB0eXBvIFtUcnV0YV0NCi0gRGVwcmVjYXRlIFpfQVNDSUk7IHVzZSBaX1RFWFQgaW5zdGVhZCBbVHJ1dGFdDQotIFVzZSBhIG5ldyBhbGdvcml0aG0gZm9yIHNldHRpbmcgc3RybS0+ZGF0YV90eXBlIGluIHRyZWVzLmMgW1RydXRhXQ0KLSBEbyBub3QgZGVmaW5lIGFuIGV4aXQoKSBwcm90b3R5cGUgaW4genV0aWwuYyB1bmxlc3MgREVCVUcgZGVmaW5lZA0KLSBSZW1vdmUgcHJvdG90eXBlIG9mIGV4aXQoKSBmcm9tIHp1dGlsLmMsIGV4YW1wbGUuYywgbWluaWd6aXAuYyBbVHJ1dGFdDQotIEFkZCBjb21tZW50IGluIHpsaWIuaCBmb3IgWl9OT19GTFVTSCBwYXJhbWV0ZXIgdG8gZGVmbGF0ZSgpDQotIEZpeCBEYXJ3aW4gYnVpbGQgdmVyc2lvbiBpZGVudGlmaWNhdGlvbiBbUGV0ZXJzb25dDQoNCkNoYW5nZXMgaW4gMS4yLjIgKDMgT2N0b2JlciAyMDA0KQ0KLSBVcGRhdGUgemxpYi5oIGNvbW1lbnRzIG9uIGd6aXAgaW4tbWVtb3J5IHByb2Nlc3NpbmcNCi0gU2V0IGFkbGVyIHRvIDEgaW4gaW5mbGF0ZVJlc2V0KCkgdG8gc3VwcG9ydCBKYXZhIHRlc3Qgc3VpdGUgW1dhbGxlc10NCi0gQWRkIGNvbnRyaWIvZG90emxpYiBbUmF2bl0NCi0gVXBkYXRlIHdpbjMyL0RMTF9GQVEudHh0IFtUcnV0YV0NCi0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0NCi0gTW92ZSBjb250cmliL3Zpc3VhbC1iYXNpYy50eHQgdG8gb2xkLyBbVHJ1dGFdDQotIEZpeCBhc3NlbWJsZXIgYnVpbGRzIGluIHByb2plY3RzL3Zpc3VhbGM2LyBbVHJ1dGFdDQoNCkNoYW5nZXMgaW4gMS4yLjEuMiAoOSBTZXB0ZW1iZXIgMjAwNCkNCi0gVXBkYXRlIElOREVYIGZpbGUNCi0gRml4IHRyZWVzLmMgdG8gdXBkYXRlIHN0cm0tPmRhdGFfdHlwZSAobm8gb25lIGV2ZXIgbm90aWNlZCEpDQotIEZpeCBidWcgaW4gZXJyb3IgY2FzZSBpbiBpbmZsYXRlLmMsIGluZmJhY2suYywgYW5kIGluZmJhY2s5LmMgW0Jyb3duXQ0KLSBBZGQgInZvbGF0aWxlIiB0byBjcmMgdGFibGUgZmxhZyBkZWNsYXJhdGlvbiAoZm9yIERZTkFNSUNfQ1JDX1RBQkxFKQ0KLSBBZGQgbGltaXRlZCBtdWx0aXRhc2tpbmcgcHJvdGVjdGlvbiB0byBEWU5BTUlDX0NSQ19UQUJMRQ0KLSBBZGQgTk9fdnNucHJpbnRmIGZvciBWTVMgaW4genV0aWwuaCBbTW96aWxsYV0NCi0gRG9uJ3QgZGVjbGFyZSBzdHJlcnJvcigpIHVuZGVyIFZNUyBbTW96aWxsYV0NCi0gQWRkIGNvbW1lbnQgdG8gRFlOQU1JQ19DUkNfVEFCTEUgdG8gdXNlIGdldF9jcmNfdGFibGUoKSB0byBpbml0aWFsaXplDQotIFVwZGF0ZSBjb250cmliL2FkYSBbQW5pc2lta292XQ0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIFtWb2xsYW50XQ0KLSBGaXggY29uZmlndXJlIHRvIG5vdCBoYXJkY29kZSBkaXJlY3RvcmllcyBmb3IgRGFyd2luIFtQZXRlcnNvbl0NCi0gRml4IGd6aW8uYyB0byBub3QgcmV0dXJuIGVycm9yIG9uIGVtcHR5IGZpbGVzIFtCcm93bl0NCi0gRml4IGluZGVudGF0aW9uOyB1cGRhdGUgdmVyc2lvbiBpbiBjb250cmliL2RlbHBoaS9aTGliLnBhcyBhbmQNCiAgY29udHJpYi9wYXNjYWwvemxpYnBhcy5wYXMgW1RydXRhXQ0KLSBVcGRhdGUgbWthc20uYmF0IGluIGNvbnRyaWIvbWFzbXg4NiBbVHJ1dGFdDQotIFVwZGF0ZSBjb250cmliL3VudGd6IFtUcnV0YV0NCi0gQWRkIHByb2plY3RzL1JFQURNRS5wcm9qZWN0cyBbVHJ1dGFdDQotIEFkZCBwcm9qZWN0IGZvciBNUyBWaXN1YWwgQysrIDYuMCBpbiBwcm9qZWN0cy92aXN1YWxjNiBbQ2FkaWV1eCwgVHJ1dGFdDQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdDQotIFVwZGF0ZSBsaXN0IG9mIFpfUFJFRklYIHN5bWJvbHMgaW4gemNvbmYuaCBbUmFuZGVycy1QZWhyc29uLCBUcnV0YV0NCi0gUmVtb3ZlIGFuIHVubmVjZXNzYXJ5IGFzc2lnbm1lbnQgdG8gY3VyciBpbiBpbmZ0cmVlcy5jIFtUcnV0YV0NCi0gQWRkIE9TLzIgdG8gZXhlIGJ1aWxkcyBpbiBjb25maWd1cmUgW1BvbHRvcmFrXQ0KLSBSZW1vdmUgZXJyIGR1bW15IHBhcmFtZXRlciBpbiB6bGliLmggW0tpZW50emxlXQ0KDQpDaGFuZ2VzIGluIDEuMi4xLjEgKDkgSmFudWFyeSAyMDA0KQ0KLSBVcGRhdGUgZW1haWwgYWRkcmVzcyBpbiBSRUFETUUNCi0gU2V2ZXJhbCBGQVEgdXBkYXRlcw0KLSBGaXggYSBiaWcgZmF0IGJ1ZyBpbiBpbmZ0cmVlcy5jIHRoYXQgcHJldmVudGVkIGRlY29kaW5nIHZhbGlkDQogIGR5bmFtaWMgYmxvY2tzIHdpdGggb25seSBsaXRlcmFscyBhbmQgbm8gZGlzdGFuY2UgY29kZXMgLS0NCiAgVGhhbmtzIHRvICJIb3QgRW11IiBmb3IgdGhlIGJ1ZyByZXBvcnQgYW5kIHNhbXBsZSBmaWxlDQotIEFkZCBhIG5vdGUgdG8gcHVmZi5jIG9uIG5vIGRpc3RhbmNlIGNvZGVzIGNhc2UuDQoNCkNoYW5nZXMgaW4gMS4yLjEgKDE3IE5vdmVtYmVyIDIwMDMpDQotIFJlbW92ZSBhIHRhYiBpbiBjb250cmliL2d6YXBwZW5kL2d6YXBwZW5kLmMNCi0gVXBkYXRlIHNvbWUgaW50ZXJmYWNlcyBpbiBjb250cmliIGZvciBuZXcgemxpYiBmdW5jdGlvbnMNCi0gVXBkYXRlIHpsaWIgdmVyc2lvbiBudW1iZXIgaW4gc29tZSBjb250cmliIGVudHJpZXMNCi0gQWRkIFdpbmRvd3MgQ0UgZGVmaW5pdGlvbiBmb3IgcHRyZGlmZl90IGluIHp1dGlsLmggW01haSwgVHJ1dGFdDQotIFN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBIdXJkIGFuZCBLRnJlZUJTRCBbQnJvd25dDQotIEZpeCBlcnJvciBpbiBOT19ESVZJREUgb3B0aW9uIG9mIGFkbGVyMzIuYw0KDQpDaGFuZ2VzIGluIDEuMi4wLjggKDQgTm92ZW1iZXIgMjAwMykNCi0gVXBkYXRlIHZlcnNpb24gaW4gY29udHJpYi9kZWxwaGkvWkxpYi5wYXMgYW5kIGNvbnRyaWIvcGFzY2FsL3psaWJwYXMucGFzDQotIEFkZCBleHBlcmltZW50YWwgTk9fRElWSURFICNkZWZpbmUgaW4gYWRsZXIzMi5jDQogICAgLSBQb3NzaWJseSBmYXN0ZXIgb24gc29tZSBwcm9jZXNzb3JzIChsZXQgbWUga25vdyBpZiBpdCBpcykNCi0gQ29ycmVjdCBaX0JMT0NLIHRvIG5vdCByZXR1cm4gb24gZmlyc3QgaW5mbGF0ZSBjYWxsIGlmIG5vIHdyYXANCi0gRml4IHN0cm0tPmRhdGFfdHlwZSBvbiBpbmZsYXRlKCkgcmV0dXJuIHRvIGNvcnJlY3RseSBpbmRpY2F0ZSBFT0INCi0gQWRkIGRlZmxhdGVQcmltZSgpIGZ1bmN0aW9uIGZvciBhcHBlbmRpbmcgaW4gdGhlIG1pZGRsZSBvZiBhIGJ5dGUNCi0gQWRkIGNvbnRyaWIvZ3phcHBlbmQgZm9yIGFuIGV4YW1wbGUgb2YgYXBwZW5kaW5nIHRvIGEgc3RyZWFtDQotIFVwZGF0ZSB3aW4zMi9ETExfRkFRLnR4dCBbVHJ1dGFdDQotIERlbGV0ZSBUdXJibyBDIGNvbW1lbnQgaW4gUkVBRE1FIFtUcnV0YV0NCi0gSW1wcm92ZSBzb21lIGluZGVudGF0aW9uIGluIHpjb25mLmggW1RydXRhXQ0KLSBGaXggaW5maW5pdGUgbG9vcCBvbiBiYWQgaW5wdXQgaW4gY29uZmlndXJlIHNjcmlwdCBbQ2h1cmNoXQ0KLSBGaXggZ3plb2YoKSBmb3IgY29uY2F0ZW5hdGVkIGd6aXAgZmlsZXMgW0pvaG5zb25dDQotIEFkZCBleGFtcGxlIHRvIGNvbnRyaWIvdmlzdWFsLWJhc2ljLnR4dCBbTWljaGFlbCBCLl0NCi0gQWRkIC1wIHRvIG1rZGlyJ3MgaW4gTWFrZWZpbGUuaW4gW3ZkYV0NCi0gRml4IGNvbmZpZ3VyZSB0byBwcm9wZXJseSBkZXRlY3QgcHJlc2VuY2Ugb3IgbGFjayBvZiBwcmludGYgZnVuY3Rpb25zDQotIEFkZCBBUzQwMCBzdXBwb3J0IFtNb25uZXJhdF0NCi0gQWRkIGEgbGl0dGxlIEN5Z3dpbiBzdXBwb3J0IFtXaWxzb25dDQoNCkNoYW5nZXMgaW4gMS4yLjAuNyAoMjEgU2VwdGVtYmVyIDIwMDMpDQotIENvcnJlY3Qgc29tZSBkZWJ1ZyBmb3JtYXRzIGluIGNvbnRyaWIvaW5mYmFjazkNCi0gQ2FzdCBhIHR5cGUgaW4gYSBkZWJ1ZyBzdGF0ZW1lbnQgaW4gdHJlZXMuYw0KLSBDaGFuZ2Ugc2VhcmNoIGFuZCByZXBsYWNlIGRlbGltaXRlciBpbiBjb25maWd1cmUgZnJvbSAlIHRvICMgW0JlZWJlXQ0KLSBVcGRhdGUgY29udHJpYi91bnRneiB0byAwLjIgd2l0aCB2YXJpb3VzIGZpeGVzIFtUcnV0YV0NCi0gQWRkIGJ1aWxkIHN1cHBvcnQgZm9yIEFtaWdhIFtOaWtsXQ0KLSBSZW1vdmUgc29tZSBkaXJlY3RvcmllcyBpbiBvbGQgdGhhdCBoYXZlIGJlZW4gdXBkYXRlZCB0byAxLjINCi0gQWRkIGR5bGliIGJ1aWxkaW5nIGZvciBNYWMgT1MgWCBpbiBjb25maWd1cmUgYW5kIE1ha2VmaWxlLmluDQotIFJlbW92ZSBvbGQgZGlzdHJpYnV0aW9uIHN0dWZmIGZyb20gTWFrZWZpbGUNCi0gVXBkYXRlIFJFQURNRSB0byBwb2ludCB0byBETExfRkFRLnR4dCwgYW5kIGFkZCBjb21tZW50IG9uIE1hYyBPUyBYDQotIFVwZGF0ZSBsaW5rcyBpbiBSRUFETUUNCg0KQ2hhbmdlcyBpbiAxLjIuMC42ICgxMyBTZXB0ZW1iZXIgMjAwMykNCi0gTWlub3IgRkFRIHVwZGF0ZXMNCi0gVXBkYXRlIGNvbnRyaWIvbWluaXppcCB0byAxLjAwIFtWb2xsYW50XQ0KLSBSZW1vdmUgdGVzdCBvZiBneiBmdW5jdGlvbnMgaW4gZXhhbXBsZS5jIHdoZW4gR1pfQ09NUFJFU1MgZGVmaW5lZCBbVHJ1dGFdDQotIFVwZGF0ZSBQT1NUSU5DIGNvbW1lbnQgZm9yIDY4MDYwIFtOaWtsXQ0KLSBBZGQgY29udHJpYi9pbmZiYWNrOSB3aXRoIGRlZmxhdGU2NCBkZWNvZGluZyAodW5zdXBwb3J0ZWQpDQotIEZvciBNVlMgZGVmaW5lIE5PX3ZzbnByaW50ZiBhbmQgdW5kZWZpbmUgRkFSIFt2YW4gQnVyaWtdDQotIEFkZCBwcmFnbWEgZm9yIGZkb3BlbiBvbiBNVlMgW3ZhbiBCdXJpa10NCg0KQ2hhbmdlcyBpbiAxLjIuMC41ICg4IFNlcHRlbWJlciAyMDAzKQ0KLSBBZGQgT0YgdG8gaW5mbGF0ZUJhY2tFbmQoKSBkZWNsYXJhdGlvbiBpbiB6bGliLmgNCi0gUmVtZW1iZXIgc3RhcnQgd2hlbiB1c2luZyBnemRvcGVuIGluIHRoZSBtaWRkbGUgb2YgYSBmaWxlDQotIFVzZSBpbnRlcm5hbCBvZmZfdCBjb3VudGVycyBpbiBneiogZnVuY3Rpb25zIHRvIHByb3Blcmx5IGhhbmRsZSBzZWVrcw0KLSBQZXJmb3JtIG1vcmUgcmlnb3JvdXMgY2hlY2sgZm9yIGRpc3RhbmNlLXRvby1mYXIgaW4gaW5mZmFzdC5jDQotIEFkZCBaX0JMT0NLIGZsdXNoIG9wdGlvbiB0byByZXR1cm4gZnJvbSBpbmZsYXRlIGF0IGJsb2NrIGJvdW5kYXJ5DQotIFNldCBzdHJtLT5kYXRhX3R5cGUgb24gcmV0dXJuIGZyb20gaW5mbGF0ZQ0KICAgIC0gSW5kaWNhdGUgYml0cyB1bnVzZWQsIGlmIGF0IGJsb2NrIGJvdW5kYXJ5LCBhbmQgaWYgaW4gbGFzdCBibG9jaw0KLSBSZXBsYWNlIHNpemVfdCB3aXRoIHB0cmRpZmZfdCBpbiBjcmMzMi5jLCBhbmQgY2hlY2sgZm9yIGNvcnJlY3Qgc2l6ZQ0KLSBBZGQgY29uZGl0aW9uIHNvIG9sZCBOT19ERUZMQVRFIGRlZmluZSBzdGlsbCB3b3JrcyBmb3IgY29tcGF0aWJpbGl0eQ0KLSBGQVEgdXBkYXRlIHJlZ2FyZGluZyB0aGUgV2luZG93cyBETEwgW1RydXRhXQ0KLSBJTkRFWCB1cGRhdGU6IGFkZCBxbnggZW50cnksIHJlbW92ZSBhaXggZW50cnkgW1RydXRhXQ0KLSBJbnN0YWxsIHpsaWIuMyBpbnRvIG1hbmRpciBbV2lsc29uXQ0KLSBNb3ZlIGNvbnRyaWIvemxpYl9kbGxfRkFRLnR4dCB0byB3aW4zMi9ETExfRkFRLnR4dDsgdXBkYXRlIFtUcnV0YV0NCi0gQWRhcHQgdGhlIHpsaWIgaW50ZXJmYWNlIHRvIHRoZSBuZXcgRExMIGNvbnZlbnRpb24gZ3VpZGVsaW5lcyBbVHJ1dGFdDQotIEludHJvZHVjZSBaTElCX1dJTkFQSSBtYWNybyB0byBhbGxvdyB0aGUgZXhwb3J0IG9mIGZ1bmN0aW9ucyB1c2luZw0KICB0aGUgV0lOQVBJIGNhbGxpbmcgY29udmVudGlvbiwgZm9yIFZpc3VhbCBCYXNpYyBbVm9sbGFudCwgVHJ1dGFdDQotIFVwZGF0ZSBtc2RvcyBhbmQgd2luMzIgc2NyaXB0cyBhbmQgbWFrZWZpbGVzIFtUcnV0YV0NCi0gRXhwb3J0IHN5bWJvbHMgYnkgbmFtZSwgbm90IGJ5IG9yZGluYWwsIGluIHdpbjMyL3psaWIuZGVmIFtUcnV0YV0NCi0gQWRkIGNvbnRyaWIvYWRhIFtBbmlzaW1rb3ZdDQotIE1vdmUgYXNtIGZpbGVzIGZyb20gY29udHJpYi92c3R1ZGlvL3ZjNzBfMzIgdG8gY29udHJpYi9hc20zODYgW1RydXRhXQ0KLSBSZW5hbWUgY29udHJpYi9hc20zODYgdG8gY29udHJpYi9tYXNteDg2IFtUcnV0YSwgVm9sbGFudF0NCi0gQWRkIGNvbnRyaWIvbWFzbTY4NiBbVHJ1dGFdDQotIEZpeCBvZmZzZXRzIGluIGNvbnRyaWIvaW5mbGF0ZTg2IGFuZCBjb250cmliL21hc214ODYvaW5mZmFzMzIuYXNtDQogIFtUcnV0YSwgVm9sbGFudF0NCi0gVXBkYXRlIGNvbnRyaWIvZGVscGhpOyByZW5hbWUgdG8gY29udHJpYi9wYXNjYWw7IGFkZCBleGFtcGxlIFtUcnV0YV0NCi0gUmVtb3ZlIGNvbnRyaWIvZGVscGhpMjsgYWRkIGEgbmV3IGNvbnRyaWIvZGVscGhpIFtUcnV0YV0NCi0gQXZvaWQgaW5jbHVzaW9uIG9mIHRoZSBub25zdGFuZGFyZCA8bWVtb3J5Lmg+IGluIGNvbnRyaWIvaW9zdHJlYW0sDQogIGFuZCBmaXggc29tZSBtZXRob2QgcHJvdG90eXBlcyBbVHJ1dGFdDQotIEZpeCB0aGUgWkNSX1NFRUQyIGNvbnN0YW50IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNvbnRyaWIvbWluaXppcA0KICBbVHJ1dGFdDQotIEF2b2lkIHRoZSB1c2Ugb2YgYmFja3NsYXNoIChcKSBpbiBjb250cmliL21pbml6aXAgW1ZvbGxhbnRdDQotIEZpeCBmaWxlIHRpbWUgaGFuZGxpbmcgaW4gY29udHJpYi91bnRnejsgdXBkYXRlIG1ha2VmaWxlcyBbVHJ1dGFdDQotIFVwZGF0ZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb21wbHkgd2l0aCB0aGUgbmV3IERMTCBndWlkZWxpbmVzDQogIFtWb2xsYW50XQ0KLSBSZW1vdmUgY29udHJpYi92c3R1ZGlvL3ZjMTVfMTYgW1ZvbGxhbnRdDQotIFJlbmFtZSBjb250cmliL3ZzdHVkaW8vdmM3MF8zMiB0byBjb250cmliL3ZzdHVkaW8vdmM3IFtUcnV0YV0NCi0gVXBkYXRlIFJFQURNRS5jb250cmliIFtUcnV0YV0NCi0gSW52ZXJ0IHRoZSBhc3NpZ25tZW50IG9yZGVyIG9mIG1hdGNoX2hlYWQgYW5kIHMtPnByZXZbLi4uXSBpbg0KICBJTlNFUlRfU1RSSU5HIFtUcnV0YV0NCi0gQ29tcGFyZSBUT09fRkFSIHdpdGggMzI3NjcgaW5zdGVhZCBvZiAzMjc2OCwgdG8gYXZvaWQgMTYtYml0IHdhcm5pbmdzDQogIFtUcnV0YV0NCi0gQ29tcGFyZSBmdW5jdGlvbiBwb2ludGVycyB3aXRoIDAsIG5vdCB3aXRoIE5VTEwgb3IgWl9OVUxMIFtUcnV0YV0NCi0gRml4IHByb3RvdHlwZSBvZiBzeW5jc2VhcmNoIGluIGluZmxhdGUuYyBbVHJ1dGFdDQotIEludHJvZHVjZSBBU01JTkYgbWFjcm8gdG8gYmUgZW5hYmxlZCB3aGVuIHVzaW5nIGFuIEFTTSBpbXBsZW1lbnRhdGlvbg0KICBvZiBpbmZsYXRlX2Zhc3QgW1RydXRhXQ0KLSBDaGFuZ2UgTk9fREVGTEFURSB0byBOT19HWkNPTVBSRVNTIFtUcnV0YV0NCi0gTW9kaWZ5IHRlc3RfZ3ppbyBpbiBleGFtcGxlLmMgdG8gdGFrZSBhIHNpbmdsZSBmaWxlIG5hbWUgYXMgYQ0KICBwYXJhbWV0ZXIgW1RydXRhXQ0KLSBFeGl0IHRoZSBleGFtcGxlLmMgcHJvZ3JhbSBpZiBnem9wZW4gZmFpbHMgW1RydXRhXQ0KLSBBZGQgdHlwZSBjYXN0cyBhcm91bmQgc3RybGVuIGluIGV4YW1wbGUuYyBbVHJ1dGFdDQotIFJlbW92ZSBjYXN0aW5nIHRvIHNpemVvZiBpbiBtaW5pZ3ppcC5jOyBnaXZlIGEgcHJvcGVyIHR5cGUNCiAgdG8gdGhlIHZhcmlhYmxlIGNvbXBhcmVkIHdpdGggU1VGRklYX0xFTiBbVHJ1dGFdDQotIFVwZGF0ZSBkZWZpbml0aW9ucyBvZiBTVERDIGFuZCBTVERDOTkgaW4gemNvbmYuaCBbVHJ1dGFdDQotIFN5bmNocm9uaXplIHpjb25mLmggd2l0aCB0aGUgbmV3IFdpbmRvd3MgRExMIGludGVyZmFjZSBbVHJ1dGFdDQotIFVzZSBTWVMxNkJJVCBpbnN0ZWFkIG9mIF9fMzJCSVRfXyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuDQogIDE2LSBhbmQgMzItYml0IHBsYXRmb3JtcyBbVHJ1dGFdDQotIFVzZSBmYXIgbWVtb3J5IGFsbG9jYXRvcnMgaW4gc21hbGwgMTYtYml0IG1lbW9yeSBtb2RlbHMgZm9yDQogIFR1cmJvIEMgW1RydXRhXQ0KLSBBZGQgaW5mbyBhYm91dCB0aGUgdXNlIG9mIEFTTVYsIEFTTUlORiBhbmQgWkxJQl9XSU5BUEkgaW4NCiAgemxpYkNvbXBpbGVGbGFncyBbVHJ1dGFdDQotIEN5Z3dpbiBoYXMgdnNucHJpbnRmIFtXaWxzb25dDQotIEluIFdpbmRvd3MxNiwgT1NfQ09ERSBpcyAwLCBhcyBpbiBNU0RPUyBbVHJ1dGFdDQotIEluIEN5Z3dpbiwgT1NfQ09ERSBpcyAzIChVbml4KSwgbm90IDExIChXaW5kb3dzMzIpIFtXaWxzb25dDQoNCkNoYW5nZXMgaW4gMS4yLjAuNCAoMTAgQXVndXN0IDIwMDMpDQotIE1pbm9yIEZBUSB1cGRhdGVzDQotIEJlIG1vcmUgc3RyaWN0IHdoZW4gY2hlY2tpbmcgaW5mbGF0ZUluaXQyJ3Mgd2luZG93Qml0cyBwYXJhbWV0ZXINCi0gQ2hhbmdlIE5PX0dVTlpJUCBjb21waWxlIG9wdGlvbiB0byBOT19HWklQIHRvIGNvdmVyIGRlZmxhdGUgYXMgd2VsbA0KLSBBZGQgZ3ppcCB3cmFwcGVyIG9wdGlvbiB0byBkZWZsYXRlSW5pdDIgdXNpbmcgd2luZG93Qml0cw0KLSBBZGQgdXBkYXRlZCBRTlggcnVsZSBpbiBjb25maWd1cmUgYW5kIHFueCBkaXJlY3RvcnkgW0Jvbm5lZm95XQ0KLSBNYWtlIGluZmxhdGUgZGlzdGFuY2UtdG9vLWZhciBjaGVja3MgbW9yZSByaWdvcm91cw0KLSBDbGVhbiB1cCBGQVIgdXNhZ2UgaW4gaW5mbGF0ZQ0KLSBBZGQgY2FzdGluZyB0byBzaXplb2YoKSBpbiBnemlvLmMgYW5kIG1pbmlnemlwLmMNCg0KQ2hhbmdlcyBpbiAxLjIuMC4zICgxOSBKdWx5IDIwMDMpDQotIEZpeCBzaWxseSBlcnJvciBpbiBnenVuZ2V0YygpIGltcGxlbWVudGF0aW9uIFtWb2xsYW50XQ0KLSBVcGRhdGUgY29udHJpYi9taW5pemlwIGFuZCBjb250cmliL3ZzdHVkaW8gW1ZvbGxhbnRdDQotIEZpeCBwcmludGYgZm9ybWF0IGluIGV4YW1wbGUuYw0KLSBDb3JyZWN0IGNkZWNsIHN1cHBvcnQgaW4gemNvbmYuaW4uaCBbQW5pc2lta292XQ0KLSBNaW5vciBGQVEgdXBkYXRlcw0KDQpDaGFuZ2VzIGluIDEuMi4wLjIgKDEzIEp1bHkgMjAwMykNCi0gQWRkIFpMSUJfVkVSTlVNIGluIHpsaWIuaCBmb3IgbnVtZXJpY2FsIHByZXByb2Nlc3NvciBjb21wYXJpc29ucw0KLSBBdHRlbXB0IHRvIGF2b2lkIHdhcm5pbmdzIGluIGNyYzMyLmMgZm9yIHBvaW50ZXItaW50IGNvbnZlcnNpb24NCi0gQWRkIEFJWCB0byBjb25maWd1cmUsIHJlbW92ZSBhaXggZGlyZWN0b3J5IFtCYWtrZXJdDQotIEFkZCBzb21lIGNhc3RzIHRvIG1pbmlnemlwLmMNCi0gSW1wcm92ZSBjaGVja2luZyBhZnRlciBpbnNlY3VyZSBzcHJpbnRmKCkgb3IgdnNwcmludGYoKSBjYWxscw0KLSBSZW1vdmUgI2VsaWYncyBmcm9tIGNyYzMyLmMNCi0gQ2hhbmdlIGxlYXZlIGxhYmVsIHRvIGluZl9sZWF2ZSBpbiBpbmZsYXRlLmMgYW5kIGluZmJhY2suYyB0byBhdm9pZA0KICBsaWJyYXJ5IGNvbmZsaWN0cw0KLSBSZW1vdmUgaW5mbGF0ZSBnemlwIGRlY29kaW5nIGJ5IGRlZmF1bHQtLW9ubHkgZW5hYmxlIGd6aXAgZGVjb2RpbmcgYnkNCiAgc3BlY2lhbCByZXF1ZXN0IGZvciBzdHJpY3RlciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5DQotIEFkZCB6bGliQ29tcGlsZUZsYWdzKCkgZnVuY3Rpb24gdG8gcmV0dXJuIGNvbXBpbGF0aW9uIGluZm9ybWF0aW9uDQotIE1vcmUgdHlwZWNhc3RpbmcgaW4gZGVmbGF0ZS5jIHRvIGF2b2lkIHdhcm5pbmdzDQotIFJlbW92ZSBsZWFkaW5nIHVuZGVyc2NvcmUgZnJvbSBfQ2FwaXRhbCAjZGVmaW5lcyBbVHJ1dGFdDQotIEZpeCBjb25maWd1cmUgdG8gbGluayBzaGFyZWQgbGlicmFyeSB3aGVuIHRlc3RpbmcNCi0gQWRkIHNvbWUgV2luZG93cyBDRSB0YXJnZXQgYWRqdXN0bWVudHMgW01haV0NCi0gUmVtb3ZlICNkZWZpbmUgWkxJQl9ETEwgaW4gemNvbmYuaCBbVm9sbGFudF0NCi0gQWRkIHpsaWIuMyBbUm9kZ2Vyc10NCi0gVXBkYXRlIFJGQyBVUkwgaW4gZGVmbGF0ZS5jIGFuZCBhbGdvcml0aG0udHh0IFtNYWldDQotIEFkZCB6bGliX2RsbF9GQVEudHh0IHRvIGNvbnRyaWIgW1RydXRhXQ0KLSBBZGQgVUwgdG8gc29tZSBjb25zdGFudHMgW1RydXRhXQ0KLSBVcGRhdGUgbWluaXppcCBhbmQgdnN0dWRpbyBbVm9sbGFudF0NCi0gUmVtb3ZlIHZlc3RpZ2lhbCBORUVEX0RVTU1ZX1JFVFVSTiBmcm9tIHpjb25mLmluLmgNCi0gRXhwYW5kIHVzZSBvZiBOT19EVU1NWV9ERUNMIHRvIGF2b2lkIGFsbCBkdW1teSBzdHJ1Y3R1cmVzDQotIEFkZGVkIGlvc3RyZWFtMyB0byBjb250cmliIFtTY2h3YXJkdF0NCi0gUmVwbGFjZSByZXdpbmQoKSB3aXRoIGZzZWVrKCkgZm9yIFdpbkNFIFtUcnV0YV0NCi0gSW1wcm92ZSBzZXR0aW5nIG9mIHpsaWIgZm9ybWF0IGNvbXByZXNzaW9uIGxldmVsIGZsYWdzDQogICAgLSBSZXBvcnQgMCBmb3IgaHVmZm1hbiBhbmQgcmxlIHN0cmF0ZWdpZXMgYW5kIGZvciBsZXZlbCA9PSAwIG9yIDENCiAgICAtIFJlcG9ydCAyIG9ubHkgZm9yIGxldmVsID09IDYNCi0gT25seSBkZWFsIHdpdGggNjRLIGxpbWl0IHdoZW4gbmVjZXNzYXJ5IGF0IGNvbXBpbGUgdGltZSBbVHJ1dGFdDQotIEFsbG93IFRPT19GQVIgY2hlY2sgdG8gYmUgdHVybmVkIG9mZiBhdCBjb21waWxlIHRpbWUgW1RydXRhXQ0KLSBBZGQgZ3pjbGVhcmVycigpIGZ1bmN0aW9uIFtTb3V6YV0NCi0gQWRkIGd6dW5nZXRjKCkgZnVuY3Rpb24NCg0KQ2hhbmdlcyBpbiAxLjIuMC4xICgxNyBNYXJjaCAyMDAzKQ0KLSBBZGQgWl9STEUgc3RyYXRlZ3kgZm9yIHJ1bi1sZW5ndGggZW5jb2RpbmcgW1RydXRhXQ0KICAgIC0gV2hlbiBaX1JMRSByZXF1ZXN0ZWQsIHJlc3RyaWN0IG1hdGNoZXMgdG8gZGlzdGFuY2Ugb25lDQogICAgLSBVcGRhdGUgemxpYi5oLCBtaW5pZ3ppcC5jLCBnem9wZW4oKSwgZ3pkb3BlbigpIGZvciBaX1JMRQ0KLSBDb3JyZWN0IEZBU1RFU1QgY29tcGlsYXRpb24gdG8gYWxsb3cgbGV2ZWwgPT0gMA0KLSBDbGVhbiB1cCB3aGF0IGdldHMgY29tcGlsZWQgZm9yIEZBU1RFU1QNCi0gSW5jb3Jwb3JhdGUgY2hhbmdlcyB0byB6Y29uZi5pbi5oIFtWb2xsYW50XQ0KICAgIC0gUmVmaW5lIGRldGVjdGlvbiBvZiBUdXJibyBDIG5lZWQgZm9yIGR1bW15IHJldHVybnMNCiAgICAtIFJlZmluZSBaTElCX0RMTCBjb21waWxhdGlvbg0KICAgIC0gSW5jbHVkZSBhZGRpdGlvbmFsIGhlYWRlciBmaWxlIG9uIFZNUyBmb3Igb2ZmX3QgdHlwZWRlZg0KLSBUcnkgdG8gdXNlIF92c25wcmludGYgd2hlcmUgaXQgc3VwcGxhbnRzIHZzcHJpbnRmIFtWb2xsYW50XQ0KLSBBZGQgc29tZSBjYXN0cyBpbiBpbmZmYXN0LmMNCi0gRW5jaGFuY2UgY29tbWVudHMgaW4gemxpYi5oIG9uIHdoYXQgaGFwcGVucyBpZiBnenByaW50ZigpIHRyaWVzIHRvDQogIHdyaXRlIG1vcmUgdGhhbiA0MDk1IGJ5dGVzIGJlZm9yZSBjb21wcmVzc2lvbg0KLSBSZW1vdmUgdW51c2VkIHN0YXRlIGZyb20gaW5mbGF0ZUJhY2tFbmQoKQ0KLSBSZW1vdmUgZXhpdCgwKSBmcm9tIG1pbmlnemlwLmMsIGV4YW1wbGUuYw0KLSBHZXQgcmlkIG9mIGFsbCB0aG9zZSBkYXJuIHRhYnMNCi0gQWRkICJjaGVjayIgdGFyZ2V0IHRvIE1ha2VmaWxlLmluIHRoYXQgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyAidGVzdCINCi0gQWRkICJtb3N0bHljbGVhbiIgYW5kICJtYWludGFpbmVyLWNsZWFuIiB0YXJnZXRzIHRvIE1ha2VmaWxlLmluDQotIFVwZGF0ZSBjb250cmliL2luZmxhdGU4NiBbQW5kZXJzb25dDQotIFVwZGF0ZSBjb250cmliL3Rlc3R6bGliLCBjb250cmliL3ZzdHVkaW8sIGNvbnRyaWIvbWluaXppcCBbVm9sbGFudF0NCi0gQWRkIG1zZG9zIGFuZCB3aW4zMiBkaXJlY3RvcmllcyB3aXRoIG1ha2VmaWxlcyBbVHJ1dGFdDQotIE1vcmUgYWRkaXRpb25zIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEZBUQ0KDQpDaGFuZ2VzIGluIDEuMi4wICg5IE1hcmNoIDIwMDMpDQotIE5ldyBhbmQgaW1wcm92ZWQgaW5mbGF0ZSBjb2RlDQogICAgLSBBYm91dCAyMCUgZmFzdGVyDQogICAgLSBEb2VzIG5vdCBhbGxvY2F0ZSAzMksgd2luZG93IHVubGVzcyBhbmQgdW50aWwgbmVlZGVkDQogICAgLSBBdXRvbWF0aWNhbGx5IGRldGVjdHMgYW5kIGRlY29tcHJlc3NlcyBnemlwIHN0cmVhbXMNCiAgICAtIFJhdyBpbmZsYXRlIG5vIGxvbmdlciBuZWVkcyBhbiBleHRyYSBkdW1teSBieXRlIGF0IGVuZA0KICAgIC0gQWRkZWQgaW5mbGF0ZUJhY2sgZnVuY3Rpb25zIHVzaW5nIGEgY2FsbGJhY2sgaW50ZXJmYWNlLS1ldmVuIGZhc3Rlcg0KICAgICAgdGhhbiBpbmZsYXRlLCB1c2VmdWwgZm9yIGZpbGUgdXRpbGl0aWVzIChnemlwLCB6aXApDQogICAgLSBBZGRlZCBpbmZsYXRlQ29weSgpIGZ1bmN0aW9uIHRvIHJlY29yZCBzdGF0ZSBmb3IgcmFuZG9tIGFjY2VzcyBvbg0KICAgICAgZXh0ZXJuYWxseSBnZW5lcmF0ZWQgZGVmbGF0ZSBzdHJlYW1zIChlLmcuIGluIGd6aXAgZmlsZXMpDQogICAgLSBNb3JlIHJlYWRhYmxlIGNvZGUgKEkgaG9wZSkNCi0gTmV3IGFuZCBpbXByb3ZlZCBjcmMzMigpDQogICAgLSBBYm91dCA1MCUgZmFzdGVyLCB0aGFua3MgdG8gc3VnZ2VzdGlvbnMgZnJvbSBSb2RuZXkgQnJvd24NCi0gQWRkIGRlZmxhdGVCb3VuZCgpIGFuZCBjb21wcmVzc0JvdW5kKCkgZnVuY3Rpb25zDQotIEZpeCBtZW1vcnkgbGVhayBpbiBkZWZsYXRlSW5pdDIoKQ0KLSBQZXJtaXQgc2V0dGluZyBkaWN0aW9uYXJ5IGZvciByYXcgZGVmbGF0ZSAoZm9yIHBhcmFsbGVsIGRlZmxhdGUpDQotIEZpeCBjb25zdCBkZWNsYXJhdGlvbiBmb3IgZ3p3cml0ZSgpDQotIENoZWNrIGZvciBzb21lIG1hbGxvYygpIGZhaWx1cmVzIGluIGd6aW8uYw0KLSBGaXggYnVnIGluIGd6b3BlbigpIG9uIHNpbmdsZS1ieXRlIGZpbGUgMHgxZg0KLSBGaXggYnVnIGluIGd6cmVhZCgpIG9uIGNvbmNhdGVuYXRlZCBmaWxlIHdpdGggMHgxZiBhdCBlbmQgb2YgYnVmZmVyDQogIGFuZCBuZXh0IGJ1ZmZlciBkb2Vzbid0IHN0YXJ0IHdpdGggMHg4Yg0KLSBGaXggdW5jb21wcmVzcygpIHRvIHJldHVybiBaX0RBVEFfRVJST1Igb24gdHJ1bmNhdGVkIGlucHV0DQotIEZyZWUgbWVtb3J5IGF0IGVuZCBvZiBleGFtcGxlLmMNCi0gUmVtb3ZlIE1BWCAjZGVmaW5lIGluIHRyZWVzLmMgKGNvbmZsaWN0ZWQgd2l0aCBzb21lIGxpYnJhcmllcykNCi0gRml4IHN0YXRpYyBjb25zdCdzIGluIGRlZmxhdGUuYywgZ3ppby5jLCBhbmQgenV0aWwuW2NoXQ0KLSBEZWNsYXJlIG1hbGxvYygpIGFuZCBmcmVlKCkgaW4gZ3ppby5jIGlmIFNUREMgbm90IGRlZmluZWQNCi0gVXNlIG1hbGxvYygpIGluc3RlYWQgb2YgY2FsbG9jKCkgaW4genV0aWwuYyBpZiBpbnQgYmlnIGVub3VnaA0KLSBEZWZpbmUgU1REQyBmb3IgQUlYDQotIEFkZCBhaXgvIHdpdGggYXBwcm9hY2ggZm9yIGNvbXBpbGluZyBzaGFyZWQgbGlicmFyeSBvbiBBSVgNCi0gQWRkIEhQLVVYIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gY29uZmlndXJlDQotIEFkZCBPcGVuVU5JWCBzdXBwb3J0IGZvciBzaGFyZWQgbGlicmFyaWVzIGluIGNvbmZpZ3VyZQ0KLSBVc2UgJGNjIGluc3RlYWQgb2YgZ2NjIHRvIGJ1aWxkIHNoYXJlZCBsaWJyYXJ5DQotIE1ha2UgcHJlZml4IGRpcmVjdG9yeSBpZiBuZWVkZWQgd2hlbiBpbnN0YWxsaW5nDQotIENvcnJlY3QgTWFjaW50b3NoIGF2b2lkYW5jZSBvZiB0eXBlZGVmIEJ5dGUgaW4gemNvbmYuaA0KLSBDb3JyZWN0IFR1cmJvIEMgbWVtb3J5IGFsbG9jYXRpb24gd2hlbiB1bmRlciBMaW51eA0KLSBVc2UgbGliei5hIGluc3RlYWQgb2YgLWx6IGluIE1ha2VmaWxlIChhc3N1cmUgdXNlIG9mIGNvbXBpbGVkIGxpYnJhcnkpDQotIFVwZGF0ZSBjb25maWd1cmUgdG8gY2hlY2sgZm9yIHNucHJpbnRmIG9yIHZzbnByaW50ZiBmdW5jdGlvbnMgYW5kIHRoZWlyDQogIHJldHVybiB2YWx1ZSwgd2FybiBkdXJpbmcgbWFrZSBpZiB1c2luZyBhbiBpbnNlY3VyZSBmdW5jdGlvbg0KLSBGaXggY29uZmlndXJlIHByb2JsZW0gd2l0aCBjb21waWxlLXRpbWUga25vd2xlZGdlIG9mIEhBVkVfVU5JU1REX0ggdGhhdA0KICBpcyBsb3N0IHdoZW4gbGlicmFyeSBpcyB1c2VkLS1yZXNvbHV0aW9uIGlzIHRvIGJ1aWxkIG5ldyB6Y29uZi5oDQotIERvY3VtZW50YXRpb24gaW1wcm92ZW1lbnRzIChpbiB6bGliLmgpOg0KICAgIC0gRG9jdW1lbnQgcmF3IGRlZmxhdGUgYW5kIGluZmxhdGUNCiAgICAtIFVwZGF0ZSBSRkNzIFVSTA0KICAgIC0gUG9pbnQgb3V0IHRoYXQgemxpYiBhbmQgZ3ppcCBmb3JtYXRzIGFyZSBkaWZmZXJlbnQNCiAgICAtIE5vdGUgdGhhdCBaX0JVRl9FUlJPUiBpcyBub3QgZmF0YWwNCiAgICAtIERvY3VtZW50IHN0cmluZyBsaW1pdCBmb3IgZ3pwcmludGYoKSBhbmQgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93DQogICAgLSBOb3RlIHJlcXVpcmVtZW50IG9uIGF2YWlsX291dCB3aGVuIGZsdXNoaW5nDQogICAgLSBOb3RlIHBlcm1pdHRlZCB2YWx1ZXMgb2YgZmx1c2ggcGFyYW1ldGVyIG9mIGluZmxhdGUoKQ0KLSBBZGQgc29tZSBGQVFzIChhbmQgZXZlbiBhbnN3ZXJzKSB0byB0aGUgRkFRDQotIEFkZCBjb250cmliL2luZmxhdGU4Ni8gZm9yIHg4NiBmYXN0ZXIgaW5mbGF0ZQ0KLSBBZGQgY29udHJpYi9ibGFzdC8gZm9yIFBLV2FyZSBEYXRhIENvbXByZXNzaW9uIExpYnJhcnkgZGVjb21wcmVzc2lvbg0KLSBBZGQgY29udHJpYi9wdWZmLyBzaW1wbGUgaW5mbGF0ZSBmb3IgZGVmbGF0ZSBmb3JtYXQgZGVzY3JpcHRpb24NCg0KQ2hhbmdlcyBpbiAxLjEuNCAoMTEgTWFyY2ggMjAwMikNCi0gWkZSRUUgd2FzIHJlcGVhdGVkIG9uIHNhbWUgYWxsb2NhdGlvbiBvbiBzb21lIGVycm9yIGNvbmRpdGlvbnMuDQogIFRoaXMgY3JlYXRlcyBhIHNlY3VyaXR5IHByb2JsZW0gZGVzY3JpYmVkIGluDQogIGh0dHA6Ly93d3cuemxpYi5vcmcvYWR2aXNvcnktMjAwMi0wMy0xMS50eHQNCi0gUmV0dXJuZWQgaW5jb3JyZWN0IGVycm9yIChaX01FTV9FUlJPUikgb24gc29tZSBpbnZhbGlkIGRhdGENCi0gQXZvaWQgYWNjZXNzZXMgYmVmb3JlIHdpbmRvdyBmb3IgaW52YWxpZCBkaXN0YW5jZXMgd2l0aCBpbmZsYXRlIHdpbmRvdw0KICBsZXNzIHRoYW4gMzJLLg0KLSBmb3JjZSB3aW5kb3dCaXRzID4gOCB0byBhdm9pZCBhIGJ1ZyBpbiB0aGUgZW5jb2RlciBmb3IgYSB3aW5kb3cgc2l6ZQ0KICBvZiAyNTYgYnl0ZXMuIChBIGNvbXBsZXRlIGZpeCB3aWxsIGJlIGF2YWlsYWJsZSBpbiAxLjEuNSkuDQoNCkNoYW5nZXMgaW4gMS4xLjMgKDkgSnVseSAxOTk4KQ0KLSBmaXggImFuIGluZmxhdGUgaW5wdXQgYnVmZmVyIGJ1ZyB0aGF0IHNob3dzIHVwIG9uIHJhcmUgYnV0IHBlcnNpc3RlbnQNCiAgb2NjYXNpb25zIiAoTWFyaykNCi0gZml4IGd6cmVhZCBhbmQgZ3p0ZWxsIGZvciBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzIChEaWRpZXIgTGUgQm90bGFuKQ0KLSBmaXggZ3pzZWVrKC4uLiwgU0VFS19TRVQpIGluIHdyaXRlIG1vZGUNCi0gZml4IGNyYyBjaGVjayBhZnRlciBhIGd6ZWVrIChGcmFuayBGYXViZXJ0KQ0KLSBmaXggbWluaXVuemlwIHdoZW4gdGhlIGxhc3QgZW50cnkgaW4gYSB6aXAgZmlsZSBpcyBpdHNlbGYgYSB6aXAgZmlsZQ0KICAoSiBMaWxsZ2UpDQotIGFkZCBjb250cmliL2FzbTU4NiBhbmQgY29udHJpYi9hc202ODYgKEJyaWFuIFJhaXRlcikNCiAgU2VlIGh0dHA6Ly93d3cubXVwcGV0bGFicy5jb20vfmJyZWFkYm94L3NvZnR3YXJlL2Fzc2VtYmx5Lmh0bWwNCi0gYWRkIHN1cHBvcnQgZm9yIERlbHBoaSAzIGluIGNvbnRyaWIvZGVscGhpIChCb2IgRGVsbGFjYSkNCi0gYWRkIHN1cHBvcnQgZm9yIEMrK0J1aWxkZXIgMyBhbmQgRGVscGhpIDMgaW4gY29udHJpYi9kZWxwaGkyIChEYXZpZGUgTW9yZXR0aSkNCi0gZG8gbm90IGV4aXQgcHJlbWF0dXJlbHkgaW4gdW50Z3ogaWYgMCBhdCBzdGFydCBvZiBibG9jayAoTWFnbnVzIEhvbG1ncmVuKQ0KLSB1c2UgbWFjcm8gRVhURVJOIGluc3RlYWQgb2YgZXh0ZXJuIHRvIHN1cHBvcnQgRExMIGZvciBCZU9TIChTYW5kZXIgU3Rva3MpDQotIGFkZGVkIGEgRkFRIGZpbGUNCg0KLSBTdXBwb3J0IGd6ZG9wZW4gb24gTWFjIHdpdGggTWV0cm93ZXJrcyAoSmFzb24gTGluaGFydCkNCi0gRG8gbm90IHJlZGVmaW5lIEJ5dGUgb24gTWFjIChCcmFkIFBldHRpdCAmIEphc29uIExpbmhhcnQpDQotIGRlZmluZSBTRUVLX0VORCB0b28gaWYgU0VFS19TRVQgaXMgbm90IGRlZmluZWQgKEFsYmVydCBDaGluLUEtWW91bmcpDQotIGF2b2lkIHNvbWUgd2FybmluZ3Mgd2l0aCBCb3JsYW5kIEMgKFRvbSBUYW5uZXIpDQotIGZpeCBhIHByb2JsZW0gaW4gY29udHJpYi9taW5pemlwL3ppcC5jIGZvciAxNi1iaXQgTVNET1MgKEdpbGxlcyBWb2xsYW50KQ0KLSBlbXVsYXRlIHV0aW1lKCkgZm9yIFdJTjMyIGluIGNvbnRyaWIvdW50Z3ogIChHaWxsZXMgVm9sbGFudCkNCi0gYWxsb3cgc2V2ZXJhbCBhcmd1bWVudHMgdG8gY29uZmlndXJlIChUaW0gTW9vbmV5LCBGcm9kbyBMb29pamFhcmQpDQotIHVzZSBsaWJkaXIgYW5kIGluY2x1ZGVkaXIgaW4gTWFrZWZpbGUuaW4gKFRpbSBNb29uZXkpDQotIHN1cHBvcnQgc2hhcmVkIGxpYnJhcmllcyBvbiBPU0YxIFY0IChUaW0gTW9vbmV5KQ0KLSByZW1vdmUgc29fbG9jYXRpb25zIGluICJtYWtlIGNsZWFuIiAgKFRpbSBNb29uZXkpDQotIGZpeCBtYWtldHJlZS5jIGNvbXBpbGF0aW9uIGVycm9yIChHbGVubiwgTWFyaykNCi0gUHl0aG9uIGludGVyZmFjZSB0byB6bGliIG5vdyBpbiBQeXRob24gMS41IChKZXJlbXkgSHlsdG9uKQ0KLSBuZXcgTWFrZWZpbGUucmlzY29zIChSaWNoIFdhbGtlcikNCi0gaW5pdGlhbGl6ZSBzdGF0aWMgZGVzY3JpcHRvcnMgaW4gdHJlZXMuYyBmb3IgZW1iZWRkZWQgdGFyZ2V0cyAoTmljayBTbWl0aCkNCi0gdXNlICJmb28tZ3oiIGluIGV4YW1wbGUuYyBmb3IgUklTQ09TIGFuZCBWTVMgKE5pY2sgU21pdGgpDQotIGFkZCB0aGUgT1MvMiBmaWxlcyBpbiBNYWtlZmlsZS5pbiB0b28gKEFuZHJldyBaYWJvbG90bnkpDQotIGZpeCBmZG9wZW4gYW5kIGhhbGxvYyBtYWNyb3MgZm9yIE1pY3Jvc29mdCBDIDYuMCAoVG9tIExhbmUpDQotIGZpeCBtYWtldHJlZS5jIHRvIGFsbG93IGNsZWFuIGNvbXBpbGF0aW9uIG9mIGluZmZpeGVkLmggKE1hcmspDQotIGZpeCBwYXJhbWV0ZXIgY2hlY2sgaW4gZGVmbGF0ZUNvcHkgKEd1bnRoZXIgTmlrbCkNCi0gY2xlYW51cCB0cmVlcy5jLCB1c2UgY29tcHJlc3NlZF9sZW4gb25seSBpbiBkZWJ1ZyBtb2RlIChDaHJpc3RpYW4gU3BpZWxlcikNCi0gTWFueSBwb3J0YWJpbGl0eSBwYXRjaGVzIGJ5IENocmlzdGlhbiBTcGllbGVyOg0KICAuIHp1dGlsLmMsIHp1dGlsLmg6IGFkZGVkICJjb25zdCIgZm9yIHptZW0qDQogIC4gTWFrZV92bXMuY29tOiBmaXhlZCBzb21lIHR5cG9zDQogIC4gTWFrZV92bXMuY29tOiBtc2Rvcy9NYWtlZmlsZS4qOiByZW1vdmVkIHp1dGlsLmggZnJvbSBzb21lIGRlcGVuZGVuY3kgbGlzdHMNCiAgLiBtc2Rvcy9NYWtlZmlsZS5tc2M6IHJlbW92ZSAiZGVmYXVsdCBydGwgbGluayBsaWJyYXJ5IiBpbmZvIGZyb20gb2JqIGZpbGVzDQogIC4gbXNkb3MvTWFrZWZpbGUuKjogdXNlIG1vZGVsLWRlcGVuZGVudCBuYW1lIGZvciB0aGUgYnVpbHQgemxpYiBsaWJyYXJ5DQogIC4gbXNkb3MvTWFrZWZpbGUuZW14LCBudC9NYWtlZmlsZS5lbXgsIG50L01ha2VmaWxlLmdjYzoNCiAgICAgbmV3IG1ha2VmaWxlcywgZm9yIGVteCAoRE9TL09TMiksIGVteCZyc3hudCBhbmQgbWluZ3czMiAoV2luZG93cyA5eCAvIE5UKQ0KLSB1c2UgZGVmaW5lIGluc3RlYWQgb2YgdHlwZWRlZiBmb3IgQnl0ZWYgYWxzbyBmb3IgTVNDIHNtYWxsL21lZGl1bSAoVG9tIExhbmUpDQotIHJlcGxhY2UgX19mYXIgd2l0aCBfZmFyIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkgKENocmlzdGlhbiBTcGllbGVyLCBUb20gTGFuZSkNCi0gZml4IHRlc3QgZm9yIGVycm5vLmggaW4gY29uZmlndXJlIChUaW0gTmV3c2hhbSkNCg0KQ2hhbmdlcyBpbiAxLjEuMiAoMTkgTWFyY2ggOTgpDQotIGFkZGVkIGNvbnRyaWIvbWluemlwLCBtaW5pIHppcCBhbmQgdW56aXAgYmFzZWQgb24gemxpYiAoR2lsbGVzIFZvbGxhbnQpDQogIFNlZSBodHRwOi8vd3d3LndpbmltYWdlLmNvbS96TGliRGxsL3VuemlwLmh0bWwNCi0gcHJlaW5pdGlhbGl6ZSB0aGUgaW5mbGF0ZSB0YWJsZXMgZm9yIGZpeGVkIGNvZGVzLCB0byBtYWtlIHRoZSBjb2RlDQogIGNvbXBsZXRlbHkgdGhyZWFkIHNhZmUgKE1hcmspDQotIHNvbWUgc2ltcGxpZmljYXRpb25zIGFuZCBzbGlnaHQgc3BlZWQtdXAgdG8gdGhlIGluZmxhdGUgY29kZSAoTWFyaykNCi0gZml4IGd6ZW9mIG9uIG5vbi1jb21wcmVzc2VkIGZpbGVzIChBbGxhbiBTY2hydW0pDQotIGFkZCAtc3RkMSBvcHRpb24gaW4gY29uZmlndXJlIGZvciBPU0YxIHRvIGZpeCBnenByaW50ZiAoTWFydGluIE1va3JlanMpDQotIHVzZSBkZWZhdWx0IHZhbHVlIG9mIDRLIGZvciBaX0JVRlNJWkUgZm9yIDE2LWJpdCBNU0RPUyAoVGltIFdlZ25lciArIEdsZW5uKQ0KLSBhZGRlZCBvczIvTWFrZWZpbGUuZGVmIGFuZCBvczIvemxpYi5kZWYgKEFuZHJldyBaYWJvbG90bnkpDQotIGFkZCBzaGFyZWQgbGliIHN1cHBvcnQgZm9yIFVOSVhfU1Y0LjJNUCAoTUFUU1VVUkEgVGFrYW5vcmkpDQotIGRvIG5vdCB3cmFwIGV4dGVybiAiQyIgYXJvdW5kIHN5c3RlbSBpbmNsdWRlcyAoVG9tIExhbmUpDQotIG1lbnRpb24gemxpYiBiaW5kaW5nIGZvciBUQ0wgaW4gUkVBRE1FIChBbmRyZWFzIEt1cHJpZXMpDQotIGFkZGVkIGFtaWdhL01ha2VmaWxlLnB1cCBmb3IgQW1pZ2EgcG93ZXJVUCBTQVMvQyBQUEMgKEFuZHJlYXMgS2xlaW5lcnQpDQotIGFsbG93ICJtYWtlIGluc3RhbGwgcHJlZml4PS4uLiIgZXZlbiBhZnRlciBjb25maWd1cmUgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikNCi0gYWxsb3cgImNvbmZpZ3VyZSAtLXByZWZpeCAkSE9NRSIgKFRpbSBNb29uZXkpDQotIHJlbW92ZSB3YXJuaW5ncyBpbiBleGFtcGxlLmMgYW5kIGd6aW8uYyAoR2xlbm4gUmFuZGVycy1QZWhyc29uKQ0KLSBtb3ZlIE1ha2VmaWxlLnNhcyB0byBhbWlnYS9NYWtlZmlsZS5zYXMNCg0KQ2hhbmdlcyBpbiAxLjEuMSAoMjcgRmViIDk4KQ0KLSBmaXggbWFjcm9zIF90cl90YWxseV8qIGluIGRlZmxhdGUuaCBmb3IgZGVidWcgbW9kZSAgKEdsZW5uIFJhbmRlcnMtUGVocnNvbikNCi0gcmVtb3ZlIGJsb2NrIHRydW5jYXRpb24gaGV1cmlzdGljIHdoaWNoIGhhZCB2ZXJ5IG1hcmdpbmFsIGVmZmVjdCBmb3IgemxpYg0KICAoc21hbGxlciBsaXRfYnVmc2l6ZSB0aGFuIGluIGd6aXAgMS4yLjQpIGFuZCBkZWdyYWRlZCBhIGxpdHRsZSB0aGUNCiAgY29tcHJlc3Npb24gcmF0aW8gb24gc29tZSBmaWxlcy4gVGhpcyBhbHNvIGFsbG93cyBpbmxpbmluZyBfdHJfdGFsbHkgZm9yDQogIG1hdGNoZXMgaW4gZGVmbGF0ZV9zbG93Lg0KLSBhZGRlZCBtc2Rvcy9NYWtlZmlsZS53MzIgZm9yIFdJTjMyIE1pY3Jvc29mdCBWaXN1YWwgQysrIChCb2IgRnJhemllcikNCg0KQ2hhbmdlcyBpbiAxLjEuMCAoMjQgRmViIDk4KQ0KLSBkbyBub3QgcmV0dXJuIFNUUkVBTV9FTkQgcHJlbWF0dXJlbHkgaW4gaW5mbGF0ZSAoSm9obiBCb3dsZXIpDQotIHJldmVydCB0byB0aGUgemxpYiAxLjAuOCBpbmZsYXRlIHRvIGF2b2lkIHRoZSBnY2MgMi44LjAgYnVnIChKZXJlbXkgQnVobGVyKQ0KLSBjb21waWxlIHdpdGggLURGQVNURVNUIHRvIGdldCBjb21wcmVzc2lvbiBjb2RlIG9wdGltaXplZCBmb3Igc3BlZWQgb25seQ0KLSBpbiBtaW5pZ3ppcCwgdHJ5IG1tYXAnaW5nIHRoZSBpbnB1dCBmaWxlIGZpcnN0IChNaWd1ZWwgQWxicmVjaHQpDQotIGluY3JlYXNlIHNpemUgb2YgSS9PIGJ1ZmZlcnMgaW4gbWluaWd6aXAuYyBhbmQgZ3ppby5jIChub3QgYSBiaWcgZ2Fpbg0KICBvbiBTdW4gYnV0IHNpZ25pZmljYW50IG9uIEhQKQ0KDQotIGFkZCBhIHBvaW50ZXIgdG8gZXhwZXJpbWVudGFsIHVuemlwIGxpYnJhcnkgaW4gUkVBRE1FIChHaWxsZXMgVm9sbGFudCkNCi0gaW5pdGlhbGl6ZSB2YXJpYWJsZSBnY2MgaW4gY29uZmlndXJlIChDaHJpcyBIZXJib3J0aCkNCg0KQ2hhbmdlcyBpbiAxLjAuOSAoMTcgRmViIDE5OTgpDQotIGFkZGVkIGd6cHV0cyBhbmQgZ3pnZXRzIGZ1bmN0aW9ucw0KLSBkbyBub3QgY2xlYXIgZW9mIGZsYWcgaW4gZ3pzZWVrIChNYXJrIERpZWtoYW5zKQ0KLSBmaXggZ3pzZWVrIGZvciBmaWxlcyBpbiB0cmFuc3BhcmVudCBtb2RlIChNYXJrIERpZWtoYW5zKQ0KLSBkbyBub3QgYXNzdW1lIHRoYXQgdnNwcmludGYgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gKEplbnMgS3JpbmtlKQ0KLSByZXBsYWNlIEVYUE9SVCB3aXRoIFpFWFBPUlQgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBvdGhlciBwcm9ncmFtcw0KLSBhZGRlZCBjb21wcmVzczIgaW4gemNvbmYuaCwgemxpYi5kZWYsIHpsaWIuZG50DQotIG5ldyBhc20gY29kZSBmcm9tIEdpbGxlcyBWb2xsYW50IGluIGNvbnRyaWIvYXNtMzg2DQotIHNpbXBsaWZ5IHRoZSBpbmZsYXRlIGNvZGUgKE1hcmspOg0KIC4gUmVwbGFjZSBaQUxMT0MncyBpbiBodWZ0X2J1aWxkKCkgd2l0aCBzaW5nbGUgWkFMTE9DIGluIGluZmxhdGVfYmxvY2tzX25ldygpDQogLiBaQUxMT0MgdGhlIGxlbmd0aCBsaXN0IGluIGluZmxhdGVfdHJlZXNfZml4ZWQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrDQogLiBaQUxMT0MgdGhlIHZhbHVlIGFyZWEgZm9yIGh1ZnRfYnVpbGQoKSBpbnN0ZWFkIG9mIHVzaW5nIHN0YWNrDQogLiBTaW1wbGlmeSBaX0ZJTklTSCBjaGVjayBpbiBpbmZsYXRlKCkNCg0KLSBBdm9pZCBnY2MgMi44LjAgY29tcGFyaXNvbiBidWcgYSBsaXR0bGUgZGlmZmVyZW50bHkgdGhhbiB6bGliIDEuMC44DQotIGluIGluZnRyZWVzLmMsIGF2b2lkIGNjIC1PIGJ1ZyBvbiBIUCAoRmFyc2hpZCBFbGFoaSkNCi0gaW4gemNvbmYuaCBtb3ZlIHRoZSBaTElCX0RMTCBzdHVmZiBlYXJsaWVyIHRvIGF2b2lkIHByb2JsZW1zIHdpdGgNCiAgdGhlIGRlY2xhcmF0aW9uIG9mIEZBUiAoR2lsbGVzIFZPbGxhbnQpDQotIGluc3RhbGwgbGliei5zbyogd2l0aCBtb2RlIDc1NSAoZXhlY3V0YWJsZSkgaW5zdGVhZCBvZiA2NDQgKE1hcmMgTGVobWFubikNCi0gcmVhZF9idWYgYnVmIHBhcmFtZXRlciBvZiB0eXBlIEJ5dGVmKiBpbnN0ZWFkIG9mIGNoYXJmKg0KLSB6bWVtY3B5IHBhcmFtZXRlcnMgYXJlIG9mIHR5cGUgQnl0ZWYqLCBub3QgY2hhcmYqIChKb3NlcGggU3Ryb3V0KQ0KLSBkbyBub3QgcmVkZWNsYXJlIHVubGluayBpbiBtaW5pZ3ppcC5jIGZvciBXSU4zMiAoSm9obiBCb3dsZXIpDQotIGZpeCBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgZGlyZWN0b3JpZXMgaW4gIm1ha2UgaW5zdGFsbCIgKElhbiBXaWxsaXMpDQoNCkNoYW5nZXMgaW4gMS4wLjggKDI3IEphbiAxOTk4KQ0KLSBmaXhlZCBvZmZzZXRzIGluIGNvbnRyaWIvYXNtMzg2L2d2bWF0MzIuYXNtIChHaWxsZXMgVm9sbGFudCkNCi0gZml4IGd6Z2V0YyBhbmQgZ3pwdXRjIGZvciBiaWcgZW5kaWFuIHN5c3RlbXMgKE1hcmt1cyBPYmVyaHVtZXIpDQotIGFkZGVkIGNvbXByZXNzMigpIHRvIGFsbG93IHNldHRpbmcgdGhlIGNvbXByZXNzaW9uIGxldmVsDQotIGluY2x1ZGUgc3lzL3R5cGVzLmggdG8gZ2V0IG9mZl90IG9uIHNvbWUgc3lzdGVtcyAoTWFyYyBMZWhtYW5uICYgUWluZ0xvbmcpDQotIHVzZSBjb25zdGFudCBhcnJheXMgZm9yIHRoZSBzdGF0aWMgdHJlZXMgaW4gdHJlZXMuYyBpbnN0ZWFkIG9mIGNvbXB1dGluZw0KICB0aGVtIGF0IHJ1biB0aW1lICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4gZm9yIHRoaXMgc3VnZ2VzdGlvbikuIFRvIGNyZWF0ZQ0KICB0cmVlcy5oLCBjb21waWxlIHdpdGggR0VOX1RSRUVTX0ggYW5kIHJ1biAibWFrZSB0ZXN0Ii4NCi0gY2hlY2sgcmV0dXJuIGNvZGUgb2YgZXhhbXBsZSBpbiAibWFrZSB0ZXN0IiBhbmQgZGlzcGxheSByZXN1bHQNCi0gcGFzcyBtaW5pZ3ppcCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBmaWxlX2NvbXByZXNzDQotIHNpbXBsaWZ5aW5nIGNvZGUgb2YgaW5mbGF0ZVN5bmMgdG8gYXZvaWQgZ2NjIDIuOCBidWcNCg0KLSBzdXBwb3J0IENDPSJnY2MgLVdhbGwiIGluIGNvbmZpZ3VyZSAtcyAoUWluZ0xvbmcpDQotIGF2b2lkIGEgZmx1c2ggY2F1c2VkIGJ5IGZ0ZWxsIGluIGd6b3BlbiBmb3Igd3JpdGUgbW9kZSAoS2VuIFJhZWJ1cm4pDQotIGZpeCB0ZXN0IGZvciBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmdzDQotIHpsaWIubGliIC0+IHpsaWIuZGxsIGluIG1zZG9zL3psaWIucmMgKEdpbGxlcyBWb2xsYW50KQ0KLSBjaGVjayBmb3IgVEFSR0VUX09TX01BQyBpbiBhZGRpdGlvbiB0byBNQUNPUyAoQnJhZCBQZXR0aXQpDQotIGRvIG5vdCB1c2UgZmRvcGVuIGZvciBNZXRyb3dlcmtzIG9uIE1hYyAoQnJhZCBQZXR0aXQpKQ0KLSBhZGQgY2hlY2tzIGZvciBnenB1dGMgYW5kIGd6cHV0YyBpbiBleGFtcGxlLmMNCi0gYXZvaWQgd2FybmluZ3MgaW4gZ3ppby5jIGFuZCBkZWZsYXRlLmMgKEFuZHJlYXMgS2xlaW5lcnQpDQotIHVzZSBjb25zdCBmb3IgdGhlIENSQyB0YWJsZSAoS2VuIFJhZWJ1cm4pDQotIGZpeGVkICJtYWtlIHVuaW5zdGFsbCIgZm9yIHNoYXJlZCBsaWJyYXJpZXMNCi0gdXNlIFRyYWNldiBpbnN0ZWFkIG9mIFRyYWNlIGluIGluZmJsb2NrLmMNCi0gaW4gZXhhbXBsZS5jIHVzZSBjb3JyZWN0IGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0ZXN0X3N5bmMNCi0gc3VwcHJlc3MgK3Zub2NvbXBhdHdhcm5pbmdzIGluIGNvbmZpZ3VyZSBmb3IgSFBVWCAobm90IGFsd2F5cyBzdXBwb3J0ZWQpDQoNCkNoYW5nZXMgaW4gMS4wLjcgKDIwIEphbiAxOTk4KQ0KLSBmaXggZ3pzZWVrIHdoaWNoIHdhcyBicm9rZW4gaW4gd3JpdGUgbW9kZQ0KLSByZXR1cm4gZXJyb3IgZm9yIGd6c2VlayB0byBuZWdhdGl2ZSBhYnNvbHV0ZSBwb3NpdGlvbg0KLSBmaXggY29uZmlndXJlIGZvciBMaW51eCAoQ2h1bi1DaHVuZyBDaGVuKQ0KLSBpbmNyZWFzZSBzdGFjayBzcGFjZSBmb3IgTVNDIChUaW0gV2VnbmVyKQ0KLSBnZXRfY3JjX3RhYmxlIGFuZCBpbmZsYXRlU3luY1BvaW50IGFyZSBFWFBPUlRlZCAoR2lsbGVzIFZvbGxhbnQpDQotIGRlZmluZSBFWFBPUlRWQSBmb3IgZ3pwcmludGYgKEdpbGxlcyBWb2xsYW50KQ0KLSBhZGRlZCBtYW4gcGFnZSB6bGliLjMgKFJpY2sgUm9kZ2VycykNCi0gZm9yIGNvbnRyaWIvdW50Z3osIGZpeCBtYWtlZGlyKCkgYW5kIGltcHJvdmUgTWFrZWZpbGUNCg0KLSBjaGVjayBnenNlZWsgaW4gd3JpdGUgbW9kZSBpbiBleGFtcGxlLmMNCi0gYWxsb2NhdGUgZXh0cmEgYnVmZmVyIGZvciBzZWVrcyBvbmx5IGlmIGd6c2VlayBpcyBhY3R1YWxseSBjYWxsZWQNCi0gYXZvaWQgc2lnbmVkL3Vuc2lnbmVkIGNvbXBhcmlzb25zIChUaW0gV2VnbmVyLCBHaWxsZXMgVm9sbGFudCkNCi0gYWRkIGluZmxhdGVTeW5jUG9pbnQgaW4gemNvbmYuaA0KLSBmaXggbGlzdCBvZiBleHBvcnRlZCBmdW5jdGlvbnMgaW4gbnQvemxpYi5kbnQgYW5kIG1kc29zL3psaWIuZGVmDQoNCkNoYW5nZXMgaW4gMS4wLjYgKDE5IEphbiAxOTk4KQ0KLSBhZGQgZnVuY3Rpb25zIGd6cHJpbnRmLCBnenB1dGMsIGd6Z2V0YywgZ3p0ZWxsLCBnemVvZiwgZ3pzZWVrLCBnenJld2luZCBhbmQNCiAgZ3pzZXRwYXJhbXMgKHRoYW5rcyB0byBSb2xhbmQgR2llcnNpZyBhbmQgS2V2aW4gUnVsYW5kIGZvciBzb21lIG9mIHRoaXMgY29kZSkNCi0gRml4IGEgZGVmbGF0ZSBidWcgb2NjdXJyaW5nIG9ubHkgd2l0aCBjb21wcmVzc2lvbiBsZXZlbCAwICh0aGFua3MgdG8NCiAgQW5keSBCdWNrbGVyIGZvciBmaW5kaW5nIHRoaXMgb25lKS4NCi0gSW4gbWluaWd6aXAsIHBhc3MgdHJhbnNwYXJlbnRseSBhbHNvIHRoZSBmaXJzdCBieXRlIGZvciAuWiBmaWxlcy4NCi0gcmV0dXJuIFpfQlVGX0VSUk9SIGluc3RlYWQgb2YgWl9PSyBpZiBvdXRwdXQgYnVmZmVyIGZ1bGwgaW4gdW5jb21wcmVzcygpDQotIGNoZWNrIFpfRklOSVNIIGluIGluZmxhdGUgKHRoYW5rcyB0byBNYXJjIFNjaGx1cGVyKQ0KLSBJbXBsZW1lbnQgZGVmbGF0ZUNvcHkgKHRoYW5rcyB0byBBZGFtIENvc3RlbGxvKQ0KLSBtYWtlIHN0YXRpYyBsaWJyYXJpZXMgYnkgZGVmYXVsdCBpbiBjb25maWd1cmUsIGFkZCAtLXNoYXJlZCBvcHRpb24uDQotIG1vdmUgTVNET1Mgb3IgV2luZG93cyBzcGVjaWZpYyBmaWxlcyB0byBkaXJlY3RvcnkgbXNkb3MNCi0gc3VwcHJlc3MgdGhlIG5vdGlvbiBvZiBwYXJ0aWFsIGZsdXNoIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UNCiAgKGJ1dCB0aGUgc3ltYm9sIFpfUEFSVElBTF9GTFVTSCBpcyBrZXB0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggMS4wLjQpDQotIHN1cHByZXNzIGhpc3RvcnkgYnVmZmVyIHByb3ZpZGVkIGJ5IGFwcGxpY2F0aW9uIHRvIHNpbXBsaWZ5IHRoZSBpbnRlcmZhY2UNCiAgKHRoaXMgZmVhdHVyZSB3YXMgbm90IGltcGxlbWVudGVkIGFueXdheSBpbiAxLjAuNCkNCi0gbmV4dF9pbiBhbmQgYXZhaWxfaW4gbXVzdCBiZSBpbml0aWFsaXplZCBiZWZvcmUgY2FsbGluZyBpbmZsYXRlSW5pdCBvcg0KICBpbmZsYXRlSW5pdDINCi0gYWRkIEVYUE9SVCBpbiBhbGwgZXhwb3J0ZWQgZnVuY3Rpb25zIChmb3IgV2luZG93cyBETEwpDQotIGFkZGVkIE1ha2VmaWxlLm50ICh0aGFua3MgdG8gU3RlcGhlbiBXaWxsaWFtcykNCi0gYWRkZWQgdGhlIHVuc3VwcG9ydGVkICJjb250cmliIiBkaXJlY3Rvcnk6DQogICBjb250cmliL2FzbTM4Ni8gYnkgR2lsbGVzIFZvbGxhbnQgPGluZm9Ad2luaW1hZ2UuY29tPg0KICAgICAgICAzODYgYXNtIGNvZGUgcmVwbGFjaW5nIGxvbmdlc3RfbWF0Y2goKS4NCiAgIGNvbnRyaWIvaW9zdHJlYW0vIGJ5IEtldmluIFJ1bGFuZCA8a2V2aW5Acm9kaW4ud3VzdGwuZWR1Pg0KICAgICAgICBBIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UgdG8gdGhlIHpsaWIgZ3oqIGZ1bmN0aW9ucw0KICAgY29udHJpYi9pb3N0cmVhbTIvICBieSBUeWdlIEz4dnNldCA8VHlnZS5Mb3ZzZXRAY21yLm5vPg0KICAgICAgICBBbm90aGVyIEMrKyBJL08gc3RyZWFtcyBpbnRlcmZhY2UNCiAgIGNvbnRyaWIvdW50Z3ovICBieSAiUGVkcm8gQS4gQXJhbmRhIEd1dGlcaXJyZXoiIDxwYWFnQHRpZC5lcz4NCiAgICAgICAgQSB2ZXJ5IHNpbXBsZSB0YXIuZ3ogZmlsZSBleHRyYWN0b3IgdXNpbmcgemxpYg0KICAgY29udHJpYi92aXN1YWwtYmFzaWMudHh0IGJ5IENhcmxvcyBSaW9zIDxjX3Jpb3NAc29uZGEuY2w+DQogICAgICAgIEhvdyB0byB1c2UgY29tcHJlc3MoKSwgdW5jb21wcmVzcygpIGFuZCB0aGUgZ3oqIGZ1bmN0aW9ucyBmcm9tIFZCLg0KLSBwYXNzIHBhcmFtcyAtZiAoZmlsdGVyZWQgZGF0YSksIC1oIChodWZmbWFuIG9ubHkpLCAtMSB0byAtOSAoY29tcHJlc3Npb24NCiAgbGV2ZWwpIGluIG1pbmlnemlwICh0aGFua3MgdG8gVG9tIExhbmUpDQoNCi0gdXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gZGVmbGF0ZQ0KLSBhZGRlZCB0ZXN0IGZvciBnenNlZWsgYW5kIGd6dGVsbCBpbiBleGFtcGxlLmMNCi0gYWRkIHVuZG9jdW1lbnRlZCBmdW5jdGlvbiBpbmZsYXRlU3luY1BvaW50KCkgKGhhY2sgZm9yIFBhdWwgTWFja2VycmFzKQ0KLSBhZGQgdW5kb2N1bWVudGVkIGZ1bmN0aW9uIHpFcnJvciB0byBjb252ZXJ0IGVycm9yIGNvZGUgdG8gc3RyaW5nDQogIChmb3IgVGltIFNtaXRoZXJzKQ0KLSBBbGxvdyBjb21waWxhdGlvbiBvZiBnemlvIHdpdGggLUROT19ERUZMQVRFIHRvIGF2b2lkIHRoZSBjb21wcmVzc2lvbiBjb2RlLg0KLSBVc2UgZGVmYXVsdCBtZW1jcHkgZm9yIFN5bWFudGVjIE1TRE9TIGNvbXBpbGVyLg0KLSBBZGQgRVhQT1JUIGtleXdvcmQgZm9yIGNoZWNrX2Z1bmMgKG5lZWRlZCBmb3IgV2luZG93cyBETEwpDQotIGFkZCBjdXJyZW50IGRpcmVjdG9yeSB0byBMRF9MSUJSQVJZX1BBVEggZm9yICJtYWtlIHRlc3QiDQotIGNyZWF0ZSBhbHNvIGEgbGluayBmb3IgbGliei5zby4xDQotIGFkZGVkIHN1cHBvcnQgZm9yIEZVSklUU1UgVVhQL0RTICh0aGFua3MgdG8gVG9zaGlha2kgTm9tdXJhKQ0KLSB1c2UgJChTSEFSRURMSUIpIGluc3RlYWQgb2YgbGliei5zbyBpbiBNYWtlZmlsZS5pbiAoZm9yIEhQVVgpDQotIGFkZGVkIC1zb25hbWUgZm9yIExpbnV4IGluIGNvbmZpZ3VyZSAoQ2h1bi1DaHVuZyBDaGVuLA0KLSBhc3NpZ24gbnVtYmVycyB0byB0aGUgZXhwb3J0ZWQgZnVuY3Rpb25zIGluIHpsaWIuZGVmIChmb3IgV2luZG93cyBETEwpDQotIGFkZCBhZHZpY2UgaW4gemxpYi5oIGZvciBiZXN0IHVzYWdlIG9mIGRlZmxhdGVTZXREaWN0aW9uYXJ5DQotIHdvcmsgYXJvdW5kIGNvbXBpbGVyIGJ1ZyBvbiBBdGFyaSAoY2FzdCBaX05VTEwgaW4gY2FsbCBvZiBzLT5jaGVja2ZuKQ0KLSBhbGxvdyBjb21waWxhdGlvbiB3aXRoIEFOU0kga2V5d29yZHMgb25seSBlbmFibGVkIGZvciBUdXJib0MgaW4gbGFyZ2UgbW9kZWwNCi0gYXZvaWQgInZlcnNpb25TdHJpbmciWzBdIChCb3JsYW5kIGJ1ZykNCi0gYWRkIE5FRURfRFVNTVlfUkVUVVJOIGZvciBCb3JsYW5kDQotIHVzZSB2YXJpYWJsZSB6X3ZlcmJvc2UgZm9yIHRyYWNpbmcgaW4gZGVidWcgbW9kZSAoTC4gUGV0ZXIgRGV1dHNjaCkuDQotIGFsbG93IGNvbXBpbGF0aW9uIHdpdGggQ0MNCi0gZGVmaW5lZCBTVERDIGZvciBPUy8yIChEYXZpZCBDaGFybGFwKQ0KLSBsaW1pdCBleHRlcm5hbCBuYW1lcyB0byA4IGNoYXJzIGZvciBNVlMgKFRob21hcyBMdW5kKQ0KLSBpbiBtaW5pZ3ppcC5jLCB1c2Ugc3RhdGljIGJ1ZmZlcnMgb25seSBmb3IgMTYtYml0IHN5c3RlbXMNCi0gZml4IHN1ZmZpeCBjaGVjayBmb3IgIm1pbmlnemlwIC1kIGZvby5neiINCi0gZG8gbm90IHJldHVybiBhbiBlcnJvciBmb3IgdGhlIDJuZCBvZiB0d28gY29uc2VjdXRpdmUgZ3pmbHVzaCgpIChGZWxpeCBMZWUpDQotIHVzZSBfZmRvcGVuIGluc3RlYWQgb2YgZmRvcGVuIGZvciBNU0MgPj0gNi4wIChUaG9tYXMgRmFuc2xhdSkNCi0gYWRkZWQgbWFrZWxjYy5iYXQgZm9yIGxjYy13aW4zMiAoVG9tIFN0IERlbmlzKQ0KLSBpbiBNYWtlZmlsZS5kajIsIHVzZSBjb3B5IGFuZCBkZWwgaW5zdGVhZCBvZiBpbnN0YWxsIGFuZCBybSAoRnJhbmsgRG9uYWhvZSkNCi0gQXZvaWQgZXhwYW5kZWQgJElkJC4gVXNlICJyY3MgLWtiIiBvciAiY3ZzIGFkbWluIC1rYiIgdG8gYXZvaWQgSWQgZXhwYW5zaW9uLg0KLSBjaGVjayBmb3IgdW5pc3RkLmggaW4gY29uZmlndXJlIChmb3Igb2ZmX3QpDQotIHJlbW92ZSB1c2VsZXNzIGNoZWNrIHBhcmFtZXRlciBpbiBpbmZsYXRlX2Jsb2Nrc19mcmVlDQotIGF2b2lkIHVzZWxlc3MgYXNzaWdubWVudCBvZiBzLT5jaGVjayB0byBpdHNlbGYgaW4gaW5mbGF0ZV9ibG9ja3NfbmV3DQotIGRvIG5vdCBmbHVzaCB0d2ljZSBpbiBnemNsb3NlICh0aGFua3MgdG8gS2VuIFJhZWJ1cm4pDQotIHJlbmFtZSBGT1BFTiBhcyBGX09QRU4gdG8gYXZvaWQgY2xhc2ggd2l0aCAvdXNyL2luY2x1ZGUvc3lzL2ZpbGUuaA0KLSB1c2UgTk9fRVJSTk9fSCBpbnN0ZWFkIG9mIGVudW1lcmF0aW9uIG9mIG9wZXJhdGluZyBzeXN0ZW1zIHdpdGggZXJybm8uaA0KLSB3b3JrIGFyb3VuZCBidWdneSBmY2xvc2Ugb24gcGlwZXMgZm9yIEhQL1VYDQotIHN1cHBvcnQgemxpYiBETEwgd2l0aCBCT1JMQU5EIEMrKyA1LjAgKHRoYW5rcyB0byBHbGVubiBSYW5kZXJzLVBlaHJzb24pDQotIGZpeCBjb25maWd1cmUgaWYgQ0MgaXMgYWxyZWFkeSBlcXVhbCB0byBnY2MNCg0KQ2hhbmdlcyBpbiAxLjAuNSAoMyBKYW4gOTgpDQotIEZpeCBpbmZsYXRlIHRvIHRlcm1pbmF0ZSBncmFjZWZ1bGx5IHdoZW4gZmVkIGNvcnJ1cHRlZCBvciBpbnZhbGlkIGRhdGENCi0gVXNlIGNvbnN0IGZvciByb21tYWJsZSBjb25zdGFudHMgaW4gaW5mbGF0ZQ0KLSBFbGltaW5hdGUgbWVtb3J5IGxlYWtzIG9uIGVycm9yIGNvbmRpdGlvbnMgaW4gaW5mbGF0ZQ0KLSBSZW1vdmVkIHNvbWUgdmVzdGlnaWFsIGNvZGUgaW4gaW5mbGF0ZQ0KLSBVcGRhdGUgd2ViIGFkZHJlc3MgaW4gUkVBRE1FDQoNCkNoYW5nZXMgaW4gMS4wLjQgKDI0IEp1bCA5NikNCi0gSW4gdmVyeSByYXJlIGNvbmRpdGlvbnMsIGRlZmxhdGUocywgWl9GSU5JU0gpIGNvdWxkIGZhaWwgdG8gcHJvZHVjZSBhbiBFT0YNCiAgYml0LCBzbyB0aGUgZGVjb21wcmVzc29yIGNvdWxkIGRlY29tcHJlc3MgYWxsIHRoZSBjb3JyZWN0IGRhdGEgYnV0IHdlbnQNCiAgb24gdG8gYXR0ZW1wdCBkZWNvbXByZXNzaW5nIGV4dHJhIGdhcmJhZ2UgZGF0YS4gVGhpcyBhZmZlY3RlZCBtaW5pZ3ppcCB0b28uDQotIHpsaWJWZXJzaW9uIGFuZCBnemVycm9yIHJldHVybiBjb25zdCBjaGFyKiAobmVlZGVkIGZvciBETEwpDQotIHBvcnQgdG8gUklTQ09TIChubyBmZG9wZW4sIG5vIG11bHRpcGxlIGRvdHMsIG5vIHVubGluaywgbm8gZmlsZW5vKQ0KLSB1c2Ugel9lcnJvciBvbmx5IGZvciBERUJVRyAoYXZvaWQgcHJvYmxlbSB3aXRoIERMTHMpDQoNCkNoYW5nZXMgaW4gMS4wLjMgKDIgSnVsIDk2KQ0KLSB1c2Ugel9zdHJlYW1wIGluc3RlYWQgb2Ygel9zdHJlYW0gKiwgd2hpY2ggaXMgbm93IGEgZmFyIHBvaW50ZXIgaW4gTVNET1MNCiAgc21hbGwgYW5kIG1lZGl1bSBtb2RlbHM7IHRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMNCiAgdmVyc2lvbnMgZm9yIHRoZXNlIG1vZGVscy4gKE5vIGVmZmVjdCBpbiBsYXJnZSBtb2RlbCBvciBvbiBvdGhlciBzeXN0ZW1zLikNCi0gcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGlmIHByZXZpb3VzIGRlZmxhdGUgY2FsbCByZXR1cm5lZCB3aXRoDQogIGF2YWlsX291dCBhcyB6ZXJvIGJ1dCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvDQotIGFkZGVkIG1lbWNtcCBmb3Igbm9uIFNUREMgY29tcGlsZXJzDQotIGRlZmluZSBOT19EVU1NWV9ERUNMIGZvciBtb3JlIE1hYyBjb21waWxlcnMgKC5oIGZpbGVzIG1lcmdlZCBpbmNvcnJlY3RseSkNCi0gZGVmaW5lIF9fMzJCSVRfXyBpZiBfXzM4Nl9fIG9yIGkzODYgaXMgZGVmaW5lZCAocGIuIHdpdGggV2F0Y29tIGFuZCBTQ08pDQotIGJldHRlciBjaGVjayBmb3IgMTYtYml0IG1vZGUgTVNDIChhdm9pZHMgcHJvYmxlbSB3aXRoIFN5bWFudGVjKQ0KDQpDaGFuZ2VzIGluIDEuMC4yICgyMyBNYXkgOTYpDQotIGFkZGVkIFdpbmRvd3MgRExMIHN1cHBvcnQNCi0gYWRkZWQgYSBmdW5jdGlvbiB6bGliVmVyc2lvbiAoZm9yIHRoZSBETEwgc3VwcG9ydCkNCi0gZml4ZWQgZGVjbGFyYXRpb25zIHVzaW5nIEJ5dGVmIGluIGluZnV0aWwuYyAocGIgd2l0aCBNU0RPUyBtZWRpdW0gbW9kZWwpDQotIEJ5dGVmIGlzIGRlZmluZSdzIGluc3RlYWQgb2YgdHlwZWRlZidkIG9ubHkgZm9yIEJvcmxhbmQgQw0KLSBhdm9pZCByZWFkaW5nIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IGluIGV4YW1wbGUuYw0KLSBtZW50aW9uIGluIFJFQURNRSB0aGF0IHRoZSB6bGliIGZvcm1hdCBpcyBub3cgUkZDMTk1MA0KLSB1cGRhdGVkIE1ha2VmaWxlLmRqMg0KLSBhZGRlZCBhbGdvcml0aG0uZG9jDQoNCkNoYW5nZXMgaW4gMS4wLjEgKDIwIE1heSA5NikgWzEuMCBza2lwcGVkIHRvIGF2b2lkIGNvbmZ1c2lvbl0NCi0gZml4IGFycmF5IG92ZXJsYXkgaW4gZGVmbGF0ZS5jIHdoaWNoIHNvbWV0aW1lcyBjYXVzZWQgYmFkIGNvbXByZXNzZWQgZGF0YQ0KLSBmaXggaW5mbGF0ZSBidWcgd2l0aCBlbXB0eSBzdG9yZWQgYmxvY2sNCi0gZml4IE1TRE9TIG1lZGl1bSBtb2RlbCB3aGljaCB3YXMgYnJva2VuIGluIDAuOTkNCi0gZml4IGRlZmxhdGVQYXJhbXMoKSB3aGljaCBjb3VsZCBnZW5lcmF0ZWQgYmFkIGNvbXByZXNzZWQgZGF0YS4NCi0gQnl0ZWYgaXMgZGVmaW5lJ2QgaW5zdGVhZCBvZiB0eXBlZGVmJ2VkICh3b3JrIGFyb3VuZCBCb3JsYW5kIGJ1ZykNCi0gYWRkZWQgYW4gSU5ERVggZmlsZQ0KLSBuZXcgbWFrZWZpbGVzIGZvciBESkdQUCAoTWFrZWZpbGUuZGoyKSwgMzItYml0IEJvcmxhbmQgKE1ha2VmaWxlLmIzMiksDQogIFdhdGNvbSAoTWFrZWZpbGUud2F0KSwgQW1pZ2EgU0FTL0MgKE1ha2VmaWxlLnNhcykNCi0gc3BlZWQgdXAgYWRsZXIzMiBmb3IgbW9kZXJuIG1hY2hpbmVzIHdpdGhvdXQgYXV0by1pbmNyZW1lbnQNCi0gYWRkZWQgLWFuc2kgZm9yIElSSVggaW4gY29uZmlndXJlDQotIHN0YXRpY19pbml0X2RvbmUgaW4gdHJlZXMuYyBpcyBhbiBpbnQNCi0gZGVmaW5lIHVubGluayBhcyBkZWxldGUgZm9yIFZNUw0KLSBmaXggY29uZmlndXJlIGZvciBRTlgNCi0gYWRkIGNvbmZpZ3VyZSBicmFuY2ggZm9yIFNDTyBhbmQgSFBVWA0KLSBhdm9pZCBtYW55IHdhcm5pbmdzICh1bnVzZWQgdmFyaWFibGVzLCBkZWFkIGFzc2lnbm1lbnRzLCBldGMuLi4pDQotIG5vIGZkb3BlbiBmb3IgQmVPUw0KLSBmaXggdGhlIFdhdGNvbSBmaXggZm9yIDMyIGJpdCBtb2RlIChkZWZpbmUgRkFSIGFzIGVtcHR5KQ0KLSByZW1vdmVkIHJlZGVmaW5pdGlvbiBvZiBCeXRlIGZvciBNS1dFUktTDQotIHdvcmsgYXJvdW5kIGFuIE1XS0VSS1MgYnVnIChpbmNvcnJlY3QgbWVyZ2Ugb2YgYWxsIC5oIGZpbGVzKQ0KDQpDaGFuZ2VzIGluIDAuOTkgKDI3IEphbiA5NikNCi0gYWxsb3cgcHJlc2V0IGRpY3Rpb25hcnkgc2hhcmVkIGJldHdlZW4gY29tcHJlc3NvciBhbmQgZGVjb21wcmVzc29yDQotIGFsbG93IGNvbXByZXNzaW9uIGxldmVsIDAgKG5vIGNvbXByZXNzaW9uKQ0KLSBhZGQgZGVmbGF0ZVBhcmFtcyBpbiB6bGliLmg6IGFsbG93IGR5bmFtaWMgY2hhbmdlIG9mIGNvbXByZXNzaW9uIGxldmVsDQogIGFuZCBjb21wcmVzc2lvbiBzdHJhdGVneS4NCi0gdGVzdCBsYXJnZSBidWZmZXJzIGFuZCBkZWZsYXRlUGFyYW1zIGluIGV4YW1wbGUuYw0KLSBhZGQgb3B0aW9uYWwgImNvbmZpZ3VyZSIgdG8gYnVpbGQgemxpYiBhcyBhIHNoYXJlZCBsaWJyYXJ5DQotIHN1cHByZXNzIE1ha2VmaWxlLnFueCwgdXNlIGNvbmZpZ3VyZSBpbnN0ZWFkDQotIGZpeGVkIGRlZmxhdGUgZm9yIDY0LWJpdCBzeXN0ZW1zIChkZXRlY3RlZCBvbiBDcmF5KQ0KLSBmaXhlZCBpbmZsYXRlX2Jsb2NrcyBmb3IgNjQtYml0IHN5c3RlbXMgKGRldGVjdGVkIG9uIEFscGhhKQ0KLSBkZWNsYXJlIFpfREVGTEFURUQgaW4gemxpYi5oIChwb3NzaWJsZSBwYXJhbWV0ZXIgZm9yIGRlZmxhdGVJbml0MikNCi0gYWx3YXlzIHJldHVybiBaX0JVRl9FUlJPUiB3aGVuIGRlZmxhdGUoKSBoYXMgbm90aGluZyB0byBkbw0KLSBkZWZsYXRlSW5pdCBhbmQgaW5mbGF0ZUluaXQgYXJlIG5vdyBtYWNyb3MgdG8gYWxsb3cgdmVyc2lvbiBjaGVja2luZw0KLSBwcmVmaXggYWxsIGdsb2JhbCBmdW5jdGlvbnMgYW5kIHR5cGVzIHdpdGggel8gd2l0aCAtRFpfUFJFRklYDQotIG1ha2UgZmFsbG9jIGNvbXBsZXRlbHkgcmVlbnRyYW50IChpbmZ0cmVlcy5jKQ0KLSBmaXhlZCB2ZXJ5IHVubGlrZWx5IHJhY2UgY29uZGl0aW9uIGluIGN0X3N0YXRpY19pbml0DQotIGZyZWUgaW4gcmV2ZXJzZSBvcmRlciBvZiBhbGxvY2F0aW9uIHRvIGhlbHAgbWVtb3J5IG1hbmFnZXINCi0gdXNlIHpsaWItMS4wLyogaW5zdGVhZCBvZiB6bGliLyogaW5zaWRlIHRoZSB0YXIuZ3oNCi0gbWFrZSB6bGliIHdhcm5pbmctZnJlZSB3aXRoICJnY2MgLU8zIC1XYWxsIC1Xd3JpdGUtc3RyaW5ncyAtV3BvaW50ZXItYXJpdGgNCiAgLVdjb252ZXJzaW9uIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLXByb3RvdHlwZXMiDQotIGFsbG93IGd6cmVhZCBvbiBjb25jYXRlbmF0ZWQgLmd6IGZpbGVzDQotIGRlZmxhdGVFbmQgbm93IHJldHVybnMgWl9EQVRBX0VSUk9SIGlmIGl0IHdhcyBwcmVtYXR1cmUNCi0gZGVmbGF0ZSBpcyBmaW5hbGx5ICg/KSBmdWxseSBkZXRlcm1pbmlzdGljIChubyBtYXRjaGVzIGJleW9uZCBlbmQgb2YgaW5wdXQpDQotIERvY3VtZW50IFpfU1lOQ19GTFVTSA0KLSBhZGQgdW5pbnN0YWxsIGluIE1ha2VmaWxlDQotIENoZWNrIGZvciBfX2NwbHVwbHVzIGluIHpsaWIuaA0KLSBCZXR0ZXIgdGVzdCBpbiBjdF9hbGlnbiBmb3IgcGFydGlhbCBmbHVzaA0KLSBhdm9pZCBoYXJtbGVzcyB3YXJuaW5ncyBmb3IgQm9ybGFuZCBDKysNCi0gaW5pdGlhbGl6ZSBoYXNoX2hlYWQgaW4gZGVmbGF0ZS5jDQotIGF2b2lkIHdhcm5pbmcgb24gZmRvcGVuIChnemlvLmMpIGZvciBIUCBjYyAtQWENCi0gaW5jbHVkZSBzdGRsaWIuaCBmb3IgU1REQyBjb21waWxlcnMNCi0gaW5jbHVkZSBlcnJuby5oIGZvciBDcmF5DQotIGlnbm9yZSBlcnJvciBpZiByYW5saWIgZG9lc24ndCBleGlzdA0KLSBjYWxsIHJhbmxpYiB0d2ljZSBmb3IgTmVYVFNURVANCi0gdXNlIGV4ZWNfcHJlZml4IGluc3RlYWQgb2YgcHJlZml4IGZvciBsaWJ6LmENCi0gcmVuYW1lZCBjdF8qIGFzIF90cl8qIHRvIGF2b2lkIGNvbmZsaWN0IHdpdGggYXBwbGljYXRpb25zDQotIGNsZWFyIHotPm1zZyBpbiBpbmZsYXRlSW5pdDIgYmVmb3JlIGFueSBlcnJvciByZXR1cm4NCi0gaW5pdGlhbGl6ZSBvcGFxdWUgaW4gZXhhbXBsZS5jLCBnemlvLmMsIGRlZmxhdGUuYyBhbmQgaW5mbGF0ZS5jDQotIGZpeGVkIHR5cG8gaW4gemNvbmYuaCAoX0dOVUNfXyA9PiBfX0dOVUNfXykNCi0gY2hlY2sgZm9yIFdJTjMyIGluIHpjb25mLmggYW5kIHp1dGlsLmMgKGF2b2lkIGZhcm1hbGxvYyBpbiAzMi1iaXQgbW9kZSkNCi0gZml4IHR5cG8gaW4gTWFrZV92bXMuY29tIChmJHRybmxubSAtPiBmJGdldHN5aSkNCi0gaW4gZmNhbGxvYywgbm9ybWFsaXplIHBvaW50ZXIgaWYgc2l6ZSA+IDY1NTIwIGJ5dGVzDQotIGRvbid0IHVzZSBzcGVjaWFsIGZjYWxsb2MgZm9yIDMyIGJpdCBCb3JsYW5kIEMrKw0KLSB1c2UgU1REQyBpbnN0ZWFkIG9mIF9fR08zMl9fIHRvIGF2b2lkIHJlZGVjbGFyaW5nIGV4aXQsIGNhbGxvYywgZXRjLi4uDQotIHVzZSBaX0JJTkFSWSBpbnN0ZWFkIG9mIEJJTkFSWQ0KLSBkb2N1bWVudCB0aGF0IGd6Y2xvc2UgYWZ0ZXIgZ3pkb3BlbiB3aWxsIGNsb3NlIHRoZSBmaWxlDQotIGFsbG93ICJhIiBhcyBtb2RlIGluIGd6b3Blbi4NCi0gZml4IGVycm9yIGNoZWNraW5nIGluIGd6cmVhZA0KLSBhbGxvdyBza2lwcGluZyAuZ3ogZXh0cmEtZmllbGQgb24gcGlwZXMNCi0gYWRkZWQgcmVmZXJlbmNlIHRvIFBlcmwgaW50ZXJmYWNlIGluIFJFQURNRQ0KLSBwdXQgdGhlIGNyYyB0YWJsZSBpbiBGQVIgZGF0YSAoSSBkaXNsaWtlIG1vcmUgYW5kIG1vcmUgdGhlIG1lZGl1bSBtb2RlbCA6KQ0KLSBhZGRlZCBnZXRfY3JjX3RhYmxlDQotIGFkZGVkIGEgZGltZW5zaW9uIHRvIGFsbCBhcnJheXMgKEJvcmxhbmQgQyBjYW4ndCBjb3VudCkuDQotIHdvcmthcm91bmQgQm9ybGFuZCBDIGJ1ZyBpbiBkZWNsYXJhdGlvbiBvZiBpbmZsYXRlX2NvZGVzX25ldyAmIGluZmxhdGVfZmFzdA0KLSBndWFyZCBhZ2FpbnN0IG11bHRpcGxlIGluY2x1c2lvbiBvZiAqLmggKGZvciBwcmVjb21waWxlZCBoZWFkZXIgb24gTWFjKQ0KLSBXYXRjb20gQyBwcmV0ZW5kcyB0byBiZSBNaWNyb3NvZnQgQyBzbWFsbCBtb2RlbCBldmVuIGluIDMyIGJpdCBtb2RlLg0KLSBkb24ndCB1c2UgdW5zaXplZCBhcnJheXMgdG8gYXZvaWQgc2lsbHkgd2FybmluZ3MgYnkgVmlzdWFsIEMrKzoNCiAgICAgd2FybmluZyBDNDc0NjogJ2luZmxhdGVfbWFzaycgOiB1bnNpemVkIGFycmF5IHRyZWF0ZWQgYXMgICdfX2ZhcicNCiAgICAgKHdoYXQncyB3cm9uZyB3aXRoIGZhciBkYXRhIGluIGZhciBtb2RlbD8pLg0KLSBkZWZpbmUgZW51bSBvdXQgb2YgaW5mbGF0ZV9ibG9ja3Nfc3RhdGUgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBDKysNCg0KQ2hhbmdlcyBpbiAwLjk1ICgxNiBBdWcgOTUpDQotIGZpeCBNU0RPUyBzbWFsbCBhbmQgbWVkaXVtIG1vZGVsIChub3cgZWFzaWVyIHRvIGFkYXB0IHRvIGFueSBjb21waWxlcikNCi0gaW5saW5lZCBzZW5kX2JpdHMNCi0gZml4IHRoZSBmaW5hbCAoOi0pIGJ1ZyBmb3IgZGVmbGF0ZSB3aXRoIGZsdXNoIChvdXRwdXQgd2FzIGNvcnJlY3QgYnV0DQogIG5vdCBjb21wbGV0ZWx5IGZsdXNoZWQgaW4gcmFyZSBvY2Nhc2lvbnMpLg0KLSBkZWZhdWx0IHdpbmRvdyBzaXplIGlzIHNhbWUgZm9yIGNvbXByZXNzaW9uIGFuZCBkZWNvbXByZXNzaW9uDQogIChpdCdzIG5vdyBzdWZmaWNpZW50IHRvIHNldCBNQVhfV0JJVFMgaW4gemNvbmYuaCkuDQotIHZvaWRwIC0+IHZvaWRwZiBhbmQgdm9pZG5wIC0+IHZvaWRwIChmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlcg0KICB0eXBlZGVmcyBhbmQgYmVjYXVzZSB2b2lkbnAgd2FzIG5vdCBuZWFyIGluIGxhcmdlIG1vZGVsKS4NCg0KQ2hhbmdlcyBpbiAwLjk0ICgxMyBBdWcgOTUpDQotIHN1cHBvcnQgTVNET1MgbWVkaXVtIG1vZGVsDQotIGZpeCBkZWZsYXRlIHdpdGggZmx1c2ggKGNvdWxkIHNvbWV0aW1lcyBnZW5lcmF0ZSBiYWQgb3V0cHV0KQ0KLSBmaXggZGVmbGF0ZVJlc2V0ICh6bGliIGhlYWRlciB3YXMgaW5jb3JyZWN0bHkgc3VwcHJlc3NlZCkNCi0gYWRkZWQgc3VwcG9ydCBmb3IgVk1TDQotIGFsbG93IGEgY29tcHJlc3Npb24gbGV2ZWwgaW4gZ3pvcGVuKCkNCi0gZ3pmbHVzaCBub3cgY2FsbHMgZmZsdXNoDQotIEZvciBkZWZsYXRlIHdpdGggZmx1c2gsIGZsdXNoIGV2ZW4gaWYgbm8gbW9yZSBpbnB1dCBpcyBwcm92aWRlZC4NCi0gcmVuYW1lIGxpYmd6LmEgYXMgbGliei5hDQotIGF2b2lkIGNvbXBsZXggZXhwcmVzc2lvbiBpbiBpbmZjb2Rlcy5jIHRyaWdnZXJpbmcgVHVyYm8gQyBidWcNCi0gd29yayBhcm91bmQgYSBwcm9ibGVtIHdpdGggZ2NjIG9uIEFscGhhIChpbiBJTlNFUlRfU1RSSU5HKQ0KLSBkb24ndCB1c2UgaW5saW5lIGZ1bmN0aW9ucyAocHJvYmxlbSB3aXRoIHNvbWUgZ2NjIHZlcnNpb25zKQ0KLSBhbGxvdyByZW5hbWluZyBvZiBCeXRlLCB1SW50LCBldGMuLi4gd2l0aCAjZGVmaW5lLg0KLSBhdm9pZCB3YXJuaW5nIGFib3V0ICh1bnVzZWQpIHBvaW50ZXIgYmVmb3JlIHN0YXJ0IG9mIGFycmF5IGluIGRlZmxhdGUuYw0KLSBhdm9pZCB2YXJpb3VzIHdhcm5pbmdzIGluIGd6aW8uYywgZXhhbXBsZS5jLCBpbmZibG9jay5jLCBhZGxlcjMyLmMsIHp1dGlsLmMNCi0gYXZvaWQgcmVzZXJ2ZWQgd29yZCAnbmV3JyBpbiB0cmVlcy5jDQoNCkNoYW5nZXMgaW4gMC45MyAoMjUgSnVuZSA5NSkNCi0gdGVtcG9yYXJpbHkgZGlzYWJsZSBpbmxpbmUgZnVuY3Rpb25zDQotIG1ha2UgZGVmbGF0ZSBkZXRlcm1pbmlzdGljDQotIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgUEFSVElBTF9GTFVTSA0KLSBTZXQgYmluYXJ5IG1vZGUgZm9yIHN0ZGluL3N0ZG91dCBpbiBtaW5pZ3ppcC5jIGZvciBPUy8yDQotIGRvbid0IGV2ZW4gdXNlIHNpZ25lZCBjaGFyIGluIGluZmxhdGUgKG5vdCBwb3J0YWJsZSBlbm91Z2gpDQotIGZpeCBpbmZsYXRlIG1lbW9yeSBsZWFrIGZvciBzZWdtZW50ZWQgYXJjaGl0ZWN0dXJlcw0KDQpDaGFuZ2VzIGluIDAuOTIgKDMgTWF5IDk1KQ0KLSBkb24ndCBhc3N1bWUgdGhhdCBjaGFyIGlzIHNpZ25lZCAocHJvYmxlbSBvbiBTR0kpDQotIENsZWFyIGJpdCBidWZmZXIgd2hlbiBzdGFydGluZyBhIHN0b3JlZCBibG9jaw0KLSBubyBtZW1jcHkgb24gUHlyYW1pZA0KLSBzdXBwcmVzc2VkIGluZnRlc3QuYw0KLSBvcHRpbWl6ZWQgZmlsbF93aW5kb3csIHB1dCBsb25nZXN0X21hdGNoIGlubGluZSBmb3IgZ2NjDQotIG9wdGltaXplZCBpbmZsYXRlIG9uIHN0b3JlZCBibG9ja3MuDQotIHVudGFiaWZ5IGFsbCBzb3VyY2VzIHRvIHNpbXBsaWZ5IHBhdGNoZXMNCg0KQ2hhbmdlcyBpbiAwLjkxICgyIE1heSA5NSkNCi0gRGVmYXVsdCBNRU1fTEVWRUwgaXMgOCAobm90IDkgZm9yIFVuaXgpIGFzIGRvY3VtZW50ZWQgaW4gemxpYi5oDQotIERvY3VtZW50IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGluIHpjb25mLmgNCi0gYWRkZWQgIm1ha2UgaW5zdGFsbCINCi0gZml4IHN5bmMgc2VhcmNoIGxvZ2ljIGluIGluZmxhdGVTeW5jDQotIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSBub3cgd29ya3MgZXZlbiBpZiBvdXRwdXQgYnVmZmVyIHRvbyBzaG9ydA0KLSBhZnRlciBpbmZsYXRlU3luYywgZG9uJ3Qgc2NhcmUgcGVvcGxlIHdpdGgganVzdCAibG8gd29ybGQiDQotIGFkZGVkIHN1cHBvcnQgZm9yIERKR1BQDQoNCkNoYW5nZXMgaW4gMC45ICgxIE1heSA5NSkNCi0gZG9uJ3QgYXNzdW1lIHRoYXQgemFsbG9jIGNsZWFycyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAodGhlIFR1cmJvQyBidWcNCiAgd2FzIE1hcmsncyBidWcgYWZ0ZXIgYWxsIDopDQotIGxldCBhZ2FpbiBnenJlYWQgY29weSB1bmNvbXByZXNzZWQgZGF0YSB1bmNoYW5nZWQgKHdhcyB3b3JraW5nIGluIDAuNzEpDQotIGRlZmxhdGUoWl9GVUxMX0ZMVVNIKSwgaW5mbGF0ZVJlc2V0IGFuZCBpbmZsYXRlU3luYyBhcmUgbm93IGZ1bGx5IGltcGxlbWVudGVkDQotIGFkZGVkIGEgdGVzdCBvZiBpbmZsYXRlU3luYyBpbiBleGFtcGxlLmMNCi0gbW92ZWQgTUFYX1dCSVRTIHRvIHpjb25mLmggYmVjYXVzZSB1c2VycyBtaWdodCB3YW50IHRvIGNoYW5nZSB0aGF0Lg0KLSBkb2N1bWVudCBleHBsaWNpdGx5IHRoYXQgemFsbG9jKDY0Sykgb24gTVNET1MgbXVzdCByZXR1cm4gYSBub3JtYWxpemVkDQogIHBvaW50ZXIgKHplcm8gb2Zmc2V0KQ0KLSBhZGRlZCBNYWtlZmlsZXMgZm9yIE1pY3Jvc29mdCBDLCBUdXJibyBDLCBCb3JsYW5kIEMrKw0KLSBmYXN0ZXIgY3JjMzIoKQ0KDQpDaGFuZ2VzIGluIDAuOCAoMjkgQXByaWwgOTUpDQotIGFkZGVkIGZhc3QgaW5mbGF0ZSAoaW5mZmFzdC5jKQ0KLSBkZWZsYXRlKFpfRklOSVNIKSBub3cgcmV0dXJucyBaX1NUUkVBTV9FTkQgd2hlbiBkb25lLiBXYXJuaW5nOiB0aGlzDQogIGlzIGluY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIHpsaWIgd2hpY2ggcmV0dXJuZWQgWl9PSy4NCi0gd29yayBhcm91bmQgYSBUdXJib0MgY29tcGlsZXIgYnVnIChiYWQgY29kZSBmb3IgYiA8PCAwLCBzZWUgaW5mdXRpbC5oKQ0KICAoYWN0dWFsbHkgdGhhdCB3YXMgbm90IGEgY29tcGlsZXIgYnVnLCBzZWUgMC44MSBhYm92ZSkNCi0gZ3pyZWFkIG5vIGxvbmdlciByZWFkcyBvbmUgZXh0cmEgYnl0ZSBpbiBjZXJ0YWluIGNhc2VzDQotIEluIGd6aW8gZGVzdHJveSgpLCBkb24ndCByZWZlcmVuY2UgYSBmcmVlZCBzdHJ1Y3R1cmUNCi0gYXZvaWQgbWFueSB3YXJuaW5ncyBmb3IgTVNET1MNCi0gYXZvaWQgdGhlIEVSUk9SIHN5bWJvbCB3aGljaCBpcyB1c2VkIGJ5IE1TIFdpbmRvd3MNCg0KQ2hhbmdlcyBpbiAwLjcxICgxNCBBcHJpbCA5NSkNCi0gRml4ZWQgbW9yZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcyA6KCBUaGVyZSBpcyBzdGlsbCBhIGJ1ZyB3aXRoDQogIFR1cmJvQyBsYXJnZSBtb2RlbC4NCg0KQ2hhbmdlcyBpbiAwLjcgKDE0IEFwcmlsIDk1KQ0KLSBBZGRlZCBmdWxsIGluZmxhdGUgc3VwcG9ydC4NCi0gU2ltcGxpZmllZCB0aGUgY3JjMzIoKSBpbnRlcmZhY2UuIFRoZSBwcmUtIGFuZCBwb3N0LWNvbmRpdGlvbmluZw0KICAob25lJ3MgY29tcGxlbWVudCkgaXMgbm93IGRvbmUgaW5zaWRlIGNyYzMyKCkuIFdBUk5JTkc6IHRoaXMgaXMNCiAgaW5jb21wYXRpYmxlIHdpdGggcHJldmlvdXMgdmVyc2lvbnM7IHNlZSB6bGliLmggZm9yIHRoZSBuZXcgdXNhZ2UuDQoNCkNoYW5nZXMgaW4gMC42MSAoMTIgQXByaWwgOTUpDQotIHdvcmthcm91bmQgZm9yIGEgYnVnIGluIFR1cmJvQy4gZXhhbXBsZSBhbmQgbWluaWd6aXAgbm93IHdvcmsgb24gTVNET1MuDQoNCkNoYW5nZXMgaW4gMC42ICgxMSBBcHJpbCA5NSkNCi0gYWRkZWQgbWluaWd6aXAuYw0KLSBhZGRlZCBnemRvcGVuIHRvIHJlb3BlbiBhIGZpbGUgZGVzY3JpcHRvciBhcyBnekZpbGUNCi0gYWRkZWQgdHJhbnNwYXJlbnQgcmVhZGluZyBvZiBub24tZ3ppcGVkIGZpbGVzIGluIGd6cmVhZC4NCi0gZml4ZWQgYnVnIGluIGd6cmVhZCAoZG9uJ3QgcmVhZCBjcmMgYXMgZGF0YSkNCi0gZml4ZWQgYnVnIGluIGRlc3Ryb3kgKGd6aW8uYykgKGRvbid0IHJldHVybiBaX1NUUkVBTV9FTkQgZm9yIGd6Y2xvc2UpLg0KLSBkb24ndCBhbGxvY2F0ZSBiaWcgYXJyYXlzIGluIHRoZSBzdGFjayAoZm9yIE1TRE9TKQ0KLSBmaXggc29tZSBNU0RPUyBjb21waWxhdGlvbiBwcm9ibGVtcw0KDQpDaGFuZ2VzIGluIDAuNToNCi0gZG8gcmVhbCBjb21wcmVzc2lvbiBpbiBkZWZsYXRlLmMuIFpfUEFSVElBTF9GTFVTSCBpcyBzdXBwb3J0ZWQgYnV0DQogIG5vdCB5ZXQgWl9GVUxMX0ZMVVNILg0KLSBzdXBwb3J0IGRlY29tcHJlc3Npb24gYnV0IG9ubHkgaW4gYSBzaW5nbGUgc3RlcCAoZm9yY2VkIFpfRklOSVNIKQ0KLSBhZGRlZCBvcGFxdWUgb2JqZWN0IGZvciB6YWxsb2MgYW5kIHpmcmVlLg0KLSBhZGRlZCBkZWZsYXRlUmVzZXQgYW5kIGluZmxhdGVSZXNldA0KLSBhZGRlZCBhIHZhcmlhYmxlIHpsaWJfdmVyc2lvbiBmb3IgY29uc2lzdGVuY3kgY2hlY2tpbmcuDQotIHJlbmFtZWQgdGhlICdmaWx0ZXInIHBhcmFtZXRlciBvZiBkZWZsYXRlSW5pdDIgYXMgJ3N0cmF0ZWd5Jy4NCiAgQWRkZWQgWl9GSUxURVJFRCBhbmQgWl9IVUZGTUFOX09OTFkgY29uc3RhbnRzLg0KDQpDaGFuZ2VzIGluIDAuNDoNCi0gYXZvaWQgInppcCIgZXZlcnl3aGVyZSwgdXNlIHpsaWIgaW5zdGVhZCBvZiB6aXBsaWIuDQotIHN1cHByZXNzIFpfQkxPQ0tfRkxVU0gsIGludGVycHJldCBaX1BBUlRJQUxfRkxVU0ggYXMgYmxvY2sgZmx1c2gNCiAgaWYgY29tcHJlc3Npb24gbWV0aG9kID09IDguDQotIGFkZGVkIGFkbGVyMzIgYW5kIGNyYzMyDQotIHJlbmFtZWQgZGVmbGF0ZU9wdGlvbnMgYXMgZGVmbGF0ZUluaXQyLCBjYWxsIG9uZSBvciB0aGUgb3RoZXIgYnV0IG5vdCBib3RoDQotIGFkZGVkIHRoZSBtZXRob2QgcGFyYW1ldGVyIGZvciBkZWZsYXRlSW5pdDIuDQotIGFkZGVkIGluZmxhdGVJbml0Mg0KLSBzaW1wbGllZCBjb25zaWRlcmFibHkgZGVmbGF0ZUluaXQgYW5kIGluZmxhdGVJbml0IGJ5IG5vdCBzdXBwb3J0aW5nDQogIHVzZXItcHJvdmlkZWQgaGlzdG9yeSBidWZmZXIuIFRoaXMgaXMgc3VwcG9ydGVkIG9ubHkgaW4gZGVmbGF0ZUluaXQyDQogIGFuZCBpbmZsYXRlSW5pdDIuDQoNCkNoYW5nZXMgaW4gMC4zOg0KLSBwcmVmaXggYWxsIG1hY3JvIG5hbWVzIHdpdGggWl8NCi0gdXNlIFpfRklOSVNIIGluc3RlYWQgb2YgZGVmbGF0ZUVuZCB0byBmaW5pc2ggY29tcHJlc3Npb24uDQotIGFkZGVkIFpfSFVGRk1BTl9PTkxZDQotIGFkZGVkIGd6ZXJyb3IoKQ0K