LyorKw0KDQpDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQpBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzICAgICAgICAgICAgICAgICAgICAgICAgICANCmFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZSAgICAgICAgIA0Kd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQpodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KVEhFIFBST0dSQU0gSVMgRElTVFJJQlVURUQgVU5ERVIgVEhFIEJTRCBMSUNFTlNFIE9OIEFOICJBUyBJUyIgQkFTSVMsICAgICAgICAgICAgICAgICAgICAgDQpXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KTW9kdWxlIE5hbWU6DQoNCiAgRGVidWdMaWIuYw0KDQpBYnN0cmFjdDoNCg0KICBVRUZJIERlYnVnIExpYnJhcnkgdGhhdCB1c2VzIFByaW50TGliIHRvIHNlbmQgbWVzc2FnZXMgdG8gQ09OT1VUDQoNCi0tKi8NCg0Kc3RhdGljIEJPT0xFQU4gICAgICAgICAgICAgICAgICAgbURlYnVnTGV2ZWxJbnN0YWxsZWQgPSBGQUxTRTsNCnN0YXRpYyBFRklfREVCVUdfTEVWRUxfUFJPVE9DT0wgIG1EZWJ1Z0xldmVsID0geyAwIH07DQoNCkVGSV9TVEFUVVMNCkRlYnVnTGliQ29uc3RydWN0b3IgKA0KICBJTiBFRklfSEFORExFICAgICAgICBJbWFnZUhhbmRsZSwNCiAgSU4gRUZJX1NZU1RFTV9UQUJMRSAgKlN5c3RlbVRhYmxlDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KQXJndW1lbnRzOg0KDQpSZXR1cm5zOg0KDQotLSovDQp7DQogIEVGSV9TVEFUVVMgICAgICAgICAgICAgICBTdGF0dXM7DQoNCiAgLy8NCiAgLy8gSW5pdGlhbGl6ZSBEZWJ1ZyBMZXZlbCBQcm90b2NvbA0KICAvLw0KICBtRGVidWdMZXZlbC5EZWJ1Z0xldmVsID0gUGNkR2V0MzIoUGNkRGVidWdQcmludEVycm9yTGV2ZWwpOw0KDQogIC8vDQogIC8vIEluc3RhbGwgRGVidWcgTGV2ZWwgUHJvdG9jb2wgDQogIC8vDQogIFN0YXR1cyA9IGdCUy0+SW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzICgNCiAgICAgICAgICAgICAgICAgICZJbWFnZUhhbmRsZSwNCiAgICAgICAgICAgICAgICAgICZnRWZpRGVidWdMZXZlbFByb3RvY29sR3VpZCwgJm1EZWJ1Z0xldmVsLA0KICAgICAgICAgICAgICAgICAgTlVMTA0KICAgICAgICAgICAgICAgICAgKTsNCiAgQVNTRVJUX0VGSV9FUlJPUiAoU3RhdHVzKTsNCg0KICAvLw0KICAvLyBTZXQgZmxhZyB0byBzaG93IHRoYXQgdGhlIERlYnVnIExldmVsIFByb3RvY29sIGhhcyBiZWVuIGluc3RhbGxlZA0KICAvLw0KICBtRGVidWdMZXZlbEluc3RhbGxlZCA9IFRSVUU7DQoNCiAgcmV0dXJuIEVGSV9TVUNDRVNTOw0KfQ0KDQpWT0lEDQpFRklBUEkNCkRlYnVnUHJpbnQgKA0KICBJTiAgVUlOVE4gIEVycm9yTGV2ZWwsDQogIElOICBDSEFSOCAgKkZvcm1hdCwNCiAgLi4uDQogICkNCi8qKysNCg0KUm91dGluZSBEZXNjcmlwdGlvbjoNCg0KICBXcmFwcGVyIGZvciBEZWJ1Z1ZQcmludCAoKQ0KICANCkFyZ3VtZW50czoNCg0KICBFcnJvckxldmVsIC0gSWYgZXJyb3IgbGV2ZWwgaXMgc2V0IGRvIHRoZSBkZWJ1ZyBwcmludC4NCg0KICBGb3JtYXQgICAgIC0gU3RyaW5nIHRvIHVzZSBmb3IgdGhlIHByaW50LCBmb2xsb3dlZCBieSBQcmludCBhcmd1bWVudHMuDQoNCiAgLi4uICAgICAgICAtIFByaW50IGFyZ3VtZW50cy4NCg0KUmV0dXJuczoNCiAgDQogIE5vbmUNCg0KLS0qLw0Kew0KICBDSEFSMTYgICBCdWZmZXJbMHgxMDBdOw0KICBDSEFSMTYgICBVbmljb2RlQnVmZmVyWzB4MTAwXTsNCiAgVUlOVDMyICAgSW5kZXg7DQogIFZBX0xJU1QgIE1hcmtlcjsNCg0KICAvLw0KICAvLyBDaGVjayB0byBzZWUgaWYgQ09OT1VUIGlzIGF2aWxhYmxlDQogIC8vDQogIGlmIChnU1QtPkNvbk91dCA9PSBOVUxMKSB7DQogICAgcmV0dXJuOw0KICB9DQoNCiAgLy8NCiAgLy8gQ2hlY2sgZHJpdmVyIERlYnVnIExldmVsIHZhbHVlIGFuZCBnbG9iYWwgZGVidWcgbGV2ZWwNCiAgLy8NCiAgaWYgKG1EZWJ1Z0xldmVsSW5zdGFsbGVkKSB7DQogICAgaWYgKChFcnJvckxldmVsICYgbURlYnVnTGV2ZWwuRGVidWdMZXZlbCkgPT0gMCkgew0KICAgICAgcmV0dXJuOw0KICAgIH0NCiAgfSBlbHNlIHsNCiAgICBpZiAoKEVycm9yTGV2ZWwgJiBQY2RHZXQzMihQY2REZWJ1Z1ByaW50RXJyb3JMZXZlbCkpID09IDApIHsNCiAgICAgIHJldHVybjsNCiAgICB9DQogIH0NCg0KICAvLw0KICAvLyBCVUdCVUc6IE5lZWQgcHJpbnQgdGhhdCB0YWtlIENIQVI4IEZvcm1hdCBhbmQgcmV0dXJucyBDSEFSMTYgQnVmZmVyDQogIC8vDQogIGZvciAoSW5kZXggPSAwOyBGb3JtYXRbSW5kZXhdICE9IDA7IEluZGV4KyspIHsNCiAgICBVbmljb2RlQnVmZmVyW0luZGV4XSA9IEZvcm1hdFtJbmRleF07DQogIH0NCiAgVW5pY29kZUJ1ZmZlcltJbmRleF0gPSBGb3JtYXRbSW5kZXhdOw0KDQogIC8vDQogIC8vIENvbnZlcnQgdGhlIERFQlVHKCkgbWVzc2FnZSB0byBhIFVuaWNvZGUgU3RyaW5nDQogIC8vDQogIFZBX1NUQVJUIChNYXJrZXIsIEZvcm1hdCk7DQogIFVuaWNvZGVWU1ByaW50IChCdWZmZXIsIHNpemVvZiAoQnVmZmVyKSwgVW5pY29kZUJ1ZmZlciwgTWFya2VyKTsNCiAgVkFfRU5EIChNYXJrZXIpOw0KDQogIC8vDQogIC8vIFNlbmQgdGhlIHByaW50IHN0cmluZyB0byB0aGUgU3RhbmRhcmQgRXJyb3IgZGV2aWNlDQogIC8vDQogIGdTVC0+Q29uT3V0LT5PdXRwdXRTdHJpbmcgKGdTVC0+Q29uT3V0LCBCdWZmZXIpOw0KfQ0KDQpWT0lEDQpFRklBUEkNCkRlYnVnQXNzZXJ0ICgNCiAgSU4gQ0hBUjggICpGaWxlTmFtZSwNCiAgSU4gSU5UTiAgIExpbmVOdW1iZXIsDQogIElOIENIQVI4ICAqRGVzY3JpcHRpb24NCiAgKQ0KLyorKw0KDQpSb3V0aW5lIERlc2NyaXB0aW9uOg0KDQogIFdvcmtlciBmdW5jdGlvbiBmb3IgQVNTRVJUKCkuIElmIEVycm9yIExvZ2dpbmcgaHViIGlzIGxvYWRlZCBsb2cgQVNTRVJUDQogIGluZm9ybWF0aW9uLiBJZiBFcnJvciBMb2dnaW5nIGh1YiBpcyBub3QgbG9hZGVkIENwdUJyZWFrcG9pbnQgKCkuDQoNCiAgV2UgdXNlIFVJTlQ2NCBidWZmZXJzIGR1ZSB0byBJUEYgYWxpZ25tZW50IGNvbmNlcm5zLg0KDQpBcmd1bWVudHM6DQoNCiAgRmlsZU5hbWUgICAgLSBGaWxlIG5hbWUgb2YgZmFpbGluZyByb3V0aW5lLg0KDQogIExpbmVOdW1iZXIgIC0gTGluZSBudW1iZXIgb2YgZmFpbGluZyBBU1NFUlQoKS4NCg0KICBEZXNjcmlwdGlvbiAtIERlc2NyaXRwdGlvbiwgdXNhbGx5IHRoZSBhc3NlcnRpb24sDQogIA0KUmV0dXJuczoNCiAgDQogIE5vbmUNCg0KLS0qLw0Kew0KICBDSEFSMTYgIEJ1ZmZlclsweDEwMF07DQoNCiAgLy8NCiAgLy8gQ2hlY2sgdG8gc2VlIGlmIENPTk9VVCBpcyBhdmlsYWJsZQ0KICAvLw0KICBpZiAoZ1NULT5Db25PdXQgPT0gTlVMTCkgew0KICAgIHJldHVybjsNCiAgfQ0KDQogIC8vDQogIC8vIEdlbmVyYXRlIHRoZSBBU1NFUlQoKSBtZXNzYWdlIGluIFVuaWNvZGUgZm9ybWF0DQogIC8vDQogIFVuaWNvZGVTUHJpbnQgKEJ1ZmZlciwgc2l6ZW9mIChCdWZmZXIpLCAoQ0hBUjE2ICopTCJBU1NFUlQgJXMoJWQpOiAlc1xuIiwgRmlsZU5hbWUsIExpbmVOdW1iZXIsIERlc2NyaXB0aW9uKTsNCg0KICAvLw0KICAvLyBTZW5kIHRoZSBwcmludCBzdHJpbmcgdG8gdGhlIFN0YW5kYXJkIEVycm9yIGRldmljZQ0KICAvLw0KICBnU1QtPkNvbk91dC0+T3V0cHV0U3RyaW5nIChnU1QtPkNvbk91dCwgQnVmZmVyKTsNCg0KICAvLw0KICAvLyBQdXQgYnJlYWsgcG9pbnQgaW4gbW9kdWxlIHRoYXQgY29udGFpbmVkIHRoZSBlcnJvci4NCiAgLy8NCiAgQ3B1QnJlYWtwb2ludCAoKTsNCn0NCg0KLyoqDQogIEZpbGxzIGEgdGFyZ2V0IGJ1ZmZlciB3aXRoIFBjZERlYnVnQ2xlYXJNZW1vcnlWYWx1ZSwgYW5kIHJldHVybnMgdGhlIHRhcmdldCBidWZmZXIuDQoNCiAgVGhpcyBmdW5jdGlvbiBmaWxscyBMZW5ndGggYnl0ZXMgb2YgQnVmZmVyIHdpdGggdGhlIHZhbHVlIHNwZWNpZmllZCBieSANCiAgUGNkRGVidWdDbGVhck1lbW9yeVZhbHVlLCBhbmQgcmV0dXJucyBCdWZmZXIuDQoNCiAgSWYgQnVmZmVyIGlzIE5VTEwsIHRoZW4gQVNTRVJUKCkuDQoNCiAgSWYgTGVuZ3RoIGlzIGdyZWF0ZXIgdGhhbiAoTUFYX0FERFJFU1MgliBCdWZmZXIgKyAxKSwgdGhlbiBBU1NFUlQoKS4gDQoNCiAgQHBhcmFtICBCdWZmZXIgIFBvaW50ZXIgdG8gdGhlIHRhcmdldCBidWZmZXIgdG8gZmlsbCB3aXRoIFBjZERlYnVnQ2xlYXJNZW1vcnlWYWx1ZS4NCiAgQHBhcmFtICBMZW5ndGggIE51bWJlciBvZiBieXRlcyBpbiBCdWZmZXIgdG8gZmlsbCB3aXRoIHplcm9zIFBjZERlYnVnQ2xlYXJNZW1vcnlWYWx1ZS4gDQoNCiAgQHJldHVybiAgQnVmZmVyDQoNCioqLw0KVk9JRCAqDQpFRklBUEkNCkRlYnVnQ2xlYXJNZW1vcnkgKA0KICBPVVQgVk9JRCAgKkJ1ZmZlciwNCiAgSU4gVUlOVE4gIExlbmd0aA0KICApDQp7DQovLyAgU2V0TWVtIChCdWZmZXIsIExlbmd0aCwgUGNkR2V0OChQY2REZWJ1Z0NsZWFyTWVtb3J5VmFsdWUpKTsNCiAgU2V0TWVtIChCdWZmZXIsIExlbmd0aCwgMHhBRik7DQogIHJldHVybiBCdWZmZXI7DQp9DQoNCkJPT0xFQU4NCkVGSUFQSQ0KRGVidWdBc3NlcnRFbmFibGVkICgNCiAgVk9JRA0KICApDQp7DQogIHJldHVybiAoKFBjZEdldDgoUGNkRGVidWdQcm9wZXJ0eU1hc2spICYgREVCVUdfUFJPUEVSVFlfREVCVUdfQVNTRVJUX0VOQUJMRUQpICE9IDApOw0KfQ0KDQpCT09MRUFODQpFRklBUEkNCkRlYnVnUHJpbnRFbmFibGVkICgNCiAgVk9JRA0KICApDQp7DQogIHJldHVybiAoKFBjZEdldDgoUGNkRGVidWdQcm9wZXJ0eU1hc2spICYgREVCVUdfUFJPUEVSVFlfREVCVUdfUFJJTlRfRU5BQkxFRCkgIT0gMCk7DQp9DQoNCkJPT0xFQU4NCkVGSUFQSQ0KRGVidWdDb2RlRW5hYmxlZCAoDQogIFZPSUQNCiAgKQ0Kew0KICByZXR1cm4gKChQY2RHZXQ4KFBjZERlYnVnUHJvcGVydHlNYXNrKSAmIERFQlVHX1BST1BFUlRZX0RFQlVHX0NPREVfRU5BQkxFRCkgIT0gMCk7DQp9DQoNCkJPT0xFQU4NCkVGSUFQSQ0KRGVidWdDbGVhck1lbW9yeUVuYWJsZWQgKA0KICBWT0lEDQogICkNCnsNCiAgcmV0dXJuICgoUGNkR2V0OChQY2REZWJ1Z1Byb3BlcnR5TWFzaykgJiBERUJVR19QUk9QRVJUWV9DTEVBUl9NRU1PUllfRU5BQkxFRCkgIT0gMCk7DQp9DQo=