LyoqIEBmaWxlDQogIFRoaXMgZmlsZSBkZWNsYXJlcyBFRkkgU21tIFN4IFNtaSBDaGlsZCBQcm90b2NvbA0KDQogIENvcHlyaWdodCAoYykgMjAwNiwgSW50ZWwgQ29ycG9yYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0KICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0ICAgICAgICANCiAgaHR0cDovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoNCiAgVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQogIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBSRVBSRVNFTlRBVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQuICAgICAgICAgICAgIA0KDQogIE1vZHVsZSBOYW1lOiAgU21tU3hEaXNwYXRjaC5oDQoNCiAgQHBhciBSZXZpc2lvbiBSZWZlcmVuY2U6DQogIFRoaXMgUHJvdG9jb2wgaXMgZGVmaW5lZCBpbiBGcmFtZXdvcmsgb2YgRUZJIFNNTSBDb3JlIEludGVyZmFjZSBTcGVjDQogIFZlcnNpb24gMC45Lg0KDQoqKi8NCg0KI2lmbmRlZiBfRUZJX1NNTV9TWF9ESVNQQVRDSF9IXw0KI2RlZmluZSBfRUZJX1NNTV9TWF9ESVNQQVRDSF9IXw0KDQovLw0KLy8gR2xvYmFsIElEIGZvciB0aGUgU3ggU01JIFByb3RvY29sDQovLw0KI2RlZmluZSBFRklfU01NX1NYX0RJU1BBVENIX1BST1RPQ09MX0dVSUQgXA0KICB7IFwNCiAgICAweDE0ZmM1MmJlLCAweDFkYywgMHg0MjZjLCB7MHg5MSwgMHhhZSwgMHhhMiwgMHgzYywgMHgzZSwgMHgyMiwgMHhhLCAweGU4IH0gXA0KICB9DQoNCnR5cGVkZWYgc3RydWN0IF9FRklfU01NX1NYX0RJU1BBVENIX1BST1RPQ09MICBFRklfU01NX1NYX0RJU1BBVENIX1BST1RPQ09MOw0KLy8NCi8vIFJlbGF0ZWQgRGVmaW5pdGlvbnMNCi8vDQp0eXBlZGVmIGVudW0gew0KICBTeFMwLA0KICBTeFMxLA0KICBTeFMyLA0KICBTeFMzLA0KICBTeFM0LA0KICBTeFM1LA0KICBFZmlNYXhpbXVtU2xlZXBUeXBlDQp9IEVGSV9TTEVFUF9UWVBFOw0KDQp0eXBlZGVmIGVudW0gew0KICBTeEVudHJ5LA0KICBTeEV4aXQsDQogIEVmaU1heGltdW1QaGFzZQ0KfSBFRklfU0xFRVBfUEhBU0U7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX1NMRUVQX1RZUEUgIFR5cGU7DQogIEVGSV9TTEVFUF9QSEFTRSBQaGFzZTsNCn0gRUZJX1NNTV9TWF9ESVNQQVRDSF9DT05URVhUOw0KDQovLw0KLy8gTWVtYmVyIGZ1bmN0aW9ucw0KLy8NCi8qKg0KICBEaXNwYXRjaCBmdW5jdGlvbiBmb3IgYSBTeCBzdGF0ZSBTTUkgaGFuZGxlci4NCg0KICBAcGFyYW0gIERpc3BhdGNoSGFuZGxlIEhhbmRsZSBvZiB0aGlzIGRpc3BhdGNoIGZ1bmN0aW9uLg0KICBAcGFyYW0gIERpc3BhdGNoQ29udGV4dCBQb2ludGVyIHRvIHRoZSBkaXNwYXRjaCBmdW5jdGlvbqGvcyBjb250ZXh0LiANCiAgVGhlIFR5cGUgYW5kIFBoYXNlIGZpZWxkcyBhcmUgZmlsbGVkIGluIGJ5IHRoZSBTeCBkaXNwYXRjaCBkcml2ZXIgDQogIHByaW9yIHRvIGludm9raW5nIHRoaXMgZGlzcGF0Y2ggZnVuY3Rpb24uIEZvciB0aGlzIGludGVyZmFjZSwgDQogIHRoZSBTeCBkcml2ZXIgd2lsbCBjYWxsIHRoZSBkaXNwYXRjaCBmdW5jdGlvbiBmb3IgYWxsIFN4IHR5cGUgDQogIGFuZCBwaGFzZXMsIHNvIHRoZSBTeCBzdGF0ZSBoYW5kbGVyKHMpIG11c3QgY2hlY2sgdGhlICBUeXBlIGFuZCANCiAgUGhhc2UgZmllbGQgb2YgRUZJX1NNTV9TWF9ESVNQQVRDSF9DT05URVhUIGFuZCBhY3QgYWNjb3JkaW5nbHkuDQoNCiAgTm90aGluZw0KDQoqKi8NCnR5cGVkZWYNClZPSUQNCihFRklBUEkgKkVGSV9TTU1fU1hfRElTUEFUQ0gpICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgIERpc3BhdGNoSGFuZGxlLA0KICBJTiAgRUZJX1NNTV9TWF9ESVNQQVRDSF9DT05URVhUICAgKkRpc3BhdGNoQ29udGV4dA0KICApOw0KDQovKioNCiAgUmVnaXN0ZXIgYSBjaGlsZCBTTUkgc291cmNlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGggYSBwYXJlbnQgU01NIGRyaXZlcg0KDQogIEBwYXJhbSAgVGhpcyBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLg0KICBAcGFyYW0gIERpc3BhdGNoRnVuY3Rpb24gUG9pbnRlciB0byBkaXNwYXRjaCBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGZvcg0KICB0aGlzIFNNSSBzb3VyY2UNCiAgQHBhcmFtICBEaXNwYXRjaENvbnRleHQgUG9pbnRlciB0byB0aGUgZGlzcGF0Y2ggZnVuY3Rpb24ncyBjb250ZXh0Lg0KICBUaGUgY2FsbGVyIGZpbGxzIHRoaXMgY29udGV4dCBpbiBiZWZvcmUgY2FsbGluZw0KICB0aGUgcmVnaXN0ZXIgZnVuY3Rpb24gdG8gaW5kaWNhdGUgdG8gdGhlIHJlZ2lzdGVyDQogIGZ1bmN0aW9uIHdoaWNoIFN4IHN0YXRlIHR5cGUgYW5kIHBoYXNlIHRoZSBjYWxsZXINCiAgd2lzaGVzIHRvIGJlIGNhbGxlZCBiYWNrIG9uLiAgRm9yIHRoaXMgaW50ZXJ0YWNlLA0KICB0aGUgU3ggZHJpdmVyIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCBoYW5kbGVycyBmb3INCiAgYWxsIFN4IHR5cGUgYW5kIHBoYXNlcywgc28gdGhlIFN4IHN0YXRlIGhhbmRsZXIocykNCiAgbXVzdCBjaGVjayB0aGUgVHlwZSBhbmQgUGhhc2UgZmllbGQgb2YgdGhlIERpc3BhdGNoDQogIGNvbnRleHQgYW5kIGFjdCBhY2NvcmRpbmdseS4NCiAgQHBhcmFtICBEaXNwYXRjaEhhbmRsZSBIYW5kbGUgb2YgZGlzcGF0Y2ggZnVuY3Rpb24sIGZvciB3aGVuIGludGVyZmFjaW5nDQogIHdpdGggdGhlIHBhcmVudCBTeCBzdGF0ZSBTTU0gZHJpdmVyLg0KDQogIEByZXR2YWwgIEVGSV9TVUNDRVNTIFRoZSBkaXNwYXRjaCBmdW5jdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkNCiAgcmVnaXN0ZXJlZCBhbmQgdGhlIFNNSSBzb3VyY2UgaGFzIGJlZW4gZW5hYmxlZC4NCiAgQHJldHZhbCAgRUZJX1VOU1VQUE9SVEVEIFRoZSBTeCBkcml2ZXIgb3IgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCB0aGF0DQogIFN4IFR5cGUvUGhhc2UuDQogIEByZXR2YWwgIEVGSV9ERVZJQ0VfRVJST1IgVGhlIFN4IGRyaXZlciB3YXMgdW5hYmxlIHRvIGVuYWJsZSB0aGUgU01JIHNvdXJjZS4NCiAgQHJldHZhbCAgRUZJX09VVF9PRl9SRVNPVVJDRVMgTm90IGVub3VnaCBtZW1vcnkgKHN5c3RlbSBvciBTTU0pIHRvIG1hbmFnZSB0aGlzDQogIGNoaWxkLg0KICBAcmV0dmFsICBFRklfSU5WQUxJRF9QQVJBTUVURVIgRGlzcGF0Y2hDb250ZXh0IGlzIGludmFsaWQuIFR5cGUgJiBQaGFzZSBhcmUgbm90DQogIHdpdGhpbiB2YWxpZCByYW5nZS4NCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU01NX1NYX1JFR0lTVEVSKSAoDQogIElOIEVGSV9TTU1fU1hfRElTUEFUQ0hfUFJPVE9DT0wgICAgICAgICAgICpUaGlzLA0KICBJTiAgRUZJX1NNTV9TWF9ESVNQQVRDSCAgICAgICAgICAgICAgICAgICBEaXNwYXRjaEZ1bmN0aW9uLA0KICBJTiAgRUZJX1NNTV9TWF9ESVNQQVRDSF9DT05URVhUICAgICAgICAgICAqRGlzcGF0Y2hDb250ZXh0LA0KICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRGlzcGF0Y2hIYW5kbGUNCiAgKTsNCg0KLyoqDQogIFVucmVnaXN0ZXIgYSBjaGlsZCBTTUkgc291cmNlIGRpc3BhdGNoIGZ1bmN0aW9uIHdpdGggYSBwYXJlbnQgU01NIGRyaXZlcg0KDQogIEBwYXJhbSAgVGhpcyBQcm90b2NvbCBpbnN0YW5jZSBwb2ludGVyLg0KICBAcGFyYW0gIERpc3BhdGNoSGFuZGxlIEhhbmRsZSBvZiBkaXNwYXRjaCBmdW5jdGlvbiB0byBkZXJlZ2lzdGVyLg0KDQogIEByZXR2YWwgIEVGSV9TVUNDRVNTIFRoZSBkaXNwYXRjaCBmdW5jdGlvbiBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgdW5yZWdpc3RlcmVkIGFuZCB0aGUNCiAgU01JIHNvdXJjZSBoYXMgYmVlbiBkaXNhYmxlZCBpZiB0aGVyZSBhcmUgbm8gb3RoZXIgcmVnaXN0ZXJlZCBjaGlsZA0KICBkaXNwYXRjaCBmdW5jdGlvbnMgZm9yIHRoaXMgU01JIHNvdXJjZS4NCiAgQHJldHZhbCAgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEhhbmRsZSBpcyBpbnZhbGlkLg0KICBAcmV0dmFsICBvdGhlciBUQkQNCg0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU01NX1NYX1VOUkVHSVNURVIpICgNCiAgSU4gRUZJX1NNTV9TWF9ESVNQQVRDSF9QUk9UT0NPTCAgICAgICAgICAgKlRoaXMsDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc3BhdGNoSGFuZGxlDQogICk7DQoNCi8vDQovLyBJbnRlcmZhY2Ugc3RydWN0dXJlIGZvciB0aGUgU01NIENoaWxkIERpc3BhdGNoIFByb3RvY29sDQovLw0KLyoqDQogIEBwYXIgUHJvdG9jb2wgRGVzY3JpcHRpb246DQogIFByb3ZpZGVzIHRoZSBwYXJlbnQgZGlzcGF0Y2ggc2VydmljZSBmb3IgYSBnaXZlbiBTeC1zdGF0ZSBzb3VyY2UgZ2VuZXJhdG9yLg0KDQogIEBwYXJhbSBSZWdpc3Rlcg0KICBJbnN0YWxscyBhIGNoaWxkIHNlcnZpY2UgdG8gYmUgZGlzcGF0Y2hlZCBieSB0aGlzIHByb3RvY29sLg0KDQogIEBwYXJhbSBVblJlZ2lzdGVyDQogIFJlbW92ZXMgYSBjaGlsZCBzZXJ2aWNlIGRpc3BhdGNoZWQgYnkgdGhpcyBwcm90b2NvbC4NCg0KKiovDQpzdHJ1Y3QgX0VGSV9TTU1fU1hfRElTUEFUQ0hfUFJPVE9DT0wgew0KICBFRklfU01NX1NYX1JFR0lTVEVSICAgUmVnaXN0ZXI7DQogIEVGSV9TTU1fU1hfVU5SRUdJU1RFUiBVblJlZ2lzdGVyOw0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlTbW1TeERpc3BhdGNoUHJvdG9jb2xHdWlkOw0KDQojZW5kaWYNCg==