LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8YW5kcmVhcy50cmFjenlrQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAicGNoLmgiDQoNCiNpbmNsdWRlICJWaWRlby5oIg0KDQp1c2luZyBuYW1lc3BhY2UgUmluZ0NsaWVudFVXUDsNCnVzaW5nIG5hbWVzcGFjZSBWaWRlbzsNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICBTaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCnVuc2lnbmVkIGludA0KVmlkZW86OlNpemU6OndpZHRoKCkNCnsNCiAgICByZXR1cm4gbV9XaWR0aDsNCn0NCg0KdW5zaWduZWQgaW50DQpWaWRlbzo6U2l6ZTo6aGVpZ2h0KCkNCnsNCiAgICByZXR1cm4gbV9IZWlnaHQ7DQp9DQoNCnZvaWQNClZpZGVvOjpTaXplOjpzZXRXaWR0aCh1bnNpZ25lZCBpbnQgd2lkdGgpDQp7DQogICAgbV9XaWR0aCA9IHdpZHRoOw0KfQ0KDQp2b2lkDQpWaWRlbzo6U2l6ZTo6c2V0SGVpZ2h0KHVuc2lnbmVkIGludCBoZWlnaHQpDQp7DQogICAgbV9IZWlnaHQgPSBoZWlnaHQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgIFJhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KU3RyaW5nXg0KUmF0ZTo6bmFtZSgpDQp7DQogICAgcmV0dXJuIG1fbmFtZTsNCn0NCg0KdW5zaWduZWQgaW50DQpSYXRlOjp2YWx1ZSgpDQp7DQogICAgcmV0dXJuIG1fdmFsdWU7DQp9DQoNCnZvaWQNClJhdGU6OnNldE5hbWUoU3RyaW5nXiBuYW1lKQ0Kew0KICAgIG1fbmFtZSA9IG5hbWU7DQp9DQoNCnZvaWQNClJhdGU6OnNldFZhbHVlKHVuc2lnbmVkIGludCB2YWx1ZSkNCnsNCiAgICBtX3ZhbHVlID0gdmFsdWU7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkNoYW5uZWw6OkNoYW5uZWwoKQ0Kew0KICAgIG1fdmFsaWRSZXNvbHV0aW9ucyA9IHJlZiBuZXcgVmVjdG9yPFJlc29sdXRpb25ePigpOw0KfQ0KDQpTdHJpbmdeDQpDaGFubmVsOjpuYW1lKCkNCnsNCiAgICByZXR1cm4gbV9uYW1lOw0KfQ0KDQpSZXNvbHV0aW9uXg0KQ2hhbm5lbDo6Y3VycmVudFJlc29sdXRpb24oKQ0Kew0KICAgIHJldHVybiBtX2N1cnJlbnRSZXNvbHV0aW9uOw0KfQ0KDQp2b2lkDQpDaGFubmVsOjpzZXROYW1lKFN0cmluZ14gbmFtZSkNCnsNCiAgICBtX25hbWUgPSBuYW1lOw0KfQ0KDQp2b2lkDQpDaGFubmVsOjpzZXRDdXJyZW50UmVzb2x1dGlvbihSZXNvbHV0aW9uXiBjdXJyZW50UmVzb2x1dGlvbikNCnsNCiAgICBtX2N1cnJlbnRSZXNvbHV0aW9uID0gY3VycmVudFJlc29sdXRpb247DQp9DQoNClZlY3RvcjxSZXNvbHV0aW9uXj5eDQpDaGFubmVsOjpyZXNvbHV0aW9uTGlzdCgpDQp7DQogICAgcmV0dXJuIG1fdmFsaWRSZXNvbHV0aW9uczsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbiAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQpSZXNvbHV0aW9uOjpSZXNvbHV0aW9uKCkNCnsNCiAgICBtX3NpemUgPSByZWYgbmV3IFNpemUoKTsNCiAgICBtX3ZhbGlkUmF0ZXMgPSByZWYgbmV3IFZlY3RvcjxSYXRlXj4oKTsNCn0NCg0KUmVzb2x1dGlvbjo6UmVzb2x1dGlvbihWaWRlbzo6U2l6ZV4gc2l6ZSk6DQogICAgbV9zaXplKHNpemUpDQp7IH0NCg0KU3RyaW5nXg0KUmVzb2x1dGlvbjo6bmFtZSgpDQp7DQogICByZXR1cm4gc2l6ZSgpLT53aWR0aCgpLlRvU3RyaW5nKCkgKyAieCIgKyBzaXplKCktPmhlaWdodCgpLlRvU3RyaW5nKCk7DQp9DQoNClJhdGVeDQpSZXNvbHV0aW9uOjphY3RpdmVSYXRlKCkNCnsNCiAgICByZXR1cm4gbV9jdXJyZW50UmF0ZTsNCn0NCg0KVmVjdG9yPFJhdGVePl4NClJlc29sdXRpb246OnJhdGVMaXN0KCkNCnsNCiAgICByZXR1cm4gbV92YWxpZFJhdGVzOw0KfQ0KDQpWaWRlbzo6U2l6ZV4NClJlc29sdXRpb246OnNpemUoKQ0Kew0KICAgIHJldHVybiBtX3NpemU7DQp9DQoNClN0cmluZ14NClJlc29sdXRpb246OmZvcm1hdCgpDQp7DQogICAgcmV0dXJuIG1fZm9ybWF0Ow0KfQ0KDQp2b2lkDQpSZXNvbHV0aW9uOjpzZXRXaWR0aChpbnQgd2lkdGgpDQp7DQogICAgbV9zaXplLT5zZXRXaWR0aCh3aWR0aCk7DQp9DQoNCnZvaWQNClJlc29sdXRpb246OnNldEhlaWdodChpbnQgaGVpZ2h0KQ0Kew0KICAgIG1fc2l6ZS0+c2V0SGVpZ2h0KGhlaWdodCk7DQp9DQoNCnZvaWQNClJlc29sdXRpb246OnNldEZvcm1hdChTdHJpbmdeIGZvcm1hdCkNCnsNCiAgICBtX2Zvcm1hdCA9IGZvcm1hdDsNCn0NCg0KYm9vbA0KUmVzb2x1dGlvbjo6c2V0QWN0aXZlUmF0ZShSYXRlXiByYXRlKQ0Kew0KICAgaWYgKG1fY3VycmVudFJhdGUgPT0gcmF0ZSkNCiAgICAgIHJldHVybiBmYWxzZTsNCg0KICAgbV9jdXJyZW50UmF0ZSA9IHJhdGU7DQogICAvLyBzZXQgY2FtZXJhIGRldmljZSByYXRlIGhlcmUNCiAgIHJldHVybiB0cnVlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCkRldmljZTo6RGV2aWNlKFN0cmluZ14gaWQpDQp7DQogICAgbV9kZXZpY2VJZCA9IGlkOw0KICAgIG1fY2hhbm5lbHMgPSByZWYgbmV3IFZlY3RvcjxDaGFubmVsXj4oKTsNCn0NCg0KU3RyaW5nXg0KRGV2aWNlOjppZCgpDQp7DQogICAgcmV0dXJuIG1fZGV2aWNlSWQ7DQp9DQoNClZlY3RvcjxDaGFubmVsXj5eDQpEZXZpY2U6OmNoYW5uZWxMaXN0KCkNCnsNCiAgIHJldHVybiBtX2NoYW5uZWxzOw0KfQ0KDQpTdHJpbmdeDQpEZXZpY2U6Om5hbWUoKQ0Kew0KICAgIHJldHVybiBtX25hbWU7DQp9DQoNCkNoYW5uZWxeDQpEZXZpY2U6OmNoYW5uZWwoKQ0Kew0KICAgIHJldHVybiBtX2N1cnJlbnRDaGFubmVsOw0KfQ0KDQpib29sDQpEZXZpY2U6OnNldEN1cnJlbnRDaGFubmVsKENoYW5uZWxeIGNoYW5uZWwpDQp7DQogICAgaWYgKG1fY3VycmVudENoYW5uZWwgPT0gY2hhbm5lbCkNCiAgICAgICAgcmV0dXJuIGZhbHNlOw0KICAgIG1fY3VycmVudENoYW5uZWwgPSBjaGFubmVsOw0KICAgIHJldHVybiB0cnVlOw0KfQ0KDQp2b2lkDQpEZXZpY2U6OnNldE5hbWUoU3RyaW5nXiBuYW1lKQ0Kew0KICAgIG1fbmFtZSA9IG5hbWU7DQp9DQoNCnZvaWQNCkRldmljZTo6c2F2ZSgpDQp7DQp9DQoNCmJvb2wNCkRldmljZTo6aXNBY3RpdmUoKQ0Kew0KICAgIHJldHVybiBmYWxzZTsNCiAgIC8vcmV0dXJuIFZpZGVvOjpEZXZpY2VNb2RlbDo6aW5zdGFuY2UoKS5hY3RpdmVEZXZpY2UoKSA9PSB0aGlzOw0KfQ0KDQp2b2lkDQpEZXZpY2U6OlNldERldmljZVByb3BlcnRpZXMoU3RyaW5nXiBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJhdGUpDQp7DQogICAgYXV0byBybCA9IG1fY3VycmVudENoYW5uZWwtPnJlc29sdXRpb25MaXN0KCk7DQogICAgZm9yIChhdXRvIHJlcyA6IHJsKSB7DQogICAgICAgIGlmIChyZXMtPmZvcm1hdCgpID09IGZvcm1hdCAmJg0KICAgICAgICAgICAgcmVzLT5zaXplKCktPndpZHRoKCkgPT0gd2lkdGggJiYNCiAgICAgICAgICAgIHJlcy0+c2l6ZSgpLT5oZWlnaHQoKSA9PSBoZWlnaHQgJiYNCiAgICAgICAgICAgIHJlcy0+YWN0aXZlUmF0ZSgpLT52YWx1ZSgpID09IHJhdGUpDQogICAgICAgIHsNCiAgICAgICAgICAgIG1fY3VycmVudENoYW5uZWwtPnNldEN1cnJlbnRSZXNvbHV0aW9uKHJlcyk7DQogICAgICAgICAgICBXcml0ZUxpbmUoIlNldERldmljZVByb3BlcnRpZXMiKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgIH0NCn0=