I3ByYWdtYSBvbmNlDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IErkZ2VyIE5pY29sYXMgPG5pY29sYXMuamFnZXJAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICAgICAqDQoqIEF1dGhvcjogVHJhY3p5ayBBbmRyZWFzIDxhbmRyZWFzLnRyYWN6eWtAc2F2b2lyZmFpcmVsaW51eC5jb20+ICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSAgICAqDQoqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5ICAgICoNCiogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiAgICAgICAgICAqDQoqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgICAgICAgICAgICoNCiogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICAgICAgICoNCiogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojaW5jbHVkZSAiVmlkZW9QYWdlLmcuaCINCiNpbmNsdWRlICJNZXNzYWdlVGV4dFBhZ2UueGFtbC5oIg0KDQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6TWVkaWE6OkNhcHR1cmU7DQp1c2luZyBuYW1lc3BhY2UgV2luZG93czo6VUk6OlhhbWw6Ok5hdmlnYXRpb247DQoNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6WGFtbDsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpBcHBsaWNhdGlvbk1vZGVsOjpDb3JlOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OkRldmljZXM6OkVudW1lcmF0aW9uOw0KDQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQovKiBkZWxlZ2F0ZSAqLw0KZGVsZWdhdGUgdm9pZCBQcmVzc0hhbmdVcENhbGwoKTsNCmRlbGVnYXRlIHZvaWQgUGF1c2VDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIENoYXRQYW5lbENhbGwoKTsNCmRlbGVnYXRlIHZvaWQgQWRkQ29udGFjdENhbGwoKTsNCmRlbGVnYXRlIHZvaWQgVHJhbnNmZXJDYWxsKCk7DQpkZWxlZ2F0ZSB2b2lkIFN3aXRjaE1pY3JvcGhvbmVTdGF0ZUNhbGwoKTsNCmRlbGVnYXRlIHZvaWQgU3dpdGNoVmlkZW9TdGF0ZUNhbGwoKTsNCmRlbGVnYXRlIHZvaWQgUmVjY29yZFZpZGVvQ2FsbCgpOw0KZGVsZWdhdGUgdm9pZCBRdWFsaXR5VmlkZW9MZXZlbENhbGwoKTsNCg0KbmFtZXNwYWNlIFZpZXdzDQp7DQoNCnB1YmxpYyByZWYgY2xhc3MgVmlkZW9QYWdlIHNlYWxlZA0Kew0KcHVibGljOg0KICAgIFZpZGVvUGFnZSgpOw0KICAgIHZvaWQgdXBkYXRlUGFnZUNvbnRlbnQoKTsNCg0KICAgIHByb3BlcnR5IGJvb2wgYmFyRmFkaW5nDQogICAgew0KICAgICAgICBib29sIGdldCgpDQogICAgICAgIHsNCiAgICAgICAgICAgIHJldHVybiBiYXJGYWRpbmdfOw0KICAgICAgICB9DQogICAgICAgIHZvaWQgc2V0KGJvb2wgdmFsdWUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGJhckZhZGluZ18gPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHByb3BlcnR5IGJvb2wgY2hhdE9wZW4NCiAgICB7DQogICAgICAgIGJvb2wgZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGNoYXRPcGVuXzsNCiAgICAgICAgfQ0KICAgICAgICB2b2lkIHNldChib29sIHZhbHVlKQ0KICAgICAgICB7DQogICAgICAgICAgICBjaGF0T3Blbl8gPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHZvaWQgc2Nyb2xsRG93bigpOw0KDQpwcm90ZWN0ZWQ6DQogICAgdmlydHVhbCB2b2lkIE9uTmF2aWdhdGVkVG8oV2luZG93czo6VUk6OlhhbWw6Ok5hdmlnYXRpb246Ok5hdmlnYXRpb25FdmVudEFyZ3NeIGUpIG92ZXJyaWRlOw0KDQppbnRlcm5hbDoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBQcmVzc0hhbmdVcENhbGxeIHByZXNzSGFuZ1VwQ2FsbDsNCiAgICBldmVudCBQYXVzZUNhbGxeIHBhdXNlQ2FsbDsNCiAgICBldmVudCBDaGF0UGFuZWxDYWxsXiBjaGF0UGFuZWxDYWxsOw0KICAgIGV2ZW50IEFkZENvbnRhY3RDYWxsXiBhZGRDb250YWN0Q2FsbDsNCiAgICBldmVudCBUcmFuc2ZlckNhbGxeIHRyYW5zZmVyQ2FsbDsNCiAgICBldmVudCBTd2l0Y2hNaWNyb3Bob25lU3RhdGVDYWxsXiBzd2l0Y2hNaWNyb3Bob25lU3RhdGVDYWxsOw0KICAgIGV2ZW50IFN3aXRjaFZpZGVvU3RhdGVDYWxsXiBzd2l0Y2hWaWRlb1N0YXRlQ2FsbDsNCiAgICBldmVudCBSZWNjb3JkVmlkZW9DYWxsXiByZWNjb3JkVmlkZW9DYWxsOw0KICAgIGV2ZW50IFF1YWxpdHlWaWRlb0xldmVsQ2FsbF4gcXVhbGl0eVZpZGVvTGV2ZWxDYWxsOw0KDQpwcml2YXRlOg0KICAgIGJvb2wgYmFyRmFkaW5nXzsNCiAgICBib29sIGNoYXRPcGVuXzsNCg0KICAgIHZvaWQgX3NlbmRCdG5fX0NsaWNrKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OlJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfbWVzc2FnZVRleHRCb3hfX0tleURvd24oUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OktleVJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBzZW5kTWVzc2FnZSgpOw0KDQogICAgQ29uY3VycmVuY3k6OnRhc2s8dm9pZD4gV3JpdGVGcmFtZUFzU29mdHdhcmVCaXRtYXBBc3luYyhTdHJpbmdeIGlkLCB1aW50OF90KiBidWYsIGludCB3aWR0aCwgaW50IGhlaWdodCk7DQoNCiAgICB2b2lkIEJ1dHRvbl9DbGljayhQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bkNhbmNlbF9fQ2xpY2soUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6Um91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5IYW5nVXBfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5QYXVzZV9fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bkNoYXRfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5BZGRGcmllbmRfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5Td2l0Y2hfX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF9idG5NaWNyb3Bob25lX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfYnRuTWVtb19fVGFwcGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpUYXBwZWRSb3V0ZWRFdmVudEFyZ3NeIGUpOw0KICAgIHZvaWQgX2J0bkhRX19UYXBwZWQoUGxhdGZvcm06Ok9iamVjdF4gc2VuZGVyLCBXaW5kb3dzOjpVSTo6WGFtbDo6SW5wdXQ6OlRhcHBlZFJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBfYnRuVmlkZW9fX1RhcHBlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6VGFwcGVkUm91dGVkRXZlbnRBcmdzXiBlKTsNCiAgICB2b2lkIF92aWRlb0NvbnRyb2xfX1BvaW50ZXJNb3ZlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBidG5BbnlfZW50ZXJlZChQbGF0Zm9ybTo6T2JqZWN0XiBzZW5kZXIsIFdpbmRvd3M6OlVJOjpYYW1sOjpJbnB1dDo6UG9pbnRlclJvdXRlZEV2ZW50QXJnc14gZSk7DQogICAgdm9pZCBidG5BbnlfZXhpdGVkKFBsYXRmb3JtOjpPYmplY3ReIHNlbmRlciwgV2luZG93czo6VUk6OlhhbWw6OklucHV0OjpQb2ludGVyUm91dGVkRXZlbnRBcmdzXiBlKTsNCn07DQp9DQp9