LyoqIEBmaWxlDQogIEVGSV9VU0JfSENfUFJPVE9DT0wgYXMgZGVmaW5lZCBpbiBFRkkgMS4xMC4NCg0KICBDb3B5cmlnaHQgKGMpIDIwMDYsIEludGVsIENvcnBvcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBhcmUgbGljZW5zZWQgYW5kIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgQlNEIExpY2Vuc2UgICAgICAgICANCiAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24uICBUaGUgZnVsbCB0ZXh0IG9mIHRoZSBsaWNlbnNlIG1heSBiZSBmb3VuZCBhdCAgICAgICAgDQogIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCAgICAgICAgICAgICAgICAgICAgIA0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELiAgICAgICAgICAgICANCg0KICBNb2R1bGUgTmFtZTogIFVzYkhvc3RDb250cm9sbGVyLmgNCg0KKiovDQoNCiNpZm5kZWYgX1VTQl9IT1NUQ09OVFJPTExFUl9IXw0KI2RlZmluZSBfVVNCX0hPU1RDT05UUk9MTEVSX0hfDQoNCiNkZWZpbmUgRUZJX1VTQl9IQ19QUk9UT0NPTF9HVUlEIFwNCiAgeyBcDQogICAgMHhmNTA4OTI2NiwgMHgxYWEwLCAweDQ5NTMsIHsweDk3LCAweGQ4LCAweDU2LCAweDJmLCAweDhhLCAweDczLCAweGI1LCAweDE5IH0gXA0KICB9DQoNCi8vDQovLyBGb3J3YXJkIHJlZmVyZW5jZSBmb3IgcHVyZSBBTlNJIGNvbXBhdGFiaWxpdHkNCi8vDQp0eXBlZGVmIHN0cnVjdCBfRUZJX1VTQl9IQ19QUk9UT0NPTCBFRklfVVNCX0hDX1BST1RPQ09MOw0KDQovLw0KLy8gUHJvdG9jb2wgZGVmaW5pdGlvbnMNCi8vDQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFByb3ZpZGVzIHNvZnR3YXJlIHJlc2V0IGZvciB0aGUgVVNCIGhvc3QgY29udHJvbGxlci4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0hDX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBBIGJpdCBtYXNrIG9mIHRoZSByZXNldCBvcGVyYXRpb24gdG8gcGVyZm9ybS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSByZXNldCBvcGVyYXRpb24gc3VjY2VlZGVkLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgdHlwZSBvZiByZXNldCBzcGVjaWZpZWQgYnkgQXR0cmlidXRlcyBpcyBub3QgY3VycmVudGx5IHN1cHBvcnRlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgaG9zdCBjb250cm9sbGVyIGhhcmR3YXJlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBdHRyaWJ1dGVzIGlzIG5vdCB2YWxpZC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgQW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIHdoaWxlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSB0aGUgcmVzZXQgb3BlcmF0aW9uLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VTQl9IQ19QUk9UT0NPTF9SRVNFVCkgKA0KICBJTiBFRklfVVNCX0hDX1BST1RPQ09MICAgICAqVGhpcywNCiAgSU4gVUlOVDE2ICAgICAgICAgICAgICAgICAgQXR0cmlidXRlcw0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXRyaWV2ZXMgY3VycmVudCBzdGF0ZSBvZiB0aGUgVVNCIGhvc3QgY29udHJvbGxlci4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0hDX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIFN0YXRlICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfU1RBVEUgZGF0YSBzdHJ1Y3R1cmUgdGhhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgY3VycmVudCBzdGF0ZSBvZiB0aGUgVVNCIGhvc3QgY29udHJvbGxlci4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHN0YXRlIGluZm9ybWF0aW9uIG9mIHRoZSBob3N0IGNvbnRyb2xsZXIgd2FzIHJldHVybmVkIGluIFN0YXRlLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBTdGF0ZSBpcyBOVUxMLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0aGUgaG9zdCBjb250cm9sbGVyoa9zDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfR0VUX1NUQVRFKSAoDQogIElOICBFRklfVVNCX0hDX1BST1RPQ09MICAgICpUaGlzLA0KICBPVVQgRUZJX1VTQl9IQ19TVEFURSAgICAgICAqU3RhdGUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU2V0cyB0aGUgVVNCIGhvc3QgY29udHJvbGxlciB0byBhIHNwZWNpZmljIHN0YXRlLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgU3RhdGUgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgc3RhdGUgb2YgdGhlIGhvc3QgY29udHJvbGxlciB0aGF0IHdpbGwgYmUgc2V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgVVNCIGhvc3QgY29udHJvbGxlciB3YXMgc3VjY2Vzc2Z1bGx5IHBsYWNlZCBpbiB0aGUgc3RhdGUgc3BlY2lmaWVkIGJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgU3RhdGUgaXMgTlVMTC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgRmFpbGVkIHRvIHNldCB0aGUgc3RhdGUgc3BlY2lmaWVkIGJ5IFN0YXRlIGR1ZSB0byBkZXZpY2UgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfU0VUX1NUQVRFKSAoDQogIElOIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgICpUaGlzLA0KICBJTiBFRklfVVNCX0hDX1NUQVRFICAgICAgICBTdGF0ZQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBTdWJtaXRzIGNvbnRyb2wgdHJhbnNmZXIgdG8gYSB0YXJnZXQgVVNCIGRldmljZS4NCiAgICANCiAgQHBhcmFtICBUaGlzICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBFRklfVVNCX0hDX1BST1RPQ09MIGluc3RhbmNlLg0KICBAcGFyYW0gIERldmljZUFkZHJlc3MgICAgICAgICBSZXByZXNlbnRzIHRoZSBhZGRyZXNzIG9mIHRoZSB0YXJnZXQgZGV2aWNlIG9uIHRoZSBVU0IsIHdoaWNoIGlzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkIGR1cmluZyBVU0IgZW51bWVyYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBJc1Nsb3dEZXZpY2UgICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRhcmdldCBkZXZpY2UgaXMgc2xvdyBkZXZpY2Ugb3IgZnVsbC1zcGVlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aW11bVBhY2tldExlbmd0aCAgIEluZGljYXRlcyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IHRoZSBkZWZhdWx0IGNvbnRyb2wgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGVuZHBvaW50IGlzIGNhcGFibGUgb2Ygc2VuZGluZyBvciByZWNlaXZpbmcuICAgICANCiAgQHBhcmFtICBSZXF1ZXN0ICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBVU0IgZGV2aWNlIHJlcXVlc3QgdGhhdCB3aWxsIGJlIHNlbnQgdG8gdGhlIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuDQogIEBwYXJhbSAgVHJhbnNmZXJEaXJlY3Rpb24gICAgIFNwZWNpZmllcyB0aGUgZGF0YSBkaXJlY3Rpb24gZm9yIHRoZSB0cmFuc2Zlci4gIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0IgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugb3IgcmVjZWl2ZWQgZnJvbSBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhTGVuZ3RoICAgICAgICAgICAgT24gaW5wdXQsIGluZGljYXRlcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkYXRhIGJ1ZmZlciBzcGVjaWZpZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgRGF0YS4gT24gb3V0cHV0LCBpbmRpY2F0ZXMgdGhlIGFtb3VudCBvZiBkYXRhIGFjdHVhbGx5ICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lT3V0ICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBtYXhpbXVtIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgd2hpY2ggdGhlIHRyYW5zZmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsbG93ZWQgdG8gY29tcGxldGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFRyYW5zZmVyUmVzdWx0ICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGRldGFpbGVkIHJlc3VsdCBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgYnkgdGhpcyAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgdHJhbnNmZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgY29udHJvbCB0cmFuc2ZlciB3YXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIGNvbnRyb2wgdHJhbnNmZXIgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBTb21lIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIFRoZSBjb250cm9sIHRyYW5zZmVyIGZhaWxlZCBkdWUgdG8gdGltZW91dC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNvbnRyb2wgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byBob3N0IGNvbnRyb2xsZXIgb3IgZGV2aWNlIGVycm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VTQl9IQ19QUk9UT0NPTF9DT05UUk9MX1RSQU5TRkVSKSAoDQogIElOICAgICBFRklfVVNCX0hDX1BST1RPQ09MICAgICAgICpUaGlzLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICBEZXZpY2VBZGRyZXNzLA0KICBJTiAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICBJc1Nsb3dEZXZpY2UsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgIE1heGltdW1QYWNrZXRMZW5ndGgsDQogIElOICAgICBFRklfVVNCX0RFVklDRV9SRVFVRVNUICAgICpSZXF1ZXN0LA0KICBJTiAgICAgRUZJX1VTQl9EQVRBX0RJUkVDVElPTiAgICBUcmFuc2ZlckRpcmVjdGlvbiwNCiAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgKkRhdGEgICAgICAgT1BUSU9OQUwsDQogIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICpEYXRhTGVuZ3RoIE9QVElPTkFMLA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICBUaW1lT3V0LA0KICBPVVQgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAqVHJhbnNmZXJSZXN1bHQNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU3VibWl0cyBidWxrIHRyYW5zZmVyIHRvIGEgYnVsayBlbmRwb2ludCBvZiBhIFVTQiBkZXZpY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9IQ19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBEZXZpY2VBZGRyZXNzICAgICAgICAgUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGRldmljZSBvbiB0aGUgVVNCLCB3aGljaCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZCBkdXJpbmcgVVNCIGVudW1lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRW5kUG9pbnRBZGRyZXNzICAgICAgIFRoZSBjb21iaW5hdGlvbiBvZiBhbiBlbmRwb2ludCBudW1iZXIgYW5kIGFuIGVuZHBvaW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiBvZiB0aGUgdGFyZ2V0IFVTQiBkZXZpY2UuICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aW11bVBhY2tldExlbmd0aCAgIEluZGljYXRlcyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IHRoZSBkZWZhdWx0IGNvbnRyb2wgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGVuZHBvaW50IGlzIGNhcGFibGUgb2Ygc2VuZGluZyBvciByZWNlaXZpbmcuICAgICANCiAgQHBhcmFtICBEYXRhICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgZGF0YSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgdG8gVVNCICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIE9uIGlucHV0LCBpbmRpY2F0ZXMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgZGF0YSBidWZmZXIgc3BlY2lmaWVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IERhdGEuIE9uIG91dHB1dCwgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgZGF0YSBhY3R1YWxseSAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycmVkLiAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhVG9nZ2xlICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBkYXRhIHRvZ2dsZSB2YWx1ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lT3V0ICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBtYXhpbXVtIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgd2hpY2ggdGhlIHRyYW5zZmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFsbG93ZWQgdG8gY29tcGxldGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFRyYW5zZmVyUmVzdWx0ICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGRldGFpbGVkIHJlc3VsdCBpbmZvcm1hdGlvbiBvZiB0aGUgYnVsayB0cmFuc2Zlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBidWxrIHRyYW5zZmVyIHdhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgYnVsayB0cmFuc2ZlciBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNvbWUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIGJ1bGsgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byB0aW1lb3V0Lg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgYnVsayB0cmFuc2ZlciBmYWlsZWQgZHVlIHRvIGhvc3QgY29udHJvbGxlciBvciBkZXZpY2UgZXJyb3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0hDX1BST1RPQ09MX0JVTEtfVFJBTlNGRVIpICgNCiAgSU4gICAgIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgKlRoaXMsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgIERldmljZUFkZHJlc3MsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgIEVuZFBvaW50QWRkcmVzcywNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgTWF4aW11bVBhY2tldExlbmd0aCwNCiAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgKkRhdGEsDQogIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICpEYXRhTGVuZ3RoLA0KICBJTiBPVVQgVUlOVDggICAgICAgICAgICAgICAgICAqRGF0YVRvZ2dsZSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgVGltZU91dCwNCiAgT1VUICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgKlRyYW5zZmVyUmVzdWx0DQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFN1Ym1pdHMgYW4gYXN5bmNocm9ub3VzIGludGVycnVwdCB0cmFuc2ZlciB0byBhbiBpbnRlcnJ1cHQgZW5kcG9pbnQgb2YgYSBVU0IgZGV2aWNlLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgRGV2aWNlQWRkcmVzcyAgICAgICAgIFJlcHJlc2VudHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBkZXZpY2Ugb24gdGhlIFVTQiwgd2hpY2ggaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWQgZHVyaW5nIFVTQiBlbnVtZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEVuZFBvaW50QWRkcmVzcyAgICAgICBUaGUgY29tYmluYXRpb24gb2YgYW4gZW5kcG9pbnQgbnVtYmVyIGFuZCBhbiBlbmRwb2ludA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gb2YgdGhlIHRhcmdldCBVU0IgZGV2aWNlLiAgIA0KICBAcGFyYW0gIElzU2xvd0RldmljZSAgICAgICAgICBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFyZ2V0IGRldmljZSBpcyBzbG93IGRldmljZSBvciBmdWxsLXNwZWVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE1heGltdW1QYWNrZXRMZW5ndGggICBJbmRpY2F0ZXMgdGhlIG1heGltdW0gcGFja2V0IHNpemUgdGhhdCB0aGUgZGVmYXVsdCBjb250cm9sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBlbmRwb2ludCBpcyBjYXBhYmxlIG9mIHNlbmRpbmcgb3IgcmVjZWl2aW5nLiAgICAgDQogIEBwYXJhbSAgSXNOZXdUcmFuc2ZlciAgICAgICAgIElmIFRSVUUsIGFuIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQgcGlwZSBpcyBidWlsdCBiZXR3ZWVuIHRoZSBob3N0ICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB0YXJnZXQgaW50ZXJydXB0IGVuZHBvaW50LiBJZiBGQUxTRSwgdGhlIHNwZWNpZmllZCAgICAgICANCiAgDQogIEBwYXJhbSAgRGF0YVRvZ2dsZSAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgZGF0YSB0b2dnbGUgdmFsdWUuICAgICAgDQogIEBwYXJhbSAgUG9sbGluZ0ludGVydmFsICAgICAgIEluZGljYXRlcyB0aGUgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcywgdGhhdCB0aGUgYXN5bmNocm9ub3VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCB0cmFuc2ZlciBpcyBwb2xsZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNocm9ub3VzIGludGVycnVwdCBwaXBlIGlzIGNhbmNlbGVkLiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBEYXRhTGVuZ3RoICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBsZW5ndGggb2YgZGF0YSB0byBiZSByZWNlaXZlZCBhdCB0aGUgcmF0ZSBzcGVjaWZpZWQgYnkNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9sbGluZ0ludGVydmFsIGZyb20gdGhlIHRhcmdldCBhc3luY2hyb25vdXMgaW50ZXJydXB0ICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kcG9pbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIENhbGxCYWNrRnVuY3Rpb24gICAgICBUaGUgQ2FsbGJhY2sgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDb250ZXh0ICAgICAgICAgICAgICAgVGhlIGNvbnRleHQgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIENhbGxCYWNrRnVuY3Rpb24uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYXN5bmNocm9ub3VzIGludGVycnVwdCB0cmFuc2ZlciByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQgb3IgY2FuY2VsZWQuICAgIA0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcmVxdWVzdCBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNvbWUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfVElNRU9VVCAgICAgICAgICAgVGhlIGJ1bGsgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byB0aW1lb3V0Lg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgYnVsayB0cmFuc2ZlciBmYWlsZWQgZHVlIHRvIGhvc3QgY29udHJvbGxlciBvciBkZXZpY2UgZXJyb3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0hDX1BST1RPQ09MX0FTWU5DX0lOVEVSUlVQVF9UUkFOU0ZFUikgKA0KICBJTiAgICAgRUZJX1VTQl9IQ19QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpUaGlzLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUFkZHJlc3MsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kUG9pbnRBZGRyZXNzLA0KICBJTiAgICAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzU2xvd0RldmljZSwNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpdW1QYWNrZXRMZW5ndGgsDQogIElOICAgICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNOZXdUcmFuc2ZlciwNCiAgSU4gT1VUIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YVRvZ2dsZSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb2xsaW5nSW50ZXJ2YWwgIE9QVElPTkFMLA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGggICAgICAgT1BUSU9OQUwsDQogIElOICAgICBFRklfQVNZTkNfVVNCX1RSQU5TRkVSX0NBTExCQUNLICAgICAgICAgICAgICAgICAgICAgQ2FsbEJhY2tGdW5jdGlvbiBPUFRJT05BTCwNCiAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqQ29udGV4dCAgICAgICAgIE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFN1Ym1pdHMgc3luY2hyb25vdXMgaW50ZXJydXB0IHRyYW5zZmVyIHRvIGFuIGludGVycnVwdCBlbmRwb2ludCBvZiBhIFVTQiBkZXZpY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9IQ19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBEZXZpY2VBZGRyZXNzICAgICAgICAgUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGRldmljZSBvbiB0aGUgVVNCLCB3aGljaCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZCBkdXJpbmcgVVNCIGVudW1lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRW5kUG9pbnRBZGRyZXNzICAgICAgIFRoZSBjb21iaW5hdGlvbiBvZiBhbiBlbmRwb2ludCBudW1iZXIgYW5kIGFuIGVuZHBvaW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiBvZiB0aGUgdGFyZ2V0IFVTQiBkZXZpY2UuICAgDQogIEBwYXJhbSAgSXNTbG93RGV2aWNlICAgICAgICAgIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YXJnZXQgZGV2aWNlIGlzIHNsb3cgZGV2aWNlIG9yIGZ1bGwtc3BlZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aW11bVBhY2tldExlbmd0aCAgIEluZGljYXRlcyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IHRoZSBkZWZhdWx0IGNvbnRyb2wgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGVuZHBvaW50IGlzIGNhcGFibGUgb2Ygc2VuZGluZyBvciByZWNlaXZpbmcuICAgICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQgcGlwZSBpcyBjYW5jZWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIE9uIGlucHV0LCB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkYXRhIGJ1ZmZlciBzcGVjaWZpZWQgYnkgRGF0YS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT24gb3V0cHV0LCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YVRvZ2dsZSAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgZGF0YSB0b2dnbGUgdmFsdWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lT3V0ICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoZSBtYXhpbXVtIHRpbWUsIGluIG1pbGxpc2Vjb25kcywgd2hpY2ggdGhlIHRyYW5zZmVyICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbGxvd2VkIHRvIGNvbXBsZXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVHJhbnNmZXJSZXN1bHQgICAgICAgIEEgcG9pbnRlciB0byB0aGUgZGV0YWlsZWQgcmVzdWx0IGluZm9ybWF0aW9uIGZyb20gdGhlIHN5bmNocm9ub3VzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdCB0cmFuc2Zlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBzeW5jaHJvbm91cyBpbnRlcnJ1cHQgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSByZXF1ZXN0IGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgZHVlIHRvIGEgbGFjayBvZiByZXNvdXJjZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBTb21lIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX1RJTUVPVVQgICAgICAgICAgIFRoZSBzeW5jaHJvbm91cyBpbnRlcnJ1cHQgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byB0aW1lb3V0Lg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgc3luY2hyb25vdXMgaW50ZXJydXB0IHRyYW5zZmVyIGZhaWxlZCBkdWUgdG8gaG9zdCBjb250cm9sbGVyIG9yIGRldmljZSBlcnJvci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfU1lOQ19JTlRFUlJVUFRfVFJBTlNGRVIpICgNCiAgSU4gICAgIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgKlRoaXMsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgIERldmljZUFkZHJlc3MsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgIEVuZFBvaW50QWRkcmVzcywNCiAgSU4gICAgIEJPT0xFQU4gICAgICAgICAgICAgICAgSXNTbG93RGV2aWNlLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICBNYXhpbXVtUGFja2V0TGVuZ3RoLA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgKkRhdGFMZW5ndGgsDQogIElOIE9VVCBVSU5UOCAgICAgICAgICAgICAgICAgICpEYXRhVG9nZ2xlLA0KICBJTiAgICAgVUlOVE4gICAgICAgICAgICAgICAgICBUaW1lT3V0LA0KICBPVVQgICAgVUlOVDMyICAgICAgICAgICAgICAgICAqVHJhbnNmZXJSZXN1bHQNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU3VibWl0cyBpc29jaHJvbm91cyB0cmFuc2ZlciB0byBhbiBpc29jaHJvbm91cyBlbmRwb2ludCBvZiBhIFVTQiBkZXZpY2UuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9IQ19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBEZXZpY2VBZGRyZXNzICAgICAgICAgUmVwcmVzZW50cyB0aGUgYWRkcmVzcyBvZiB0aGUgdGFyZ2V0IGRldmljZSBvbiB0aGUgVVNCLCB3aGljaCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZCBkdXJpbmcgVVNCIGVudW1lcmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRW5kUG9pbnRBZGRyZXNzICAgICAgIFRoZSBjb21iaW5hdGlvbiBvZiBhbiBlbmRwb2ludCBudW1iZXIgYW5kIGFuIGVuZHBvaW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiBvZiB0aGUgdGFyZ2V0IFVTQiBkZXZpY2UuICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aW11bVBhY2tldExlbmd0aCAgIEluZGljYXRlcyB0aGUgbWF4aW11bSBwYWNrZXQgc2l6ZSB0aGF0IHRoZSBkZWZhdWx0IGNvbnRyb2wgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIGVuZHBvaW50IGlzIGNhcGFibGUgb2Ygc2VuZGluZyBvciByZWNlaXZpbmcuICAgICAgIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvZiBkYXRhIHRoYXQgd2lsbCBiZSB0cmFuc21pdHRlZCB0byBVU0INCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIG9yIHJlY2VpdmVkIGZyb20gVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jaHJvbm91cyBpbnRlcnJ1cHQgcGlwZSBpcyBjYW5jZWxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YUxlbmd0aCAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgbGVuZ3RoLCBpbiBieXRlcywgb2YgdGhlIGRhdGEgdG8gYmUgc2VudCB0byBvciByZWNlaXZlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHRoZSBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUcmFuc2ZlclJlc3VsdCAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBkZXRhaWxlZCByZXN1bHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgaXNvY2hyb25vdXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSBpc29jaHJvbm91cyBjb3VsZCBub3QgYmUgY29tcGxldGVkIGR1ZSB0byBhIGxhY2sgb2YgcmVzb3VyY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgU29tZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9USU1FT1VUICAgICAgICAgICBUaGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byB0aW1lb3V0Lg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgaXNvY2hyb25vdXMgdHJhbnNmZXIgZmFpbGVkIGR1ZSB0byBob3N0IGNvbnRyb2xsZXIgb3IgZGV2aWNlIGVycm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VTQl9IQ19QUk9UT0NPTF9JU09DSFJPTk9VU19UUkFOU0ZFUikgKA0KICBJTiAgICAgRUZJX1VTQl9IQ19QUk9UT0NPTCAgICAqVGhpcywNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgRGV2aWNlQWRkcmVzcywNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgRW5kUG9pbnRBZGRyZXNzLA0KICBJTiAgICAgVUlOVDggICAgICAgICAgICAgICAgICBNYXhpbXVtUGFja2V0TGVuZ3RoLA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAqRGF0YSwNCiAgSU4gICAgIFVJTlROICAgICAgICAgICAgICAgICAgRGF0YUxlbmd0aCwNCiAgT1VUICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgKlRyYW5zZmVyUmVzdWx0DQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFN1Ym1pdHMgbm9uYmxvY2tpbmcgaXNvY2hyb25vdXMgdHJhbnNmZXIgdG8gYW4gaXNvY2hyb25vdXMgZW5kcG9pbnQgb2YgYSBVU0IgZGV2aWNlLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgRGV2aWNlQWRkcmVzcyAgICAgICAgIFJlcHJlc2VudHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHRhcmdldCBkZXZpY2Ugb24gdGhlIFVTQiwgd2hpY2ggaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWQgZHVyaW5nIFVTQiBlbnVtZXJhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEVuZFBvaW50QWRkcmVzcyAgICAgICBUaGUgY29tYmluYXRpb24gb2YgYW4gZW5kcG9pbnQgbnVtYmVyIGFuZCBhbiBlbmRwb2ludA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gb2YgdGhlIHRhcmdldCBVU0IgZGV2aWNlLiAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE1heGltdW1QYWNrZXRMZW5ndGggICBJbmRpY2F0ZXMgdGhlIG1heGltdW0gcGFja2V0IHNpemUgdGhhdCB0aGUgZGVmYXVsdCBjb250cm9sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlciBlbmRwb2ludCBpcyBjYXBhYmxlIG9mIHNlbmRpbmcgb3IgcmVjZWl2aW5nLiAgICAgICANCiAgQHBhcmFtICBEYXRhICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb2YgZGF0YSB0aGF0IHdpbGwgYmUgdHJhbnNtaXR0ZWQgdG8gVVNCDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSBvciByZWNlaXZlZCBmcm9tIFVTQiBkZXZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgaW50ZXJydXB0IHBpcGUgaXMgY2FuY2VsZWQuICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERhdGFMZW5ndGggICAgICAgICAgICBTcGVjaWZpZXMgdGhlIGxlbmd0aCwgaW4gYnl0ZXMsIG9mIHRoZSBkYXRhIHRvIGJlIHNlbnQgdG8gb3IgcmVjZWl2ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgVVNCIGRldmljZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgSXNvY2hyb25vdXNDYWxsYmFjayAgIFRoZSBDYWxsYmFjayBmdW5jdGlvbi4NCiAgQHBhcmFtICBDb250ZXh0ICAgICAgICAgICAgICAgRGF0YSBwYXNzZWQgdG8gdGhlIElzb2Nocm9ub3VzQ2FsbGJhY2sgZnVuY3Rpb24uIFRoaXMgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIGFuZCBtYXkgYmUgTlVMTC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBhc3luY2hyb25vdXMgaXNvY2hyb25vdXMgdHJhbnNmZXIgd2FzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSBhc3luY2hyb25vdXMgaXNvY2hyb25vdXMgY291bGQgbm90IGJlIGNvbXBsZXRlZCBkdWUgdG8gYSBsYWNrIG9mIHJlc291cmNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFNvbWUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfQVNZTkNfSVNPQ0hST05PVVNfVFJBTlNGRVIpICgNCiAgSU4gICAgIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgICAgICAgICAgICAgKlRoaXMsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUFkZHJlc3MsDQogIElOICAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZFBvaW50QWRkcmVzcywNCiAgSU4gICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4aW11bVBhY2tldExlbmd0aCwNCiAgSU4gT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkRhdGEsDQogIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFMZW5ndGgsDQogIElOICAgICBFRklfQVNZTkNfVVNCX1RSQU5TRkVSX0NBTExCQUNLICAgIElzb2Nocm9ub3VzQ2FsbEJhY2ssDQogIElOICAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDb250ZXh0IE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHJpZXZlcyB0aGUgbnVtYmVyIG9mIHJvb3QgaHViIHBvcnRzLg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgUG9ydE51bWJlciAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHRoZSByb290IGh1YiBwb3J0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHBvcnQgbnVtYmVyIHdhcyByZXRyaWV2ZWQgc3VjY2Vzc2Z1bGx5Lg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0aGUgcG9ydCBudW1iZXIuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFBvcnROdW1iZXIgaXMgTlVMTC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfR0VUX1JPT1RIVUJfUE9SVF9OVU1CRVIpICgNCiAgSU4gRUZJX1VTQl9IQ19QUk9UT0NPTCAgICAqVGhpcywNCiAgT1VUIFVJTlQ4ICAgICAgICAgICAgICAgICAqUG9ydE51bWJlcg0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mIGEgVVNCIHJvb3QgaHViIHBvcnQuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9IQ19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBQb3J0TnVtYmVyICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByb290IGh1YiBwb3J0IGZyb20gd2hpY2ggdGhlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgaXMgemVybyBiYXNlZC4NCiAgQHBhcmFtICBQb3J0U3RhdHVzICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHBvcnQgc3RhdHVzIGJpdHMgYW5kIHBvcnQgc3RhdHVzIGNoYW5nZSBiaXRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgc3RhdHVzIG9mIHRoZSBVU0Igcm9vdCBodWIgcG9ydCBzcGVjaWZpZWQgYnkgUG9ydE51bWJlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXMgcmV0dXJuZWQgaW4gUG9ydFN0YXR1cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQb3J0TnVtYmVyIGlzIGludmFsaWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfVVNCX0hDX1BST1RPQ09MX0dFVF9ST09USFVCX1BPUlRfU1RBVFVTKSAoDQogIElOIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgICpUaGlzLA0KICBJTiAgVUlOVDggICAgICAgICAgICAgICAgICBQb3J0TnVtYmVyLA0KICBPVVQgRUZJX1VTQl9QT1JUX1NUQVRVUyAgICAqUG9ydFN0YXR1cw0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBTZXRzIGEgZmVhdHVyZSBmb3IgdGhlIHNwZWNpZmllZCByb290IGh1YiBwb3J0Lg0KICAgIA0KICBAcGFyYW0gIFRoaXMgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIEVGSV9VU0JfSENfUFJPVE9DT0wgaW5zdGFuY2UuDQogIEBwYXJhbSAgUG9ydE51bWJlciAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcm9vdCBodWIgcG9ydCBmcm9tIHdoaWNoIHRoZSBzdGF0dXMgaXMgdG8gYmUgcmV0cmlldmVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIHplcm8gYmFzZWQuDQogIEBwYXJhbSAgUG9ydEZlYXR1cmUgICAgICAgICAgIEluZGljYXRlcyB0aGUgZmVhdHVyZSBzZWxlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUgc2V0DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZmVhdHVyZSBzcGVjaWZpZWQgYnkgUG9ydEZlYXR1cmUgd2FzIHNldCBmb3IgdGhlIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290IGh1YiBwb3J0IHNwZWNpZmllZCBieSBQb3J0TnVtYmVyLiAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQb3J0TnVtYmVyIGlzIGludmFsaWQgb3IgUG9ydEZlYXR1cmUgaXMgaW52YWxpZCBmb3IgdGhpcyBmdW5jdGlvbi4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfU0VUX1JPT1RIVUJfUE9SVF9GRUFUVVJFKSAoDQogIElOIEVGSV9VU0JfSENfUFJPVE9DT0wgICAgICpUaGlzLA0KICBJTiBVSU5UOCAgICAgICAgICAgICAgICAgICBQb3J0TnVtYmVyLA0KICBJTiBFRklfVVNCX1BPUlRfRkVBVFVSRSAgICBQb3J0RmVhdHVyZQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDbGVhcnMgYSBmZWF0dXJlIGZvciB0aGUgc3BlY2lmaWVkIHJvb3QgaHViIHBvcnQuDQogICAgDQogIEBwYXJhbSAgVGhpcyAgICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX1VTQl9IQ19QUk9UT0NPTCBpbnN0YW5jZS4NCiAgQHBhcmFtICBQb3J0TnVtYmVyICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSByb290IGh1YiBwb3J0IGZyb20gd2hpY2ggdGhlIHN0YXR1cyBpcyB0byBiZSBjbGVhcmVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIGlzIHplcm8gYmFzZWQuDQogIEBwYXJhbSAgUG9ydEZlYXR1cmUgICAgICAgICAgIEluZGljYXRlcyB0aGUgZmVhdHVyZSBzZWxlY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGZlYXR1cmUgY2xlYXINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBmZWF0dXJlIHNwZWNpZmllZCBieSBQb3J0RmVhdHVyZSB3YXMgY2xlYXJlZCBmb3IgdGhlIFVTQg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290IGh1YiBwb3J0IHNwZWNpZmllZCBieSBQb3J0TnVtYmVyLiAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQb3J0TnVtYmVyIGlzIGludmFsaWQgb3IgUG9ydEZlYXR1cmUgaXMgaW52YWxpZCBmb3IgdGhpcyBmdW5jdGlvbi4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VU0JfSENfUFJPVE9DT0xfQ0xFQVJfUk9PVEhVQl9QT1JUX0ZFQVRVUkUpICgNCiAgSU4gRUZJX1VTQl9IQ19QUk9UT0NPTCAgICAgKlRoaXMsDQogIElOIFVJTlQ4ICAgICAgICAgICAgICAgICAgIFBvcnROdW1iZXIsDQogIElOIEVGSV9VU0JfUE9SVF9GRUFUVVJFICAgIFBvcnRGZWF0dXJlDQogICk7DQoNCnN0cnVjdCBfRUZJX1VTQl9IQ19QUk9UT0NPTCB7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfUkVTRVQgICAgICAgICAgICAgICAgICAgICAgIFJlc2V0Ow0KICBFRklfVVNCX0hDX1BST1RPQ09MX0dFVF9TVEFURSAgICAgICAgICAgICAgICAgICBHZXRTdGF0ZTsNCiAgRUZJX1VTQl9IQ19QUk9UT0NPTF9TRVRfU1RBVEUgICAgICAgICAgICAgICAgICAgU2V0U3RhdGU7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfQ09OVFJPTF9UUkFOU0ZFUiAgICAgICAgICAgIENvbnRyb2xUcmFuc2ZlcjsNCiAgRUZJX1VTQl9IQ19QUk9UT0NPTF9CVUxLX1RSQU5TRkVSICAgICAgICAgICAgICAgQnVsa1RyYW5zZmVyOw0KICBFRklfVVNCX0hDX1BST1RPQ09MX0FTWU5DX0lOVEVSUlVQVF9UUkFOU0ZFUiAgICBBc3luY0ludGVycnVwdFRyYW5zZmVyOw0KICBFRklfVVNCX0hDX1BST1RPQ09MX1NZTkNfSU5URVJSVVBUX1RSQU5TRkVSICAgICBTeW5jSW50ZXJydXB0VHJhbnNmZXI7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfSVNPQ0hST05PVVNfVFJBTlNGRVIgICAgICAgIElzb2Nocm9ub3VzVHJhbnNmZXI7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfQVNZTkNfSVNPQ0hST05PVVNfVFJBTlNGRVIgIEFzeW5jSXNvY2hyb25vdXNUcmFuc2ZlcjsNCiAgRUZJX1VTQl9IQ19QUk9UT0NPTF9HRVRfUk9PVEhVQl9QT1JUX05VTUJFUiAgICAgR2V0Um9vdEh1YlBvcnROdW1iZXI7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfR0VUX1JPT1RIVUJfUE9SVF9TVEFUVVMgICAgIEdldFJvb3RIdWJQb3J0U3RhdHVzOw0KICBFRklfVVNCX0hDX1BST1RPQ09MX1NFVF9ST09USFVCX1BPUlRfRkVBVFVSRSAgICBTZXRSb290SHViUG9ydEZlYXR1cmU7DQogIEVGSV9VU0JfSENfUFJPVE9DT0xfQ0xFQVJfUk9PVEhVQl9QT1JUX0ZFQVRVUkUgIENsZWFyUm9vdEh1YlBvcnRGZWF0dXJlOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWpvclJldmlzaW9uOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaW5vclJldmlzaW9uOw0KfTsNCg0KZXh0ZXJuIEVGSV9HVUlEIGdFZmlVc2JIY1Byb3RvY29sR3VpZDsNCg0KI2VuZGlmDQo=