LyoqIEBmaWxlDQogIEluY2x1ZGUgZmlsZSB0aGF0IHN1cHBvcnRlcyBVRUZJLg0KICANCiAgVGhpcyBpbmNsdWRlIGZpbGUgbXVzdCBvbmx5IGNvbnRhaW4gdGhpbmdzIGRlZmluZWQgaW4gdGhlIFVFRkkgMi4wIHNwZWNpZmljYXRpb24uDQogIElmIGEgY29kZSBjb25zdHJ1Y3QgaXMgZGVmaW5lZCBpbiB0aGUgVUVGSSAyLjAgc3BlY2lmaWNhdGlvbiBpdCBtdXN0IGJlIGluY2x1ZGVkDQogIGJ5IHRoaXMgaW5jbHVkZSBmaWxlLg0KICANCiAgQ29weXJpZ2h0IChjKSAyMDA2LCBJbnRlbCBDb3Jwb3JhdGlvbg0KICBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQogIGFyZSBsaWNlbnNlZCBhbmQgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBCU0QgTGljZW5zZQ0KICB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbi4gIFRoZSBmdWxsIHRleHQgb2YgdGhlIGxpY2Vuc2UgbWF5IGJlIGZvdW5kIGF0DQogIGh0dHA6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHANCiAgDQogIFRIRSBQUk9HUkFNIElTIERJU1RSSUJVVEVEIFVOREVSIFRIRSBCU0QgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLA0KICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgUkVQUkVTRU5UQVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELg0KICANCiAgTW9kdWxlIE5hbWU6ICAgIFVlZmlTcGVjLmgNCiAgDQoqKi8NCg0KI2lmbmRlZiBfX1VFRklfU1BFQ19IX18NCiNkZWZpbmUgX19VRUZJX1NQRUNfSF9fDQoNCiNpbmNsdWRlIDxDb21tb24vTXVsdGlQaGFzZS5oPg0KDQovLw0KLy8gRUZJIERhdGEgVHlwZXMgZGVyaXZlZCBmcm9tIG90aGVyIEVGSSBkYXRhIHR5cGVzLg0KLy8NCiNkZWZpbmUgTlVMTF9IQU5ETEUgKChWT0lEICopIDApDQoNCnR5cGVkZWYgVk9JRCAgKkVGSV9FVkVOVDsNCnR5cGVkZWYgVUlOVE4gRUZJX1RQTDsNCg0KLy8NCi8vIE5ldHdvcmtpbmcNCi8vDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQ4IEFkZHJbNF07DQp9IEVGSV9JUHY0X0FERFJFU1M7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDggQWRkclsxNl07DQp9IEVGSV9JUHY2X0FERFJFU1M7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDggQWRkclszMl07DQp9IEVGSV9NQUNfQUREUkVTUzsNCg0KdHlwZWRlZiB1bmlvbiB7DQogIFVJTlQzMiAgICAgICAgICAgIEFkZHJbNF07DQogIEVGSV9JUHY0X0FERFJFU1MgIHY0Ow0KICBFRklfSVB2Nl9BRERSRVNTICB2NjsNCn0gRUZJX0lQX0FERFJFU1M7DQoNCg0KdHlwZWRlZiBlbnVtIHsNCiAgQWxsb2NhdGVBbnlQYWdlcywNCiAgQWxsb2NhdGVNYXhBZGRyZXNzLA0KICBBbGxvY2F0ZUFkZHJlc3MsDQogIE1heEFsbG9jYXRlVHlwZQ0KfSBFRklfQUxMT0NBVEVfVFlQRTsNCg0KDQovLw0KLy8gcG9zc2libGUgY2FjaGluZyB0eXBlcyBmb3IgdGhlIG1lbW9yeSByYW5nZQ0KLy8NCiNkZWZpbmUgRUZJX01FTU9SWV9VQyAgIDB4MDAwMDAwMDAwMDAwMDAwMVVMTA0KI2RlZmluZSBFRklfTUVNT1JZX1dDICAgMHgwMDAwMDAwMDAwMDAwMDAyVUxMDQojZGVmaW5lIEVGSV9NRU1PUllfV1QgICAweDAwMDAwMDAwMDAwMDAwMDRVTEwNCiNkZWZpbmUgRUZJX01FTU9SWV9XQiAgIDB4MDAwMDAwMDAwMDAwMDAwOFVMTA0KI2RlZmluZSBFRklfTUVNT1JZX1VDRSAgMHgwMDAwMDAwMDAwMDAwMDEwVUxMDQoNCi8vDQovLyBwaHlzaWNhbCBtZW1vcnkgcHJvdGVjdGlvbiBvbiByYW5nZQ0KLy8NCiNkZWZpbmUgRUZJX01FTU9SWV9XUCAweDAwMDAwMDAwMDAwMDEwMDBVTEwNCiNkZWZpbmUgRUZJX01FTU9SWV9SUCAweDAwMDAwMDAwMDAwMDIwMDBVTEwNCiNkZWZpbmUgRUZJX01FTU9SWV9YUCAweDAwMDAwMDAwMDAwMDQwMDBVTEwNCg0KLy8NCi8vIHJhbmdlIHJlcXVpcmVzIGEgcnVudGltZSBtYXBwaW5nDQovLw0KI2RlZmluZSBFRklfTUVNT1JZX1JVTlRJTUUgIDB4ODAwMDAwMDAwMDAwMDAwMFVMTA0KDQp0eXBlZGVmIFVJTlQ2NCAgRUZJX1ZJUlRVQUxfQUREUkVTUzsNCg0KI2RlZmluZSBFRklfTUVNT1JZX0RFU0NSSVBUT1JfVkVSU0lPTiAxDQp0eXBlZGVmIHN0cnVjdCB7DQogIFVJTlQzMiAgICAgICAgICAgICAgICBUeXBlOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgUGFkOw0KICBFRklfUEhZU0lDQUxfQUREUkVTUyAgUGh5c2ljYWxTdGFydDsNCiAgRUZJX1ZJUlRVQUxfQUREUkVTUyAgIFZpcnR1YWxTdGFydDsNCiAgVUlOVDY0ICAgICAgICAgICAgICAgIE51bWJlck9mUGFnZXM7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICBBdHRyaWJ1dGU7DQp9IEVGSV9NRU1PUllfREVTQ1JJUFRPUjsNCg0KLy8NCi8vICBFRklfRklFTERfT0ZGU0VUIC0gcmV0dXJucyB0aGUgYnl0ZSBvZmZzZXQgdG8gYSBmaWVsZCB3aXRoaW4gYSBzdHJ1Y3R1cmUNCi8vDQojZGVmaW5lIEVGSV9GSUVMRF9PRkZTRVQoVFlQRSxGaWVsZCkgKChVSU5UTikoJigoKFRZUEUgKikgMCktPkZpZWxkKSkpDQoNCiNpbmNsdWRlIDxQcm90b2NvbC9EZXZpY2VQYXRoLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvU2ltcGxlVGV4dEluLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvU2ltcGxlVGV4dE91dC5oPg0KDQovLw0KLy8gRGVjbGFyZSBmb3J3YXJkIHJlZmVyZW5jZWQgZGF0YSBzdHJ1Y3R1cmVzDQovLw0KdHlwZWRlZiBzdHJ1Y3QgX0VGSV9TWVNURU1fVEFCTEUgICBFRklfU1lTVEVNX1RBQkxFOw0KDQovKioNCiAgQWxsb2NhdGVzIG1lbW9yeSBwYWdlcyBmcm9tIHRoZSBzeXN0ZW0uDQogIA0KICBAcGFyYW0gIFR5cGUgICAgICAgIFRoZSB0eXBlIG9mIGFsbG9jYXRpb24gdG8gcGVyZm9ybS4NCiAgQHBhcmFtICBNZW1vcnlUeXBlICBUaGUgdHlwZSBvZiBtZW1vcnkgdG8gYWxsb2NhdGUuDQogIEBwYXJhbSAgUGFnZXMgICAgICAgVGhlIG51bWJlciBvZiBjb250aWd1b3VzIDQgS0IgcGFnZXMgdG8gYWxsb2NhdGUuDQogIEBwYXJhbSAgTWVtb3J5ICAgICAgUG9pbnRlciB0byBhIHBoeXNpY2FsIGFkZHJlc3MuIE9uIGlucHV0LCB0aGUgd2F5IGluIHdoaWNoIHRoZSBhZGRyZXNzIGlzDQogICAgICAgICAgICAgICAgICAgICAgdXNlZCBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiBUeXBlLiAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIHBhZ2VzIHdlcmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAxKSBUeXBlIGlzIG5vdCBBbGxvY2F0ZUFueVBhZ2VzIG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlTWF4QWRkcmVzcyBvciBBbGxvY2F0ZUFkZHJlc3MuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIE1lbW9yeVR5cGUgaXMgaW4gdGhlIHJhbmdlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVmaU1heE1lbW9yeVR5cGUuLjB4N0ZGRkZGRkYuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSBwYWdlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBUaGUgcmVxdWVzdGVkIHBhZ2VzIGNvdWxkIG5vdCBiZSBmb3VuZC4NCiAgICAgICAgICAgICAgICAgICAgIA0KKiovICAgICAgICAgICAgICAgICAgDQp0eXBlZGVmICAgICAgICAgICAgICANCkVGSV9TVEFUVVMgICAgICAgICAgIA0KKEVGSUFQSSAqRUZJX0FMTE9DQVRFX1BBR0VTKSAoDQogIElOICAgICBFRklfQUxMT0NBVEVfVFlQRSAgICAgICAgICAgIFR5cGUsDQogIElOICAgICBFRklfTUVNT1JZX1RZUEUgICAgICAgICAgICAgIE1lbW9yeVR5cGUsDQogIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VzLA0KICBJTiBPVVQgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAqTWVtb3J5DQogICk7DQoNCi8qKg0KICBGcmVlcyBtZW1vcnkgcGFnZXMuDQogICAgDQogIEBwYXJhbSAgTWVtb3J5ICAgICAgVGhlIGJhc2UgcGh5c2ljYWwgYWRkcmVzcyBvZiB0aGUgcGFnZXMgdG8gYmUgZnJlZWQuDQogIEBwYXJhbSAgUGFnZXMgICAgICAgVGhlIG51bWJlciBvZiBjb250aWd1b3VzIDQgS0IgcGFnZXMgdG8gZnJlZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJlcXVlc3RlZCBwYWdlcyB3ZXJlIGZyZWVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBNZW1vcnkgaXMgbm90IGEgcGFnZS1hbGlnbmVkIGFkZHJlc3Mgb3IgUGFnZXMgaXMgaW52YWxpZC4gICAgDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSByZXF1ZXN0ZWQgbWVtb3J5IHBhZ2VzIHdlcmUgbm90IGFsbG9jYXRlZCB3aXRoDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG9jYXRlUGFnZXMoKS4NCiAgICAgICAgICAgICAgICAgICAgIA0KKiovICAgICAgICAgIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0ZSRUVfUEFHRVMpICgNCiAgSU4gIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgTWVtb3J5LA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBQYWdlcw0KICApOw0KDQovKioNCiAgUmV0dXJucyB0aGUgY3VycmVudCBtZW1vcnkgbWFwLg0KICAgIA0KICBAcGFyYW0gIE1lbW9yeU1hcFNpemUgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgTWVtb3J5TWFwIGJ1ZmZlci4NCiAgQHBhcmFtICBNZW1vcnlNYXAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgaW4gd2hpY2ggZmlybXdhcmUgcGxhY2VzIHRoZSBjdXJyZW50IG1lbW9yeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAuDQogIEBwYXJhbSAgTWFwS2V5ICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbG9jYXRpb24gaW4gd2hpY2ggZmlybXdhcmUgcmV0dXJucyB0aGUga2V5IGZvciB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCBtZW1vcnkgbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERlc2NyaXB0b3JTaXplICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHdoaWNoIGZpcm13YXJlIHJldHVybnMgdGhlIHNpemUsIGluIGJ5dGVzLCBvZg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBpbmRpdmlkdWFsIEVGSV9NRU1PUllfREVTQ1JJUFRPUi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIERlc2NyaXB0b3JWZXJzaW9uICAgICBBIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIGluIHdoaWNoIGZpcm13YXJlIHJldHVybnMgdGhlIHZlcnNpb24gbnVtYmVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgRUZJX01FTU9SWV9ERVNDUklQVE9SLiANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBtZW1vcnkgbWFwIHdhcyByZXR1cm5lZCBpbiB0aGUgTWVtb3J5TWFwIGJ1ZmZlci4NCiAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIE1lbW9yeU1hcCBidWZmZXIgd2FzIHRvbyBzbWFsbC4gVGhlIGN1cnJlbnQgYnVmZmVyIHNpemUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIGhvbGQgdGhlIG1lbW9yeSBtYXAgaXMgcmV0dXJuZWQgaW4gTWVtb3J5TWFwU2l6ZS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgMSkgTWVtb3J5TWFwU2l6ZSBpcyBOVUxMLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBUaGUgTWVtb3J5TWFwIGJ1ZmZlciBpcyBub3QgdG9vIHNtYWxsIGFuZCBNZW1vcnlNYXAgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICANCioqLyAgICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9HRVRfTUVNT1JZX01BUCkgKA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpNZW1vcnlNYXBTaXplLA0KICBJTiBPVVQgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICAgICpNZW1vcnlNYXAsDQogIE9VVCAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgKk1hcEtleSwNCiAgT1VUICAgIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAqRGVzY3JpcHRvclNpemUsDQogIE9VVCAgICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgKkRlc2NyaXB0b3JWZXJzaW9uDQogICk7DQoNCiNkZWZpbmUgTmV4dE1lbW9yeURlc2NyaXB0b3IoX1B0ciwgX1NpemUpICAgKChFRklfTUVNT1JZX0RFU0NSSVBUT1IgKikgKCgoVUlOVDggKikgKF9QdHIpKSArIChfU2l6ZSkpKQ0KI2RlZmluZSBORVhUX01FTU9SWV9ERVNDUklQVE9SKF9QdHIsIF9TaXplKSBOZXh0TWVtb3J5RGVzY3JpcHRvciAoX1B0ciwgX1NpemUpDQoNCi8qKg0KICBBbGxvY2F0ZXMgcG9vbCBtZW1vcnkuDQogICAgDQogIEBwYXJhbSAgUG9vbFR5cGUgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHBvb2wgdG8gYWxsb2NhdGUuDQogIEBwYXJhbSAgU2l6ZSAgICAgICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYWxsb2NhdGUgZnJvbSB0aGUgcG9vbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEJ1ZmZlciAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyIGlmIHRoZSBjYWxsIHN1Y2NlZWRzOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgcmVxdWVzdGVkIG51bWJlciBvZiBieXRlcyB3YXMgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGUgcG9vbCByZXF1ZXN0ZWQgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBQb29sVHlwZSB3YXMgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgDQoqKi8gICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfQUxMT0NBVEVfUE9PTCkgKA0KICBJTiAgRUZJX01FTU9SWV9UWVBFICAgICAgICAgICAgICBQb29sVHlwZSwNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSwNCiAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKipCdWZmZXINCiAgKTsNCg0KLyoqDQogIFJldHVybnMgcG9vbCBtZW1vcnkgdG8gdGhlIHN5c3RlbS4NCiAgICANCiAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZyZWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG1lbW9yeSB3YXMgcmV0dXJuZWQgdG8gdGhlIHN5c3RlbS4gIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBCdWZmZXIgd2FzIGludmFsaWQuDQogICAgICAgICAgICAgICAgICAgICANCioqLyAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9GUkVFX1BPT0wpICgNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkJ1ZmZlcg0KICApOw0KDQovKioNCiAgQ2hhbmdlcyB0aGUgcnVudGltZSBhZGRyZXNzaW5nIG1vZGUgb2YgRUZJIGZpcm13YXJlIGZyb20gcGh5c2ljYWwgdG8gdmlydHVhbC4NCiAgICANCiAgQHBhcmFtICBNZW1vcnlNYXBTaXplICAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgVmlydHVhbE1hcC4NCiAgQHBhcmFtICBEZXNjcmlwdG9yU2l6ZSAgICAgICAgVGhlIHNpemUgaW4gYnl0ZXMgb2YgYW4gZW50cnkgaW4gdGhlIFZpcnR1YWxNYXAuDQogIEBwYXJhbSAgRGVzY3JpcHRvclZlcnNpb24gICAgIFRoZSB2ZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUgZW50cmllcyBpbiBWaXJ0dWFsTWFwLg0KICBAcGFyYW0gIFZpcnR1YWxNYXAgICAgICAgICAgICBBbiBhcnJheSBvZiBtZW1vcnkgZGVzY3JpcHRvcnMgd2hpY2ggY29udGFpbiBuZXcgdmlydHVhbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hcHBpbmcgaW5mb3JtYXRpb24gZm9yIGFsbCBydW50aW1lIHJhbmdlcy4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSB2aXJ0dWFsIGFkZHJlc3MgbWFwIGhhcyBiZWVuIGFwcGxpZWQuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEVGSSBmaXJtd2FyZSBpcyBub3QgYXQgcnVudGltZSwgb3IgdGhlIEVGSSBmaXJtd2FyZSBpcyBhbHJlYWR5IGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgYWRkcmVzcyBtYXBwZWQgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIERlc2NyaXB0b3JTaXplIG9yIERlc2NyaXB0b3JWZXJzaW9uIGlzIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX05PX01BUFBJTkcgICAgICAgIEEgdmlydHVhbCBhZGRyZXNzIHdhcyBub3Qgc3VwcGxpZWQgZm9yIGEgcmFuZ2UgaW4gdGhlIG1lbW9yeQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXAgdGhhdCByZXF1aXJlcyBhIG1hcHBpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgQSB2aXJ0dWFsIGFkZHJlc3Mgd2FzIHN1cHBsaWVkIGZvciBhbiBhZGRyZXNzIHRoYXQgaXMgbm90IGZvdW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBtZW1vcnkgbWFwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU0VUX1ZJUlRVQUxfQUREUkVTU19NQVApICgNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5TWFwU2l6ZSwNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclNpemUsDQogIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JWZXJzaW9uLA0KICBJTiAgRUZJX01FTU9SWV9ERVNDUklQVE9SICAgICAgICAqVmlydHVhbE1hcA0KICApOw0KDQovKioNCiAgQ29ubmVjdHMgb25lIG9yIG1vcmUgZHJpdmVycyB0byBhIGNvbnRyb2xsZXIuDQogICAgDQogIEBwYXJhbSAgQ29udHJvbGxlckhhbmRsZSAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGNvbnRyb2xsZXIgdG8gd2hpY2ggZHJpdmVyKHMpIGFyZSB0byBiZSBjb25uZWN0ZWQuDQogIEBwYXJhbSAgRHJpdmVySW1hZ2VIYW5kbGUgICAgIEEgcG9pbnRlciB0byBhbiBvcmRlcmVkIGxpc3QgaGFuZGxlcyB0aGF0IHN1cHBvcnQgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGSV9EUklWRVJfQklORElOR19QUk9UT0NPTC4gICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgUmVtYWluaW5nRGV2aWNlUGF0aCAgIEEgcG9pbnRlciB0byB0aGUgZGV2aWNlIHBhdGggdGhhdCBzcGVjaWZpZXMgYSBjaGlsZCBvZiB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciBzcGVjaWZpZWQgYnkgQ29udHJvbGxlckhhbmRsZS4gICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFJlY3Vyc2l2ZSAgICAgICAgICAgICBJZiBUUlVFLCB0aGVuIENvbm5lY3RDb250cm9sbGVyKCkgaXMgY2FsbGVkIHJlY3Vyc2l2ZWx5ICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVudGlsIHRoZSBlbnRpcmUgdHJlZSBvZiBjb250cm9sbGVycyBiZWxvdyB0aGUgY29udHJvbGxlciBzcGVjaWZpZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgQ29udHJvbGxlckhhbmRsZSBoYXZlIGJlZW4gY3JlYXRlZC4gSWYgRkFMU0UsIHRoZW4gICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJlZSBvZiBjb250cm9sbGVycyBpcyBvbmx5IGV4cGFuZGVkIG9uZSBsZXZlbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIDEpIE9uZSBvciBtb3JlIGRyaXZlcnMgd2VyZSBjb25uZWN0ZWQgdG8gQ29udHJvbGxlckhhbmRsZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMikgTm8gZHJpdmVycyB3ZXJlIGNvbm5lY3RlZCB0byBDb250cm9sbGVySGFuZGxlLCBidXQgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYWluaW5nRGV2aWNlUGF0aCBpcyBub3QgTlVMTCwgYW5kIGl0IGlzIGFuIEVuZCBEZXZpY2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBOb2RlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDb250cm9sbGVySGFuZGxlIGlzIG5vdCBhIHZhbGlkIEVGSV9IQU5ETEUuICAgICAgIA0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICAxKSBUaGVyZSBhcmUgbm8gRUZJX0RSSVZFUl9CSU5ESU5HX1BST1RPQ09MIGluc3RhbmNlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50IGluIHRoZSBzeXN0ZW0uICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyKSBObyBkcml2ZXJzIHdlcmUgY29ubmVjdGVkIHRvIENvbnRyb2xsZXJIYW5kbGUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0NPTk5FQ1RfQ09OVFJPTExFUikgKA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlckhhbmRsZSwNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICpEcml2ZXJJbWFnZUhhbmRsZSwgICBPUFRJT05BTA0KICBJTiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgKlJlbWFpbmluZ0RldmljZVBhdGgsIE9QVElPTkFMDQogIElOICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnNpdmUNCiAgKTsNCg0KLyoqDQogIERpc2Nvbm5lY3RzIG9uZSBvciBtb3JlIGRyaXZlcnMgZnJvbSBhIGNvbnRyb2xsZXIuDQogICAgDQogIEBwYXJhbSAgQ29udHJvbGxlckhhbmRsZSAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGNvbnRyb2xsZXIgZnJvbSB3aGljaCBkcml2ZXIocykgYXJlIHRvIGJlIGRpc2Nvbm5lY3RlZC4NCiAgQHBhcmFtICBEcml2ZXJJbWFnZUhhbmRsZSAgICAgVGhlIGRyaXZlciB0byBkaXNjb25uZWN0IGZyb20gQ29udHJvbGxlckhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIENoaWxkSGFuZGxlICAgICAgICAgICBUaGUgaGFuZGxlIG9mIHRoZSBjaGlsZCB0byBkZXN0cm95LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICAxKSBPbmUgb3IgbW9yZSBkcml2ZXJzIHdlcmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIGNvbnRyb2xsZXIuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIE9uIGVudHJ5LCBubyBkcml2ZXJzIGFyZSBtYW5hZ2luZyBDb250cm9sbGVySGFuZGxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzKSBEcml2ZXJJbWFnZUhhbmRsZSBpcyBub3QgTlVMTCwgYW5kIG9uIGVudHJ5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyaXZlckltYWdlSGFuZGxlIGlzIG5vdCBtYW5hZ2luZyBDb250cm9sbGVySGFuZGxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yZSBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGFyZSBub3QgZW5vdWdoIHJlc291cmNlcyBhdmFpbGFibGUgdG8gZGlzY29ubmVjdCBhbnkgZHJpdmVycyBmcm9tDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSBjb250cm9sbGVyIGNvdWxkIG5vdCBiZSBkaXNjb25uZWN0ZWQgYmVjYXVzZSBvZiBhIGRldmljZSBlcnJvci4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLyANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9ESVNDT05ORUNUX0NPTlRST0xMRVIpICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlLA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgIERyaXZlckltYWdlSGFuZGxlLCBPUFRJT05BTA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgIENoaWxkSGFuZGxlICAgICAgICBPUFRJT05BTA0KICApOw0KDQovLw0KLy8gQ29udmVydFBvaW50ZXIgRGVidWdEaXNwb3NpdGlvbiB0eXBlLg0KLy8NCiNkZWZpbmUgRUZJX09QVElPTkFMX1BUUiAgICAgMHgwMDAwMDAwMQ0KI2RlZmluZSBFRklfT1BUSU9OQUxfUE9JTlRFUiBFRklfT1BUSU9OQUxfUFRSDQoNCi8qKg0KICBEZXRlcm1pbmVzIHRoZSBuZXcgdmlydHVhbCBhZGRyZXNzIHRoYXQgaXMgdG8gYmUgdXNlZCBvbiBzdWJzZXF1ZW50IG1lbW9yeSBhY2Nlc3Nlcy4NCiAgICANCiAgQHBhcmFtICBEZWJ1Z0Rpc3Bvc2l0aW9uICAgICAgU3VwcGxpZXMgdHlwZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHBvaW50ZXIgYmVpbmcgY29udmVydGVkLg0KICBAcGFyYW0gIEFkZHJlc3MgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRoYXQgaXMgdG8gYmUgZml4ZWQgdG8gYmUgdGhlIHZhbHVlIG5lZWRlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIG5ldyB2aXJ0dWFsIGFkZHJlc3MgbWFwcGluZ3MgYmVpbmcgYXBwbGllZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwb2ludGVyIHBvaW50ZWQgdG8gYnkgQWRkcmVzcyB3YXMgbW9kaWZpZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAxKSBBZGRyZXNzIGlzIE5VTEwuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpICpBZGRyZXNzIGlzIE5VTEwgYW5kIERlYnVnRGlzcG9zaXRpb24gZG9lcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgaGF2ZSB0aGUgRUZJX09QVElPTkFMX1BUUiBiaXQgc2V0LiAgICANCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIHBvaW50ZXIgcG9pbnRlZCB0byBieSBBZGRyZXNzIHdhcyBub3QgZm91bmQgdG8gYmUgcGFydA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgY3VycmVudCBtZW1vcnkgbWFwLiBUaGlzIGlzIG5vcm1hbGx5IGZhdGFsLiAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfQ09OVkVSVF9QT0lOVEVSKSAoDQogIElOICAgICBVSU5UTiAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z0Rpc3Bvc2l0aW9uLA0KICBJTiBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgKipBZGRyZXNzDQogICk7DQoNCi8vDQovLyBFRkkgRXZlbnQgVHlwZXMgKG5hbWUgZGVmaW5lZCBpbiBzcGVjKQ0KLy8NCiNkZWZpbmUgRVZFTlRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwMDAwMDANCiNkZWZpbmUgRVZFTlRfUlVOVElNRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAwMDAwMDANCiNkZWZpbmUgRVZFTlRfUlVOVElNRV9DT05URVhUICAgICAgICAgICAgICAgICAgIDB4MjAwMDAwMDANCg0KI2RlZmluZSBFVkVOVF9OT1RJRllfV0FJVCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDEwMA0KI2RlZmluZSBFVkVOVF9OT1RJRllfU0lHTkFMICAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDIwMA0KDQojZGVmaW5lIEVWRU5UX1NJR05BTF9FWElUX0JPT1RfU0VSVklDRVMgICAgICAgICAweDAwMDAwMjAxDQojZGVmaW5lIEVWRU5UX1NJR05BTF9WSVJUVUFMX0FERFJFU1NfQ0hBTkdFICAgICAweDYwMDAwMjAyDQoNCiNpZiAoKEVES19SRUxFQVNFX1ZFUlNJT04gIT0gMCkgJiYgKEVGSV9TUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPCAweDAwMDIwMDAwKSkNCi8vDQovLyBQcmlvciB0byBVRUZJIDIuMCBUaWFubyBleHRlbmRlZCB0aGVzZSBlbnVtcy4gVGhpcyB3YXMgcmVwbGFjZWQgYnkNCi8vIENyZWF0ZUV2ZW50RXgoKSBFdmVudCBHcm91cHMgaW4gVUVGSSAyLjANCi8vDQojZGVmaW5lIEVGSV9FVkVOVF9OT1RJRllfU0lHTkFMX0FMTCAgICAgMHgwMDAwMDQwMA0KDQojZGVmaW5lIEVGSV9FVkVOVF9TSUdOQUxfUkVBRFlfVE9fQk9PVCAgMHgwMDAwMDIwMw0KI2RlZmluZSBFRklfRVZFTlRfU0lHTkFMX0xFR0FDWV9CT09UICAgIDB4MDAwMDAyMDQNCg0KI2VuZGlmDQoNCi8vDQovLyBFRkkgRXZlbnQgVHlwZXMgKG5hbWUgZm9sbG93aW5nIGNvZGluZyBzdHlsZSkNCi8vDQojZGVmaW5lIEVGSV9FVkVOVF9USU1FUiAgICAgICAgICAgICAgICAgICAgICAgICBFVkVOVF9USU1FUg0KI2RlZmluZSBFRklfRVZFTlRfUlVOVElNRSAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfUlVOVElNRQ0KI2RlZmluZSBFRklfRVZFTlRfUlVOVElNRV9DT05URVhUICAgICAgICAgICAgICAgRVZFTlRfUlVOVElNRV9DT05URVhUDQoNCiNkZWZpbmUgRUZJX0VWRU5UX05PVElGWV9XQUlUICAgICAgICAgICAgICAgICAgIEVWRU5UX05PVElGWV9XQUlUDQojZGVmaW5lIEVGSV9FVkVOVF9OT1RJRllfU0lHTkFMICAgICAgICAgICAgICAgICBFVkVOVF9OT1RJRllfU0lHTkFMDQoNCiNkZWZpbmUgRUZJX0VWRU5UX1NJR05BTF9FWElUX0JPT1RfU0VSVklDRVMgICAgIEVWRU5UX1NJR05BTF9FWElUX0JPT1RfU0VSVklDRVMNCiNkZWZpbmUgRUZJX0VWRU5UX1NJR05BTF9WSVJUVUFMX0FERFJFU1NfQ0hBTkdFIEVWRU5UX1NJR05BTF9WSVJUVUFMX0FERFJFU1NfQ0hBTkdFDQoNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEludm9rZSBhIG5vdGlmaWNhdGlvbiBldmVudA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIEV2ZW50IHdob3NlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbiBpcyBiZWluZyBpbnZva2VkLg0KICBAcGFyYW0gIENvbnRleHQgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb26hr3MgY29udGV4dCwgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIGltcGxlbWVudGF0aW9uLWRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnR5cGVkZWYNClZPSUQNCihFRklBUEkgKkVGSV9FVkVOVF9OT1RJRlkpICgNCiAgSU4gIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAqQ29udGV4dA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQ3JlYXRlcyBhbiBldmVudC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFR5cGUgICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiBldmVudCB0byBjcmVhdGUgYW5kIGl0cyBtb2RlIGFuZCBhdHRyaWJ1dGVzLg0KICBAcGFyYW0gIE5vdGlmeVRwbCAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb26hr3MgY29udGV4dC4NCiAgQHBhcmFtICBOb3RpZnlGdW5jdGlvbiAgICAgICAgUG9pbnRlciB0byB0aGUgZXZlbnShr3Mgbm90aWZpY2F0aW9uIGZ1bmN0aW9uLCBpZiBhbnkuICANCiAgQHBhcmFtICBOb3RpZnlDb250ZXh0ICAgICAgICAgUG9pbnRlciB0byB0aGUgbm90aWZpY2F0aW9uIGZ1bmN0aW9uoa9zIGNvbnRleHQ7IGNvcnJlc3BvbmRzIHRvIHBhcmFtZXRlcg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0IGluIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEV2ZW50ICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBuZXdseSBjcmVhdGVkIGV2ZW50IGlmIHRoZSBjYWxsIHN1Y2NlZWRzOyB1bmRlZmluZWQgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBldmVudCBzdHJ1Y3R1cmUgd2FzIGNyZWF0ZWQuICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlIGV2ZW50IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuDQogIA0KKiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9DUkVBVEVfRVZFTlQpICgNCiAgSU4gIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgVHlwZSwNCiAgSU4gIEVGSV9UUEwgICAgICAgICAgICAgICAgICAgICAgTm90aWZ5VHBsLA0KICBJTiAgRUZJX0VWRU5UX05PVElGWSAgICAgICAgICAgICBOb3RpZnlGdW5jdGlvbiwNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKk5vdGlmeUNvbnRleHQsDQogIE9VVCBFRklfRVZFTlQgICAgICAgICAgICAgICAgICAgICpFdmVudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQ3JlYXRlcyBhbiBldmVudCBpbiBhIGdyb3VwLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVHlwZSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGV2ZW50IHRvIGNyZWF0ZSBhbmQgaXRzIG1vZGUgYW5kIGF0dHJpYnV0ZXMuDQogIEBwYXJhbSAgTm90aWZ5VHBsICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbqGvcyBjb250ZXh0Lg0KICBAcGFyYW0gIE5vdGlmeUZ1bmN0aW9uICAgICAgICBQb2ludGVyIHRvIHRoZSBldmVudKGvcyBub3RpZmljYXRpb24gZnVuY3Rpb24sIGlmIGFueS4gIA0KICBAcGFyYW0gIE5vdGlmeUNvbnRleHQgICAgICAgICBQb2ludGVyIHRvIHRoZSBub3RpZmljYXRpb24gZnVuY3Rpb26hr3MgY29udGV4dDsgY29ycmVzcG9uZHMgdG8gcGFyYW1ldGVyDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgaW4gdGhlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbi4gICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnRHcm91cCAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBncm91cCB0byB3aGljaCB0aGlzIGV2ZW50IGJlbG9uZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBFdmVudCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbmV3bHkgY3JlYXRlZCBldmVudCBpZiB0aGUgY2FsbCBzdWNjZWVkczsgdW5kZWZpbmVkICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgc3RydWN0dXJlIHdhcyBjcmVhdGVkLiAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZSBldmVudCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICANCioqLyAgICAgICAgICAgICAgICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfQ1JFQVRFX0VWRU5UX0VYKSAoDQogIElOICAgICAgIFVJTlQzMiAgICAgICAgICAgICAgICAgVHlwZSwNCiAgSU4gICAgICAgRUZJX1RQTCAgICAgICAgICAgICAgICBOb3RpZnlUcGwgICAgICBPUFRJT05BTCwNCiAgSU4gICAgICAgRUZJX0VWRU5UX05PVElGWSAgICAgICBOb3RpZnlGdW5jdGlvbiBPUFRJT05BTCwNCiAgSU4gQ09OU1QgVk9JRCAgICAgICAgICAgICAgICAgICAqTm90aWZ5Q29udGV4dCBPUFRJT05BTCwNCiAgSU4gQ09OU1QgRUZJX0dVSUQgICAgICAgICAgICAgICAqRXZlbnRHcm91cCAgICBPUFRJT05BTCwNCiAgT1VUICAgICAgRUZJX0VWRU5UICAgICAgICAgICAgICAqRXZlbnQNCiAgKTsNCg0KdHlwZWRlZiBlbnVtIHsNCiAgVGltZXJDYW5jZWwsDQogIFRpbWVyUGVyaW9kaWMsDQogIFRpbWVyUmVsYXRpdmUNCn0gRUZJX1RJTUVSX0RFTEFZOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFNldHMgdGhlIHR5cGUgb2YgdGltZXIgYW5kIHRoZSB0cmlnZ2VyIHRpbWUgZm9yIGEgdGltZXIgZXZlbnQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSB0aW1lciBldmVudCB0aGF0IGlzIHRvIGJlIHNpZ25hbGVkIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4NCiAgQHBhcmFtICBUeXBlICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgdGltZSB0aGF0IGlzIHNwZWNpZmllZCBpbiBUcmlnZ2VyVGltZS4NCiAgQHBhcmFtICBUcmlnZ2VyVGltZSAgICAgICAgICAgVGhlIG51bWJlciBvZiAxMDBucyB1bml0cyB1bnRpbCB0aGUgdGltZXIgZXhwaXJlcy4gIA0KDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBldmVudCBoYXMgYmVlbiBzZXQgdG8gYmUgc2lnbmFsZWQgYXQgdGhlIHJlcXVlc3RlZCB0aW1lLiAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEV2ZW50IG9yIFR5cGUgaXMgbm90IHZhbGlkLg0KICANCioqLyAgICAgICAgIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1NFVF9USU1FUikgKA0KICBJTiAgRUZJX0VWRU5UICAgICAgICAgICAgICAgIEV2ZW50LA0KICBJTiAgRUZJX1RJTUVSX0RFTEFZICAgICAgICAgIFR5cGUsDQogIElOICBVSU5UNjQgICAgICAgICAgICAgICAgICAgVHJpZ2dlclRpbWUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFNpZ25hbHMgYW4gZXZlbnQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBzaWduYWwuDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGV2ZW50IGhhcyBiZWVuIHNpZ25hbGVkLiAgDQogIA0KKiovICAgICAgICAgICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9TSUdOQUxfRVZFTlQpICgNCiAgSU4gIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU3RvcHMgZXhlY3V0aW9uIHVudGlsIGFuIGV2ZW50IGlzIHNpZ25hbGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE51bWJlck9mRXZlbnRzICAgICAgICBUaGUgbnVtYmVyIG9mIGV2ZW50cyBpbiB0aGUgRXZlbnQgYXJyYXkuDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIEFuIGFycmF5IG9mIEVGSV9FVkVOVC4NCiAgQHBhcmFtICBJbmRleCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5kZXggb2YgdGhlIGV2ZW50IHdoaWNoIHNhdGlzZmllZCB0aGUgd2FpdCBjb25kaXRpb24uDQoNCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGV2ZW50IGluZGljYXRlZCBieSBJbmRleCB3YXMgc2lnbmFsZWQuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIDEpIE51bWJlck9mRXZlbnRzIGlzIDAuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIFRoZSBldmVudCBpbmRpY2F0ZWQgYnkgSW5kZXggaXMgb2YgdHlwZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlRfTk9USUZZX1NJR05BTC4gICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgVGhlIGN1cnJlbnQgVFBMIGlzIG5vdCBUUExfQVBQTElDQVRJT04uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQoqKi8gICAgICAgICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfV0FJVF9GT1JfRVZFTlQpICgNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICBOdW1iZXJPZkV2ZW50cywNCiAgSU4gIEVGSV9FVkVOVCAgICAgICAgICAgICAgICAqRXZlbnQsDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgKkluZGV4DQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDbG9zZXMgYW4gZXZlbnQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBjbG9zZS4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgaGFzIGJlZW4gY2xvc2VkLiAgDQogIA0KKiovICAgICAgICAgICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9DTE9TRV9FVkVOVCkgKA0KICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDaGVja3Mgd2hldGhlciBhbiBldmVudCBpcyBpbiB0aGUgc2lnbmFsZWQgc3RhdGUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRXZlbnQgICAgICAgICAgICAgICAgIFRoZSBldmVudCB0byBjaGVjay4NCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZXZlbnQgaXMgaW4gdGhlIHNpZ25hbGVkIHN0YXRlLg0KICBAcmV0dmFsIEVGSV9OT1RfUkVBRFkgICAgICAgICBUaGUgZXZlbnQgaXMgbm90IGluIHRoZSBzaWduYWxlZCBzdGF0ZS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgRXZlbnQgaXMgb2YgdHlwZSBFVlRfTk9USUZZX1NJR05BTC4NCiAgDQoqKi8gICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9DSEVDS19FVkVOVCkgKA0KICBJTiBFRklfRVZFTlQgICAgICAgICAgICAgICAgRXZlbnQNCiAgKTsNCg0KLy8NCi8vIFRhc2sgcHJpb3JpdHkgbGV2ZWwgKG5hbWUgZGVmaW5lZCBpbiBzcGVjKS4NCi8vDQojZGVmaW5lIFRQTF9BUFBMSUNBVElPTiAgICAgICA0DQojZGVmaW5lIFRQTF9DQUxMQkFDSyAgICAgICAgICA4DQojZGVmaW5lIFRQTF9OT1RJRlkgICAgICAgICAgICAxNg0KI2RlZmluZSBUUExfSElHSF9MRVZFTCAgICAgICAgMzENCg0KLy8NCi8vIFRhc2sgcHJpb3JpdHkgbGV2ZWwgKG5hbWUgZm9sbG93aW5nIGNvZGluZyBzdHlsZSkuDQovLw0KI2RlZmluZSBFRklfVFBMX0FQUExJQ0FUSU9OICAgVFBMX0FQUExJQ0FUSU9ODQojZGVmaW5lIEVGSV9UUExfQ0FMTEJBQ0sgICAgICBUUExfQ0FMTEJBQ0sNCiNkZWZpbmUgRUZJX1RQTF9OT1RJRlkgICAgICAgIFRQTF9OT1RJRlkNCiNkZWZpbmUgRUZJX1RQTF9ISUdIX0xFVkVMICAgIFRQTF9ISUdIX0xFVkVMDQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmFpc2VzIGEgdGFza6GvcyBwcmlvcml0eSBsZXZlbCBhbmQgcmV0dXJucyBpdHMgcHJldmlvdXMgbGV2ZWwuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTmV3VHBsICAgICAgICAgICAgICAgIFRoZSBuZXcgdGFzayBwcmlvcml0eSBsZXZlbC4NCiAgDQogIEByZXR2YWwgICAgICAgICAgICAgICAgICAgICAgIFByZXZpb3VzIHRhc2sgcHJpb3JpdHkgbGV2ZWwgIA0KICANCioqLyAgICAgICAgIA0KdHlwZWRlZg0KRUZJX1RQTA0KKEVGSUFQSSAqRUZJX1JBSVNFX1RQTCkgKA0KICBJTiBFRklfVFBMICAgICAgTmV3VHBsDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmVzdG9yZXMgYSB0YXNroa9zIHByaW9yaXR5IGxldmVsIHRvIGl0cyBwcmV2aW91cyB2YWx1ZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBPbGRUcGwgICAgICAgICAgICAgICAgVGhlIHByZXZpb3VzIHRhc2sgcHJpb3JpdHkgbGV2ZWwgdG8gcmVzdG9yZSAgICANCiAgDQoqKi8gICAgICAgDQp0eXBlZGVmDQpWT0lEDQooRUZJQVBJICpFRklfUkVTVE9SRV9UUEwpICgNCiAgSU4gRUZJX1RQTCAgICAgIE9sZFRwbA0KICApOw0KDQovLw0KLy8gVmFyaWFibGUgYXR0cmlidXRlcw0KLy8NCiNkZWZpbmUgRUZJX1ZBUklBQkxFX05PTl9WT0xBVElMRSAgICAgICAweDAwMDAwMDAxDQojZGVmaW5lIEVGSV9WQVJJQUJMRV9CT09UU0VSVklDRV9BQ0NFU1MgMHgwMDAwMDAwMg0KI2RlZmluZSBFRklfVkFSSUFCTEVfUlVOVElNRV9BQ0NFU1MgICAgIDB4MDAwMDAwMDQNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXR1cm5zIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFZhcmlhYmxlTmFtZSAgICAgICAgICBBIE51bGwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZW5kb3Khr3MgdmFyaWFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFZlbmRvckd1aWQgICAgICAgICAgICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdmVuZG9yLiAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgIElmIG5vdCBOVUxMLCBhIHBvaW50ZXIgdG8gdGhlIG1lbW9yeSBsb2NhdGlvbiB0byByZXR1cm4gdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgYml0bWFzayBmb3IgdGhlIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YVNpemUgICAgICAgICAgICAgIE9uIGlucHV0LCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmV0dXJuIERhdGEgYnVmZmVyLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbiBvdXRwdXQgdGhlIHNpemUgb2YgZGF0YSByZXR1cm5lZCBpbiBEYXRhLiAgICAgICAgICANCiAgQHBhcmFtICBEYXRhICAgICAgICAgICAgICAgICAgVGhlIGJ1ZmZlciB0byByZXR1cm4gdGhlIGNvbnRlbnRzIG9mIHRoZSB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGZ1bmN0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLg0KICBAcmV0dmFsIEVGSV9CVUZGRVJfVE9PX1NNQUxMICBUaGUgRGF0YVNpemUgaXMgdG9vIHNtYWxsIGZvciB0aGUgcmVzdWx0Lg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdmFyaWFibGUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4NCiAgDQoqKi8gICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9HRVRfVkFSSUFCTEUpICgNCiAgSU4gICAgIENIQVIxNiAgICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLA0KICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkLA0KICBPVVQgICAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICpBdHRyaWJ1dGVzLCAgICBPUFRJT05BTA0KICBJTiBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpEYXRhU2l6ZSwNCiAgT1VUICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAqRGF0YQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEVudW1lcmF0ZXMgdGhlIGN1cnJlbnQgdmFyaWFibGUgbmFtZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVmFyaWFibGVOYW1lU2l6ZSAgICAgIFRoZSBzaXplIG9mIHRoZSBWYXJpYWJsZU5hbWUgYnVmZmVyLg0KICBAcGFyYW0gIFZhcmlhYmxlTmFtZSAgICAgICAgICBPbiBpbnB1dCwgc3VwcGxpZXMgdGhlIGxhc3QgVmFyaWFibGVOYW1lIHRoYXQgd2FzIHJldHVybmVkICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgR2V0TmV4dFZhcmlhYmxlTmFtZSgpLiBPbiBvdXRwdXQsIHJldHVybnMgdGhlIE51bGx0ZXJtaW5hdGVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBjdXJyZW50IHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFZlbmRvckd1aWQgICAgICAgICAgICBPbiBpbnB1dCwgc3VwcGxpZXMgdGhlIGxhc3QgVmVuZG9yR3VpZCB0aGF0IHdhcyByZXR1cm5lZCBieQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXROZXh0VmFyaWFibGVOYW1lKCkuIE9uIG91dHB1dCwgcmV0dXJucyB0aGUgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3JHdWlkIG9mIHRoZSBjdXJyZW50IHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgVGhlIG5leHQgdmFyaWFibGUgd2FzIG5vdCBmb3VuZC4NCiAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIFZhcmlhYmxlTmFtZVNpemUgaXMgdG9vIHNtYWxsIGZvciB0aGUgcmVzdWx0Lg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdmFyaWFibGUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4NCiAgDQoqKi8gICAgICAgIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUpICgNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lU2l6ZSwNCiAgSU4gT1VUIENIQVIxNiAgICAgICAgICAgICAgICAgICAqVmFyaWFibGVOYW1lLA0KICBJTiBPVVQgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFNldHMgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVmFyaWFibGVOYW1lICAgICAgICAgIEEgTnVsbC10ZXJtaW5hdGVkIFVuaWNvZGUgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvcqGvcyB2YXJpYWJsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVmVuZG9yR3VpZCAgICAgICAgICAgIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSB2ZW5kb3IuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBBdHRyaWJ1dGVzICAgICAgICAgICAgQXR0cmlidXRlcyBiaXRtYXNrIHRvIHNldCBmb3IgdGhlIHZhcmlhYmxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGF0YVNpemUgICAgICAgICAgICAgIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBEYXRhIGJ1ZmZlci4NCiAgQHBhcmFtICBEYXRhICAgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnRzIGZvciB0aGUgdmFyaWFibGUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgZmlybXdhcmUgaGFzIHN1Y2Nlc3NmdWxseSBzdG9yZWQgdGhlIHZhcmlhYmxlIGFuZCBpdHMgZGF0YSBhcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkIGJ5IHRoZSBBdHRyaWJ1dGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9XUklURV9QUk9URUNURUQgICBUaGUgdmFyaWFibGUgaW4gcXVlc3Rpb24gaXMgcmVhZC1vbmx5Lg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBOb3QgZW5vdWdoIHN0b3JhZ2UgaXMgYXZhaWxhYmxlIHRvIGhvbGQgdGhlIHZhcmlhYmxlIGFuZCBpdHMgZGF0YS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIFRoZSB2YXJpYWJsZSBjb3VsZCBub3QgYmUgcmV0cmlldmVkIGR1ZSB0byBhIGhhcmR3YXJlIGVycm9yLiAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU0VUX1ZBUklBQkxFKSAoDQogIElOICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpWYXJpYWJsZU5hbWUsDQogIElOICBFRklfR1VJRCAgICAgICAgICAgICAgICAgICAgICpWZW5kb3JHdWlkLA0KICBJTiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBEYXRhU2l6ZSwNCiAgSU4gIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKkRhdGENCiAgKTsNCg0KLy8NCi8vIEVGSSBUaW1lDQovLw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBVSU5UMzIgIFJlc29sdXRpb247DQogIFVJTlQzMiAgQWNjdXJhY3k7DQogIEJPT0xFQU4gU2V0c1RvWmVybzsNCn0gRUZJX1RJTUVfQ0FQQUJJTElUSUVTOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXR1cm5zIHRoZSBjdXJyZW50IHRpbWUgYW5kIGRhdGUgaW5mb3JtYXRpb24sIGFuZCB0aGUgdGltZS1rZWVwaW5nIGNhcGFiaWxpdGllcyANCiAgb2YgdGhlIGhhcmR3YXJlIHBsYXRmb3JtLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBUaW1lICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHN0b3JhZ2UgdG8gcmVjZWl2ZSBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHRpbWUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDYXBhYmlsaXRpZXMgICAgICAgICAgQW4gb3B0aW9uYWwgcG9pbnRlciB0byBhIGJ1ZmZlciB0byByZWNlaXZlIHRoZSByZWFsIHRpbWUgY2xvY2sgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZaGvcyBjYXBhYmlsaXRpZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFRpbWUgaXMgTlVMTC4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIHRpbWUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gaGFyZHdhcmUgZXJyb3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9HRVRfVElNRSkgKA0KICBPVVQgIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAqVGltZSwNCiAgT1VUICBFRklfVElNRV9DQVBBQklMSVRJRVMgICAgICAgKkNhcGFiaWxpdGllcyBPUFRJT05BTA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBTZXRzIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgYW5kIGRhdGUgaW5mb3JtYXRpb24uDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFRpbWUgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdGltZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBBIHRpbWUgZmllbGQgaXMgb3V0IG9mIHJhbmdlLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgdGltZSBjb3VsZCBub3QgYmUgc2V0IGR1ZSBkdWUgdG8gaGFyZHdhcmUgZXJyb3IuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovICAgIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1NFVF9USU1FKSAoDQogIElOICBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgICpUaW1lDQogICk7DQogIA0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0dXJucyB0aGUgY3VycmVudCB3YWtldXAgYWxhcm0gY2xvY2sgc2V0dGluZy4NCiAgDQogIEBwYXJhbSAgRW5hYmxlZCAgICAgICAgICAgICAgIEluZGljYXRlcyBpZiB0aGUgYWxhcm0gaXMgY3VycmVudGx5IGVuYWJsZWQgb3IgZGlzYWJsZWQuDQogIEBwYXJhbSAgUGVuZGluZyAgICAgICAgICAgICAgIEluZGljYXRlcyBpZiB0aGUgYWxhcm0gc2lnbmFsIGlzIHBlbmRpbmcgYW5kIHJlcXVpcmVzIGFja25vd2xlZGdlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgVGltZSAgICAgICAgICAgICAgICAgIFRoZSBjdXJyZW50IGFsYXJtIHNldHRpbmcuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYWxhcm0gc2V0dGluZ3Mgd2VyZSByZXR1cm5lZC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQW55IHBhcmFtZXRlciBpcyBOVUxMLg0KICBAcmV0dmFsIEVGSV9ERVZJQ0VfRVJST1IgICAgICBUaGUgd2FrZXVwIHRpbWUgY291bGQgbm90IGJlIHJldHJpZXZlZCBkdWUgdG8gYSBoYXJkd2FyZSBlcnJvci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfR0VUX1dBS0VVUF9USU1FKSAoDQogIE9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgKkVuYWJsZWQsDQogIE9VVCBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgKlBlbmRpbmcsDQogIE9VVCBFRklfVElNRSAgICAgICAgICAgICAgICAgICAgKlRpbWUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU2V0cyB0aGUgc3lzdGVtIHdha2V1cCBhbGFybSBjbG9jayB0aW1lLg0KICANCiAgQHBhcmFtICBFbmFibGVkICAgICAgICAgICAgICAgRW5hYmxlIG9yIGRpc2FibGUgdGhlIHdha2V1cCBhbGFybS4gIA0KICBAcGFyYW0gIFRpbWUgICAgICAgICAgICAgICAgICBJZiBFbmFibGUgaXMgVFJVRSwgdGhlIHRpbWUgdG8gc2V0IHRoZSB3YWtldXAgYWxhcm0gZm9yLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSWYgRW5hYmxlIGlzIFRSVUUsIHRoZW4gdGhlIHdha2V1cCBhbGFybSB3YXMgZW5hYmxlZC4gSWYNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlIGlzIEZBTFNFLCB0aGVuIHRoZSB3YWtldXAgYWxhcm0gd2FzIGRpc2FibGVkLiAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgQSB0aW1lIGZpZWxkIGlzIG91dCBvZiByYW5nZS4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIHdha2V1cCB0aW1lIGNvdWxkIG5vdCBiZSBzZXQgZHVlIHRvIGEgaGFyZHdhcmUgZXJyb3IuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIEEgd2FrZXVwIHRpbWVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU0VUX1dBS0VVUF9USU1FKSAoDQogIElOICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSwNCiAgSU4gIEVGSV9USU1FICAgICAgICAgICAgICAgICAgICAgKlRpbWUgICBPUFRJT05BTA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBUaGlzIGlzIHRoZSBkZWNsYXJhdGlvbiBvZiBhbiBFRkkgaW1hZ2UgZW50cnkgcG9pbnQuIFRoaXMgY2FuIGJlIHRoZSBlbnRyeSBwb2ludCB0byBhbiBhcHBsaWNhdGlvbg0KICB3cml0dGVuIHRvIHRoaXMgc3BlY2lmaWNhdGlvbiwgYW4gRUZJIGJvb3Qgc2VydmljZSBkcml2ZXIsIG9yIGFuIEVGSSBydW50aW1lIGRyaXZlci4gICAgICAgICAgICAgICAgDQogIA0KICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBsb2FkZWQgaW1hZ2UuDQogIEBwYXJhbSAgU3lzdGVtVGFibGUgICAgICAgICAgIFN5c3RlbSBUYWJsZSBmb3IgdGhpcyBpbWFnZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KKiovICAgIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0lNQUdFX0VOVFJZX1BPSU5UKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiAgRUZJX1NZU1RFTV9UQUJMRSAgICAgICAgICAgICAqU3lzdGVtVGFibGUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgTG9hZHMgYW4gRUZJIGltYWdlIGludG8gbWVtb3J5Lg0KICANCiAgQHBhcmFtICBCb290UG9saWN5ICAgICAgICAgICAgSWYgVFJVRSwgaW5kaWNhdGVzIHRoYXQgdGhlIHJlcXVlc3Qgb3JpZ2luYXRlcyBmcm9tIHRoZSBib290DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIGFuZCB0aGF0IHRoZSBib290IG1hbmFnZXIgaXMgYXR0ZW1wdGluZyB0byBsb2FkICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlUGF0aCBhcyBhIGJvb3Qgc2VsZWN0aW9uLiBJZ25vcmVkIGlmIFNvdXJjZUJ1ZmZlciBpcyAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgUGFyZW50SW1hZ2VIYW5kbGUgICAgIFRoZSBjYWxsZXKhr3MgaW1hZ2UgaGFuZGxlLg0KICBAcGFyYW0gIEZpbGVQYXRoICAgICAgICAgICAgICBUaGUgRGV2aWNlSGFuZGxlIHNwZWNpZmljIGZpbGUgcGF0aCBmcm9tIHdoaWNoIHRoZSBpbWFnZSBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBTb3VyY2VCdWZmZXIgICAgICAgICAgSWYgbm90IE5VTEwsIGEgcG9pbnRlciB0byB0aGUgbWVtb3J5IGxvY2F0aW9uIGNvbnRhaW5pbmcgYSBjb3B5DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBpbWFnZSB0byBiZSBsb2FkZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFNvdXJjZVNpemUgICAgICAgICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiBTb3VyY2VCdWZmZXIuICANCiAgQHBhcmFtICBJbWFnZUhhbmRsZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgcmV0dXJuZWQgaW1hZ2UgaGFuZGxlIHRoYXQgaXMgY3JlYXRlZCB3aGVuIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSBpcyBzdWNjZXNzZnVsbHkgbG9hZGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgSW1hZ2Ugd2FzIGxvYWRlZCBpbnRvIG1lbW9yeSBjb3JyZWN0bHkuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIEJvdGggU291cmNlQnVmZmVyIGFuZCBGaWxlUGF0aCBhcmUgTlVMTC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVzIGFyZSBpbnZhbGlkLg0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgaW1hZ2UgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBJbWFnZSB3YXMgbm90IGxvYWRlZCBkdWUgdG8gaW5zdWZmaWNpZW50IHJlc291cmNlcy4NCiAgQHJldHZhbCBFRklfTE9BRF9FUlJPUiAgICAgICAgSW1hZ2Ugd2FzIG5vdCBsb2FkZWQgYmVjYXVzZSB0aGUgaW1hZ2UgZm9ybWF0IHdhcyBjb3JydXB0IG9yIG5vdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlcnN0b29kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0RFVklDRV9FUlJPUiAgICAgIEltYWdlIHdhcyBub3QgbG9hZGVkIGJlY2F1c2UgdGhlIGRldmljZSByZXR1cm5lZCBhIHJlYWQgZXJyb3IuICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQoqKi8gICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfSU1BR0VfTE9BRCkgKA0KICBJTiAgQk9PTEVBTiAgICAgICAgICAgICAgICAgICAgICBCb290UG9saWN5LA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICBQYXJlbnRJbWFnZUhhbmRsZSwNCiAgSU4gIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgKkZpbGVQYXRoLA0KICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAqU291cmNlQnVmZmVyIE9QVElPTkFMLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VTaXplLA0KICBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAqSW1hZ2VIYW5kbGUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVHJhbnNmZXJzIGNvbnRyb2wgdG8gYSBsb2FkZWQgaW1hZ2Whr3MgZW50cnkgcG9pbnQuDQogIA0KICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgb2YgaW1hZ2UgdG8gYmUgc3RhcnRlZC4gIA0KICBAcGFyYW0gIEV4aXREYXRhU2l6ZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzaXplLCBpbiBieXRlcywgb2YgRXhpdERhdGEuDQogIEBwYXJhbSAgRXhpdERhdGEgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIGEgZGF0YSBidWZmZXIgdGhhdCBpbmNsdWRlcyBhIE51bGwtdGVybWluYXRlZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmljb2RlIHN0cmluZywgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGJpbmFyeSBkYXRhLiAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgSW1hZ2VIYW5kbGUgaXMgZWl0aGVyIGFuIGludmFsaWQgaW1hZ2UgaGFuZGxlIG9yIHRoZSBpbWFnZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIHdpdGggU3RhcnRJbWFnZQ0KICBAcmV0dmFsIEV4aXQgY29kZSBmcm9tIGltYWdlICBFeGl0IGNvZGUgZnJvbSBpbWFnZQ0KICANCioqLyAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9JTUFHRV9TVEFSVCkgKA0KICBJTiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBPVVQgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICpFeGl0RGF0YVNpemUsDQogIE9VVCBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgKipFeGl0RGF0YSAgICBPUFRJT05BTA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBUZXJtaW5hdGVzIGEgbG9hZGVkIEVGSSBpbWFnZSBhbmQgcmV0dXJucyBjb250cm9sIHRvIGJvb3Qgc2VydmljZXMuDQogIA0KICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBpbWFnZS4NCiAgQHBhcmFtICBFeGl0U3RhdHVzICAgICAgICAgICAgVGhlIGltYWdloa9zIGV4aXQgY29kZS4NCiAgQHBhcmFtICBFeGl0RGF0YVNpemUgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBFeGl0RGF0YS4NCiAgQHBhcmFtICBFeGl0RGF0YSAgICAgICAgICAgICAgUG9pbnRlciB0byBhIGRhdGEgYnVmZmVyIHRoYXQgaW5jbHVkZXMgYSBOdWxsLXRlcm1pbmF0ZWQgVW5pY29kZSBzdHJpbmcsICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxseSBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGJpbmFyeSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgSW1hZ2VIYW5kbGUgd2FzIHVubG9hZGVkLiAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIFRoZSBpbWFnZSBzcGVjaWZpZWQgYnkgSW1hZ2VIYW5kbGUgaGFzIGJlZW4gbG9hZGVkIGFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHdpdGggTG9hZEltYWdlKCkgYW5kIFN0YXJ0SW1hZ2UoKSwgYnV0IHRoZSAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgaXMgbm90IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIGltYWdlLiAgICAgICAgICAgICAgIA0KICANCioqLyAgICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9FWElUKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiAgRUZJX1NUQVRVUyAgICAgICAgICAgICAgICAgICBFeGl0U3RhdHVzLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBFeGl0RGF0YVNpemUsDQogIElOICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICpFeGl0RGF0YSAgICAgT1BUSU9OQUwNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgVW5sb2FkcyBhbiBpbWFnZS4NCiAgDQogIEBwYXJhbSAgSW1hZ2VIYW5kbGUgICAgICAgICAgIEhhbmRsZSB0aGF0IGlkZW50aWZpZXMgdGhlIGltYWdlIHRvIGJlIHVubG9hZGVkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGltYWdlIGhhcyBiZWVuIHVubG9hZGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBJbWFnZUhhbmRsZSBpcyBub3QgYSB2YWxpZCBpbWFnZSBoYW5kbGUuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBpbWFnZSBoYXMgYmVlbiBzdGFydGVkLCBhbmQgZG9lcyBub3Qgc3VwcG9ydCB1bmxvYWQuDQogIEByZXR2YWwgICAgICAgICAgICAgICAgICAgICAgIEV4aXQgY29kZSBmcm9tIHRoZSBpbWFnZSdzIHVubG9hZCBoYW5kbGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQoqKi8gICAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfSU1BR0VfVU5MT0FEKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFRlcm1pbmF0ZXMgYWxsIGJvb3Qgc2VydmljZXMuDQogIA0KICBAcGFyYW0gIEltYWdlSGFuZGxlICAgICAgICAgICBIYW5kbGUgdGhhdCBpZGVudGlmaWVzIHRoZSBleGl0aW5nIGltYWdlLg0KICBAcGFyYW0gIE1hcEtleSAgICAgICAgICAgICAgICBLZXkgdG8gdGhlIGxhdGVzdCBtZW1vcnkgbWFwLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgQm9vdCBzZXJ2aWNlcyBoYXZlIGJlZW4gdGVybWluYXRlZC4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTWFwS2V5IGlzIGluY29ycmVjdC4gIA0KICANCioqLyAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfRVhJVF9CT09UX1NFUlZJQ0VTKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgIEltYWdlSGFuZGxlLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICBNYXBLZXkNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgSW5kdWNlcyBhIGZpbmUtZ3JhaW5lZCBzdGFsbC4NCiAgDQogIEBwYXJhbSAgTWljcm9zZWNvbmRzICAgICAgICAgIFRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIHRvIHN0YWxsIGV4ZWN1dGlvbi4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgRXhlY3V0aW9uIHdhcyBzdGFsbGVkIGF0IGxlYXN0IHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3Jvc2Vjb25kcy4gIA0KICANCioqLyAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfU1RBTEwpICgNCiAgSU4gIFVJTlROICAgICAgICAgICAgICAgICAgICBNaWNyb3NlY29uZHMNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgU2V0cyB0aGUgc3lzdGVtoa9zIHdhdGNoZG9nIHRpbWVyLg0KICANCiAgQHBhcmFtICBUaW1lb3V0ICAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHNldCB0aGUgd2F0Y2hkb2cgdGltZXIgdG8uDQogIEBwYXJhbSAgV2F0Y2hkb2dDb2RlICAgICAgICAgIFRoZSBudW1lcmljIGNvZGUgdG8gbG9nIG9uIGEgd2F0Y2hkb2cgdGltZXIgdGltZW91dCBldmVudC4NCiAgQHBhcmFtICBEYXRhU2l6ZSAgICAgICAgICAgICAgVGhlIHNpemUsIGluIGJ5dGVzLCBvZiBXYXRjaGRvZ0RhdGEuDQogIEBwYXJhbSAgV2F0Y2hkb2dEYXRhICAgICAgICAgIEEgZGF0YSBidWZmZXIgdGhhdCBpbmNsdWRlcyBhIE51bGwtdGVybWluYXRlZCBVbmljb2RlIHN0cmluZywgb3B0aW9uYWxseQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBhZGRpdGlvbmFsIGJpbmFyeSBkYXRhLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHRpbWVvdXQgaGFzIGJlZW4gc2V0Lg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBUaGUgc3VwcGxpZWQgV2F0Y2hkb2dDb2RlIGlzIGludmFsaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgc3lzdGVtIGRvZXMgbm90IGhhdmUgYSB3YXRjaGRvZyB0aW1lci4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIHdhdGNoIGRvZyB0aW1lciBjb3VsZCBub3QgYmUgcHJvZ3JhbW1lZCBkdWUgdG8gYSBoYXJkd2FyZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9TRVRfV0FUQ0hET0dfVElNRVIpICgNCiAgSU4gVUlOVE4gICAgICAgICAgICAgICAgICAgIFRpbWVvdXQsDQogIElOIFVJTlQ2NCAgICAgICAgICAgICAgICAgICBXYXRjaGRvZ0NvZGUsDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgICBEYXRhU2l6ZSwNCiAgSU4gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICpXYXRjaGRvZ0RhdGEgT1BUSU9OQUwNCiAgKTsNCg0KdHlwZWRlZiBlbnVtIHsNCiAgRWZpUmVzZXRDb2xkLA0KICBFZmlSZXNldFdhcm0sDQogIEVmaVJlc2V0U2h1dGRvd24sDQojaWYgKChFREtfUkVMRUFTRV9WRVJTSU9OICE9IDApICYmIChFRklfU1BFQ0lGSUNBVElPTl9WRVJTSU9OIDwgMHgwMDAyMDAwMCkpDQogIC8vDQogIC8vIFRpYW5vIGV4dGVuc2lvbiBmb3IgY2Fwc3VsZXMgdGhhdCB3YXMgcmVtb3ZlZCBhZnRlciBVRUZJIDIuMCBjYW1lIG91dA0KICAvLw0KICBFZmlSZXNldFVwZGF0ZQ0KI2VuZGlmDQp9IEVGSV9SRVNFVF9UWVBFOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXNldHMgdGhlIGVudGlyZSBwbGF0Zm9ybS4NCiAgDQogIEBwYXJhbSAgUmVzZXRUeXBlICAgICAgICAgICAgIFRoZSB0eXBlIG9mIHJlc2V0IHRvIHBlcmZvcm0uDQogIEBwYXJhbSAgUmVzZXRTdGF0dXMgICAgICAgICAgIFRoZSBzdGF0dXMgY29kZSBmb3IgdGhlIHJlc2V0Lg0KICBAcGFyYW0gIERhdGFTaXplICAgICAgICAgICAgICBUaGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIFdhdGNoZG9nRGF0YS4NCiAgQHBhcmFtICBSZXNldERhdGEgICAgICAgICAgICAgRm9yIGEgUmVzZXRUeXBlIG9mIEVmaVJlc2V0Q29sZCwgRWZpUmVzZXRXYXJtLCBvciAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWZpUmVzZXRTaHV0ZG93biB0aGUgZGF0YSBidWZmZXIgc3RhcnRzIHdpdGggYSBOdWxsLXRlcm1pbmF0ZWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pY29kZSBzdHJpbmcsIG9wdGlvbmFsbHkgZm9sbG93ZWQgYnkgYWRkaXRpb25hbCBiaW5hcnkgZGF0YS4NCg0KKiovICANCnR5cGVkZWYNClZPSUQNCihFRklBUEkgKkVGSV9SRVNFVF9TWVNURU0pICgNCiAgSU4gRUZJX1JFU0VUX1RZUEUgICAgICAgICAgIFJlc2V0VHlwZSwNCiAgSU4gRUZJX1NUQVRVUyAgICAgICAgICAgICAgIFJlc2V0U3RhdHVzLA0KICBJTiBVSU5UTiAgICAgICAgICAgICAgICAgICAgRGF0YVNpemUsDQogIElOIENIQVIxNiAgICAgICAgICAgICAgICAgICAqUmVzZXREYXRhIE9QVElPTkFMDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgY291bnQgZm9yIHRoZSBwbGF0Zm9ybS4NCiAgDQogIEBwYXJhbSAgQ291bnQgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gcmV0dXJuZWQgdmFsdWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV4dCBtb25vdG9uaWMgY291bnQgd2FzIHJldHVybmVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDb3VudCBpcyBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGRldmljZSBpcyBub3QgZnVuY3Rpb25pbmcgcHJvcGVybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0dFVF9ORVhUX01PTk9UT05JQ19DT1VOVCkgKA0KICBPVVQgVUlOVDY0ICAgICAgICAgICAgICAgICAgKkNvdW50DQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgdGhlIG5leHQgaGlnaCAzMiBiaXRzIG9mIHRoZSBwbGF0Zm9ybaGvcyBtb25vdG9uaWMgY291bnRlci4NCiAgDQogIEBwYXJhbSAgSGlnaENvdW50ICAgICAgICAgICAgIFBvaW50ZXIgdG8gcmV0dXJuZWQgdmFsdWUuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbmV4dCBoaWdoIG1vbm90b25pYyBjb3VudCB3YXMgcmV0dXJuZWQuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEhpZ2hDb3VudCBpcyBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGRldmljZSBpcyBub3QgZnVuY3Rpb25pbmcgcHJvcGVybHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0dFVF9ORVhUX0hJR0hfTU9OT19DT1VOVCkgKA0KICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgKkhpZ2hDb3VudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDb21wdXRlcyBhbmQgcmV0dXJucyBhIDMyLWJpdCBDUkMgZm9yIGEgZGF0YSBidWZmZXIuDQogIA0KICBAcGFyYW0gIERhdGEgICAgICAgICAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBvbiB3aGljaCB0aGUgMzItYml0IENSQyBpcyB0byBiZSBjb21wdXRlZC4NCiAgQHBhcmFtICBEYXRhU2l6ZSAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIERhdGEuDQogIEBwYXJhbSAgQ3JjMzIgICAgICAgICAgICAgICAgIFRoZSAzMi1iaXQgQ1JDIHRoYXQgd2FzIGNvbXB1dGVkIGZvciB0aGUgZGF0YSBidWZmZXIgc3BlY2lmaWVkIGJ5IERhdGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIERhdGFTaXplLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIDMyLWJpdCBDUkMgd2FzIGNvbXB1dGVkIGZvciB0aGUgZGF0YSBidWZmZXIgYW5kIHJldHVybmVkIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyYzMyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0NBTENVTEFURV9DUkMzMikgKA0KICBJTiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpEYXRhLA0KICBJTiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTaXplLA0KICBPVVQgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgICpDcmMzMg0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mIG9uZSBidWZmZXIgdG8gYW5vdGhlciBidWZmZXIuDQogIA0KICBAcGFyYW0gIERlc3RpbmF0aW9uICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgb2YgdGhlIG1lbW9yeSBjb3B5Lg0KICBAcGFyYW0gIFNvdXJjZSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzb3VyY2UgYnVmZmVyIG9mIHRoZSBtZW1vcnkgY29weS4NCiAgQHBhcmFtICBMZW5ndGggICAgICAgICAgICAgICAgTnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkgZnJvbSBTb3VyY2UgdG8gRGVzdGluYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KVk9JRA0KKEVGSUFQSSAqRUZJX0NPUFlfTUVNKSAoDQogIElOIFZPSUQgICAgICpEZXN0aW5hdGlvbiwNCiAgSU4gVk9JRCAgICAgKlNvdXJjZSwNCiAgSU4gVUlOVE4gICAgTGVuZ3RoDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFRoZSBTZXRNZW0oKSBmdW5jdGlvbiBmaWxscyBhIGJ1ZmZlciB3aXRoIGEgc3BlY2lmaWVkIHZhbHVlLg0KICANCiAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIGZpbGwuDQogIEBwYXJhbSAgU2l6ZSAgICAgICAgICAgICAgICAgIE51bWJlciBvZiBieXRlcyBpbiBCdWZmZXIgdG8gZmlsbC4NCiAgQHBhcmFtICBWYWx1ZSAgICAgICAgICAgICAgICAgVmFsdWUgdG8gZmlsbCBCdWZmZXIgd2l0aC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KVk9JRA0KKEVGSUFQSSAqRUZJX1NFVF9NRU0pICgNCiAgSU4gVk9JRCAgICAgKkJ1ZmZlciwNCiAgSU4gVUlOVE4gICAgU2l6ZSwNCiAgSU4gVUlOVDggICAgVmFsdWUNCiAgKTsNCg0KLy8NCi8vIFByb3RvY29sIGhhbmRsZXIgZnVuY3Rpb25zDQovLw0KdHlwZWRlZiBlbnVtIHsNCiAgRUZJX05BVElWRV9JTlRFUkZBQ0UNCn0gRUZJX0lOVEVSRkFDRV9UWVBFOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBJbnN0YWxscyBhIHByb3RvY29sIGludGVyZmFjZSBvbiBhIGRldmljZSBoYW5kbGUuIElmIHRoZSBoYW5kbGUgZG9lcyBub3QgZXhpc3QsIGl0IGlzIGNyZWF0ZWQgYW5kIGFkZGVkDQogIHRvIHRoZSBsaXN0IG9mIGhhbmRsZXMgaW4gdGhlIHN5c3RlbS4gSW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzKCkgcGVyZm9ybXMgICAgICAgICAgICAgICAgICAgICANCiAgbW9yZSBlcnJvciBjaGVja2luZyB0aGFuIEluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpLCBzbyBpdCBpcyByZWNvbW1lbmRlZCB0aGF0ICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBJbnN0YWxsTXVsdGlwbGVQcm90b2NvbEludGVyZmFjZXMoKSBiZSB1c2VkIGluIHBsYWNlIG9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEluc3RhbGxQcm90b2NvbEludGVyZmFjZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQogIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgRUZJX0hBTkRMRSBvbiB3aGljaCB0aGUgaW50ZXJmYWNlIGlzIHRvIGJlIGluc3RhbGxlZC4NCiAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgVGhlIG51bWVyaWMgSUQgb2YgdGhlIHByb3RvY29sIGludGVyZmFjZS4NCiAgQHBhcmFtICBJbnRlcmZhY2VUeXBlICAgICAgICAgSW5kaWNhdGVzIHdoZXRoZXIgSW50ZXJmYWNlIGlzIHN1cHBsaWVkIGluIG5hdGl2ZSBmb3JtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgSW50ZXJmYWNlICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHByb3RvY29sIGludGVyZmFjZSB3YXMgaW5zdGFsbGVkLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBTcGFjZSBmb3IgYSBuZXcgaGFuZGxlIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9JTlNUQUxMX1BST1RPQ09MX0lOVEVSRkFDRSkgKA0KICBJTiBPVVQgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICpIYW5kbGUsDQogIElOICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLA0KICBJTiAgICAgRUZJX0lOVEVSRkFDRV9UWVBFICAgICAgIEludGVyZmFjZVR5cGUsDQogIElOICAgICBWT0lEICAgICAgICAgICAgICAgICAgICAgKkludGVyZmFjZQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBJbnN0YWxscyBvbmUgb3IgbW9yZSBwcm90b2NvbCBpbnRlcmZhY2VzIGludG8gdGhlIGJvb3Qgc2VydmljZXMgZW52aXJvbm1lbnQuDQogIA0KICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIHRvIGluc3RhbGwgdGhlIG5ldyBwcm90b2NvbCBpbnRlcmZhY2VzIG9uLCBvciBOVUxMIGlmIGEgbmV3DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBpcyB0byBiZSBhbGxvY2F0ZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIC4uLiAgICAgICAgICAgICAgICAgICBBIHZhcmlhYmxlIGFyZ3VtZW50IGxpc3QgY29udGFpbmluZyBwYWlycyBvZiBwcm90b2NvbCBHVUlEcyBhbmQgcHJvdG9jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCg0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBBbGwgdGhlIHByb3RvY29sIGludGVyZmFjZSB3YXMgaW5zdGFsbGVkLg0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBUaGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgaW4gcG9vbCB0byBpbnN0YWxsIGFsbCB0aGUgcHJvdG9jb2xzLg0KICBAcmV0dmFsIEVGSV9BTFJFQURZX1NUQVJURUQgICBBIERldmljZSBQYXRoIFByb3RvY29sIGluc3RhbmNlIHdhcyBwYXNzZWQgaW4gdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhhbmRsZSBkYXRhYmFzZS4NCiAgICANCioqLyAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTKSAoDQogIElOIE9VVCBFRklfSEFORExFICAgICAgICAgICAqSGFuZGxlLA0KICAuLi4NCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmVpbnN0YWxscyBhIHByb3RvY29sIGludGVyZmFjZSBvbiBhIGRldmljZSBoYW5kbGUuDQogIA0KICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBIYW5kbGUgb24gd2hpY2ggdGhlIGludGVyZmFjZSBpcyB0byBiZSByZWluc3RhbGxlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgbnVtZXJpYyBJRCBvZiB0aGUgaW50ZXJmYWNlLg0KICBAcGFyYW0gIE9sZEludGVyZmFjZSAgICAgICAgICBBIHBvaW50ZXIgdG8gdGhlIG9sZCBpbnRlcmZhY2UuIE5VTEwgY2FuIGJlIHVzZWQgaWYgYSBzdHJ1Y3R1cmUgaXMgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCBQcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBOZXdJbnRlcmZhY2UgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBuZXcgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICANCiAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugd2FzIHJlaW5zdGFsbGVkLg0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBUaGUgT2xkSW50ZXJmYWNlIG9uIHRoZSBoYW5kbGUgd2FzIG5vdCBmb3VuZC4NCiAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRCAgICAgVGhlIHByb3RvY29sIGludGVyZmFjZSBjb3VsZCBub3QgYmUgcmVpbnN0YWxsZWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgT2xkSW50ZXJmYWNlIGlzIHN0aWxsIGJlaW5nIHVzZWQgYnkgYSAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXIgdGhhdCB3aWxsIG5vdCByZWxlYXNlIGl0LiAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9SRUlOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoDQogIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsDQogIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqT2xkSW50ZXJmYWNlLA0KICBJTiBWT0lEICAgICAgICAgICAgICAgICAgICAgKk5ld0ludGVyZmFjZQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZW1vdmVzIGEgcHJvdG9jb2wgaW50ZXJmYWNlIGZyb20gYSBkZXZpY2UgaGFuZGxlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0DQogIFVuaW5zdGFsbE11bHRpcGxlUHJvdG9jb2xJbnRlcmZhY2VzKCkgYmUgdXNlZCBpbiBwbGFjZSBvZiAgICAgICAgICAgICAgICANCiAgVW5pbnN0YWxsUHJvdG9jb2xJbnRlcmZhY2UoKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICANCiAgQHBhcmFtICBIYW5kbGUgICAgICAgICAgICAgICAgVGhlIGhhbmRsZSBvbiB3aGljaCB0aGUgaW50ZXJmYWNlIHdhcyBpbnN0YWxsZWQuDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFRoZSBudW1lcmljIElEIG9mIHRoZSBpbnRlcmZhY2UuDQogIEBwYXJhbSAgSW50ZXJmYWNlICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICANCiAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBpbnRlcmZhY2Ugd2FzIHJlbW92ZWQuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIFRoZSBpbnRlcmZhY2Ugd2FzIG5vdCBmb3VuZC4NCiAgQHJldHZhbCBFRklfQUNDRVNTX0RFTklFRCAgICAgVGhlIGludGVyZmFjZSB3YXMgbm90IHJlbW92ZWQgYmVjYXVzZSB0aGUgaW50ZXJmYWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN0aWxsIGJlaW5nIHVzZWQgYnkgYSBkcml2ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VTklOU1RBTExfUFJPVE9DT0xfSU5URVJGQUNFKSAoDQogIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBIYW5kbGUsDQogIElOIEVGSV9HVUlEICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqSW50ZXJmYWNlDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJlbW92ZXMgb25lIG9yIG1vcmUgcHJvdG9jb2wgaW50ZXJmYWNlcyBpbnRvIHRoZSBib290IHNlcnZpY2VzIGVudmlyb25tZW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIA0KICBAcGFyYW0gIEhhbmRsZSAgICAgICAgICAgICAgICBUaGUgaGFuZGxlIHRvIHJlbW92ZSB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlcyBmcm9tLiAgDQogIEBwYXJhbSAgLi4uICAgICAgICAgICAgICAgICAgIEEgdmFyaWFibGUgYXJndW1lbnQgbGlzdCBjb250YWluaW5nIHBhaXJzIG9mIHByb3RvY29sIEdVSURzIGFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2NvbCBpbnRlcmZhY2VzLg0KICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgQWxsIHRoZSBwcm90b2NvbCBpbnRlcmZhY2VzIHdlcmUgcmVtb3ZlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvZiB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlcyB3YXMgbm90IHByZXZpb3VzbHkgaW5zdGFsbGVkIG9uIEhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9VTklOU1RBTExfTVVMVElQTEVfUFJPVE9DT0xfSU5URVJGQUNFUykgKA0KICBJTiBFRklfSEFORExFICAgICAgICAgICBIYW5kbGUsDQogIC4uLg0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBRdWVyaWVzIGEgaGFuZGxlIHRvIGRldGVybWluZSBpZiBpdCBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm90b2NvbC4NCiAgDQogIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgYmVpbmcgcXVlcmllZC4NCiAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgVGhlIHB1Ymxpc2hlZCB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgcHJvdG9jb2wuDQogIEBwYXJhbSAgSW50ZXJmYWNlICAgICAgICAgICAgIFN1cHBsaWVzIHRoZSBhZGRyZXNzIHdoZXJlIGEgcG9pbnRlciB0byB0aGUgY29ycmVzcG9uZGluZyBQcm90b2NvbA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UgaXMgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGludGVyZmFjZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBwcm90b2NvbCB3YXMgcmV0dXJuZWQuDQogIEByZXR2YWwgRUZJX1VOU1VQUE9SVEVEICAgICAgIFRoZSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3BlY2lmaWVkIHByb3RvY29sLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb2YgdGhlIHByb3RvY29sIGludGVyZmFjZXMgd2FzIG5vdCBwcmV2aW91c2x5IGluc3RhbGxlZCBvbiBIYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICANCioqLyAgDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfSEFORExFX1BST1RPQ09MKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLA0KICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZQ0KICApOw0KDQojZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0hBTkRMRV9QUk9UT0NPTCAgMHgwMDAwMDAwMQ0KI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9HRVRfUFJPVE9DT0wgICAgICAgIDB4MDAwMDAwMDINCiNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfVEVTVF9QUk9UT0NPTCAgICAgICAweDAwMDAwMDA0DQojZGVmaW5lIEVGSV9PUEVOX1BST1RPQ09MX0JZX0NISUxEX0NPTlRST0xMRVIgMHgwMDAwMDAwOA0KI2RlZmluZSBFRklfT1BFTl9QUk9UT0NPTF9CWV9EUklWRVIgICAgICAgICAgIDB4MDAwMDAwMTANCiNkZWZpbmUgRUZJX09QRU5fUFJPVE9DT0xfRVhDTFVTSVZFICAgICAgICAgICAweDAwMDAwMDIwDQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFF1ZXJpZXMgYSBoYW5kbGUgdG8gZGV0ZXJtaW5lIGlmIGl0IHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3RvY29sLiBJZiB0aGUgcHJvdG9jb2wgaXMgc3VwcG9ydGVkIGJ5IHRoZQ0KICBoYW5kbGUsIGl0IG9wZW5zIHRoZSBwcm90b2NvbCBvbiBiZWhhbGYgb2YgdGhlIGNhbGxpbmcgYWdlbnQuDQogICAgDQogIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgZm9yIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgdGhhdCBpcyBiZWluZyBvcGVuZWQuDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFRoZSBwdWJsaXNoZWQgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb3RvY29sLg0KICBAcGFyYW0gIEludGVyZmFjZSAgICAgICAgICAgICBTdXBwbGllcyB0aGUgYWRkcmVzcyB3aGVyZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvdG9jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlIGlzIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQWdlbnRIYW5kbGUgICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGFnZW50IHRoYXQgaXMgb3BlbmluZyB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBieSBQcm90b2NvbCBhbmQgSW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDb250cm9sbGVySGFuZGxlICAgICAgSWYgdGhlIGFnZW50IHRoYXQgaXMgb3BlbmluZyBhIHByb3RvY29sIGlzIGEgZHJpdmVyIHRoYXQgZm9sbG93cyB0aGUgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVRUZJIERyaXZlciBNb2RlbCwgdGhlbiB0aGlzIHBhcmFtZXRlciBpcyB0aGUgY29udHJvbGxlciBoYW5kbGUgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHJlcXVpcmVzIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UuIElmIHRoZSBhZ2VudCBkb2VzIG5vdCBmb2xsb3cgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgVUVGSSBEcml2ZXIgTW9kZWwsIHRoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgb3B0aW9uYWwgYW5kIG1heSAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBOVUxMLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIEF0dHJpYnV0ZXMgICAgICAgICAgICBUaGUgb3BlbiBtb2RlIG9mIHRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugc3BlY2lmaWVkIGJ5IEhhbmRsZSAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBQcm90b2NvbC4gICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBBbiBpdGVtIHdhcyBhZGRlZCB0byB0aGUgb3BlbiBsaXN0IGZvciB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLCBhbmQgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvY29sIGludGVyZmFjZSB3YXMgcmV0dXJuZWQgaW4gSW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfVU5TVVBQT1JURUQgICAgICAgSGFuZGxlIGRvZXMgbm90IHN1cHBvcnQgUHJvdG9jb2wuDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogIEByZXR2YWwgRUZJX0FDQ0VTU19ERU5JRUQgICAgIFJlcXVpcmVkIGF0dHJpYnV0ZXMgY2FuJ3QgYmUgc3VwcG9ydGVkIGluIGN1cnJlbnQgZW52aXJvbm1lbnQuDQogIEByZXR2YWwgRUZJX0FMUkVBRFlfU1RBUlRFRCAgIEl0ZW0gb24gdGhlIG9wZW4gbGlzdCBhbHJlYWR5IGhhcyByZXF1aWVyZCBhdHRyaWJ1dGVzIHdob3NlIGFnZW50DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSBpcyB0aGUgc2FtZSBhcyBBZ2VudEhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9PUEVOX1BST1RPQ09MKSAoDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgIEhhbmRsZSwNCiAgSU4gIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgKlByb3RvY29sLA0KICBPVVQgVk9JRCAgICAgICAgICAgICAgICAgICAgICAqKkludGVyZmFjZSwNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgQWdlbnRIYW5kbGUsDQogIElOICBFRklfSEFORExFICAgICAgICAgICAgICAgIENvbnRyb2xsZXJIYW5kbGUsIE9QVElPTkFMDQogIElOICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMNCiAgKTsNCg0KICANCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIENsb3NlcyBhIHByb3RvY29sIG9uIGEgaGFuZGxlIHRoYXQgd2FzIG9wZW5lZCB1c2luZyBPcGVuUHJvdG9jb2woKS4NCiAgICANCiAgQHBhcmFtICBIYW5kbGUgICAgICAgICAgICAgICAgVGhlIGhhbmRsZSBmb3IgdGhlIHByb3RvY29sIGludGVyZmFjZSB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIE9wZW5Qcm90b2NvbCgpLCBhbmQgaXMgbm93IGJlaW5nIGNsb3NlZC4gICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFRoZSBwdWJsaXNoZWQgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIHByb3RvY29sLg0KICBAcGFyYW0gIEludGVyZmFjZSAgICAgICAgICAgICBTdXBwbGllcyB0aGUgYWRkcmVzcyB3aGVyZSBhIHBvaW50ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcgUHJvdG9jb2wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJmYWNlIGlzIHJldHVybmVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQWdlbnRIYW5kbGUgICAgICAgICAgIFRoZSBoYW5kbGUgb2YgdGhlIGFnZW50IHRoYXQgaXMgY2xvc2luZyB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIENvbnRyb2xsZXJIYW5kbGUgICAgICBJZiB0aGUgYWdlbnQgdGhhdCBvcGVuZWQgYSBwcm90b2NvbCBpcyBhIGRyaXZlciB0aGF0IGZvbGxvd3MgdGhlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVFRkkgRHJpdmVyIE1vZGVsLCB0aGVuIHRoaXMgcGFyYW1ldGVyIGlzIHRoZSBjb250cm9sbGVyIGhhbmRsZSANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCByZXF1aXJlZCB0aGUgcHJvdG9jb2wgaW50ZXJmYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHByb3RvY29sIGluc3RhbmNlIHdhcyBjbG9zZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLiAgDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIDEpIEhhbmRsZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBwcm90b2NvbCBzcGVjaWZpZWQgYnkgUHJvdG9jb2wuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpIFRoZSBwcm90b2NvbCBpbnRlcmZhY2Ugc3BlY2lmaWVkIGJ5IEhhbmRsZSBhbmQgUHJvdG9jb2wgaXMgbm90DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBvcGVuIGJ5IEFnZW50SGFuZGxlIGFuZCBDb250cm9sbGVySGFuZGxlLiAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovICANCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9DTE9TRV9QUk9UT0NPTCkgKA0KICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgSGFuZGxlLA0KICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLA0KICBJTiBFRklfSEFORExFICAgICAgICAgICAgICAgQWdlbnRIYW5kbGUsDQogIElOIEVGSV9IQU5ETEUgICAgICAgICAgICAgICBDb250cm9sbGVySGFuZGxlDQogICk7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0hBTkRMRSAgQWdlbnRIYW5kbGU7DQogIEVGSV9IQU5ETEUgIENvbnRyb2xsZXJIYW5kbGU7DQogIFVJTlQzMiAgICAgIEF0dHJpYnV0ZXM7DQogIFVJTlQzMiAgICAgIE9wZW5Db3VudDsNCn0gRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBhZ2VudHMgdGhhdCBjdXJyZW50bHkgaGF2ZSBhIHByb3RvY29sIGludGVyZmFjZSBvcGVuZWQuDQogICAgDQogIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgZm9yIHRoZSBwcm90b2NvbCBpbnRlcmZhY2UgdGhhdCBpcyBiZWluZyBxdWVyaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBUaGUgcHVibGlzaGVkIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoZSBwcm90b2NvbC4NCiAgQHBhcmFtICBFbnRyeUJ1ZmZlciAgICAgICAgICAgQSBwb2ludGVyIHRvIGEgYnVmZmVyIG9mIG9wZW4gcHJvdG9jb2wgaW5mb3JtYXRpb24gaW4gdGhlIGZvcm0gb2YNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT05fRU5UUlkgc3RydWN0dXJlcy4gICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBFbnRyeUNvdW50ICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBFbnRyeUJ1ZmZlci4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBvcGVuIHByb3RvY29sIGluZm9ybWF0aW9uIHdhcyByZXR1cm5lZCBpbiBFbnRyeUJ1ZmZlciwgYW5kIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB3YXMgcmV0dXJuZWQgRW50cnlDb3VudC4gICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgYXJlIG5vdCBlbm91Z2ggcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBhbGxvY2F0ZSBFbnRyeUJ1ZmZlci4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgSGFuZGxlIGRvZXMgbm90IHN1cHBvcnQgdGhlIHByb3RvY29sIHNwZWNpZmllZCBieSBQcm90b2NvbC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gIA0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX09QRU5fUFJPVE9DT0xfSU5GT1JNQVRJT04pICgNCiAgSU4gIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZSwNCiAgSU4gIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgSU4gIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OX0VOVFJZICoqRW50cnlCdWZmZXIsDQogIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRW50cnlDb3VudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIHRoYXQgYXJlIGluc3RhbGxlZCBvbiBhIGhhbmRsZSBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQNCiAgZnJvbSBwb29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgDQogIEBwYXJhbSAgSGFuZGxlICAgICAgICAgICAgICAgIFRoZSBoYW5kbGUgZnJvbSB3aGljaCB0byByZXRyaWV2ZSB0aGUgbGlzdCBvZiBwcm90b2NvbCBpbnRlcmZhY2UNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1VJRHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgUHJvdG9jb2xCdWZmZXIgICAgICAgIEEgcG9pbnRlciB0byB0aGUgbGlzdCBvZiBwcm90b2NvbCBpbnRlcmZhY2UgR1VJRCBwb2ludGVycyB0aGF0IGFyZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YWxsZWQgb24gSGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBQcm90b2NvbEJ1ZmZlckNvdW50ICAgQSBwb2ludGVyIHRvIHRoZSBudW1iZXIgb2YgR1VJRCBwb2ludGVycyBwcmVzZW50IGluIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbEJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIGxpc3Qgb2YgcHJvdG9jb2wgaW50ZXJmYWNlIEdVSURzIGluc3RhbGxlZCBvbiBIYW5kbGUgd2FzIHJldHVybmVkIGluDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sQnVmZmVyLiBUaGUgbnVtYmVyIG9mIHByb3RvY29sIGludGVyZmFjZSBHVUlEcyB3YXMgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBpbiBQcm90b2NvbEJ1ZmZlckNvdW50LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgaXMgbm90IGVub3VnaCBwb29sIG1lbW9yeSB0byBzdG9yZSB0aGUgcmVzdWx0cy4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9QUk9UT0NPTFNfUEVSX0hBTkRMRSkgKA0KICBJTiAgRUZJX0hBTkRMRSAgICAgIEhhbmRsZSwNCiAgT1VUIEVGSV9HVUlEICAgICAgICAqKipQcm90b2NvbEJ1ZmZlciwNCiAgT1VUIFVJTlROICAgICAgICAgICAqUHJvdG9jb2xCdWZmZXJDb3VudA0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBDcmVhdGVzIGFuIGV2ZW50IHRoYXQgaXMgdG8gYmUgc2lnbmFsZWQgd2hlbmV2ZXIgYW4gaW50ZXJmYWNlIGlzIGluc3RhbGxlZCBmb3IgYSBzcGVjaWZpZWQgcHJvdG9jb2wuICANCiAgDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFRoZSBudW1lcmljIElEIG9mIHRoZSBwcm90b2NvbCBmb3Igd2hpY2ggdGhlIGV2ZW50IGlzIHRvIGJlIHJlZ2lzdGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBFdmVudCAgICAgICAgICAgICAgICAgRXZlbnQgdGhhdCBpcyB0byBiZSBzaWduYWxlZCB3aGVuZXZlciBhIHByb3RvY29sIGludGVyZmFjZSBpcyByZWdpc3RlcmVkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBQcm90b2NvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFJlZ2lzdHJhdGlvbiAgICAgICAgICBBIHBvaW50ZXIgdG8gYSBtZW1vcnkgbG9jYXRpb24gdG8gcmVjZWl2ZSB0aGUgcmVnaXN0cmF0aW9uIHZhbHVlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgbm90aWZpY2F0aW9uIGV2ZW50IGhhcyBiZWVuIHJlZ2lzdGVyZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9PVVRfT0ZfUkVTT1VSQ0VTICBTcGFjZSBmb3IgdGhlIG5vdGlmaWNhdGlvbiBldmVudCBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLg0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1JFR0lTVEVSX1BST1RPQ09MX05PVElGWSkgKA0KICBJTiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgSU4gIEVGSV9FVkVOVCAgICAgICAgICAgICAgICBFdmVudCwNCiAgT1VUIFZPSUQgICAgICAgICAgICAgICAgICAgICAqKlJlZ2lzdHJhdGlvbg0KICApOw0KDQp0eXBlZGVmIGVudW0gew0KICBBbGxIYW5kbGVzLA0KICBCeVJlZ2lzdGVyTm90aWZ5LA0KICBCeVByb3RvY29sDQp9IEVGSV9MT0NBVEVfU0VBUkNIX1RZUEU7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgYW4gYXJyYXkgb2YgaGFuZGxlcyB0aGF0IHN1cHBvcnQgYSBzcGVjaWZpZWQgcHJvdG9jb2wuDQogIA0KICBAcGFyYW0gIFNlYXJjaFR5cGUgICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggaGFuZGxlKHMpIGFyZSB0byBiZSByZXR1cm5lZC4NCiAgQHBhcmFtICBQcm90b2NvbCAgICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBwcm90b2NvbCB0byBzZWFyY2ggYnkuDQogIEBwYXJhbSAgU2VhcmNoS2V5ICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgc2VhcmNoIGtleS4gICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQnVmZmVyU2l6ZSAgICAgICAgICAgIE9uIGlucHV0LCB0aGUgc2l6ZSBpbiBieXRlcyBvZiBCdWZmZXIuIE9uIG91dHB1dCwgdGhlIHNpemUgaW4gYnl0ZXMgb2YgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXJyYXkgcmV0dXJuZWQgaW4gQnVmZmVyIChpZiB0aGUgYnVmZmVyIHdhcyBsYXJnZSBlbm91Z2gpIG9yIHRoZSAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBidWZmZXIgbmVlZGVkIHRvIG9idGFpbiB0aGUgYXJyYXkgKGlmIHRoZSBidWZmZXIgd2FzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBsYXJnZSBlbm91Z2gpLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBCdWZmZXIgICAgICAgICAgICAgICAgVGhlIGJ1ZmZlciBpbiB3aGljaCB0aGUgYXJyYXkgaXMgcmV0dXJuZWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgYXJyYXkgb2YgaGFuZGxlcyB3YXMgcmV0dXJuZWQuDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIE5vIGhhbmRsZXMgbWF0Y2ggdGhlIHNlYXJjaC4NCiAgQHJldHZhbCBFRklfQlVGRkVSX1RPT19TTUFMTCAgVGhlIEJ1ZmZlclNpemUgaXMgdG9vIHNtYWxsIGZvciB0aGUgcmVzdWx0LiAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIE9uZSBvciBtb3JlIHBhcmFtZXRlcnMgYXJlIGludmFsaWQuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfTE9DQVRFX0hBTkRMRSkgKA0KICBJTiAgICAgRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgIFNlYXJjaFR5cGUsDQogIElOICAgICBFRklfR1VJRCAgICAgICAgICAgICAgICAgKlByb3RvY29sLCAgICBPUFRJT05BTA0KICBJTiAgICAgVk9JRCAgICAgICAgICAgICAgICAgICAgICpTZWFyY2hLZXksICAgT1BUSU9OQUwNCiAgSU4gT1VUIFVJTlROICAgICAgICAgICAgICAgICAgICAqQnVmZmVyU2l6ZSwNCiAgT1VUICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAqQnVmZmVyDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIExvY2F0ZXMgdGhlIGhhbmRsZSB0byBhIGRldmljZSBvbiB0aGUgZGV2aWNlIHBhdGggdGhhdCBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkIHByb3RvY29sLg0KICAgIA0KICBAcGFyYW0gIFByb3RvY29sICAgICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHByb3RvY29sIHRvIHNlYXJjaCBmb3IuDQogIEBwYXJhbSAgRGV2aWNlUGF0aCAgICAgICAgICAgIE9uIGlucHV0LCBhIHBvaW50ZXIgdG8gYSBwb2ludGVyIHRvIHRoZSBkZXZpY2UgcGF0aC4gT24gb3V0cHV0LCB0aGUgZGV2aWNlDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggcG9pbnRlciBpcyBtb2RpZmllZCB0byBwb2ludCB0byB0aGUgcmVtYWluaW5nIHBhcnQgb2YgdGhlIGRldmljZSAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgRGV2aWNlICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgcmV0dXJuZWQgZGV2aWNlIGhhbmRsZS4gIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgVGhlIHJlc3VsdGluZyBoYW5kbGUgd2FzIHJldHVybmVkLg0KICBAcmV0dmFsIEVGSV9OT1RfRk9VTkQgICAgICAgICBObyBoYW5kbGVzIG1hdGNoIHRoZSBzZWFyY2guICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9MT0NBVEVfREVWSUNFX1BBVEgpICgNCiAgSU4gICAgIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgICAgICAgICpQcm90b2NvbCwNCiAgSU4gT1VUIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgICoqRGV2aWNlUGF0aCwNCiAgT1VUICAgIEVGSV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICpEZXZpY2UNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQWRkcywgdXBkYXRlcywgb3IgcmVtb3ZlcyBhIGNvbmZpZ3VyYXRpb24gdGFibGUgZW50cnkgZnJvbSB0aGUgRUZJIFN5c3RlbSBUYWJsZS4NCiAgICANCiAgQHBhcmFtICBHdWlkICAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBHVUlEIGZvciB0aGUgZW50cnkgdG8gYWRkLCB1cGRhdGUsIG9yIHJlbW92ZS4NCiAgQHBhcmFtICBUYWJsZSAgICAgICAgICAgICAgICAgQSBwb2ludGVyIHRvIHRoZSBjb25maWd1cmF0aW9uIHRhYmxlIGZvciB0aGUgZW50cnkgdG8gYWRkLCB1cGRhdGUsIG9yDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZS4gTWF5IGJlIE5VTEwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgKEd1aWQsIFRhYmxlKSBwYWlyIHdhcyBhZGRlZCwgdXBkYXRlZCwgb3IgcmVtb3ZlZC4NCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgQW4gYXR0ZW1wdCB3YXMgbWFkZSB0byBkZWxldGUgYSBub25leGlzdGVudCBlbnRyeS4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgR3VpZCBpcyBub3QgdmFsaWQuDQogIEByZXR2YWwgRUZJX09VVF9PRl9SRVNPVVJDRVMgIFRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGF2YWlsYWJsZSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSkgKA0KICBJTiBFRklfR1VJRCAgICAgICAgICAgICAgICAgKkd1aWQsDQogIElOIFZPSUQgICAgICAgICAgICAgICAgICAgICAqVGFibGUNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmVzZXJ2ZWQgc2VydmljZS4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBUaGUgb3BlcmF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUkVTRVJWRURfU0VSVklDRSkgKA0KICBWT0lEDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgYW4gYXJyYXkgb2YgaGFuZGxlcyB0aGF0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCBpbiBhIGJ1ZmZlciBhbGxvY2F0ZWQgZnJvbSBwb29sLg0KICANCiAgQHBhcmFtICBTZWFyY2hUeXBlICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIGhhbmRsZShzKSBhcmUgdG8gYmUgcmV0dXJuZWQuDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgcHJvdG9jb2wgdG8gc2VhcmNoIGJ5Lg0KICBAcGFyYW0gIFNlYXJjaEtleSAgICAgICAgICAgICBTdXBwbGllcyB0aGUgc2VhcmNoIGtleSBkZXBlbmRpbmcgb24gdGhlIFNlYXJjaFR5cGUuDQogIEBwYXJhbSAgTm9IYW5kbGVzICAgICAgICAgICAgIFRoZSBudW1iZXIgb2YgaGFuZGxlcyByZXR1cm5lZCBpbiBCdWZmZXIuDQogIEBwYXJhbSAgQnVmZmVyICAgICAgICAgICAgICAgIEEgcG9pbnRlciB0byB0aGUgYnVmZmVyIHRvIHJldHVybiB0aGUgcmVxdWVzdGVkIGFycmF5IG9mIGhhbmRsZXMgdGhhdA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IFByb3RvY29sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIFRoZSBhcnJheSBvZiBoYW5kbGVzIHdhcyByZXR1cm5lZCBpbiBCdWZmZXIsIGFuZCB0aGUgbnVtYmVyIG9mDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXMgaW4gQnVmZmVyIHdhcyByZXR1cm5lZCBpbiBOb0hhbmRsZXMuICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX05PVF9GT1VORCAgICAgICAgIE5vIGhhbmRsZXMgbWF0Y2ggdGhlIHNlYXJjaC4NCiAgQHJldHZhbCBFRklfT1VUX09GX1JFU09VUkNFUyAgVGhlcmUgaXMgbm90IGVub3VnaCBwb29sIG1lbW9yeSB0byBzdG9yZSB0aGUgbWF0Y2hpbmcgcmVzdWx0cy4NCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgT25lIG9yIG1vcmUgcGFyYW1ldGVycyBhcmUgaW52YWxpZC4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8NCnR5cGVkZWYNCkVGSV9TVEFUVVMNCihFRklBUEkgKkVGSV9MT0NBVEVfSEFORExFX0JVRkZFUikgKA0KICBJTiAgICAgRUZJX0xPQ0FURV9TRUFSQ0hfVFlQRSAgICAgICBTZWFyY2hUeXBlLA0KICBJTiAgICAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAqUHJvdG9jb2wsICAgICAgT1BUSU9OQUwNCiAgSU4gICAgIFZPSUQgICAgICAgICAgICAgICAgICAgICAgICAgKlNlYXJjaEtleSwgICAgIE9QVElPTkFMDQogIElOIE9VVCBVSU5UTiAgICAgICAgICAgICAgICAgICAgICAgICpOb0hhbmRsZXMsDQogIE9VVCAgICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICoqQnVmZmVyDQogICk7DQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgdGhlIGZpcnN0IHByb3RvY29sIGluc3RhbmNlIHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gcHJvdG9jb2wuDQogICAgDQogIEBwYXJhbSAgUHJvdG9jb2wgICAgICAgICAgICAgIFByb3ZpZGVzIHRoZSBwcm90b2NvbCB0byBzZWFyY2ggZm9yLg0KICBAcGFyYW0gIFJlZ2lzdHJhdGlvbiAgICAgICAgICBPcHRpb25hbCByZWdpc3RyYXRpb24ga2V5IHJldHVybmVkIGZyb20NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJQcm90b2NvbE5vdGlmeSgpLiAgICAgICAgICAgICAgDQogIEBwYXJhbSAgSW50ZXJmYWNlICAgICAgICAgICAgIE9uIHJldHVybiwgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBpbnRlcmZhY2UgdGhhdCBtYXRjaGVzIFByb3RvY29sIGFuZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RyYXRpb24uICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX1NVQ0NFU1MgICAgICAgICAgIEEgcHJvdG9jb2wgaW5zdGFuY2UgbWF0Y2hpbmcgUHJvdG9jb2wgd2FzIGZvdW5kIGFuZCByZXR1cm5lZCBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfTk9UX0ZPVU5EICAgICAgICAgTm8gcHJvdG9jb2wgaW5zdGFuY2VzIHdlcmUgZm91bmQgdGhhdCBtYXRjaCBQcm90b2NvbCBhbmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaXN0cmF0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEByZXR2YWwgRUZJX0lOVkFMSURfUEFSQU1FVEVSIEludGVyZmFjZSBpcyBOVUxMLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX0xPQ0FURV9QUk9UT0NPTCkgKA0KICBJTiAgRUZJX0dVSUQgICpQcm90b2NvbCwNCiAgSU4gIFZPSUQgICAgICAqUmVnaXN0cmF0aW9uLCBPUFRJT05BTA0KICBPVVQgVk9JRCAgICAgICoqSW50ZXJmYWNlDQogICk7DQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlbmd0aDsNCiAgdW5pb24gew0KICAgIEVGSV9QSFlTSUNBTF9BRERSRVNTICBEYXRhQmxvY2s7DQogICAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgIENvbnRpbnVhdGlvblBvaW50ZXI7DQogIH0gVW5pb247DQp9IFVFRklfQ0FQU1VMRV9CTE9DS19ERVNDUklQVE9SOw0KDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9HVUlEICAgICAgICAgIENhcHN1bGVHdWlkOw0KICBVSU5UMzIgICAgICAgICAgICBIZWFkZXJTaXplOw0KICBVSU5UMzIgICAgICAgICAgICBGbGFnczsNCiAgVUlOVDMyICAgICAgICAgICAgQ2Fwc3VsZUltYWdlU2l6ZTsNCn0gVUVGSV9DQVBTVUxFX0hFQURFUjsNCg0KI2RlZmluZSBDQVBTVUxFX0ZMQUdTX1BFUlNJU1RfQUNST1NTX1JFU0VUICAgICAgICAgIDB4MDAwMTAwMDANCiNkZWZpbmUgQ0FQU1VMRV9GTEFHU19QT1BVTEFURV9TWVNURU1fVEFCTEUgICAgICAgICAweDAwMDIwMDAwDQoNCi8qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFBhc3NlcyBjYXBzdWxlcyB0byB0aGUgZmlybXdhcmUgd2l0aCBib3RoIHZpcnR1YWwgYW5kIHBoeXNpY2FsIG1hcHBpbmcuIERlcGVuZGluZyBvbiB0aGUgaW50ZW5kZWQNCiAgY29uc3VtcHRpb24sIHRoZSBmaXJtd2FyZSBtYXkgcHJvY2VzcyB0aGUgY2Fwc3VsZSBpbW1lZGlhdGVseS4gSWYgdGhlIHBheWxvYWQgc2hvdWxkIHBlcnNpc3QgICAgIA0KICBhY3Jvc3MgYSBzeXN0ZW0gcmVzZXQsIHRoZSByZXNldCB2YWx1ZSByZXR1cm5lZCBmcm9tIEVGSV9RdWVyeUNhcHN1bGVDYXBhYmlsaXRpZXMgbXVzdCAgICAgICAgICAgDQogIGJlIHBhc3NlZCBpbnRvIFJlc2V0U3lzdGVtKCkgYW5kIHdpbGwgY2F1c2UgdGhlIGNhcHN1bGUgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBmaXJtd2FyZSBhcyAgICAgICANCiAgcGFydCBvZiB0aGUgcmVzZXQgcHJvY2Vzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIA0KICBAcGFyYW0gIENhcHN1bGVIZWFkZXJBcnJheSAgICBWaXJ0dWFsIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgdmlydHVhbCBwb2ludGVycyB0byB0aGUgY2Fwc3VsZXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcgcGFzc2VkIGludG8gdXBkYXRlIGNhcHN1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQ2Fwc3VsZUNvdW50ICAgICAgICAgIE51bWJlciBvZiBwb2ludGVycyB0byBFRklfQ0FQU1VMRV9IRUFERVIgaW4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzcHVsZUhlYWRlckFycmF5LiAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFNjYXR0ZXJHYXRoZXJMaXN0ICAgICBQaHlzaWNhbCBwb2ludGVyIHRvIGEgc2V0IG9mICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRklfQ0FQU1VMRV9CTE9DS19ERVNDUklQVE9SIHRoYXQgZGVzY3JpYmVzIHRoZQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiBpbiBwaHlzaWNhbCBtZW1vcnkgb2YgYSBzZXQgb2YgY2Fwc3VsZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBWYWxpZCBjYXBzdWxlIHdhcyBwYXNzZWQuIElmICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBUFNVTEVfRkxBR1NfUEVSU0lUX0FDUk9TU19SRVNFVCBpcyBub3Qgc2V0LCB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fwc3VsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGJ5IHRoZSBmaXJtd2FyZS4NCiAgQHJldHZhbCBFRklfREVWSUNFX0VSUk9SICAgICAgVGhlIGNhcHN1bGUgdXBkYXRlIHdhcyBzdGFydGVkLCBidXQgZmFpbGVkIGR1ZSB0byBhIGRldmljZSBlcnJvci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiBDYXBzdWxlU2l6ZSBpcyBOVUxMLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCioqLw0KdHlwZWRlZg0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1VQREFURV9DQVBTVUxFKSAoDQogIElOIFVFRklfQ0FQU1VMRV9IRUFERVIgICAgKipDYXBzdWxlSGVhZGVyQXJyYXksDQogIElOIFVJTlROICAgICAgICAgICAgICAgICAgQ2Fwc3VsZUNvdW50LA0KICBJTiBFRklfUEhZU0lDQUxfQUREUkVTUyAgIFNjYXR0ZXJHYXRoZXJMaXN0ICAgT1BUSU9OQUwNCiAgKTsNCg0KLyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgUmV0dXJucyBpZiB0aGUgY2Fwc3VsZSBjYW4gYmUgc3VwcG9ydGVkIHZpYSBVcGRhdGVDYXBzdWxlKCkuDQogICAgDQogIEBwYXJhbSAgQ2Fwc3VsZUhlYWRlckFycmF5ICAgIFZpcnR1YWwgcG9pbnRlciB0byBhbiBhcnJheSBvZiB2aXJ0dWFsIHBvaW50ZXJzIHRvIHRoZSBjYXBzdWxlcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWluZyBwYXNzZWQgaW50byB1cGRhdGUgY2Fwc3VsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHBhcmFtICBDYXBzdWxlQ291bnQgICAgICAgICAgTnVtYmVyIG9mIHBvaW50ZXJzIHRvIEVGSV9DQVBTVUxFX0hFQURFUiBpbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNwdWxlSGVhZGVyQXJyYXkuICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aXVtQ2Fwc3VsZVNpemUgICAgIE9uIG91dHB1dCB0aGUgbWF4aW11bSBzaXplIHRoYXQgVXBkYXRlQ2Fwc3VsZSgpIGNhbg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IGFzIGFuIGFyZ3VtZW50IHRvIFVwZGF0ZUNhcHN1bGUoKSB2aWEgICAgICANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2Fwc3VsZUhlYWRlckFycmF5IGFuZCBTY2F0dGVyR2F0aGVyTGlzdC4gICAgICAgICAgICANCiAgQHBhcmFtICBSZXNldFR5cGUgICAgICAgICAgICAgUmV0dXJucyB0aGUgdHlwZSBvZiByZXNldCByZXF1aXJlZCBmb3IgdGhlIGNhcHN1bGUgdXBkYXRlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9TVUNDRVNTICAgICAgICAgICBWYWxpZCBhbnN3ZXIgcmV0dXJuZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICBUaGUgY2Fwc3VsZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybSwgYW5kDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW1DYXBzdWxlU2l6ZSBhbmQgUmVzZXRUeXBlIGFyZSB1bmRlZmluZWQuICAgICAgICANCiAgQHJldHZhbCBFRklfSU5WQUxJRF9QQVJBTUVURVIgTWF4aW11bUNhcHN1bGVTaXplIGlzIE5VTEwuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KKiovDQp0eXBlZGVmDQpFRklfU1RBVFVTDQooRUZJQVBJICpFRklfUVVFUllfQ0FQU1VMRV9DQVBBQklMSVRJRVMpICgNCiAgSU4gIFVFRklfQ0FQU1VMRV9IRUFERVIgICAgKipDYXBzdWxlSGVhZGVyQXJyYXksDQogIElOICBVSU5UTiAgICAgICAgICAgICAgICAgIENhcHN1bGVDb3VudCwNCiAgT1VUIFVJTlQ2NCAgICAgICAgICAgICAgICAgKk1heGltdW1DYXBzdWxlU2l6ZSwNCiAgT1VUIEVGSV9SRVNFVF9UWVBFICAgICAgICAgKlJlc2V0VHlwZQ0KICApOw0KDQovKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEVGSSB2YXJpYWJsZXMuDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgQXR0cmlidXRlcyAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzIGJpdG1hc2sgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB2YXJpYWJsZXMgb24NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRvIHJldHVybiBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIE1heGltdW1WYXJpYWJsZVN0b3JhZ2VTaXplICAgT24gb3V0cHV0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHN0b3JhZ2Ugc3BhY2UgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoZSBFRkkgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcGFyYW0gIFJlbWFpbmluZ1ZhcmlhYmxlU3RvcmFnZVNpemUgUmV0dXJucyB0aGUgcmVtYWluaW5nIHNpemUgb2YgdGhlIHN0b3JhZ2Ugc3BhY2UgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHRoZSBFRkkgdmFyaWFibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgc3BlY2lmaWVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogIEBwYXJhbSAgTWF4aW11bVZhcmlhYmxlU2l6ZSAgICAgICAgICBSZXR1cm5zIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGluZGl2aWR1YWwgRUZJICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGVzIHNwZWNpZmllZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgQHJldHZhbCBFRklfU1VDQ0VTUyAgICAgICAgICAgICAgICAgIFZhbGlkIGFuc3dlciByZXR1cm5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9JTlZBTElEX1BBUkFNRVRFUiAgICAgICAgQW4gaW52YWxpZCBjb21iaW5hdGlvbiBvZiBhdHRyaWJ1dGUgYml0cyB3YXMgc3VwcGxpZWQgICAgICAgICAgICAgICAgIA0KICBAcmV0dmFsIEVGSV9VTlNVUFBPUlRFRCAgICAgICAgICAgICAgVGhlIGF0dHJpYnV0ZSBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgcGxhdGZvcm0sIGFuZCB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW1WYXJpYWJsZVN0b3JhZ2VTaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmdWYXJpYWJsZVN0b3JhZ2VTaXplLCBNYXhpbXVtVmFyaWFibGVTaXplICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHVuZGVmaW5lZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoqKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQp0eXBlZGVmICAgICAgICAgICAgICAgICAgICAgICAgIA0KRUZJX1NUQVRVUw0KKEVGSUFQSSAqRUZJX1FVRVJZX1ZBUklBQkxFX0lORk8pICgNCiAgSU4gIFVJTlQzMiAgICAgICAgICAgIEF0dHJpYnV0ZXMsDQogIE9VVCBVSU5UNjQgICAgICAgICAgICAqTWF4aW11bVZhcmlhYmxlU3RvcmFnZVNpemUsDQogIE9VVCBVSU5UNjQgICAgICAgICAgICAqUmVtYWluaW5nVmFyaWFibGVTdG9yYWdlU2l6ZSwNCiAgT1VUIFVJTlQ2NCAgICAgICAgICAgICpNYXhpbXVtVmFyaWFibGVTaXplDQogICk7DQoNCg0KLy8NCi8vIEVGSSBSdW50aW1lIFNlcnZpY2VzIFRhYmxlDQovLw0KI2RlZmluZSBFRklfMV8wMl9TWVNURU1fVEFCTEVfUkVWSVNJT04gICgoMSA8PCAxNikgfCAwMikNCiNkZWZpbmUgRUZJXzFfMTBfU1lTVEVNX1RBQkxFX1JFVklTSU9OICAoKDEgPDwgMTYpIHwgMTApDQojZGVmaW5lIEVGSV8yXzAwX1NZU1RFTV9UQUJMRV9SRVZJU0lPTiAgKCgyIDw8IDE2KSB8IDApDQoNCiNkZWZpbmUgRUZJX1JVTlRJTUVfU0VSVklDRVNfU0lHTkFUVVJFICAweDU2NTI0NTUzNTQ0ZTU1NTJVTEwNCiNkZWZpbmUgRUZJX1JVTlRJTUVfU0VSVklDRVNfUkVWSVNJT04gICAoRUZJXzJfMDBfU1lTVEVNX1RBQkxFX1JFVklTSU9OKQ0KDQojaWYgKEVES19SRUxFQVNFX1ZFUlNJT04gIT0gMCkgJiYgKEVGSV9TUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPCAweDAwMDIwMDAwKQ0KLy8NCi8vIEluY2x1ZGUgdGhlIGRlZmluaXRpb24gZm9yIFRJQU5PX1JFUE9SVF9TVEFUVVNfQ09ERSBpZiB0aGlzIGlzIHRoZSB2ZXJzaW9uDQovLyAgb2YgVGlhbm8gdGhhdCBleHRlbmRlZCB0aGUgRUZJIHNwZWNpZmljYXRpb24uIElmIFRpYW5vIG1vZGUgaXMgZGlhYmxlZA0KLy8gIGRvbid0IGluY2x1ZGUgaXQuDQovLw0KI2luY2x1ZGUgPER4ZS9BcmNoUHJvdG9jb2wvU3RhdHVzQ29kZS5oPg0KI2VuZGlmDQoNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfVEFCTEVfSEVBREVSICAgICAgICAgICAgICBIZHI7DQoNCiAgLy8NCiAgLy8gVGltZSBzZXJ2aWNlcw0KICAvLw0KICBFRklfR0VUX1RJTUUgICAgICAgICAgICAgICAgICBHZXRUaW1lOw0KICBFRklfU0VUX1RJTUUgICAgICAgICAgICAgICAgICBTZXRUaW1lOw0KICBFRklfR0VUX1dBS0VVUF9USU1FICAgICAgICAgICBHZXRXYWtldXBUaW1lOw0KICBFRklfU0VUX1dBS0VVUF9USU1FICAgICAgICAgICBTZXRXYWtldXBUaW1lOw0KDQogIC8vDQogIC8vIFZpcnR1YWwgbWVtb3J5IHNlcnZpY2VzDQogIC8vDQogIEVGSV9TRVRfVklSVFVBTF9BRERSRVNTX01BUCAgIFNldFZpcnR1YWxBZGRyZXNzTWFwOw0KICBFRklfQ09OVkVSVF9QT0lOVEVSICAgICAgICAgICBDb252ZXJ0UG9pbnRlcjsNCg0KICAvLw0KICAvLyBWYXJpYWJsZSBzZXJ2aWNlcw0KICAvLw0KICBFRklfR0VUX1ZBUklBQkxFICAgICAgICAgICAgICBHZXRWYXJpYWJsZTsNCiAgRUZJX0dFVF9ORVhUX1ZBUklBQkxFX05BTUUgICAgR2V0TmV4dFZhcmlhYmxlTmFtZTsNCiAgRUZJX1NFVF9WQVJJQUJMRSAgICAgICAgICAgICAgU2V0VmFyaWFibGU7DQoNCiAgLy8NCiAgLy8gTWlzYw0KICAvLw0KICBFRklfR0VUX05FWFRfSElHSF9NT05PX0NPVU5UICBHZXROZXh0SGlnaE1vbm90b25pY0NvdW50Ow0KICBFRklfUkVTRVRfU1lTVEVNICAgICAgICAgICAgICBSZXNldFN5c3RlbTsNCg0KI2lmIChFRklfU1BFQ0lGSUNBVElPTl9WRVJTSU9OID49IDB4MDAwMjAwMDApDQogIC8vDQogIC8vIE5ldyBCb290IFNlcnZpY2VzIGFkZGVkIGJ5IFVFRkkgMi4wDQogIC8vDQogIEVGSV9VUERBVEVfQ0FQU1VMRSAgICAgICAgICAgICAgVXBkYXRlQ2Fwc3VsZTsNCiAgRUZJX1FVRVJZX0NBUFNVTEVfQ0FQQUJJTElUSUVTICBRdWVyeUNhcHN1bGVDYXBhYmlsaXRpZXM7DQogIEVGSV9RVUVSWV9WQVJJQUJMRV9JTkZPICAgICAgICAgUXVlcnlWYXJpYWJsZUluZm87DQojZWxpZiAoRURLX1JFTEVBU0VfVkVSU0lPTiAhPSAwKQ0KICAvLw0KICAvLyBUaWFubyBleHRlbnNpb24gdG8gRUZJIDEuMTAgcnVudGltZSB0YWJsZQ0KICAvLyAgSXQgd2FzIG1vdmVkIHRvIGEgcHJvdG9jb2wgdG8gbm90IGNvbmZsaWN0IHdpdGggVUVGSSAyLjANCiAgLy8gIElmIFRpYW5vIGlzIGRpc2FibGVkIHRoaXMgaXRlbSBpcyBub3QgZW5hYmxlZCBmb3IgRUZJIDEuMTANCiAgLy8NCiAgVElBTk9fUkVQT1JUX1NUQVRVU19DT0RFICAgICAgICBSZXBvcnRTdGF0dXNDb2RlOw0KI2VuZGlmDQp9IEVGSV9SVU5USU1FX1NFUlZJQ0VTOw0KDQovLw0KLy8gRUZJIEJvb3QgU2VydmljZXMgVGFibGUNCi8vDQojZGVmaW5lIEVGSV9CT09UX1NFUlZJQ0VTX1NJR05BVFVSRSAweDU2NTI0NTUzNTQ0ZjRmNDJVTEwNCiNkZWZpbmUgRUZJX0JPT1RfU0VSVklDRVNfUkVWSVNJT04gIChFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pDQoNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX1RBQkxFX0hFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZHI7DQoNCiAgLy8NCiAgLy8gVGFzayBwcmlvcml0eSBmdW5jdGlvbnMNCiAgLy8NCiAgRUZJX1JBSVNFX1RQTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSYWlzZVRQTDsNCiAgRUZJX1JFU1RPUkVfVFBMICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN0b3JlVFBMOw0KDQogIC8vDQogIC8vIE1lbW9yeSBmdW5jdGlvbnMNCiAgLy8NCiAgRUZJX0FMTE9DQVRFX1BBR0VTICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0ZVBhZ2VzOw0KICBFRklfRlJFRV9QQUdFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVQYWdlczsNCiAgRUZJX0dFVF9NRU1PUllfTUFQICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRNZW1vcnlNYXA7DQogIEVGSV9BTExPQ0FURV9QT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdGVQb29sOw0KICBFRklfRlJFRV9QT09MICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVQb29sOw0KDQogIC8vDQogIC8vIEV2ZW50ICYgdGltZXIgZnVuY3Rpb25zDQogIC8vDQogIEVGSV9DUkVBVEVfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnQ7DQogIEVGSV9TRVRfVElNRVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VGltZXI7DQogIEVGSV9XQUlUX0ZPUl9FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgV2FpdEZvckV2ZW50Ow0KICBFRklfU0lHTkFMX0VWRU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hbEV2ZW50Ow0KICBFRklfQ0xPU0VfRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlRXZlbnQ7DQogIEVGSV9DSEVDS19FVkVOVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tFdmVudDsNCg0KICAvLw0KICAvLyBQcm90b2NvbCBoYW5kbGVyIGZ1bmN0aW9ucw0KICAvLw0KICBFRklfSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UgICAgICAgICAgICAgIEluc3RhbGxQcm90b2NvbEludGVyZmFjZTsNCiAgRUZJX1JFSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UgICAgICAgICAgICBSZWluc3RhbGxQcm90b2NvbEludGVyZmFjZTsNCiAgRUZJX1VOSU5TVEFMTF9QUk9UT0NPTF9JTlRFUkZBQ0UgICAgICAgICAgICBVbmluc3RhbGxQcm90b2NvbEludGVyZmFjZTsNCiAgRUZJX0hBTkRMRV9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVQcm90b2NvbDsNCiAgVk9JRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUmVzZXJ2ZWQ7DQogIEVGSV9SRUdJU1RFUl9QUk9UT0NPTF9OT1RJRlkgICAgICAgICAgICAgICAgUmVnaXN0ZXJQcm90b2NvbE5vdGlmeTsNCiAgRUZJX0xPQ0FURV9IQU5ETEUgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGVIYW5kbGU7DQogIEVGSV9MT0NBVEVfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgTG9jYXRlRGV2aWNlUGF0aDsNCiAgRUZJX0lOU1RBTExfQ09ORklHVVJBVElPTl9UQUJMRSAgICAgICAgICAgICBJbnN0YWxsQ29uZmlndXJhdGlvblRhYmxlOw0KDQogIC8vDQogIC8vIEltYWdlIGZ1bmN0aW9ucw0KICAvLw0KICBFRklfSU1BR0VfTE9BRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJbWFnZTsNCiAgRUZJX0lNQUdFX1NUQVJUICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydEltYWdlOw0KICBFRklfRVhJVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4aXQ7DQogIEVGSV9JTUFHRV9VTkxPQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5sb2FkSW1hZ2U7DQogIEVGSV9FWElUX0JPT1RfU0VSVklDRVMgICAgICAgICAgICAgICAgICAgICAgRXhpdEJvb3RTZXJ2aWNlczsNCg0KICAvLw0KICAvLyBNaXNjIGZ1bmN0aW9ucw0KICAvLw0KICBFRklfR0VUX05FWFRfTU9OT1RPTklDX0NPVU5UICAgICAgICAgICAgICAgIEdldE5leHRNb25vdG9uaWNDb3VudDsNCiAgRUZJX1NUQUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFsbDsNCiAgRUZJX1NFVF9XQVRDSERPR19USU1FUiAgICAgICAgICAgICAgICAgICAgICBTZXRXYXRjaGRvZ1RpbWVyOw0KDQogIC8vDQogIC8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCiAgLy8gRUZJIDEuMSBTZXJ2aWNlcw0KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KICAvLw0KICAvLyBEcml2ZXJTdXBwb3J0IFNlcnZpY2VzDQogIC8vDQogIEVGSV9DT05ORUNUX0NPTlRST0xMRVIgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdENvbnRyb2xsZXI7DQogIEVGSV9ESVNDT05ORUNUX0NPTlRST0xMRVIgICAgICAgICAgICAgICAgICAgRGlzY29ubmVjdENvbnRyb2xsZXI7DQoNCiAgLy8NCiAgLy8gQWRkZWQgT3BlbiBhbmQgQ2xvc2UgcHJvdG9jb2wgZm9yIHRoZSBuZXcgZHJpdmVyIG1vZGVsDQogIC8vDQogIEVGSV9PUEVOX1BST1RPQ09MICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlblByb3RvY29sOw0KICBFRklfQ0xPU0VfUFJPVE9DT0wgICAgICAgICAgICAgICAgICAgICAgICAgIENsb3NlUHJvdG9jb2w7DQogIEVGSV9PUEVOX1BST1RPQ09MX0lORk9STUFUSU9OICAgICAgICAgICAgICAgT3BlblByb3RvY29sSW5mb3JtYXRpb247DQoNCiAgLy8NCiAgLy8gQWRkZWQgbmV3IHNlcnZpY2VzIHRvIEVGSSAxLjEgYXMgTGliIHRvIHJlZHVjZSBjb2RlIHNpemUuDQogIC8vDQogIEVGSV9QUk9UT0NPTFNfUEVSX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgUHJvdG9jb2xzUGVySGFuZGxlOw0KICBFRklfTE9DQVRFX0hBTkRMRV9CVUZGRVIgICAgICAgICAgICAgICAgICAgIExvY2F0ZUhhbmRsZUJ1ZmZlcjsNCiAgRUZJX0xPQ0FURV9QUk9UT0NPTCAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhdGVQcm90b2NvbDsNCg0KICBFRklfSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTICAgIEluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlczsNCiAgRUZJX1VOSU5TVEFMTF9NVUxUSVBMRV9QUk9UT0NPTF9JTlRFUkZBQ0VTICBVbmluc3RhbGxNdWx0aXBsZVByb3RvY29sSW50ZXJmYWNlczsNCg0KICAvLw0KICAvLyBDUkMzMiBzZXJ2aWNlcw0KICAvLw0KICBFRklfQ0FMQ1VMQVRFX0NSQzMyICAgICAgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0ZUNyYzMyOw0KDQogIC8vDQogIC8vIE1lbW9yeSBVdGlsaXR5IFNlcnZpY2VzDQogIC8vDQogIEVGSV9DT1BZX01FTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29weU1lbTsNCiAgRUZJX1NFVF9NRU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRNZW07DQoNCiNpZiAoRUZJX1NQRUNJRklDQVRJT05fVkVSU0lPTiA+PSAweDAwMDIwMDAwKQ0KICAvLw0KICAvLyBVRUZJIDIuMCBFeHRlbnNpb24gdG8gdGhlIHRhYmxlDQogIC8vDQogIEVGSV9DUkVBVEVfRVZFTlRfRVggICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRXZlbnRFeDsNCiNlbmRpZg0KfSBFRklfQk9PVF9TRVJWSUNFUzsNCg0KLy8NCi8vIEVGSSBDb25maWd1cmF0aW9uIFRhYmxlDQovLw0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfR1VJRCAgVmVuZG9yR3VpZDsNCiAgVk9JRCAgICAgICpWZW5kb3JUYWJsZTsNCn0gRUZJX0NPTkZJR1VSQVRJT05fVEFCTEU7DQoNCi8vDQovLyBFRkkgU3lzdGVtIFRhYmxlDQovLw0KI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1NJR05BVFVSRSAgICAgIDB4NTQ1MzU5NTMyMDQ5NDI0OVVMTA0KI2RlZmluZSBFRklfU1lTVEVNX1RBQkxFX1JFVklTSU9OICAgICAgIChFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pDQoNCnN0cnVjdCBfRUZJX1NZU1RFTV9UQUJMRSB7DQogIEVGSV9UQUJMRV9IRUFERVIgICAgICAgICAgICAgIEhkcjsNCg0KICBDSEFSMTYgICAgICAgICAgICAgICAgICAgICAgICAqRmlybXdhcmVWZW5kb3I7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgIEZpcm13YXJlUmV2aXNpb247DQoNCiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgQ29uc29sZUluSGFuZGxlOw0KICBFRklfU0lNUExFX1RFWFRfSU5fUFJPVE9DT0wgICAqQ29uSW47DQoNCiAgRUZJX0hBTkRMRSAgICAgICAgICAgICAgICAgICAgQ29uc29sZU91dEhhbmRsZTsNCiAgRUZJX1NJTVBMRV9URVhUX09VVF9QUk9UT0NPTCAgKkNvbk91dDsNCg0KICBFRklfSEFORExFICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZEVycm9ySGFuZGxlOw0KICBFRklfU0lNUExFX1RFWFRfT1VUX1BST1RPQ09MICAqU3RkRXJyOw0KDQogIEVGSV9SVU5USU1FX1NFUlZJQ0VTICAgICAgICAgICpSdW50aW1lU2VydmljZXM7DQogIEVGSV9CT09UX1NFUlZJQ0VTICAgICAgICAgICAgICpCb290U2VydmljZXM7DQoNCiAgVUlOVE4gICAgICAgICAgICAgICAgICAgICAgICAgTnVtYmVyT2ZUYWJsZUVudHJpZXM7DQogIEVGSV9DT05GSUdVUkFUSU9OX1RBQkxFICAgICAgICpDb25maWd1cmF0aW9uVGFibGU7DQoNCn07DQoNCi8vDQovLyBEZXZpY2UgUGF0aCBpbmZvcm1hdGlvbg0KLy8NCg0KI3ByYWdtYSBwYWNrKDEpDQoNCi8vDQovLyBIYXJkd2FyZSBEZXZpY2UgUGF0aHMNCi8vDQojZGVmaW5lIEhBUkRXQVJFX0RFVklDRV9QQVRIICAgICAgMHgwMQ0KDQojZGVmaW5lIEhXX1BDSV9EUCAgICAgICAgICAgICAgICAgMHgwMQ0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2U7DQp9IFBDSV9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBIV19QQ0NBUkRfRFAgICAgICAgICAgICAgIDB4MDINCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb25OdW1iZXI7DQp9IFBDQ0FSRF9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBIV19NRU1NQVBfRFAgICAgICAgICAgICAgIDB4MDMNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5VHlwZTsNCiAgRUZJX1BIWVNJQ0FMX0FERFJFU1MgICAgICAgICAgICBTdGFydGluZ0FkZHJlc3M7DQogIEVGSV9QSFlTSUNBTF9BRERSRVNTICAgICAgICAgICAgRW5kaW5nQWRkcmVzczsNCn0gTUVNTUFQX0RFVklDRV9QQVRIOw0KDQojZGVmaW5lIEhXX1ZFTkRPUl9EUCAgICAgICAgICAgICAgMHgwNA0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBHdWlkOw0KfSBWRU5ET1JfREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgSFdfQ09OVFJPTExFUl9EUCAgICAgICAgICAweDA1DQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KI2lmIEVES19SRUxFQVNFX1ZFUlNJT04gPj0gMHgwMDAyMDAwMA0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXJOdW1iZXI7DQojZWxzZQ0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xsZXI7DQojZW5kaWYNCn0gQ09OVFJPTExFUl9ERVZJQ0VfUEFUSDsNCg0KLy8NCi8vIEFDUEkgRGV2aWNlIFBhdGhzDQovLw0KI2RlZmluZSBBQ1BJX0RFVklDRV9QQVRIICAgICAgICAgIDB4MDINCg0KI2RlZmluZSBBQ1BJX0RQICAgICAgICAgICAgICAgICAgIDB4MDENCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgSElEOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFVJRDsNCn0gQUNQSV9ISURfREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgQUNQSV9FWFRFTkRFRF9EUCAgICAgICAgICAweDAyDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIEhJRDsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBVSUQ7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQ0lEOw0KICAvLw0KICAvLyBPcHRpb25hbCB2YXJpYWJsZSBsZW5ndGggX0hJRFNUUg0KICAvLyBPcHRpb25hbCB2YXJpYWJsZSBsZW5ndGggX1VJRFNUUg0KICAvLw0KfSBBQ1BJX0VYVEVOREVEX0hJRF9ERVZJQ0VfUEFUSDsNCg0KLy8NCi8vICBFSVNBIElEIE1hY3JvDQovLyAgRUlTQSBJRCBEZWZpbml0aW9uIDMyLWJpdHMNCi8vICAgYml0c1sxNTowXSAtIHRocmVlIGNoYXJhY3RlciBjb21wcmVzc2VkIEFTQ0lJIEVJU0EgSUQuDQovLyAgIGJpdHNbMzE6MTZdIC0gYmluYXJ5IG51bWJlcg0KLy8gICAgQ29tcHJlc3NlZCBBU0NJSSBpcyA1IGJpdHMgcGVyIGNoYXJhY3RlciAwYjAwMDAxID0gJ0EnIDBiMTEwMTAgPSAnWicNCi8vDQojZGVmaW5lIFBOUF9FSVNBX0lEX0NPTlNUICAgICAgICAgMHg0MWQwDQojZGVmaW5lIEVJU0FfSUQoX05hbWUsIF9OdW0pICAgICAgKChVSU5UMzIpICgoX05hbWUpIHwgKF9OdW0pIDw8IDE2KSkNCiNkZWZpbmUgRUlTQV9QTlBfSUQoX1BOUElkKSAgICAgICAoRUlTQV9JRChQTlBfRUlTQV9JRF9DT05TVCwgKF9QTlBJZCkpKQ0KI2RlZmluZSBFRklfUE5QX0lEKF9QTlBJZCkgICAgICAgIChFSVNBX0lEKFBOUF9FSVNBX0lEX0NPTlNULCAoX1BOUElkKSkpDQoNCiNkZWZpbmUgUE5QX0VJU0FfSURfTUFTSyAgICAgICAgICAweGZmZmYNCiNkZWZpbmUgRUlTQV9JRF9UT19OVU0oX0lkKSAgICAgICAoKF9JZCkgPj4gMTYpDQoNCg0KI2RlZmluZSBBQ1BJX0FEUl9EUCAgICAgICAgICAgICAgIDB4MDMNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQURSOw0KfSBBQ1BJX0FEUl9ERVZJQ0VfUEFUSDsNCg0KDQovLw0KLy8gTWVzc2FnaW5nIERldmljZSBQYXRocw0KLy8NCiNkZWZpbmUgTUVTU0FHSU5HX0RFVklDRV9QQVRIICAgICAweDAzDQoNCiNkZWZpbmUgTVNHX0FUQVBJX0RQICAgICAgICAgICAgICAweDAxDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1hcnlTZWNvbmRhcnk7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xhdmVNYXN0ZXI7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTHVuOw0KfSBBVEFQSV9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfU0NTSV9EUCAgICAgICAgICAgICAgIDB4MDINCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgUHVuOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsNCn0gU0NTSV9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfRklCUkVDSEFOTkVMX0RQICAgICAgIDB4MDMNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzZXJ2ZWQ7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgV1dOOw0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEx1bjsNCn0gRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIOw0KDQojZGVmaW5lIE1TR18xMzk0X0RQICAgICAgICAgICAgICAgMHgwNA0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsNCiAgVUlOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZDsNCiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBHdWlkOw0KfSBGMTM5NF9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfVVNCX0RQICAgICAgICAgICAgICAgIDB4MDUNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICBIZWFkZXI7DQogICAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgUGFyZW50UG9ydE51bWJlcjsNCiAgICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlcmZhY2VOdW1iZXI7DQp9IFVTQl9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfVVNCX0NMQVNTX0RQICAgICAgICAgIDB4MGYNCnR5cGVkZWYgc3RydWN0IHsNCiAgICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICBIZWFkZXI7DQogICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgVmVuZG9ySWQ7DQogICAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgUHJvZHVjdElkOw0KICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUNsYXNzOw0KICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVN1YkNsYXNzOw0KICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVByb3RvY29sOw0KfSBVU0JfQ0xBU1NfREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgTVNHX1VTQl9XV0lEX0RQICAgICAgICAgICAweDEwDQp0eXBlZGVmIHN0cnVjdCB7DQogICAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgSGVhZGVyOw0KICAgIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZU51bWJlcjsNCiAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICBWZW5kb3JJZDsNCiAgICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICBQcm9kdWN0SWQ7DQogICAgLy8gQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgU2VyaWFsTnVtYmVyW107DQp9IFVTQl9XV0lEX0RFVklDRV9QQVRIOw0KDQojZGVmaW5lIE1TR19ERVZJQ0VfTE9HSUNBTF9VTklUX0RQICAweDExDQp0eXBlZGVmIHN0cnVjdCB7DQogICAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgSGVhZGVyOw0KICAgIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgIExVTjsNCn0gREVWSUNFX0xPR0lDQUxfVU5JVF9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfSTJPX0RQICAgICAgICAgICAgICAgIDB4MDYNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgVGlkOw0KfSBJMk9fREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgTVNHX01BQ19BRERSX0RQICAgICAgICAgICAweDBiDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KICBFRklfTUFDX0FERFJFU1MgICAgICAgICAgICAgICAgIE1hY0FkZHJlc3M7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgSWZUeXBlOw0KfSBNQUNfQUREUl9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfSVB2NF9EUCAgICAgICAgICAgICAgIDB4MGMNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIEVGSV9JUHY0X0FERFJFU1MgICAgICAgICAgICAgICAgTG9jYWxJcEFkZHJlc3M7DQogIEVGSV9JUHY0X0FERFJFU1MgICAgICAgICAgICAgICAgUmVtb3RlSXBBZGRyZXNzOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydDsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVQb3J0Ow0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY0lwQWRkcmVzczsNCn0gSVB2NF9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfSVB2Nl9EUCAgICAgICAgICAgICAgIDB4MGQNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIEVGSV9JUHY2X0FERFJFU1MgICAgICAgICAgICAgICAgTG9jYWxJcEFkZHJlc3M7DQogIEVGSV9JUHY2X0FERFJFU1MgICAgICAgICAgICAgICAgUmVtb3RlSXBBZGRyZXNzOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsUG9ydDsNCiAgVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGVQb3J0Ow0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3RvY29sOw0KICBCT09MRUFOICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRpY0lwQWRkcmVzczsNCn0gSVB2Nl9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNU0dfSU5GSU5JQkFORF9EUCAgICAgICAgIDB4MDkNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VGbGFnczsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBQb3J0R2lkWzE2XTsNCiAgVUlOVDY0ICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlSWQ7DQogIFVJTlQ2NCAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0UG9ydElkOw0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlkOw0KfSBJTkZJTklCQU5EX0RFVklDRV9QQVRIOw0KDQojZGVmaW5lIElORklOSUJBTkRfUkVTT1VSQ0VfRkxBR19JT0NfU0VSVklDRSAgICAgICAgICAgICAgICAweDAxDQojZGVmaW5lIElORklOSUJBTkRfUkVTT1VSQ0VfRkxBR19FWFRFTkRFRF9CT09UX0VOVklST05NRU5UICAweDAyDQojZGVmaW5lIElORklOSUJBTkRfUkVTT1VSQ0VfRkxBR19DT05TT0xFX1BST1RPQ09MICAgICAgICAgICAweDA0DQojZGVmaW5lIElORklOSUJBTkRfUkVTT1VSQ0VfRkxBR19TVE9SQUdFX1BST1RPQ09MICAgICAgICAgICAweDA4DQojZGVmaW5lIElORklOSUJBTkRfUkVTT1VSQ0VfRkxBR19ORVRXT1JLX1BST1RPQ09MICAgICAgICAgICAweDEwDQoNCiNkZWZpbmUgTVNHX1VBUlRfRFAgICAgICAgICAgICAgICAweDBlDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOw0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdWRSYXRlOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCaXRzOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcml0eTsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9wQml0czsNCn0gVUFSVF9ERVZJQ0VfUEFUSDsNCg0KLy8NCi8vIFVzZSBWRU5ET1JfREVWSUNFX1BBVEggc3RydWN0DQovLw0KI2RlZmluZSBNU0dfVkVORE9SX0RQICAgICAgICAgICAgIDB4MGENCg0KI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfUENfQU5TSSAgICAgRUZJX1BDX0FOU0lfR1VJRA0KI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfVlRfMTAwICAgICAgRUZJX1ZUXzEwMF9HVUlEDQojZGVmaW5lIERFVklDRV9QQVRIX01FU1NBR0lOR19WVF8xMDBfUExVUyBFRklfVlRfMTAwX1BMVVNfR1VJRA0KI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfVlRfVVRGOCAgICAgRUZJX1ZUX1VURjhfR1VJRA0KI2RlZmluZSBERVZJQ0VfUEFUSF9NRVNTQUdJTkdfU0FTICAgICAgICAgRUZJX1NBU19ERVZJQ0VfUEFUSF9HVUlEDQoNCg0KI2RlZmluZSBNU0dfSVNDU0lfRFAgICAgICAgICAgICAgIDB4MTMNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1Byb3RvY29sOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2luT3B0aW9uOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFBvcnRhbEdyb3VwVGFnOw0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIExVTjsNCiAgLy8gQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICBpU0NTSSBUYXJnZXQgTmFtZQ0KfSBJU0NTSV9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBJU0NTSV9MT0dJTl9PUFRJT05fTk9fSEVBREVSX0RJR0VTVCAgICAgICAgICAgICAweDAwMDANCiNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX0hFQURFUl9ESUdFU1RfVVNJTkdfQ1JDMzJDICAgMHgwMDAyDQojZGVmaW5lIElTQ1NJX0xPR0lOX09QVElPTl9OT19EQVRBX0RJR0VTVCAgICAgICAgICAgICAgIDB4MDAwMA0KI2RlZmluZSBJU0NTSV9MT0dJTl9PUFRJT05fREFUQV9ESUdFU1RfVVNJTkdfQ1JDMzJDICAgICAweDAwMDgNCiNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX0FVVEhNRVRIT0RfQ0hBUCAgICAgICAgICAgICAgMHgwMDAwDQojZGVmaW5lIElTQ1NJX0xPR0lOX09QVElPTl9BVVRITUVUSE9EX05PTiAgICAgICAgICAgICAgIDB4MTAwMA0KI2RlZmluZSBJU0NTSV9MT0dJTl9PUFRJT05fQ0hBUF9CSSAgICAgICAgICAgICAgICAgICAgICAweDAwMDANCiNkZWZpbmUgSVNDU0lfTE9HSU5fT1BUSU9OX0NIQVBfVU5JICAgICAgICAgICAgICAgICAgICAgMHgyMDAwDQoNCg0KLy8NCi8vIE1lZGlhIERldmljZSBQYXRoDQovLw0KI2RlZmluZSBNRURJQV9ERVZJQ0VfUEFUSCAgICAgICAgIDB4MDQNCg0KI2RlZmluZSBNRURJQV9IQVJERFJJVkVfRFAgICAgICAgIDB4MDENCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uTnVtYmVyOw0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblN0YXJ0Ow0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblNpemU7DQogIFVJTlQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgU2lnbmF0dXJlWzE2XTsNCiAgVUlOVDggICAgICAgICAgICAgICAgICAgICAgICAgICBNQlJUeXBlOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpZ25hdHVyZVR5cGU7DQp9IEhBUkREUklWRV9ERVZJQ0VfUEFUSDsNCg0KI2RlZmluZSBNQlJfVFlQRV9QQ0FUICAgICAgICAgICAgIDB4MDENCiNkZWZpbmUgTUJSX1RZUEVfRUZJX1BBUlRJVElPTl9UQUJMRV9IRUFERVIgMHgwMg0KDQojZGVmaW5lIFNJR05BVFVSRV9UWVBFX01CUiAgICAgICAgMHgwMQ0KI2RlZmluZSBTSUdOQVRVUkVfVFlQRV9HVUlEICAgICAgIDB4MDINCg0KI2RlZmluZSBNRURJQV9DRFJPTV9EUCAgICAgICAgICAgIDB4MDINCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICAgICAgICBIZWFkZXI7DQogIFVJTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vdEVudHJ5Ow0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblN0YXJ0Ow0KICBVSU5UNjQgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvblNpemU7DQp9IENEUk9NX0RFVklDRV9QQVRIOw0KDQovLw0KLy8gVXNlIFZFTkRPUl9ERVZJQ0VfUEFUSCBzdHJ1Y3QNCi8vDQojZGVmaW5lIE1FRElBX1ZFTkRPUl9EUCAgICAgICAgICAgMHgwMw0KDQojZGVmaW5lIE1FRElBX0ZJTEVQQVRIX0RQICAgICAgICAgMHgwNA0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsNCiAgQ0hBUjE2ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXRoTmFtZVsxXTsNCn0gRklMRVBBVEhfREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgU0laRV9PRl9GSUxFUEFUSF9ERVZJQ0VfUEFUSCBFRklfRklFTERfT0ZGU0VUKEZJTEVQQVRIX0RFVklDRV9QQVRILFBhdGhOYW1lKQ0KDQojZGVmaW5lIE1FRElBX1BST1RPQ09MX0RQICAgICAgICAgMHgwNQ0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgIEhlYWRlcjsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICAgICAgICBQcm90b2NvbDsNCn0gTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEg7DQoNCiNpZiAoKEVES19SRUxFQVNFX1ZFUlNJT04gIT0gMCkgJiYgKEVGSV9TUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPCAweDAwMDIwMDAwKSkNCi8vDQovLyBQcmlvciB0byBVRUZJIDIuMCBUaWFubyBleHRlbmRlZCB0aGlzIGVudW0uIFVFRkkgb3ducyBkZXZpY2UgcGF0aCB2YWx1ZXMNCi8vIGFuZCB3ZSBtb3ZlZCB0byBhIG5ldyBHVUlEJ2VkIGRldmljZSBwYXRoIGZvciBUaWFubw0KLy8NCg0KI2RlZmluZSBNRURJQV9GVl9GSUxFUEFUSF9EUCAgICAgIDB4MDYNCnR5cGVkZWYgc3RydWN0IHsNCiAgRUZJX0RFVklDRV9QQVRIX1BST1RPQ09MICBIZWFkZXI7DQogIEVGSV9HVUlEICAgICAgICAgICAgICAgICAgTmFtZUd1aWQ7DQp9IE1FRElBX0ZXX1ZPTF9GSUxFUEFUSF9ERVZJQ0VfUEFUSDsNCg0KI2Vsc2UNCg0KdHlwZWRlZiBzdHJ1Y3Qgew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgIEhlYWRlcjsNCiAgRUZJX0dVSUQgICAgICAgICAgICAgICAgICBQaXdnU3BlY2lmaWNEZXZpY2VQYXRoOw0KICBVSU5UMzIgICAgICAgICAgICAgICAgICAgIFR5cGU7DQp9IFBJV0dfREVWSUNFX1BBVEg7DQoNCiNkZWZpbmUgUElXR19NRURJQV9GV19WT0xfRklMRVBBVEhfREVWSUNFX1BBVEhfVFlQRSAgICAgICAgIDB4MDENCnR5cGVkZWYgc3RydWN0IHsNCiAgUElXR19ERVZJQ0VfUEFUSCAgICAgIFBpd2c7DQogIEVGSV9HVUlEICAgICAgICAgICAgICBOYW1lR3VpZDsNCn0gTUVESUFfRldfVk9MX0ZJTEVQQVRIX0RFVklDRV9QQVRIOw0KDQovLw0KLy8gUGxhY2UgaG9sZGVyIGZvciBhIGZ1dHVyZSBleHRlbnNpb24NCi8vDQojZGVmaW5lIFBJV0dfTUVESUFGV19WT0xfREVWSUNFX1BBVEhfVFlQRSAgICAgICAgICAgICAgICAgICAweDAyDQp0eXBlZGVmIHN0cnVjdCB7DQogIFBJV0dfREVWSUNFX1BBVEggICAgICBQaXdnOw0KICBFRklfR1VJRCAgICAgICAgICAgICAgVm9sdW1lR3VpZDsNCn0gTUVESUFfRldfVk9MX0RFVklDRV9QQVRIOw0KDQojZW5kaWYNCg0KDQovLw0KLy8gQkJTIERldmljZSBQYXRoDQovLw0KI2RlZmluZSBCQlNfREVWSUNFX1BBVEggICAgICAgICAgIDB4MDUNCiNkZWZpbmUgQkJTX0JCU19EUCAgICAgICAgICAgICAgICAweDAxDQp0eXBlZGVmIHN0cnVjdCB7DQogIEVGSV9ERVZJQ0VfUEFUSF9QUk9UT0NPTCAgICAgICAgSGVhZGVyOw0KICBVSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVR5cGU7DQogIFVJTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzRmxhZzsNCiAgQ0hBUjggICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbMV07DQp9IEJCU19CQlNfREVWSUNFX1BBVEg7DQoNCi8vDQovLyBEZXZpY2VUeXBlIGRlZmluaXRpb25zIC0gZnJvbSBCQlMgc3BlY2lmaWNhdGlvbg0KLy8NCiNkZWZpbmUgQkJTX1RZUEVfRkxPUFBZICAgICAgICAgICAweDAxDQojZGVmaW5lIEJCU19UWVBFX0hBUkREUklWRSAgICAgICAgMHgwMg0KI2RlZmluZSBCQlNfVFlQRV9DRFJPTSAgICAgICAgICAgIDB4MDMNCiNkZWZpbmUgQkJTX1RZUEVfUENNQ0lBICAgICAgICAgICAweDA0DQojZGVmaW5lIEJCU19UWVBFX1VTQiAgICAgICAgICAgICAgMHgwNQ0KI2RlZmluZSBCQlNfVFlQRV9FTUJFRERFRF9ORVRXT1JLIDB4MDYNCiNkZWZpbmUgQkJTX1RZUEVfQkVWICAgICAgICAgICAgICAweDgwDQojZGVmaW5lIEJCU19UWVBFX1VOS05PV04gICAgICAgICAgMHhGRg0KDQoNCi8vDQovLyBVbmlvbiBvZiBhbGwgcG9zc2libGUgRGV2aWNlIFBhdGhzIGFuZCBwb2ludGVycyB0byBEZXZpY2UgUGF0aHMNCi8vDQoNCnR5cGVkZWYgdW5pb24gew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgICAgICAgRGV2UGF0aDsNCiAgUENJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIFBjaTsNCiAgUENDQVJEX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIFBjQ2FyZDsNCiAgTUVNTUFQX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIE1lbU1hcDsNCiAgVkVORE9SX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgIFZlbmRvcjsNCg0KICBDT05UUk9MTEVSX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgQ29udHJvbGxlcjsNCiAgQUNQSV9ISURfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIEFjcGk7DQoNCiAgQVRBUElfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgIEF0YXBpOw0KICBTQ1NJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgU2NzaTsNCiAgRklCUkVDSEFOTkVMX0RFVklDRV9QQVRIICAgICAgICAgICAgIEZpYnJlQ2hhbm5lbDsNCg0KICBGMTM5NF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgRjEzOTQ7DQogIFVTQl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICBVc2I7DQogIFVTQl9DTEFTU19ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICBVc2JDbGFzczsNCiAgSTJPX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgIEkyTzsNCiAgTUFDX0FERFJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgIE1hY0FkZHI7DQogIElQdjRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICBJcHY0Ow0KICBJUHY2X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgSXB2NjsNCiAgSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgIEluZmluaUJhbmQ7DQogIFVBUlRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICBVYXJ0Ow0KDQogIEhBUkREUklWRV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICBIYXJkRHJpdmU7DQogIENEUk9NX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICBDRDsNCg0KICBGSUxFUEFUSF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgRmlsZVBhdGg7DQogIE1FRElBX1BST1RPQ09MX0RFVklDRV9QQVRIICAgICAgICAgICBNZWRpYVByb3RvY29sOw0KDQogIEJCU19CQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICBCYnM7DQp9IEVGSV9ERVZfUEFUSDsNCg0KDQoNCnR5cGVkZWYgdW5pb24gew0KICBFRklfREVWSUNFX1BBVEhfUFJPVE9DT0wgICAgICAgICAgICAgKkRldlBhdGg7DQogIFBDSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqUGNpOw0KICBQQ0NBUkRfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgKlBjQ2FyZDsNCiAgTUVNTUFQX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICpNZW1NYXA7DQogIFZFTkRPUl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAqVmVuZG9yOw0KDQogIENPTlRST0xMRVJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAqQ29udHJvbGxlcjsNCiAgQUNQSV9ISURfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpBY3BpOw0KICBBQ1BJX0VYVEVOREVEX0hJRF9ERVZJQ0VfUEFUSCAgICAgICAgKkV4dGVuZGVkQWNwaTsNCg0KICBBVEFQSV9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgKkF0YXBpOw0KICBTQ1NJX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKlNjc2k7DQogIEZJQlJFQ0hBTk5FTF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAqRmlicmVDaGFubmVsOw0KDQogIEYxMzk0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqRjEzOTQ7DQogIFVTQl9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICAgICAgICAqVXNiOw0KICBVU0JfQ0xBU1NfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgKlVzYkNsYXNzOw0KICBJMk9fREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAgKkkyTzsNCiAgTUFDX0FERFJfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpNYWNBZGRyOw0KICBJUHY0X0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKklwdjQ7DQogIElQdjZfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAgICAqSXB2NjsNCiAgSU5GSU5JQkFORF9ERVZJQ0VfUEFUSCAgICAgICAgICAgICAgICpJbmZpbmlCYW5kOw0KICBVQVJUX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAgKlVhcnQ7DQoNCiAgSEFSRERSSVZFX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICpIYXJkRHJpdmU7DQogIENEUk9NX0RFVklDRV9QQVRIICAgICAgICAgICAgICAgICAgICAqQ0Q7DQoNCiAgRklMRVBBVEhfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICpGaWxlUGF0aDsNCiAgTUVESUFfUFJPVE9DT0xfREVWSUNFX1BBVEggICAgICAgICAgICpNZWRpYVByb3RvY29sOw0KDQogIEJCU19CQlNfREVWSUNFX1BBVEggICAgICAgICAgICAgICAgICAqQmJzOw0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlJhdzsNCn0gRUZJX0RFVl9QQVRIX1BUUjsNCg0KI3ByYWdtYSBwYWNrKCkNCg0KDQovLw0KLy8gUFhFIEluZm9ybWF0aW9ucw0KLy8NCg0KLy8NCi8vIFBhY2tldCBkZWZpbml0aW9ucw0KLy8NCnR5cGVkZWYgc3RydWN0IHsNCiAgVUlOVDggICBCb290cE9wY29kZTsNCiAgVUlOVDggICBCb290cEh3VHlwZTsNCiAgVUlOVDggICBCb290cEh3QWRkckxlbjsNCiAgVUlOVDggICBCb290cEdhdGVIb3BzOw0KICBVSU5UMzIgIEJvb3RwSWRlbnQ7DQogIFVJTlQxNiAgQm9vdHBTZWNvbmRzOw0KICBVSU5UMTYgIEJvb3RwRmxhZ3M7DQogIFVJTlQ4ICAgQm9vdHBDaUFkZHJbNF07DQogIFVJTlQ4ICAgQm9vdHBZaUFkZHJbNF07DQogIFVJTlQ4ICAgQm9vdHBTaUFkZHJbNF07DQogIFVJTlQ4ICAgQm9vdHBHaUFkZHJbNF07DQogIFVJTlQ4ICAgQm9vdHBId0FkZHJbMTZdOw0KICBVSU5UOCAgIEJvb3RwU3J2TmFtZVs2NF07DQogIFVJTlQ4ICAgQm9vdHBCb290RmlsZVsxMjhdOw0KICBVSU5UMzIgIERoY3BNYWdpazsNCiAgVUlOVDggICBEaGNwT3B0aW9uc1s1Nl07DQp9IEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNF9QQUNLRVQ7DQoNCnR5cGVkZWYgdW5pb24gew0KICBVSU5UOCAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd1sxNDcyXTsNCiAgRUZJX1BYRV9CQVNFX0NPREVfREhDUFY0X1BBQ0tFVCBEaGNwdjQ7DQoNCiAgLy8NCiAgLy8gIEVGSV9QWEVfQkFTRV9DT0RFX0RIQ1BWNl9QQUNLRVQgICAgIERoY3B2NjsNCiAgLy8NCn0gRUZJX1BYRV9CQVNFX0NPREVfUEFDS0VUOw0KDQojaW5jbHVkZSA8VWVmaS9FZmlQeGUuaD4NCg0KLy8NCi8vIEVGSSBSZXZpc2lvbiBpbmZvcm1hdGlvbg0KLy8NCiNkZWZpbmUgRUZJX0ZJUk1XQVJFX1JFVklTSU9OICAgICAgIChFRklfMl8wMF9TWVNURU1fVEFCTEVfUkVWSVNJT04pDQoNCiNpbmNsdWRlIDxDb21tb24vRWZpSW1hZ2UuaD4NCiNpbmNsdWRlIDxJbmR1c3RyeVN0YW5kYXJkL1VzYi5oPg0KDQoNCiNkZWZpbmUgRUZJX1VTQl9IQ19SRVNFVF9HTE9CQUwgICAgICAgICAgICAweDAwMDENCiNkZWZpbmUgRUZJX1VTQl9IQ19SRVNFVF9IT1NUX0NPTlRST0xMRVIgICAweDAwMDINCiNkZWZpbmUgRUZJX1VTQl9IQ19SRVNFVF9HTE9CQUxfV0lUSF9ERUJVRyAweDAwMDQNCiNkZWZpbmUgRUZJX1VTQl9IQ19SRVNFVF9IT1NUX1dJVEhfREVCVUcgICAweDAwMDgNCg0KLy8NCi8vIFVTQiBIb3N0IENvbnRyb2xsZXIgc3RhdGUNCi8vDQp0eXBlZGVmIGVudW0gew0KICBFZmlVc2JIY1N0YXRlSGFsdCwNCiAgRWZpVXNiSGNTdGF0ZU9wZXJhdGlvbmFsLA0KICBFZmlVc2JIY1N0YXRlU3VzcGVuZCwNCiAgRWZpVXNiSGNTdGF0ZU1heGltdW0NCn0gRUZJX1VTQl9IQ19TVEFURTsNCg0KDQovLw0KLy8gRUZJIEZpbGUgbG9jYXRpb24gdG8gYm9vdCBmcm9tIG9uIHJlbW92YWJsZSBtZWRpYSBkZXZpY2VzDQovLw0KI2RlZmluZSBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRV9JQTMyICAgIEwiXFxFRklcXEJPT1RcXEJPT1RJQTMyLkVGSSINCiNkZWZpbmUgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUVfSUE2NCAgICBMIlxcRUZJXFxCT09UXFxCT09USUE2NC5FRkkiDQojZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FX1g2NCAgICAgTCJcXEVGSVxcQk9PVFxcQk9PVFg2NC5FRkkiDQojZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FX0VCQyAgICAgTCJcXEVGSVxcQk9PVFxcQk9PVEVCQy5FRkkiDQoNCiNpZiAgIGRlZmluZWQgKE1ERV9DUFVfSUEzMikNCiAgI2RlZmluZSBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRSAgIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FX0lBMzINCiNlbGlmIGRlZmluZWQgKE1ERV9DUFVfSVBGKQ0KICAjZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FICAgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUVfSUE2NA0KI2VsaWYgZGVmaW5lZCAoTURFX0NQVV9YNjQpDQogICNkZWZpbmUgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUUgICBFRklfUkVNT1ZBQkxFX01FRElBX0ZJTEVfTkFNRV9YNjQNCiNlbGlmIGRlZmluZWQgKE1ERV9DUFVfRUJDKQ0KICAjZGVmaW5lIEVGSV9SRU1PVkFCTEVfTUVESUFfRklMRV9OQU1FICAgRUZJX1JFTU9WQUJMRV9NRURJQV9GSUxFX05BTUVfRUJDDQojZWxzZQ0KICAjZXJyb3IgVW5rbm93biBQcm9jZXNzb3IgVHlwZQ0KI2VuZGlmDQoNCg0KLy8NCi8vIFByb3RvY29scyBmcm9tIEVGSSAxLjEwIHRoYXQgZ290IHRoaWVyIG5hbWVzIGZpeGVkIGluIFVFRkkgMi4wDQovLw0KI2luY2x1ZGUgPFByb3RvY29sL0xvYWRlZEltYWdlLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvU2ltcGxlVGV4dEluLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvU2ltcGxlVGV4dE91dC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1NlcmlhbElvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvTG9hZEZpbGUuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9TaW1wbGVGaWxlU3lzdGVtLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRGlza0lvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvQmxvY2tJby5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1VuaWNvZGVDb2xsYXRpb24uaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9TaW1wbGVOZXR3b3JrLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRWZpTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXIuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9QeGVCYXNlQ29kZS5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1B4ZUJhc2VDb2RlQ2FsbEJhY2suaD4NCg0KLy8NCi8vIEVGSSAxLjEwIFByb3RvY29scw0KLy8NCiNpbmNsdWRlIDxQcm90b2NvbC9CaXMuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9CdXNTcGVjaWZpY0RyaXZlck92ZXJyaWRlLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvQ29tcG9uZW50TmFtZS5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0RlYnVnUG9ydC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0RlYnVnU3VwcG9ydC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0RlY29tcHJlc3MuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9Ecml2ZXJCaW5kaW5nLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRHJpdmVyQ29uZmlndXJhdGlvbi5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0RyaXZlckRpYWdub3N0aWNzLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRWJjLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRWZpTmV0d29ya0ludGVyZmFjZUlkZW50aWZpZXIuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9GaWxlSW5mby5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0ZpbGVTeXN0ZW1JbmZvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRmlsZVN5c3RlbVZvbHVtZUxhYmVsSW5mby5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1BjaUlvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvUGNpUm9vdEJyaWRnZUlvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvUGxhdGZvcm1Ecml2ZXJPdmVycmlkZS5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1NpbXBsZVBvaW50ZXIuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9TY3NpUGFzc1RocnUuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9Vc2JJby5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1VzYkhvc3RDb250cm9sbGVyLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvVWdhRHJhdy5oPg0KDQovLw0KLy8gRUZJIDEuMTAgR1VJRHMNCi8vDQojaW5jbHVkZSA8R3VpZC9BY3BpLmg+DQojaW5jbHVkZSA8R3VpZC9EZWJ1Z0ltYWdlSW5mb1RhYmxlLmg+DQojaW5jbHVkZSA8R3VpZC9HbG9iYWxWYXJpYWJsZS5oPg0KI2luY2x1ZGUgPEd1aWQvR3B0Lmg+DQojaW5jbHVkZSA8R3VpZC9QY0Fuc2kuaD4NCiNpbmNsdWRlIDxHdWlkL1NtQmlvcy5oPg0KI2luY2x1ZGUgPEd1aWQvU2FsU3lzdGVtVGFibGUuaD4NCg0KDQojaWYgKEVGSV9TUEVDSUZJQ0FUSU9OX1ZFUlNJT04gPj0gMHgwMDAyMDAwMCkNCi8vDQovLyBUdXJuIG9uIFVFRkkgMi4wIFByb3RvY29scyBhbmQgR1VJRHMNCi8vDQojaW5jbHVkZSA8UHJvdG9jb2wvQXV0aGVudGljYXRpb25JbmZvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRGV2aWNlUGF0aFV0aWxpdGllcy5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0RldmljZVBhdGhUb1RleHQuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9EZXZpY2VQYXRoRnJvbVRleHQuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9HcmFwaGljc091dHB1dC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0VkaWREaXNjb3ZlcmVkLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvRWRpZEFjdGl2ZS5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0VkaWRPdmVycmlkZS5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1Njc2lJby5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1Njc2lQYXNzVGhydUV4dC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0lTY3NpSW5pdGF0b3JOYW1lLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvVXNiMkhvc3RDb250cm9sbGVyLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvVGFwZUlvLmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvTWFuYWdlZE5ldHdvcmsuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9BcnAuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9EaGNwNC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0lQNC5oPg0KI2luY2x1ZGUgPFByb3RvY29sL0lQNENvbmZpZy5oPg0KI2luY2x1ZGUgPFByb3RvY29sL1RjcDQuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9VZHA0Lmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvTXRmdHA0Lmg+DQojaW5jbHVkZSA8UHJvdG9jb2wvU2VydmljZUJpbmRpbmcuaD4NCiNpbmNsdWRlIDxQcm90b2NvbC9IYXNoLmg+DQoNCiNpbmNsdWRlIDxHdWlkL0V2ZW50R3JvdXAuaD4NCiNlbmRpZg0KDQoNCiNlbmRpZg0K