ZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaCBiL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDViNzI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBIQVJEV0FSRV9BUElfSF8KKworI2RlZmluZSBIQVJEV0FSRV9BUElfSF8KKworI2luY2x1ZGUgPE9NWFBsdWdpbkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gdGhlIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZW5hYmxlQW5kcm9pZE5hdGl2ZUJ1ZmZlcnMnIGV4dGVuc2lvbgorLy8gaXMgZ2l2ZW4uCisvLworLy8gV2hlbiBBbmRyb2lkIG5hdGl2ZSBidWZmZXIgdXNlIGlzIGRpc2FibGVkIGZvciBhIHBvcnQgKHRoZSBkZWZhdWx0IHN0YXRlKSwKKy8vIHRoZSBPTVggbm9kZSBzaG91bGQgb3BlcmF0ZSBhcyBub3JtYWwsIGFuZCBleHBlY3QgVXNlQnVmZmVyIGNhbGxzIHRvIHNldCBpdHMKKy8vIGJ1ZmZlcnMuICBUaGlzIGlzIHRoZSBtb2RlIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gQ1BVIGFjY2VzcyB0byB0aGUgYnVmZmVyIGlzCisvLyByZXF1aXJlZC4KKy8vCisvLyBXaGVuIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlciB1c2UgaGFzIGJlZW4gZW5hYmxlZCBmb3IgYSBnaXZlbiBwb3J0LCB0aGUgdmlkZW8KKy8vIGNvbG9yIGZvcm1hdCBmb3IgdGhlIHBvcnQgaXMgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYW4gQW5kcm9pZCBwaXhlbCBmb3JtYXQKKy8vIHJhdGhlciB0aGFuIGFuIE9NWCBjb2xvciBmb3JtYXQuICBUaGUgbm9kZSBzaG91bGQgdGhlbiBleHBlY3QgdG8gcmVjZWl2ZQorLy8gVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciBjYWxscyAodmlhIE9NWF9TZXRQYXJhbWV0ZXIpIHJhdGhlciB0aGFuIFVzZUJ1ZmZlcgorLy8gY2FsbHMgZm9yIHRoYXQgcG9ydC4KK3N0cnVjdCBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGVuYWJsZTsKK307CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX1NldFBhcmFtZXRlcigpIHdoZW4gdGhlIGV4dGVuc2lvbgorLy8gaW5kZXggIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5zdG9yZU1ldGFEYXRhSW5CdWZmZXJzIgorLy8gaXMgZ2l2ZW4uCisvLworLy8gV2hlbiBtZXRhIGRhdGEgaXMgc3RvcmVkIGluIHRoZSB2aWRlbyBidWZmZXJzIHBhc3NlZCBiZXR3ZWVuIE9NWCBjbGllbnRzCisvLyBhbmQgT01YIGNvbXBvbmVudHMsIGludGVycHJldGF0aW9uIG9mIHRoZSBidWZmZXIgZGF0YSBpcyB1cCB0byB0aGUKKy8vIGJ1ZmZlciByZWNlaXZlciwgYW5kIHRoZSBkYXRhIG1heSBvciBtYXkgbm90IGJlIHRoZSBhY3R1YWwgdmlkZW8gZGF0YSwgYnV0CisvLyBzb21lIGluZm9ybWF0aW9uIGhlbHBmdWwgZm9yIHRoZSByZWNlaXZlciB0byBsb2NhdGUgdGhlIGFjdHVhbCBkYXRhLgorLy8gVGhlIGJ1ZmZlciByZWNlaXZlciB0aHVzIG5lZWRzIHRvIGtub3cgaG93IHRvIGludGVycHJldCB3aGF0IGlzIHN0b3JlZAorLy8gaW4gdGhlc2UgYnVmZmVycywgd2l0aCBtZWNoYW5pc21zIHByZS1kZXRlcm1pbmVkIGV4dGVybmFsbHkuIEhvdyB0bworLy8gaW50ZXJwcmV0IHRoZSBtZXRhIGRhdGEgaXMgb3V0c2lkZSBvZiB0aGUgc2NvcGUgb2YgdGhpcyBtZXRob2QuCisvLworLy8gQ3VycmVudGx5LCB0aGlzIGlzIHNwZWNpZmljYWxseSB1c2VkIHRvIHBhc3MgbWV0YSBkYXRhIGZyb20gdmlkZW8gc291cmNlCisvLyAoY2FtZXJhIGNvbXBvbmVudCwgZm9yIGluc3RhbmNlKSB0byB2aWRlbyBlbmNvZGVyIHRvIGF2b2lkIG1lbWNweWluZyBvZgorLy8gaW5wdXQgdmlkZW8gZnJhbWUgZGF0YS4gVG8gZG8gdGhpcywgYlN0b3JlTWV0YUR0YSBpcyBzZXQgdG8gT01YX1RSVUUuCisvLyBJZiBiU3RvcmVNZXRhRGF0YSBpcyBzZXQgdG8gZmFsc2UsIHJlYWwgWVVWIGZyYW1lIGRhdGEgd2lsbCBiZSBzdG9yZWQKKy8vIGluIHRoZSBidWZmZXJzLiBJbiBhZGRpdGlvbiwgaWYgbm8gT01YX1NldFBhcmFtZXRlcigpIGNhbGwgaXMgbWFkZQorLy8gd2l0aCB0aGUgY29ycmVzcG9uZGluZyBleHRlbnNpb24gaW5kZXgsIHJlYWwgWVVWIGRhdGEgaXMgc3RvcmVkCisvLyBpbiB0aGUgYnVmZmVycy4KK3N0cnVjdCBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYlN0b3JlTWV0YURhdGE7Cit9OworCisvLyBBIHBvaW50ZXIgdG8gdGhpcyBzdHJ1Y3QgaXMgcGFzc2VkIHRvIE9NWF9TZXRQYXJhbWV0ZXIgd2hlbiB0aGUgZXh0ZW5zaW9uCisvLyBpbmRleCBmb3IgdGhlICdPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcicgZXh0ZW5zaW9uIGlzCisvLyBnaXZlbi4gIFRoaXMgY2FsbCB3aWxsIG9ubHkgYmUgcGVyZm9ybWVkIGlmIGEgcHJpb3IgY2FsbCB3YXMgbWFkZSB3aXRoIHRoZQorLy8gJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycycgZXh0ZW5zaW9uIGluZGV4LAorLy8gZW5hYmxpbmcgdXNlIG9mIEFuZHJvaWQgbmF0aXZlIGJ1ZmZlcnMuCitzdHJ1Y3QgVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9QVFIgcEFwcFByaXZhdGU7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXJIZWFkZXI7CisgICAgY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd0J1ZmZlcj4mIG5hdGl2ZUJ1ZmZlcjsKK307CisKKy8vIEEgcG9pbnRlciB0byB0aGlzIHN0cnVjdCBpcyBwYXNzZWQgdG8gT01YX0dldFBhcmFtZXRlciB3aGVuIHRoZSBleHRlbnNpb24KKy8vIGluZGV4IGZvciB0aGUgJ09NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5nZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UnCisvLyBleHRlbnNpb24gaXMgZ2l2ZW4uICBUaGUgdXNhZ2UgYml0cyByZXR1cm5lZCBmcm9tIHRoaXMgcXVlcnkgd2lsbCBiZSB1c2VkIHRvCisvLyBhbGxvY2F0ZSB0aGUgR3JhbGxvYyBidWZmZXJzIHRoYXQgZ2V0IHBhc3NlZCB0byB0aGUgdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcgorLy8gY29tbWFuZC4KK3N0cnVjdCBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvLyBJTgorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvLyBJTgorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvLyBJTgorICAgIE9NWF9VMzIgblVzYWdlOyAgICAgICAgICAgICAvLyBPVVQKK307CisKKy8vIEFuIGVudW0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgdG8gaW5kaWNhdGUgYW4gb3BhcXVlIGNvbG9yZm9ybWF0CisvLyBpcyBkZWNsYXJlZCBpbiBtZWRpYS9zdGFnZWZyaWdodC9vcGVubWF4L09NWF9JVkNvbW1vbi5oCisvLyBUaGlzIHdpbGwgaW5mb3JtIHRoZSBlbmNvZGVyIHRoYXQgdGhlIGFjdHVhbAorLy8gY29sb3Jmb3JtYXQgd2lsbCBiZSByZWxheWVkIGJ5IHRoZSBHUmFsbG9jIEJ1ZmZlcnMuCisvLyBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSAgPSAweDdGMDAwMDAxLAorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiBhbmRyb2lkOjpPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKTsKKworI2VuZGlmICAvLyBIQVJEV0FSRV9BUElfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkOGUxMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUvT01YUGx1Z2luQmFzZS5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9NWF9QTFVHSU5fQkFTRV9IXworCisjZGVmaW5lIE9NWF9QTFVHSU5fQkFTRV9IXworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9NWENvbXBvbmVudEJhc2U7CisKK3N0cnVjdCBPTVhQbHVnaW5CYXNlIHsKKyAgICBPTVhQbHVnaW5CYXNlKCkge30KKyAgICB2aXJ0dWFsIH5PTVhQbHVnaW5CYXNlKCkge30KKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBtYWtlQ29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgY29uc3QgT01YX0NBTExCQUNLVFlQRSAqY2FsbGJhY2tzLAorICAgICAgICAgICAgT01YX1BUUiBhcHBEYXRhLAorICAgICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpID0gMDsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KSA9IDA7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKKyAgICAgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICAgICAgT01YX1UzMiBpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldFJvbGVzT2ZDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgPSAwOworCitwcml2YXRlOgorICAgIE9NWFBsdWdpbkJhc2UoY29uc3QgT01YUGx1Z2luQmFzZSAmKTsKKyAgICBPTVhQbHVnaW5CYXNlICZvcGVyYXRvcj0oY29uc3QgT01YUGx1Z2luQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT01YX1BMVUdJTl9CQVNFX0hfCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0F1ZGlvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4Mjg0MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaApAQCAtMCwwICsxLDEzMjggQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBAZmlsZSBPTVhfQXVkaW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBBdWRpbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlCisgKiAgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVubWlsdHMuCisgKi8KKworI2lmbmRlZiBPTVhfQXVkaW9faAorI2RlZmluZSBPTVhfQXVkaW9faAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfQ29yZS5oPgorCisvKiogQGRlZmdyb3VwIG1pZGkgTUlESQorICogQGluZ3JvdXAgYXVkaW8KKyAqLworIAorLyoqIEBkZWZncm91cCBlZmZlY3RzIEF1ZGlvIGVmZmVjdHMKKyAqIEBpbmdyb3VwIGF1ZGlvCisgKi8KKworLyoqIEBkZWZncm91cCBhdWRpbyBPcGVuTUFYIElMIEF1ZGlvIERvbWFpbgorICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBBdWRpbyBkb21haW4KKyAqIEB7CisgKi8KKworLyoqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSBhdWRpbyBjb2RpbmdzLiAgCisgKiAgSWYgIk9NWF9BVURJT19Db2RpbmdVbnVzZWQiIGlzIHNlbGVjdGVkLCB0aGUgY29kaW5nIHNlbGVjdGlvbiBtdXN0IAorICogIGJlIGRvbmUgaW4gYSB2ZW5kb3Igc3BlY2lmaWMgd2F5LiAgU2luY2UgdGhpcyBpcyBmb3IgYW4gYXVkaW8gCisgKiAgcHJvY2Vzc2luZyBlbGVtZW50IHRoaXMgZW51bSBpcyByZWxldmFudC4gIEhvd2V2ZXIsIGZvciBhbm90aGVyIAorICogIHR5cGUgb2YgY29tcG9uZW50IG90aGVyIGVudW1zIHdvdWxkIGJlIGluIHRoaXMgYXJlYS4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DT0RJTkdUWVBFIHsKKyAgICBPTVhfQVVESU9fQ29kaW5nVW51c2VkID0gMCwgIC8qKjwgUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBjb2RpbmcgaXMgTi9BICAqLworICAgIE9NWF9BVURJT19Db2RpbmdBdXRvRGV0ZWN0LCAgLyoqPCBhdXRvIGRldGVjdGlvbiBvZiBhdWRpbyBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUENNLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUENNIGNvZGluZyAqLworICAgIE9NWF9BVURJT19Db2RpbmdBRFBDTSwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBRFBDTSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQU1SLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQU1SIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHU01GUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gZnVsbHJhdGUgKGkuZS4gR1NNNjEwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHU01FRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHU00gRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nR1NNSFIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIEhhbGZyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdQRENGUiwgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgRnVsbHJhdGUgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1BEQ0VGUiwgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUERDSFIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEhhbGZyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdURE1BRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBURE1BIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAoVElBL0VJQS0xMzYtNDIwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdURE1BRUZSLCAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBURE1BIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAoVElBL0VJQS0xMzYtNDEwKSAqLworICAgIE9NWF9BVURJT19Db2RpbmdRQ0VMUDgsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBRQ0VMUCA4a2JwcyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUUNFTFAxMywgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgMTNrYnBzIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdFVlJDLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBFVlJDIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdTTVYsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBTTVYgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MTEsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzExIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHNzIzLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyMyBkb3QgMSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRzcyNiwgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjYgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MjksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzI5IGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdBQUMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBBQUMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ01QMywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1QMyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nU0JDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgU0JDIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdWT1JCSVMsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBWT1JCSVMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1dNQSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFdNQSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUkEsICAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUkEgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ01JREksICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIE1JREkgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQ09ESU5HVFlQRTsKKworCisvKiogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiAgbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgYXVkaW8gCisgKiAgcGF0aC4gIElmIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkIHRvIGRlZmluZSB0aGUgcGFyYW1ldGVycyBvZiB0aGUKKyAqICBwb3J0IChzdWNoIGFzIGZyZXF1ZW5jeSksIGFkZGl0aW9uYWwgc3RydWN0dXJlcyBtdXN0IGJlIHNlbnQgc3VjaCBhcyB0aGUKKyAqICBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgc3RydWN0dXJlIHRvIHN1cHBseSB0aGUgZXh0cmEgcGFyYW1ldGVycyBmb3IgdGhlIHBvcnQuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOyAgICAgICAgICAgIC8qKjwgTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0ICovCisgICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7IC8qKiA8IHBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gb3V0cHV0IGRldmljZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAgKi8KKyAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7ICAvKio8IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoZSBPTVggY29tcG9uZW50ICovCisgICAgT01YX0FVRElPX0NPRElOR1RZUEUgZUVuY29kaW5nOyAgLyoqPCBUeXBlIG9mIGRhdGEgZXhwZWN0ZWQgZm9yIHRoaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KK30gT01YX0FVRElPX1BPUlRERUZJTklUSU9OVFlQRTsKKworCisvKiogIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlCisgICogIHRoZSB2YXJpb3VzIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KKyAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIDB4MCB0byBOLTEgKi8KKyAgICBPTVhfQVVESU9fQ09ESU5HVFlQRSBlRW5jb2Rpbmc7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIHBvcnQgKGUuZy4gUENNLCBBTVIsIE1QMywgZXRjKSAqLworfSBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEU7CisKKworLyoqIFBDTSBtb2RlIHR5cGUgICovIAordHlwZWRlZiBlbnVtIE9NWF9BVURJT19QQ01NT0RFVFlQRSB7IAorICAgIE9NWF9BVURJT19QQ01Nb2RlTGluZWFyID0gMCwgIC8qKjwgTGluZWFyIFBDTSBlbmNvZGVkIGRhdGEgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVBTGF3LCAgICAgICAgLyoqPCBBIGxhdyBQQ00gZW5jb2RlZCBkYXRhIChHLjcxMSkgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVNVUxhdywgICAgICAgLyoqPCBNdSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fUENNTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX1BDTU1vZGVNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fUENNTU9ERVRZUEU7IAorCisKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgeworICAgIE9NWF9BVURJT19DaGFubmVsTm9uZSA9IDB4MCwgICAgLyoqPCBVbnVzZWQgb3IgZW1wdHkgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExGICAgPSAweDEsICAgIC8qKjwgTGVmdCBmcm9udCAqLworICAgIE9NWF9BVURJT19DaGFubmVsUkYgICA9IDB4MiwgICAgLyoqPCBSaWdodCBmcm9udCAqLworICAgIE9NWF9BVURJT19DaGFubmVsQ0YgICA9IDB4MywgICAgLyoqPCBDZW50ZXIgZnJvbnQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExTICAgPSAweDQsICAgIC8qKjwgTGVmdCBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsUlMgICA9IDB4NSwgICAgLyoqPCBSaWdodCBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsTEZFICA9IDB4NiwgICAgLyoqPCBMb3cgZnJlcXVlbmN5IGVmZmVjdHMgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbENTICAgPSAweDcsICAgIC8qKjwgQmFjayBzdXJyb3VuZCAqLworICAgIE9NWF9BVURJT19DaGFubmVsTFIgICA9IDB4OCwgICAgLyoqPCBMZWZ0IHJlYXIuICovCisgICAgT01YX0FVRElPX0NoYW5uZWxSUiAgID0gMHg5LCAgICAvKio8IFJpZ2h0IHJlYXIuICovCisgICAgT01YX0FVRElPX0NoYW5uZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NoYW5uZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19DaGFubmVsTWF4ICA9IDB4N0ZGRkZGRkYgCit9IE9NWF9BVURJT19DSEFOTkVMVFlQRTsKKworI2RlZmluZSBPTVhfQVVESU9fTUFYQ0hBTk5FTFMgMTYgIC8qKjwgbWF4aW11bSBudW1iZXIgZGlzdGluY3QgYXVkaW8gY2hhbm5lbHMgdGhhdCBhIGJ1ZmZlciBtYXkgY29udGFpbiAqLworI2RlZmluZSBPTVhfTUlOX1BDTVBBWUxPQURfTVNFQyA1IC8qKjwgTWluaW11bSBhdWRpbyBidWZmZXIgcGF5bG9hZCBzaXplIGZvciB1bmNvbXByZXNzZWQgKFBDTSkgYXVkaW8gKi8KKworLyoqIFBDTSBmb3JtYXQgZGVzY3JpcHRpb24gKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBCeXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAoZS5nLiAyIGZvciBzdGVyZW8pICovIAorICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBlTnVtRGF0YTsgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBzaWduZWQgb3IgdW5zaWduZWQgKi8gCisgICAgT01YX0VORElBTlRZUEUgZUVuZGlhbjsgICAgICAgICAgIC8qKjwgaW5kaWNhdGVzIFBDTSBkYXRhIGFzIGxpdHRsZSBvciBiaWcgZW5kaWFuICovIAorICAgIE9NWF9CT09MIGJJbnRlcmxlYXZlZDsgICAgICAgICAgICAvKio8IFRydWUgZm9yIG5vcm1hbCBpbnRlcmxlYXZlZCBkYXRhOyBmYWxzZSBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uLWludGVybGVhdmVkIGRhdGEgKGUuZy4gYmxvY2sgZGF0YSkgKi8gCisgICAgT01YX1UzMiBuQml0UGVyU2FtcGxlOyAgICAgICAgICAgIC8qKjwgQml0IHBlciBzYW1wbGUgKi8gCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKKyAgICBPTVhfQVVESU9fUENNTU9ERVRZUEUgZVBDTU1vZGU7ICAgLyoqPCBQQ00gbW9kZSBlbnVtZXJhdGlvbiAqLyAKKyAgICBPTVhfQVVESU9fQ0hBTk5FTFRZUEUgZUNoYW5uZWxNYXBwaW5nW09NWF9BVURJT19NQVhDSEFOTkVMU107IC8qKjwgU2xvdCBpIGNvbnRhaW5zIGNoYW5uZWwgZGVmaW5lZCBieSBlQ2hhbm5lbE1hcFtpXSAqLworCit9IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRTsgCisKKworLyoqIEF1ZGlvIGNoYW5uZWwgbW9kZS4gIFRoaXMgaXMgdXNlZCBieSBib3RoIEFBQyBhbmQgTVAzLCBhbHRob3VnaCB0aGUgbmFtZXMgYXJlIG1vcmUgYXBwcm9wcmlhdGUKKyAqIGZvciB0aGUgTVAzLiAgRm9yIGV4YW1wbGUsIEpvaW50U3RlcmVvIGZvciBNUDMgaXMgQ291cGxpbmdDaGFubmVscyBmb3IgQUFDLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgeworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZVN0ZXJlbyA9IDAsICAvKio8IDIgY2hhbm5lbHMsIHRoZSBiaXRyYXRlIGFsbG9jYXRpb24gYmV0d2VlbiB0aG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBjaGFubmVscyBjaGFuZ2VzIGFjY29yZGluZ2x5IHRvIGVhY2ggY2hhbm5lbCBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUpvaW50U3RlcmVvLCAvKio8IG1vZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2Ygd2hhdCBpcyBjb21tb24gYmV0d2VlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIGNoYW5uZWxzIGZvciBoaWdoZXIgY29tcHJlc3Npb24gZ2FpbiAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUR1YWwsICAgICAgICAvKio8IDIgbW9uby1jaGFubmVscywgZWFjaCBjaGFubmVsIGlzIGVuY29kZWQgd2l0aCBoYWxmIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBiaXRyYXRlIG9mIHRoZSBvdmVyYWxsIGJpdHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNb25vLCAgICAgICAgLyoqPCBNb25vIGNoYW5uZWwgbW9kZSAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19DaGFubmVsTW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRTsKKworCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgeworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDFMYXllcjMgPSAwLCAvKio8IE1QMyBBdWRpbyBNUEVHIDEgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMkxheWVyMywgICAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcgMiBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAyXzVMYXllcjMsICAgLyoqPCBNUDMgQXVkaW8gTVBFRzIuNSBMYXllciAzIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFOworCisvKiogTVAzIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01QM1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLworICAgIE9NWF9VMzIgbkF1ZGlvQmFuZFdpZHRoOyAgICAgICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX01QM1NUUkVBTUZPUk1BVFRZUEUgZUZvcm1hdDsgIC8qKjwgTVAzIHN0cmVhbSBmb3JtYXQgKi8KK30gT01YX0FVRElPX1BBUkFNX01QM1RZUEU7CisKKwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIHsKKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVAyQURUUyA9IDAsIC8qKjwgQUFDIEF1ZGlvIERhdGEgVHJhbnNwb3J0IFN0cmVhbSAyIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRBRFRTLCAgICAgLyoqPCBBQUMgQXVkaW8gRGF0YSBUcmFuc3BvcnQgU3RyZWFtIDQgZm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNExPQVMsICAgICAvKio8IEFBQyBMb3cgT3ZlcmhlYWQgQXVkaW8gU3RyZWFtIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRMQVRNLCAgICAgLyoqPCBBQUMgTG93IG92ZXJoZWFkIEF1ZGlvIFRyYW5zcG9ydCBNdWx0aXBsZXggKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0QURJRiwgICAgICAgIC8qKjwgQUFDIEF1ZGlvIERhdGEgSW50ZXJjaGFuZ2UgRm9ybWF0ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QNEZGLCAgICAgICAvKio8IEFBQyBpbnNpZGUgTVBFRy00L0lTTyBGaWxlIEZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRSQVcsICAgICAgICAgLyoqPCBBQUMgUmF3IEZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEU7CisKKworLyoqIEFBQyBtb2RlIHR5cGUuICBOb3RlIHRoYXQgdGhlIHRlcm0gcHJvZmlsZSBpcyB1c2VkIHdpdGggdGhlIE1QRUctMgorICogc3RhbmRhcmQgYW5kIHRoZSB0ZXJtIG9iamVjdCB0eXBlIGFuZCBwcm9maWxlIGlzIHVzZWQgd2l0aCBNUEVHLTQgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEV7CisgIE9NWF9BVURJT19BQUNPYmplY3ROdWxsID0gMCwgICAgICAvKio8IE51bGwsIG5vdCB1c2VkICovCisgIE9NWF9BVURJT19BQUNPYmplY3RNYWluID0gMSwgICAgICAvKio8IEFBQyBNYWluIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsICAgICAgICAgICAgLyoqPCBBQUMgTG93IENvbXBsZXhpdHkgb2JqZWN0IChBQUMgcHJvZmlsZSkgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdFNTUiwgICAgICAgICAgIC8qKjwgQUFDIFNjYWxhYmxlIFNhbXBsZSBSYXRlIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TFRQLCAgICAgICAgICAgLyoqPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24gb2JqZWN0ICovCisgIE9NWF9BVURJT19BQUNPYmplY3RIRSwgICAgICAgICAgICAvKio8IEFBQyBIaWdoIEVmZmljaWVuY3kgKG9iamVjdCB0eXBlIFNCUiwgSEUtQUFDIHByb2ZpbGUpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RTY2FsYWJsZSwgICAgICAvKio8IEFBQyBTY2FsYWJsZSBvYmplY3QgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEVSTEMgPSAxNywgICAgIC8qKjwgRVIgQUFDIExvdyBDb21wbGV4aXR5IG9iamVjdCAoRXJyb3IgUmVzaWxpZW50IEFBQy1MQykgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdExEID0gMjMsICAgICAgIC8qKjwgQUFDIExvdyBEZWxheSBvYmplY3QgKEVycm9yIFJlc2lsaWVudCkgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEhFX1BTID0gMjksICAgIC8qKjwgQUFDIEhpZ2ggRWZmaWNpZW5jeSB3aXRoIFBhcmFtZXRyaWMgU3RlcmVvIGNvZGluZyAoSEUtQUFDIHYyLCBvYmplY3QgdHlwZSBQUykgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX0FBQ09iamVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19BQUNPYmplY3RNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRTsKKworCisvKiogQUFDIHRvb2wgdXNhZ2UgKGZvciBuQUFDdG9vbHMgaW4gT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFKS4KKyAqIFJlcXVpcmVkIGZvciBlbmNvZGVyIGNvbmZpZ3VyYXRpb24gYW5kIG9wdGlvbmFsIGFzIGRlY29kZXIgaW5mbyBvdXRwdXQuCisgKiBGb3IgTVAzLCBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGlzIHN1ZmZpY2llbnQuICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTm9uZSAweDAwMDAwMDAwIC8qKjwgbm8gQUFDIHRvb2xzIGFsbG93ZWQgKGVuY29kZXIgY29uZmlnKSBvciBhY3RpdmUgKGRlY29kZXIgaW5mbyBvdXRwdXQpICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sTVMgICAweDAwMDAwMDAxIC8qKjwgTVM6IE1pZC9zaWRlIGpvaW50IGNvZGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sSVMgICAweDAwMDAwMDAyIC8qKjwgSVM6IEludGVuc2l0eSBzdGVyZW8gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbFROUyAgMHgwMDAwMDAwNCAvKio8IFROUzogVGVtcG9yYWwgTm9pc2UgU2hhcGluZyB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sUE5TICAweDAwMDAwMDA4IC8qKjwgUE5TOiBNUEVHLTQgUGVyY2VwdHVhbCBOb2lzZSBzdWJzdGl0dXRpb24gdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbExUUCAgMHgwMDAwMDAxMCAvKio8IExUUDogTVBFRy00IExvbmcgVGVybSBQcmVkaWN0aW9uIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xBbGwgIDB4N0ZGRkZGRkYgLyoqPCBhbGwgQUFDIHRvb2xzIGFsbG93ZWQgb3IgYWN0aXZlICgqLworCisvKiogTVBFRy00IEFBQyBlcnJvciByZXNpbGllbmNlIChFUikgdG9vbCB1c2FnZSAoZm9yIG5BQUNFUnRvb2xzIGluIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSkuCisgKiBSZXF1aXJlZCBmb3IgRVIgZW5jb2RlciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25hbCBhcyBkZWNvZGVyIGluZm8gb3V0cHV0ICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUk5vbmUgIDB4MDAwMDAwMDAgIC8qKjwgbm8gQUFDIEVSIHRvb2xzIGFsbG93ZWQvdXNlZCAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJWQ0IxMSAweDAwMDAwMDAxICAvKio8IFZDQjExOiBWaXJ0dWFsIENvZGUgQm9va3MgZm9yIEFBQyBzZWN0aW9uIGRhdGEgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSUlZMQyAgMHgwMDAwMDAwMiAgLyoqPCBSVkxDOiBSZXZlcnNpYmxlIFZhcmlhYmxlIExlbmd0aCBDb2RpbmcgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSSENSICAgMHgwMDAwMDAwNCAgLyoqPCBIQ1I6IEh1ZmZtYW4gQ29kZXdvcmQgUmVvcmRlcmluZyAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJBbGwgICAweDdGRkZGRkZGICAvKio8IGFsbCBBQUMgRVIgdG9vbHMgYWxsb3dlZC91c2VkICovCisKKworLyoqIEFBQyBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgICAgICAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KKyAgICBPTVhfVTMyIG5GcmFtZUxlbmd0aDsgICAgICAgICAgLyoqPCBGcmFtZSBsZW5ndGggKGluIGF1ZGlvIHNhbXBsZXMgcGVyIGNoYW5uZWwpIG9mIHRoZSBjb2RlYy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW4gYmUgMTAyNCBvciA5NjAgKEFBQy1MQyksIDIwNDggKEhFLUFBQyksIDQ4MCBvciA1MTIgKEFBQy1MRCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCisgICAgT01YX1UzMiBuQUFDdG9vbHM7ICAgICAgICAgICAgIC8qKjwgQUFDIHRvb2wgdXNhZ2UgKi8KKyAgICBPTVhfVTMyIG5BQUNFUnRvb2xzOyAgICAgICAgICAgLyoqPCBNUEVHLTQgQUFDIGVycm9yIHJlc2lsaWVuY2UgdG9vbCB1c2FnZSAqLworICAgIE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSBlQUFDUHJvZmlsZTsgICAvKio8IEFBQyBwcm9maWxlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX0FBQ1NUUkVBTUZPUk1BVFRZUEUgZUFBQ1N0cmVhbUZvcm1hdDsgLyoqPCBBQUMgc3RyZWFtIGZvcm1hdCBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAgIC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCit9IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRTsKKworCisvKiogVk9SQklTIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGVuY29kZWQgZGF0YSBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMuIEVuY29kaW5nIGlzIHNldCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0cmF0ZSBjbG9zZXN0IHRvIHNwZWNpZmllZCAgdmFsdWUgKGluIGJwcykgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgIC8qKjwgU2V0cyBtaW5pbXVtIGJpdHJhdGUgKGluIGJwcykuICovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAvKio8IFNldHMgbWF4aW11bSBiaXRyYXRlIChpbiBicHMpLiAqLworCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHRoZSBhdWRpbyBzaWduYWwuIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9TMzIgblF1YWxpdHk7CQkgIC8qKjwgU2V0cyBlbmNvZGluZyBxdWFsaXR5IHRvIG4sIGJldHdlZW4gLTEgKGxvdykgYW5kIDEwIChoaWdoKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGRlZmF1bHQgbW9kZSBvZiBvcGVyYXRpb24sIHRlaCBxdWFsaXR5IGxldmVsIGlzIDMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbCBxdWFsaXR5IHJhbmdlIGlzIDAgLSAxMC4gKi8KKyAgICBPTVhfQk9PTCBiTWFuYWdlZDsJCSAgLyoqPCBTZXQgIGJpdHJhdGUgIG1hbmFnZW1lbnQgIG1vZGUuIFRoaXMgdHVybnMgb2ZmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgVkJSIGVuY29kaW5nLCBidXQgYWxsb3dzIGhhcmQgb3Igc29mdCBiaXRyYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRzIHRvIGJlIGVuZm9yY2VkIGJ5IHRoZSBlbmNvZGVyLiBUaGlzIG1vZGUgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHNsb3dlciwgYW5kIG1heSBhbHNvIGJlIGxvd2VyIHF1YWxpdHkuIEl0IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcmlseSB1c2VmdWwgZm9yIHN0cmVhbWluZy4gKi8KKyAgICBPTVhfQk9PTCBiRG93bm1peDsJCSAgLyoqPCBEb3dubWl4IGlucHV0IGZyb20gc3RlcmVvIHRvIG1vbm8gKGhhcyBubyBlZmZlY3Qgb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1zdGVyZW8gc3RyZWFtcykuIFVzZWZ1bCBmb3IgbG93ZXItYml0cmF0ZSBlbmNvZGluZy4gKi8gICAgIAorfSBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRTsKKworCisvKiogV01BIFZlcnNpb24gKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fV01BRk9STUFUVFlQRSB7CisgIE9NWF9BVURJT19XTUFGb3JtYXRVbnVzZWQgPSAwLCAvKio8IGZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICBPTVhfQVVESU9fV01BRm9ybWF0NywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA3ICovCisgIE9NWF9BVURJT19XTUFGb3JtYXQ4LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDggKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdDksICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgOSAqLworICBPTVhfQVVESU9fV01BRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fV01BRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1dNQUZPUk1BVFRZUEU7CisKKworLyoqIFdNQSBQcm9maWxlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIHsKKyAgT01YX0FVRElPX1dNQVByb2ZpbGVVbnVzZWQgPSAwLCAgLyoqPCBwcm9maWxlIHVudXNlZCBvciB1bmtub3duICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTDEsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMSAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZUwyLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDIgKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVMMywgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwzICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fV01BUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fV01BUFJPRklMRVRZUEU7CisKKworLyoqIFdNQSBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9XTUFUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTE2IG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfQVVESU9fV01BRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KKwlPTVhfQVVESU9fV01BUFJPRklMRVRZUEUgZVByb2ZpbGU7ICAvKio8IFByb2ZpbGUgb2YgV01BIHN0cmVhbSAvIGRhdGEgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGluZ1JhdGU7ICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEgKi8KKyAgICBPTVhfVTE2IG5CbG9ja0FsaWduOyAgICAgIC8qKjwgaXMgdGhlIGJsb2NrIGFsaWdubWVudCwgb3IgYmxvY2sgc2l6ZSwgaW4gYnl0ZXMgb2YgdGhlIGF1ZGlvIGNvZGVjICovCisgICAgT01YX1UxNiBuRW5jb2RlT3B0aW9uczsgICAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KKyAgICBPTVhfVTMyIG5TdXBlckJsb2NrQWxpZ247IC8qKjwgV01BIFR5cGUtc3BlY2lmaWMgZGF0YSAqLworfSBPTVhfQVVESU9fUEFSQU1fV01BVFlQRTsKKworLyoqIAorICogUmVhbEF1ZGlvIGZvcm1hdAorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1JBRk9STUFUVFlQRSB7CisgICAgT01YX0FVRElPX1JBRm9ybWF0VW51c2VkID0gMCwgLyoqPCBGb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fUkE4LCAgICAgICAgICAgICAgICAvKio8IFJlYWxBdWRpbyA4IGNvZGVjICovCisgICAgT01YX0FVRElPX1JBOSwgICAgICAgICAgICAgICAgLyoqPCBSZWFsQXVkaW8gOSBjb2RlYyAqLworICAgIE9NWF9BVURJT19SQTEwX0FBQywgICAgICAgICAgIC8qKjwgTVBFRy00IEFBQyBjb2RlYyBmb3IgYml0cmF0ZXMgb2YgbW9yZSB0aGFuIDEyOGticHMgKi8KKyAgICBPTVhfQVVESU9fUkExMF9DT0RFQywgICAgICAgICAvKio8IFJlYWxBdWRpbyBjb2RlYyBmb3IgYml0cmF0ZXMgbGVzcyB0aGFuIDEyOCBrYnBzICovCisgICAgT01YX0FVRElPX1JBMTBfTE9TU0xFU1MsICAgICAgLyoqPCBSZWFsQXVkaW8gTG9zc2xlc3MgKi8KKyAgICBPTVhfQVVESU9fUkExMF9NVUxUSUNIQU5ORUwsICAvKio8IFJlYWxBdWRpbyBNdWx0aWNoYW5uZWwgKi8KKyAgICBPTVhfQVVESU9fUkExMF9WT0lDRSwgICAgICAgICAvKio8IFJlYWxBdWRpbyBWb2ljZSBmb3IgYml0cmF0ZXMgYmVsb3cgMTUga2JwcyAqLworICAgIE9NWF9BVURJT19SQUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fUkFGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19SQUZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1JBRk9STUFUVFlQRTsKKworLyoqIFJBIChSZWFsIEF1ZGlvKSBwYXJhbXMgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUkFUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8gCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAgIC8qKjwgaXMgdGhlIHNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhICovIAorICAgIE9NWF9VMzIgbkJpdHNQZXJGcmFtZTsgICAgICAvKio8IGlzIHRoZSB2YWx1ZSBmb3IgYml0cyBwZXIgZnJhbWUgICovIAorICAgIE9NWF9VMzIgblNhbXBsZVBlckZyYW1lOyAgICAvKio8IGlzIHRoZSB2YWx1ZSBmb3Igc2FtcGxlcyBwZXIgZnJhbWUgKi8gCisgICAgT01YX1UzMiBuQ291cGxpbmdRdWFudEJpdHM7IC8qKjwgaXMgdGhlIG51bWJlciBvZiBjb3VwbGluZyBxdWFudGl6YXRpb24gYml0cyBpbiB0aGUgc3RyZWFtICovIAorICAgIE9NWF9VMzIgbkNvdXBsaW5nU3RhcnRSZWdpb247ICAgLyoqPCBpcyB0aGUgY291cGxpbmcgc3RhcnQgcmVnaW9uIGluIHRoZSBzdHJlYW0gICovIAorICAgIE9NWF9VMzIgbk51bVJlZ2lvbnM7ICAgICAgICAvKio8IGlzIHRoZSBudW1iZXIgb2YgcmVnaW9ucyB2YWx1ZSAqLyAKKyAgICBPTVhfQVVESU9fUkFGT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgaXMgdGhlIFJlYWxBdWRpbyBhdWRpbyBmb3JtYXQgKi8KK30gT01YX0FVRElPX1BBUkFNX1JBVFlQRTsgCisKKworLyoqIFNCQyBBbGxvY2F0aW9uIE1ldGhvZCBUeXBlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRSB7CisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZExvdWRuZXNzLCAvKio8IExvdWRuZXNzIGFsbG9jYXRpb24gbWV0aG9kICovCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZFNOUiwgICAgICAvKio8IFNOUiBhbGxvY2F0aW9uIG1ldGhvZCAqLworICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19TQkNBbGxvY01ldGhvZE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRTsKKworCisvKiogU0JDIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5CbG9ja3M7ICAgICAgICAgICAvKio8IE51bWJlciBvZiBibG9ja3MgKi8KKyAgICBPTVhfVTMyIG5TdWJiYW5kczsgICAgICAgICAvKio8IE51bWJlciBvZiBzdWJiYW5kcyAqLworICAgIE9NWF9VMzIgbkJpdFBvb2w7ICAgICAgICAgIC8qKjwgQml0cG9vbCB2YWx1ZSAqLworICAgIE9NWF9CT09MIGJFbmFibGVCaXRyYXRlOyAgIC8qKjwgVXNlIGJpdHJhdGUgdmFsdWUgaW5zdGVhZCBvZiBiaXRwb29sICovCisgICAgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBlQ2hhbm5lbE1vZGU7IC8qKjwgQ2hhbm5lbCBtb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX1NCQ0FMTE9DTUVUSE9EVFlQRSBlU0JDQWxsb2NUeXBlOyAgIC8qKjwgU0JDIEFsbG9jYXRpb24gbWV0aG9kIHR5cGUgKi8KK30gT01YX0FVRElPX1BBUkFNX1NCQ1RZUEU7CisKKworLyoqIEFEUENNIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgT01YX1UzMiBuQml0c1BlclNhbXBsZTsgICAgIC8qKjwgTnVtYmVyIG9mIGJpdHMgaW4gZWFjaCBzYW1wbGUgKi8gCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovIAorfSBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFOyAKKworCisvKiogRzcyMyByYXRlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjNSQVRFIHsKKyAgICBPTVhfQVVESU9fRzcyM01vZGVVbnVzZWQgPSAwLCAgLyoqPCBBTVJOQiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fRzcyM01vZGVMb3csICAgICAgICAgLyoqPCA1MzAwIGJwcyAqLworICAgIE9NWF9BVURJT19HNzIzTW9kZUhpZ2gsICAgICAgICAvKio8IDYzMDAgYnBzICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19HNzIzTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRzcyM1JBVEU7CisKKworLyoqIEc3MjMgLSBTYW1wbGUgcmF0ZSBtdXN0IGJlIDggS0h6ICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyM1RZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovIAorICAgIE9NWF9BVURJT19HNzIzUkFURSBlQml0UmF0ZTsgIC8qKjwgdG9kbzogU2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gYSBjb25maWc/ICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLyAKKyAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBQb3N0IEZpbHRlciAqLyAKK30gT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFOyAKKworCisvKiogSVRVIEc3MjYgKEFEUENNKSByYXRlICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0c3MjZNT0RFIHsKKyAgICBPTVhfQVVESU9fRzcyNk1vZGVVbnVzZWQgPSAwLCAgLyoqPCBHNzI2IE1vZGUgdW51c2VkIC8gdW5rbm93biAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZTE2LCAgICAgICAgICAvKio8IDE2IGticHMgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGUyNCwgICAgICAgICAgLyoqPCAyNCBrYnBzICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlMzIsICAgICAgICAgIC8qKjwgMzIga2JwcywgbW9zdCBjb21tb24gcmF0ZSwgYWxzbyBHNzIxICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlNDAsICAgICAgICAgIC8qKjwgNDAga2JwcyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fRzcyNk1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0c3MjZNT0RFOworCisKKy8qKiBHLjcyNiBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgLSBtdXN0IGJlIGF0IDhLSHogKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEUgeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8gCisgICAgIE9NWF9BVURJT19HNzI2TU9ERSBlRzcyNk1vZGU7Cit9IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRTsgCisKKworLyoqIEc3MjkgY29kZXIgdHlwZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzI5VFlQRSB7CisgICAgT01YX0FVRElPX0c3MjkgPSAwLCAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5QSwgICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IGFubmV4IEEgIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5QiwgICAgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5IHdpdGggYW5uZXggQiBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fRzcyOUFCLCAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSBhbm5leGVzIEEgYW5kIEIgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0c3MjlLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0c3MjlWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19HNzI5TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRzcyOVRZUEU7CisKKworLyoqIEc3Mjkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzIC0gZml4ZWQgNktIeiBzYW1wbGUgcmF0ZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQVVESU9fRzcyOVRZUEUgZUJpdFR5cGU7Cit9IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRTsKKworCisvKiogQU1SIEZyYW1lIGZvcm1hdCAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFIHsgCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0Q29uZm9ybWFuY2UgPSAwLCAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIENvbmZvcm1hbmNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0YW5kYXJkKSBGb3JtYXQgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SUYxLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIEludGVyZmFjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdCAxICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMiwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBJbnRlcmZhY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMiovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdEZTRiwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBGaWxlIFN0b3JhZ2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0UlRQUGF5bG9hZCwgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgQU1SIFJlYWwtVGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zcG9ydCBQcm90b2NvbCBQYXlsb2FkIEZvcm1hdCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJVFUsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBJVFUgRm9ybWF0IChhZGRlZCBhdCBNb3Rvcm9sYSByZXF1ZXN0KSAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fQU1SRlJBTUVGT1JNQVRUWVBFOyAKKworCisvKiogQU1SIGJhbmQgbW9kZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgeworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVVudXNlZCA9IDAsICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIwLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDAgPSAgNDc1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjEsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMSA9ICA1MTUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMiwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAyID0gIDU5MDAgYnBzICovIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMywgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAzID0gIDY3MDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI0LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDQgPSAgNzQwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjUsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNSA9ICA3OTUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNiwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA2ID0gMTAyMDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI3LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDcgPSAxMjIwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjAsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMCA9ICA2NjAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMSwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAxID0gIDg4NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IyLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDIgPSAxMjY1MCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IzLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDMgPSAxNDI1MCBicHMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I0LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDQgPSAxNTg1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjUsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNSA9IDE4MjUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNiwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA2ID0gMTk4NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I3LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDcgPSAyMzA1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjgsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgOCA9IDIzODUwIGJwcyAqLyAgICAgIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0FNUkJBTkRNT0RFVFlQRTsKKyAgICAgCisKKy8qKiBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gbW9kZSAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEUgeyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9mZiA9IDAsICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIGlzIGRpc2FibGVkICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQxLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAxIChWQUQxKSBpcyBlbmFibGVkICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25WQUQyLCAgICAgICAgIC8qKjwgQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIE1vZGUgdXNpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2ljZSBBY3Rpdml0eSBEZXRlY3RvciAyIChWQUQyKSBpcyBlbmFibGVkICovICAgICAgIAorICAgIE9NWF9BVURJT19BTVJEVFhNb2RlT25BdXRvLCAgICAgICAgIC8qKjwgVGhlIGNvZGVjIHdpbGwgYXV0b21hdGljYWxseSBzZWxlY3QgYmV0d2VlbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZiwgVkFEMSBvciBWQUQyIG1vZGVzICovIAorCisgICAgT01YX0FVRElPX0FNUkRUWGFzRUZSLCAgICAgICAgICAgICAvKio8IERUWCBhcyBFRlIgaW5zdGVhZCBvZiBBTVIgc3RhbmRhcmQgKDNHUFAgMjYuMTAxLCBmcmFtZSB0eXBlID04LDksMTApICovCisKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVNYXggPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fQU1SRFRYTU9ERVRZUEU7IAorIAorCisvKiogQU1SIHBhcmFtcyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0FNUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgICAgICAgICAgICAgICAvKio8IEJpdCByYXRlIHJlYWQgb25seSBmaWVsZCAqLworICAgIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgZUFNUkJhbmRNb2RlOyAvKio8IEFNUiBCYW5kIE1vZGUgZW51bWVyYXRpb24gKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1PREVUWVBFICBlQU1SRFRYTW9kZTsgIC8qKjwgQU1SIERUWCBNb2RlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSBlQU1SRnJhbWVGb3JtYXQ7IC8qKjwgQU1SIGZyYW1lIGZvcm1hdCBlbnVtZXJhdGlvbiAqLworfSBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRTsKKworCisvKiogR1NNX0ZSIChFVFNJIDA2LjEwLCAzR1BQIDQ2LjAxMCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fR1NNRlJUWVBFOworCisKKy8qKiBHU00tSFIgKEVUU0kgMDYuMjAsIDNHUFAgNDYuMDIwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01IUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9HU01IUlRZUEU7CisKKworLyoqIEdTTS1FRlIgKEVUU0kgMDYuNjAsIDNHUFAgNDYuMDYwKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HU01FRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRTsKKworCisvKiogVERNQSBGUiAoVElBL0VJQS0xMzYtNDIwLCBWU0VMUCA3Ljk1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEU7CisKKworLyoqIFRETUEgRUZSIChUSUEvRUlBLTEzNi00MTAsIEFDRUxQIDcuNGticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1RETUFFRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEU7CisKKworLyoqIFBEQyBGUiAoIFJDUi0yNywgVlNFTFAgNi43a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fUERDRlJUWVBFOworCisKKy8qKiBQREMgRUZSICggUkNSLTI3LCBBQ0VMUCA2LjdrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRTsKKworLyoqIFBEQyBIUiAoIFJDUi0yNywgUFNJLUNFTFAgMy40NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1BEQ0hSVFlQRTsKKworCisvKiogQ0RNQSBSYXRlIHR5cGVzICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0NETUFSQVRFVFlQRSB7CisgICAgT01YX0FVRElPX0NETUFSYXRlQmxhbmsgPSAwLCAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpcyBibGFuayAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUZ1bGwsICAgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gZnVsbCByYXRlICovCisgICAgT01YX0FVRElPX0NETUFSYXRlSGFsZiwgICAgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBoYWxmIHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVRdWFydGVyLCAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIHF1YXJ0ZXIgcmF0ZSAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUVpZ2h0aCwgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gZWlnaHRoIHJhdGUgKERUWCkqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUVyYXN1cmUsICAgICAgICAgICAgLyoqPCBDRE1BIGVyYXN1cmUgZnJhbWUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NETUFSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19DRE1BUkFURVRZUEU7CisKKworLyoqIFFDRUxQOCAoVElBL0VJQS05NiwgdXAgdG8gOGticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBpbnB1dCBkYXRhLiAgVXNlIDAgZm9yIHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLworfSBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRTsKKworCisvKiogUUNFTFAxMyAoIENETUEsIEVJQS9USUEtNzMzLCAxMy4za2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBGcmFtZSByYXRlICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCit9IE9NWF9BVURJT19QQVJBTV9RQ0VMUDEzVFlQRTsKKworCisvKiogRVZSQyAoIENETUEsIEVJQS9USUEtMTI3LCBSQ0VMUCB1cCB0byA4LjU1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fRVZSQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFIGVDRE1BUmF0ZTsgLyoqPCBhY3R1YWwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9CT09MIGJSQVRFX1JFRFVDb247ICAgICAgIC8qKjwgUkFURV9SRURVQ3Rpb24gaXMgcmVxdWVzdGVkIGZvciB0aGlzIGZyYW1lICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAgICAgLyoqPCBtaW5tYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gMSAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ICovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KKyAgICBPTVhfQk9PTCBiTm9pc2VTdXBwcmVzc29yOyAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3Mgbm9pc2Ugc3VwcHJlc3NvciBwcmUtcHJvY2Vzc2luZyAqLworICAgIE9NWF9CT09MIGJQb3N0RmlsdGVyOyAgICAgICAgIC8qKjwgRW5hYmxlIGRlY29kZXIncyBwb3N0IEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fRVZSQ1RZUEU7CisKKworLyoqIFNNViAoIHVwIHRvIDguNTVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9CT09MIGJSQVRFX1JFRFVDb247ICAgICAgICAgICAvKio8IFJBVEVfUkVEVUN0aW9uIGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBmcmFtZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgPz8qLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWF4aW1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSA0ID8/Ki8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBlbmNvZGVyJ3MgSGlnaCBQYXNzIEZpbHRlciA/PyovCisgICAgT01YX0JPT0wgYk5vaXNlU3VwcHJlc3NvcjsgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIG5vaXNlIHN1cHByZXNzb3IgcHJlLXByb2Nlc3NpbmcgKi8KKyAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBkZWNvZGVyJ3MgcG9zdCBGaWx0ZXIgPz8qLworfSBPTVhfQVVESU9fUEFSQU1fU01WVFlQRTsKKworCisvKiogTUlESSBGb3JtYXQgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEUKK3sKKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFVua25vd24gPSAwLCAvKio8IE1JREkgRm9ybWF0IHVua25vd24gb3IgZG9uJ3QgY2FyZSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMCwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMCAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMSwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U01GMiwgICAgICAgIC8qKjwgU3RhbmRhcmQgTUlESSBGaWxlIFR5cGUgMiAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0U1BNSURJLCAgICAgIC8qKjwgU1AtTUlESSAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0WE1GMCwgICAgICAgIC8qKjwgZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAwICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRYTUYxLCAgICAgICAgLyoqPCBlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDEgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdE1vYmlsZVhNRiwgICAvKio8IE1vYmlsZSBYTUYgKGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMikgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NSURJRk9STUFUVFlQRTsKKworCisvKiogTUlESSBwYXJhbXMgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuRmlsZVNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgTUlESSBmaWxlIGluIGJ5dGVzLCB3aGVyZSB0aGUgZW50aXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgZmlsZSBwYXNzZWQgaW4sIG90aGVyd2lzZSBpZiAweDAsIHRoZSBNSURJIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWVyZ2VkIGFuZCBzdHJlYW1lZCAoaW5zdGVhZCBvZiBwYXNzZWQgYXMgYW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlIE1JREkgZmlsZSkgKi8KKyAgICBPTVhfQlUzMiBzTWF4UG9seXBob255OyAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2ltdWx0YW5lb3VzIHBvbHlwaG9uaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pY2VzLiBBIHZhbHVlIG9mIHplcm8gaW5kaWNhdGVzIHRoYXQgdGhlIGRlZmF1bHQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255IG9mIHRoZSBkZXZpY2UgaXMgdXNlZCAgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfQk9PTCBiTG9hZERlZmF1bHRTb3VuZDsgICAgLyoqPCBXaGV0aGVyIHRvIGxvYWQgZGVmYXVsdCBzb3VuZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW5rIGF0IGluaXRpYWxpemF0aW9uICovCisgICAgT01YX0FVRElPX01JRElGT1JNQVRUWVBFIGVNaWRpRm9ybWF0OyAvKio8IFZlcnNpb24gb2YgdGhlIE1JREkgZmlsZSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEU7CisKKworLyoqIFR5cGUgb2YgdGhlIE1JREkgc291bmQgYmFuayAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRSB7CisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtVbnVzZWQgPSAwLCAgICAgICAgICAgLyoqPCB1bnVzZWQvdW5rbm93biBzb3VuZGJhbmsgdHlwZSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rRExTMSwgICAgICAgICAgICAgICAgIC8qKjwgRExTIHZlcnNpb24gMSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rRExTMiwgICAgICAgICAgICAgICAgIC8qKjwgRExTIHZlcnNpb24gMiAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTQmFzZSwgICAgICAgIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIGJhc2UgZnVuY3Rpb25hbGl0eSAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTW9iaWxlRExTUGx1c09wdGlvbnMsIC8qKjwgTW9iaWxlIERMUywgdXNpbmcgdGhlIHNwZWNpZmljYXRpb24tZGVmaW5lZCBvcHRpb25hbCBmZWF0dXJlIHNldCAqLworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFOworCisKKy8qKiBCYW5rIExheW91dCBkZXNjcmliZXMgaG93IGJhbmsgTVNCICYgTFNCIGFyZSB1c2VkIGluIHRoZSBETFMgaW5zdHJ1bWVudCBkZWZpbml0aW9ucyBzb3VuZCBiYW5rIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFIHsKKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VW51c2VkID0gMCwgICAvKio8IHVudXNlZC91bmtub3duIHNvdW5kYmFuayB0eXBlICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNLCAgICAgICAgICAgLyoqPCBHUyBsYXlvdXQgKGJhc2VkIG9uIGJhbmsgTVNCIDB4MDApICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEdNMiwgICAgICAgICAgLyoqPCBHZW5lcmFsIE1JREkgMiBsYXlvdXQgKHVzaW5nIE1TQiAweDc4LzB4NzksIExTQiAweDAwKSAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRVc2VyLCAgICAgICAgIC8qKjwgRG9lcyBub3QgY29uZm9ybSB0byBhbnkgYmFuayBudW1iZXJpbmcgc3RhbmRhcmRzICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEU7CisKKworLyoqIE1JREkgcGFyYW1zIHRvIGxvYWQvdW5sb2FkIHVzZXIgc291bmRiYW5rIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5ETFNJbmRleDsgICAgICAgIC8qKjwgRExTIGZpbGUgaW5kZXggdG8gYmUgbG9hZGVkICovCisgICAgT01YX1UzMiBuRExTU2l6ZTsgICAgICAgICAvKio8IFNpemUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfUFRSIHBETFNEYXRhOyAgICAgICAgIC8qKjwgUG9pbnRlciB0byBETFMgZmlsZSBkYXRhICovCisgICAgT01YX0FVRElPX01JRElTT1VOREJBTktUWVBFIGVNaWRpU291bmRCYW5rOyAgIC8qKjwgTWlkaSBzb3VuZCBiYW5rIHR5cGUgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fTUlESVNPVU5EQkFOS0xBWU9VVFRZUEUgZU1pZGlTb3VuZEJhbmtMYXlvdXQ7IC8qKjwgTWlkaSBzb3VuZCBiYW5rIGxheW91dCBlbnVtZXJhdGlvbiAqLworfSBPTVhfQVVESU9fUEFSQU1fTUlESUxPQURVU0VSU09VTkRUWVBFOworCisKKy8qKiBTdHJ1Y3R1cmUgZm9yIExpdmUgTUlESSBldmVudHMgYW5kIE1JUCBtZXNzYWdlcy4gCisgKiAoTUlQID0gTWF4aW11bSBJbnN0YW50YW5lb3VzIFBvbHlwaG9ueTsgcGFydCBvZiB0aGUgU1AtTUlESSBzdGFuZGFyZC4pIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbk1pZGlFdmVudFNpemU7ICAgLyoqPCBTaXplIG9mIGltbWVkaWF0ZSBNSURJIGV2ZW50cyBvciBNSVAgbWVzc2FnZSBpbiBieXRlcyAgKi8KKyAgICBPTVhfVTggbk1pZGlFdmVudHNbMV07ICAgIC8qKjwgTUlESSBldmVudCBhcnJheSB0byBiZSByZW5kZXJlZCBpbW1lZGlhdGVseSwgb3IgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXkgZm9yIHRoZSBNSVAgbWVzc2FnZSBidWZmZXIsIHdoZXJlIHRoZSBzaXplIGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZWQgYnkgbk1pZGlFdmVudFNpemUgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFOworCisKKy8qKiBNSURJIHNvdW5kIGJhbmsvIHByb2dyYW0gcGFpciBpbiBhIGdpdmVuIGNoYW5uZWwgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBWYWxpZCBjaGFubmVsIHZhbHVlcyByYW5nZSBmcm9tIDEgdG8gMTYgKi8KKyAgICBPTVhfVTE2IG5JRFByb2dyYW07ICAgICAgICAgLyoqPCBWYWxpZCBwcm9ncmFtIElEIHJhbmdlIGlzIDEgdG8gMTI4ICovCisgICAgT01YX1UxNiBuSURTb3VuZEJhbms7ICAgICAgIC8qKjwgU291bmQgYmFuayBJRCAqLworICAgIE9NWF9VMzIgblVzZXJTb3VuZEJhbmtJbmRleDsvKio8IFVzZXIgc291bmRiYW5rIGluZGV4LCBlYXNpZXIgdG8gYWNjZXNzIHNvdW5kYmFua3MgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgaW5kZXggaWYgbXVsdGlwbGUgYmFua3MgYXJlIHByZXNlbnQgKi8KK30gT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEU7CisKKworLyoqIE1JREkgY29udHJvbCAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CUzMyIHNQaXRjaFRyYW5zcG9zaXRpb247IC8qKjwgUGl0Y2ggdHJhbnNwb3NpdGlvbiBpbiBzZW1pdG9uZXMsIHN0b3JlZCBhcyBRMjIuMTAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgYmFzZWQgb24gSkFWQSBNTUFQSSAoSlNSLTEzNSkgcmVxdWlyZW1lbnQgKi8KKyAgICBPTVhfQlUzMiBzUGxheUJhY2tSYXRlOyAgICAgICAvKio8IFJlbGF0aXZlIHBsYXliYWNrIHJhdGUsIHN0b3JlZCBhcyBRMTQuMTcgZml4ZWQtcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBiYXNlZCBvbiBKU1ItMTM1IHJlcXVpcmVtZW50ICovCisgICAgT01YX0JVMzIgc1RlbXBvIDsgICAgICAgICAgICAgLyoqPCBUZW1wbyBpbiBiZWF0cyBwZXIgbWludXRlIChCUE0pLCBzdG9yZWQgYXMgUTIyLjEwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQtcG9pbnQgbnVtYmVyIGJhc2VkIG9uIEpTUi0xMzUgcmVxdWlyZW1lbnQgKi8KKyAgICBPTVhfVTMyIG5NYXhQb2x5cGhvbnk7ICAgICAgICAvKio8IFNwZWNpZmllcyB0aGUgbWF4aW11bSBzaW11bHRhbmVvdXMgcG9seXBob25pYyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9seXBob255IG9mIHRoZSBkZXZpY2UgaXMgdXNlZCAgKi8KKyAgICBPTVhfVTMyIG5OdW1SZXBlYXQ7ICAgICAgICAgICAvKio8IE51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgcGxheWJhY2sgKi8KKyAgICBPTVhfVTMyIG5TdG9wVGltZTsgICAgICAgICAgICAvKio8IFRpbWUgaW4gbWlsbGlzZWNvbmRzIHRvIGluZGljYXRlIHdoZW4gcGxheWJhY2sgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHN0b3AgYXV0b21hdGljYWxseS4gIFNldCB0byB6ZXJvIGlmIG5vdCB1c2VkICovCisgICAgT01YX1UxNiBuQ2hhbm5lbE11dGVNYXNrOyAgICAgLyoqPCAxNiBiaXQgbWFzayBmb3IgY2hhbm5lbCBtdXRlIHN0YXR1cyAqLworICAgIE9NWF9VMTYgbkNoYW5uZWxTb2xvTWFzazsgICAgIC8qKjwgMTYgYml0IG1hc2sgZm9yIGNoYW5uZWwgc29sbyBzdGF0dXMgKi8KKyAgICBPTVhfVTMyIG5UcmFjazAwMzFNdXRlTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBtdXRlIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDAtMzEgKi8KKyAgICBPTVhfVTMyIG5UcmFjazMyNjNNdXRlTWFzazsgICAvKio8IDMyIGJpdCBtYXNrIGZvciB0cmFjayBtdXRlIHN0YXR1cy4gTm90ZTogVGhpcyBpcyBmb3IgdHJhY2tzIDMyLTYzICovCisgICAgT01YX1UzMiBuVHJhY2swMDMxU29sb01hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgc29sbyBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAwLTMxICovCisgICAgT01YX1UzMiBuVHJhY2szMjYzU29sb01hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgc29sbyBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAzMi02MyAqLworCit9IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFOworCisKKy8qKiBNSURJIFBsYXliYWNrIFN0YXRlcyAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJUExBWUJBQ0tTVEFURVRZUEUgeworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVVbmtub3duID0gMCwgICAgICAvKio8IFVua25vd24gc3RhdGUgb3Igc3RhdGUgZG9lcyBub3QgbWFwIHRvIAorICAJCQkJCQkJCQkJCQkJb3RoZXIgZGVmaW5lZCBzdGF0ZXMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlQ2xvc2VkRW5nYWdlZCwgICAgLyoqPCBObyBNSURJIHJlc291cmNlIGlzIGN1cnJlbnRseSBvcGVuLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5IHByb2Nlc3NpbmcgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlESSBldmVudHMuICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBhcnNpbmcsICAgICAgICAgIC8qKjwgQSBNSURJIHJlc291cmNlIGlzIG9wZW4gYW5kIGlzIGJlaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1lZC4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nIE1JREkgZXZlbnRzLiAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVPcGVuRW5nYWdlZCwgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBwcmltZWQgYnV0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBwbGF5aW5nLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gVGhlIHRyYW5zaXRpb24gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlIGlzIG9ubHkgcG9zc2libGUgZnJvbSB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZyBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSAncGxheWJhY2sgaGVhZCcgcmVhY2hlcyB0aGUgZW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgbWVkaWEgZGF0YSBvciB0aGUgcGxheWJhY2sgc3RvcHMgZHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RvcCB0aW1lIHNldC4qLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nLCAgICAgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBjdXJyZW50bHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5aW5nLiBUaGUgTUlESSBlbmdpbmUgaXMgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4qLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nUGFydGlhbGx5LCAvKio8IEJlc3QtZWZmb3J0IHBsYXliYWNrIGR1ZSB0byBTUC1NSURJL0RMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGNvbnN0cmFpbnRzICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmdTaWxlbnRseSwgIC8qKjwgRHVlIHRvIHN5c3RlbSByZXNvdXJjZSBjb25zdHJhaW50cyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUC1NSURJIGNvbnRlbnQgY29uc3RyYWludHMsIHRoZXJlIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gYXVkaWJsZSBNSURJIGNvbnRlbnQgZHVyaW5nIHBsYXliYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5LiBUaGUgc2l0dWF0aW9uIG1heSBjaGFuZ2UgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgYXJlIGZyZWVkIGxhdGVyLiovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFOworCisKKy8qKiBNSURJIHN0YXR1cyAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJU1RBVFVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UxNiBuTnVtVHJhY2tzOyAgICAgICAgIC8qKjwgTnVtYmVyIG9mIE1JREkgdHJhY2tzIGluIHRoZSBmaWxlLCByZWFkIG9ubHkgZmllbGQuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSB1bnRpbCB0aGUgZW50aXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCisgICAgT01YX1UzMiBuRHVyYXRpb247ICAgICAgICAgIC8qKjwgVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudGx5IG9wZW4gTUlESSByZXNvdXJjZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovICAKKyAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgICAgLyoqPCBDdXJyZW50IFBvc2l0aW9uIG9mIHRoZSBNSURJIHJlc291cmNlIGJlaW5nIHBsYXllZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQk9PTCBiVmlicmE7ICAgICAgICAgICAgLyoqPCBEb2VzIFZpYnJhIHRyYWNrIGV4aXN0PyBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICovCisgICAgT01YX1UzMiBuTnVtTWV0YUV2ZW50czsgICAgIC8qKjwgVG90YWwgbnVtYmVyIG9mIE1JREkgTWV0YSBFdmVudHMgaW4gdGhlIGN1cnJlbnRseSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnRpbCB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gICovCisgICAgT01YX1UzMiBuTnVtQWN0aXZlVm9pY2VzOyAgIC8qKjwgTnVtYmVyIG9mIGFjdGl2ZSB2b2ljZXMgaW4gdGhlIGN1cnJlbnRseSBwbGF5aW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgcmVzb3VyY2UuIE5PVEU6IE1heSBub3QgcmV0dXJuIGEgbWVhbmluZ2Z1bCB2YWx1ZSB1bnRpbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZW50aXJlIGZpbGUgaXMgcGFyc2VkIGFuZCBidWZmZXJlZC4gKi8KKyAgICBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIGVNSURJUGxheUJhY2tTdGF0ZTsgIC8qKjwgTUlESSBwbGF5YmFjayBzdGF0ZSBlbnVtZXJhdGlvbiwgcmVhZCBvbmx5IGZpZWxkICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEU7CisKKworLyoqIE1JREkgTWV0YSBFdmVudCBzdHJ1Y3R1cmUgb25lIHBlciBNZXRhIEV2ZW50LgorICogIE1JREkgTWV0YSBFdmVudHMgYXJlIGxpa2UgYXVkaW8gbWV0YWRhdGEsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlIGludGVyc3BlcnNlZCAKKyAqICB3aXRoIHRoZSBNSURJIGNvbnRlbnQgdGhyb3VnaG91dCB0aGUgZmlsZSBhbmQgYXJlIG5vdCBsb2NhbGl6ZWQgaW4gdGhlIGhlYWRlci4gCisgKiAgQXMgc3VjaCwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJldHJpZXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZXNlIE1ldGEgRXZlbnRzIGZyb20gCisgKiAgdGhlIGVuZ2luZSwgYXMgaXQgZW5jb3VudGVycyB0aGVzZSBNZXRhIEV2ZW50cyB3aXRoaW4gdGhlIE1JREkgY29udGVudC4gCisgKiAgRm9yIGV4YW1wbGUsIFNNRiBmaWxlcyBjYW4gaGF2ZSB1cCB0byAxNCB0eXBlcyBvZiBNSURJIE1ldGEgRXZlbnRzIChjb3B5cmlnaHQsIAorICogIGF1dGhvciwgZGVmYXVsdCB0ZW1wbywgZXRjLikgc2NhdHRlcmVkIHRocm91Z2hvdXQgdGhlIGZpbGUuIAorICogIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UVFlQRXsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAvKio8IEluZGV4IG9mIE1ldGEgRXZlbnQgKi8gCisgICAgT01YX1U4IG5NZXRhRXZlbnRUeXBlOyAgICAvKio8IE1ldGEgRXZlbnQgVHlwZSwgN2JpdHMgKGkuZS4gMCAtIDEyNykgKi8gCisgICAgT01YX1UzMiBuTWV0YUV2ZW50U2l6ZTsgICAvKio8IHNpemUgb2YgdGhlIE1ldGEgRXZlbnQgaW4gYnl0ZXMgKi8gCisgICAgT01YX1UzMiBuVHJhY2s7ICAgICAgICAgICAvKio8IHRyYWNrIG51bWJlciBmb3IgdGhlIG1ldGEgZXZlbnQgKi8KKyAgICBPTVhfVTMyIG5Qb3NpdGlvbjsgICAgICAgIC8qKjwgUG9zaXRpb24gb2YgdGhlIG1ldGEtZXZlbnQgaW4gbWlsbGlzZWNvbmRzICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEU7IAorCisKKy8qKiBNSURJIE1ldGEgRXZlbnQgRGF0YSBzdHJ1Y3R1cmUgLSBvbmUgcGVyIE1ldGEgRXZlbnQuIAorICogQGluZ3JvdXAgbWlkaQorICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJTUVUQUVWRU5UREFUQVRZUEV7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgLyoqPCBJbmRleCBvZiBNZXRhIEV2ZW50ICovIAorICAgIE9NWF9VMzIgbk1ldGFFdmVudFNpemU7ICAgLyoqPCBzaXplIG9mIHRoZSBNZXRhIEV2ZW50IGluIGJ5dGVzICovIAorICAgIE9NWF9VOCBuRGF0YVsxXTsgICAgICAgICAgLyoqPCBhcnJheSBvZiBvbmUgb3IgbW9yZSBieXRlcyBvZiBtZXRhIGRhdGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluZGljYXRlZCBieSB0aGUgbk1ldGFFdmVudFNpemUgZmllbGQgKi8gCit9IE9NWF9BVURJT19DT05GSUdfX01JRElNRVRBRVZFTlREQVRBVFlQRTsgCisKKworLyoqIEF1ZGlvIFZvbHVtZSBhZGp1c3RtZW50IGZvciBhIHBvcnQgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfVk9MVU1FVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgaW5kZXggaW5kaWNhdGluZyB3aGljaCBwb3J0IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldC4gIFNlbGVjdCB0aGUgaW5wdXQgcG9ydCB0byBzZXQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB0aGF0IHBvcnQncyB2b2x1bWUuICBTZWxlY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZS4gKi8KKyAgICBPTVhfQk9PTCBiTGluZWFyOyAgICAgICAgICAgLyoqPCBJcyB0aGUgdm9sdW1lIHRvIGJlIHNldCBpbiBsaW5lYXIgKDAuMTAwKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBsb2dhcml0aG1pYyBzY2FsZSAobUIpICovCisgICAgT01YX0JTMzIgc1ZvbHVtZTsgICAgICAgICAgIC8qKjwgVm9sdW1lIGxpbmVhciBzZXR0aW5nIGluIHRoZSAwLi4xMDAgcmFuZ2UsIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lIGxvZ2FyaXRobWljIHNldHRpbmcgZm9yIHRoaXMgcG9ydC4gIFRoZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igdm9sdW1lIGFyZSBpbiBtQiAobWlsbGliZWxzID0gMS8xMDAgZEIpIHJlbGF0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSBnYWluIG9mIDEgKGUuZy4gdGhlIG91dHB1dCBpcyB0aGUgc2FtZSBhcyB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgbGV2ZWwpLiAgVmFsdWVzIGFyZSBpbiBtQiBmcm9tIG5NYXggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heGltdW0gdm9sdW1lKSB0byBuTWluIG1CICh0eXBpY2FsbHkgbmVnYXRpdmUpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSB2b2x1bWUgaXMgInZvbHRhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhICJwb3dlciIsIGl0IHRha2VzIGEgc2V0dGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02MDAgbUIgdG8gZGVjcmVhc2UgdGhlIHZvbHVtZSBieSAxLzIuICBJZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29tcG9uZW50IGNhbm5vdCBhY2N1cmF0ZWx5IHNldCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHNldHRpbmcsIHRoZSBjdXJyZW50IGFjdHVhbCB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJldHVybmVkLiAqLworfSBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEU7CisKKworLyoqIEF1ZGlvIFZvbHVtZSBhZGp1c3RtZW50IGZvciBhIGNoYW5uZWwgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3Mgdm9sdW1lLiAgU2VsZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUuICovCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgT01YX0FMTCB0byBhcHBseSB2b2x1bWUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGwgY2hhbm5lbHMgKi8KKyAgICBPTVhfQk9PTCBiTGluZWFyOyAgICAgICAgICAgLyoqPCBJcyB0aGUgdm9sdW1lIHRvIGJlIHNldCBpbiBsaW5lYXIgKDAuMTAwKSBvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dhcml0aG1pYyBzY2FsZSAobUIpICovCisgICAgT01YX0JTMzIgc1ZvbHVtZTsgICAgICAgICAgIC8qKjwgVm9sdW1lIGxpbmVhciBzZXR0aW5nIGluIHRoZSAwLi4xMDAgcmFuZ2UsIE9SCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lIGxvZ2FyaXRobWljIHNldHRpbmcgZm9yIHRoaXMgcG9ydC4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZXMgZm9yIHZvbHVtZSBhcmUgaW4gbUIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbGxpYmVscyA9IDEvMTAwIGRCKSByZWxhdGl2ZSB0byBhIGdhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGxldmVsKS4gIFZhbHVlcyBhcmUgaW4gbUIgZnJvbSBuTWF4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhpbXVtIHZvbHVtZSkgdG8gbk1pbiBtQiAodHlwaWNhbGx5IG5lZ2F0aXZlKS4gIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmNlIHRoZSB2b2x1bWUgaXMgInZvbHRhZ2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vdCBhICJwb3dlciIsIGl0IHRha2VzIGEgc2V0dGluZyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02MDAgbUIgdG8gZGVjcmVhc2UgdGhlIHZvbHVtZSBieSAxLzIuICBJZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgY29tcG9uZW50IGNhbm5vdCBhY2N1cmF0ZWx5IHNldCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHRvIHRoZSByZXF1ZXN0ZWQgdmFsdWUsIGl0IG11c3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgdGhlIHZvbHVtZSB0byB0aGUgY2xvc2VzdCB2YWx1ZSBCRUxPVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0ZWQgdmFsdWUuICBXaGVuIGdldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lIHNldHRpbmcsIHRoZSBjdXJyZW50IGFjdHVhbCB2b2x1bWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJldHVybmVkLiAqLworICAgIE9NWF9CT09MIGJJc01JREk7ICAgICAgICAgICAvKio8IFRSVUUgaWYgbkNoYW5uZWwgcmVmZXJzIHRvIGEgTUlESSBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG90aGVyd2lzZSAqLworfSBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFOworCisKKy8qKiBBdWRpbyBiYWxhbmNlIHNldHRpbmcgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3MgYmFsYW5jZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZS4gKi8KKyAgICBPTVhfUzMyIG5CYWxhbmNlOyAgICAgICAgICAgLyoqPCBiYWxhbmNlIHNldHRpbmcgZm9yIHRoaXMgcG9ydCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwMCB0byAxMDAsIHdoZXJlIC0xMDAgaW5kaWNhdGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGxlZnQsIGFuZCBubyByaWdodCAqLworfSBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFOworCisKKy8qKiBBdWRpbyBQb3J0IG11dGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTVVURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3MgbXV0ZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0ZS4gKi8KKyAgICBPTVhfQk9PTCBiTXV0ZTsgICAgICAgICAgICAgLyoqPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgcG9ydCAqLworfSBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFOworCisKKy8qKiBBdWRpbyBDaGFubmVsIG11dGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsOyAgICAgICAgICAgLyoqPCBjaGFubmVsIHRvIHNlbGVjdCBmcm9tIDAgdG8gTi0xLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZyBPTVhfQUxMIHRvIGFwcGx5IG11dGUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbGwgY2hhbm5lbHMgKi8KKyAgICBPTVhfQk9PTCBiTXV0ZTsgICAgICAgICAgICAgLyoqPCBNdXRlIHNldHRpbmcgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgIE9NWF9CT09MIGJJc01JREk7ICAgICAgICAgICAvKio8IFRSVUUgaWYgbkNoYW5uZWwgcmVmZXJzIHRvIGEgTUlESSBjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFIG90aGVyd2lzZSAqLyAKK30gT01YX0FVRElPX0NPTkZJR19DSEFOTkVMTVVURVRZUEU7CisKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgbG91ZG5lc3MgY29udHJvbCwgd2hpY2ggYm9vc3RzIGJhc3MgYW5kIHRvIGEgCisgKiAgc21hbGxlciBleHRlbnQgaGlnaCBlbmQgZnJlcXVlbmNpZXMgdG8gY29tcGVuc2F0ZSBmb3IgaGVhcmluZworICogIGFiaWxpdHkgYXQgdGhlIGV4dHJlbWUgZW5kcyBvZiB0aGUgYXVkaW8gc3BlY3RydW0KKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTE9VRE5FU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiTG91ZG5lc3M7ICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBsb3VkbmVzcyAqLworfSBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgYmFzcywgd2hpY2ggY29udHJvbHMgbG93IGZyZXF1ZW5jaWVzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0JBU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBiYXNzIGNvbnRyb2wgKi8KKyAgICBPTVhfUzMyIG5CYXNzOyAgICAgICAgICAgICAvKio8IGJhc3Mgc2V0dGluZyBmb3IgdGhlIHBvcnQsIGFzIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgbWVhbnMgbm8gY2hhbmdlIGluIGJhc3MgbGV2ZWwpKi8KK30gT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgdHJlYmxlLCB3aGljaCBjb250cm9scyBoaWdoIGZyZXF1ZW5jaWVzIHRvbmVzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIHRyZWJsZSBjb250cm9sICovCisgICAgT01YX1MzMiAgblRyZWJsZTsgICAgICAgICAgLyoqPCB0cmVibGUgc2V0dGluZyBmb3IgdGhlIHBvcnQsIGFzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAtMTAwIHRvIDEwMCAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMCBtZWFucyBubyBjaGFuZ2UgaW4gdHJlYmxlIGxldmVsKSAqLworfSBPTVhfQVVESU9fQ09ORklHX1RSRUJMRVRZUEU7CisKKworLyoqIEFuIGVxdWFsaXplciBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgdHdvIHJlYXNvbnM6IHRvIGNvbXBlbnNhdGUgZm9yIGFuIAorICogIHN1Yi1vcHRpbWFsIGZyZXF1ZW5jeSByZXNwb25zZSBvZiBhIHN5c3RlbSB0byBtYWtlIGl0IHNvdW5kIG1vcmUgbmF0dXJhbCAKKyAqICBvciB0byBjcmVhdGUgaW50ZW50aW9uYWxseSBzb21lIHVubmF0dXJhbCBjb2xvcmluZyB0byB0aGUgc291bmQgdG8gY3JlYXRlCisgKiAgYW4gZWZmZWN0LgorICogIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBlcXVhbGl6ZXIgKi8KKyAgICBPTVhfQlUzMiBzQmFuZEluZGV4OyAgICAgICAvKio8IEJhbmQgbnVtYmVyIHRvIGJlIHNldC4gIFVwcGVyIExpbWl0IGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTi0xLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgYmFuZHMsIGxvd2VyIGxpbWl0IGlzIDAgKi8KKyAgICBPTVhfQlUzMiBzQ2VudGVyRnJlcTsgICAgICAvKio8IENlbnRlciBmcmVxdWVjaWVzIGluIEh6LiAgVGhpcyBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkIG9ubHkgZWxlbWVudCBhbmQgaXMgdXNlZCB0byBkZXRlcm1pbmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbG93ZXIsIGNlbnRlciBhbmQgdXBwZXIgZnJlcXVlbmN5IG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBiYW5kLiAgKi8KKyAgICBPTVhfQlMzMiBzQmFuZExldmVsOyAgICAgICAvKio8IGJhbmQgbGV2ZWwgaW4gbWlsbGliZWxzICovCit9IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRTsKKworCisvKiogU3RlcmVvIHdpZGVuaW5nIG1vZGUgdHlwZSAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFIHsKKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdIZWFkcGhvbmVzLCAgICAvKio8IFN0ZXJlbyB3aWRlbmluZyBmb3IgbG91ZHNwZWFrZXJzICovCisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nTG91ZHNwZWFrZXJzLCAgLyoqPCBTdGVyZW8gd2lkZW5pbmcgZm9yIGNsb3NlbHkgc3BhY2VkIGxvdWRzcGVha2VycyAqLworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRTsKKworCisvKiogQ29udHJvbCBmb3Igc3RlcmVvIHdpZGVuaW5nLCB3aGljaCBpcyBhIHNwZWNpYWwgMi1jaGFubmVsCisgKiAgY2FzZSBvZiB0aGUgYXVkaW8gdmlydHVhbGl6ZXIgZWZmZWN0LiBGb3IgZXhhbXBsZSwgZm9yIDUuMS1jaGFubmVsIAorICogIG91dHB1dCwgaXQgdHJhbnNsYXRlcyB0byB2aXJ0dWFsIHN1cnJvdW5kIHNvdW5kLiAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfU1RFUkVPV0lERU5JTkdUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBzdGVyZW8gd2lkZW5pbmcgY29udHJvbCAqLworICAgIE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEUgZVdpZGVuaW5nVHlwZTsgLyoqPCBTdGVyZW8gd2lkZW5pbmcgYWxnb3JpdGhtIHR5cGUgKi8KKyAgICBPTVhfVTMyICBuU3RlcmVvV2lkZW5pbmc7ICAvKio8IHN0ZXJlbyB3aWRlbmluZyBzZXR0aW5nIGZvciB0aGUgcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGEgY29udGludW91cyB2YWx1ZSBmcm9tIDAgdG8gMTAwICAqLworfSBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRTsKKworCisvKiogVGhlIGNob3J1cyBlZmZlY3QgKG9yIGBgY2hvcmFsaXplcicnKSBpcyBhbnkgc2lnbmFsIHByb2Nlc3NvciB3aGljaCBtYWtlcworICogIG9uZSBzb3VuZCBzb3VyY2UgKHN1Y2ggYXMgYSB2b2ljZSkgc291bmQgbGlrZSBtYW55IHN1Y2ggc291cmNlcyBzaW5naW5nIAorICogIChvciBwbGF5aW5nKSBpbiB1bmlzb24uIFNpbmNlIHBlcmZvcm1hbmNlIGluIHVuaXNvbiBpcyBuZXZlciBleGFjdCwgY2hvcnVzIAorICogIGVmZmVjdHMgc2ltdWxhdGUgdGhpcyBieSBtYWtpbmcgaW5kZXBlbmRlbnRseSBtb2RpZmllZCBjb3BpZXMgb2YgdGhlIGlucHV0IAorICogIHNpZ25hbC4gTW9kaWZpY2F0aW9ucyBtYXkgaW5jbHVkZSAoMSkgZGVsYXksICgyKSBmcmVxdWVuY3kgc2hpZnQsIGFuZCAKKyAqICAoMykgYW1wbGl0dWRlIG1vZHVsYXRpb24uCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgY2hvcnVzICovCisgICAgT01YX0JVMzIgc0RlbGF5OyAgICAgICAgICAgLyoqPCBhdmVyYWdlIGRlbGF5IGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CVTMyIHNNb2R1bGF0aW9uUmF0ZTsgIC8qKjwgcmF0ZSBvZiBtb2R1bGF0aW9uIGluIG1pbGxpaGVydHogKi8KKyAgICBPTVhfVTMyIG5Nb2R1bGF0aW9uRGVwdGg7ICAvKio8IGRlcHRoIG9mIG1vZHVsYXRpb24gYXMgYSBwZXJjZW50YWdlIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgKGkuZS4gMCB0byAxMDApICovCisgICAgT01YX0JVMzIgbkZlZWRiYWNrOyAgICAgICAgLyoqPCBGZWVkYmFjayBmcm9tIGNob3J1cyBvdXRwdXQgdG8gaW5wdXQgaW4gcGVyY2VudGFnZSAqLworfSBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEU7CisKKworLyoqIFJldmVyYmVyYXRpb24gaXMgcGFydCBvZiB0aGUgcmVmbGVjdGVkIHNvdW5kIHRoYXQgZm9sbG93cyB0aGUgZWFybHkgCisgKiAgcmVmbGVjdGlvbnMuIEluIGEgdHlwaWNhbCByb29tLCB0aGlzIGNvbnNpc3RzIG9mIGEgZGVuc2Ugc3VjY2Vzc2lvbiBvZiAKKyAqICBlY2hvZXMgd2hvc2UgZW5lcmd5IGRlY2F5cyBleHBvbmVudGlhbGx5LiBUaGUgcmV2ZXJiZXJhdGlvbiBlZmZlY3Qgc3RydWN0dXJlIAorICogIGFzIGRlZmluZWQgaGVyZSBpbmNsdWRlcyBib3RoIChlYXJseSkgcmVmbGVjdGlvbnMgYXMgd2VsbCBhcyAobGF0ZSkgcmV2ZXJiZXJhdGlvbnMuIAorICogQGluZ3JvdXAgZWZmZWN0cworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1JFVkVSQkVSQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciByZXZlcmJlcmF0aW9uIGNvbnRyb2wgKi8KKyAgICBPTVhfQlMzMiBzUm9vbUxldmVsOyAgICAgICAgICAvKio8IEludGVuc2l0eSBsZXZlbCBmb3IgdGhlIHdob2xlIHJvb20gZWZmZWN0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gYm90aCBlYXJseSByZWZsZWN0aW9ucyBhbmQgbGF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldmVyYmVyYXRpb24pIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CUzMyIHNSb29tSGlnaEZyZXFMZXZlbDsgIC8qKjwgQXR0ZW51YXRpb24gYXQgaGlnaCBmcmVxdWVuY2llcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGludGVuc2l0eSBhdCBsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CUzMyIHNSZWZsZWN0aW9uc0xldmVsOyAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIG9mIGVhcmx5IHJlZmxlY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsYXRpdmUgdG8gcm9vbSB2YWx1ZSksIGluIG1pbGxpYmVscyAqLworICAgIE9NWF9CVTMyIHNSZWZsZWN0aW9uc0RlbGF5OyAgIC8qKjwgRGVsYXkgdGltZSBvZiB0aGUgZmlyc3QgcmVmbGVjdGlvbiByZWxhdGl2ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBkaXJlY3QgcGF0aCwgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JTMzIgc1JldmVyYkxldmVsOyAgICAgICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgb2YgbGF0ZSByZXZlcmJlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZSB0byByb29tIGxldmVsLCBpbiBtaWxsaWJlbHMgKi8KKyAgICBPTVhfQlUzMiBzUmV2ZXJiRGVsYXk7ICAgICAgICAvKio8IFRpbWUgZGVsYXkgZnJvbSB0aGUgZmlyc3QgZWFybHkgcmVmbGVjdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24sIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CVTMyIHNEZWNheVRpbWU7ICAgICAgICAgIC8qKjwgTGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5IHRpbWUgYXQgbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcywgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JVMzIgbkRlY2F5SGlnaEZyZXFSYXRpbzsgLyoqPCBSYXRpbyBvZiBoaWdoIGZyZXF1ZW5jeSBkZWNheSB0aW1lIHJlbGF0aXZlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbG93IGZyZXF1ZW5jeSBkZWNheSB0aW1lIGluIHBlcmNlbnQgICovCisgICAgT01YX1UzMiBuRGVuc2l0eTsgICAgICAgICAgICAgLyoqPCBNb2RhbCBkZW5zaXR5IGluIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gZGVjYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwZXJjZW50IChpLmUuIDAgLSAxMDApICovCisgICAgT01YX1UzMiBuRGlmZnVzaW9uOyAgICAgICAgICAgLyoqPCBFY2hvIGRlbnNpdHkgaW4gdGhlIGxhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBlcmNlbnQgKGkuZS4gMCAtIDEwMCkgKi8KKyAgICBPTVhfQlUzMiBzUmVmZXJlbmNlSGlnaEZyZXE7ICAvKio8IFJlZmVyZW5jZSBoaWdoIGZyZXF1ZW5jeSBpbiBIZXJ0ei4gVGhpcyBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBmcmVxdWVuY3kgdXNlZCBhcyB0aGUgcmVmZXJlbmNlIGZvciBhbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaGlnaC1mcmVxdWVuY3kgc2V0dGluZ3MgYWJvdmUgKi8KKworfSBPTVhfQVVESU9fQ09ORklHX1JFVkVSQkVSQVRJT05UWVBFOworCisKKy8qKiBQb3NzaWJsZSBzZXR0aW5ncyBmb3IgdGhlIEVjaG8gQ2FuY2VsYXRpb24gc3RydWN0dXJlIHRvIHVzZSAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19FQ0hPQ0FOVFlQRSB7CisgICBPTVhfQVVESU9fRWNob0Nhbk9mZiA9IDAsICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gaXMgZGlzYWJsZWQgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuTm9ybWFsLCAgICAgLyoqPCBFY2hvIENhbmNlbGxhdGlvbiBub3JtYWwgb3BlcmF0aW9uIC0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyBmcm9tIHBsYXN0aWNzIGFuZCBmYWNlICovCisgICBPTVhfQVVESU9fRWNob0NhbkhGcmVlLCAgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gb3B0aW1pemVkIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kcyBGcmVlIG9wZXJhdGlvbiAqLworICAgT01YX0FVRElPX0VjaG9DYW5DYXJLaXQsICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gb3B0aW1pemVkIGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXIgS2l0IChsb25nZXIgZWNobykgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0FVRElPX0VjaG9DYW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgT01YX0FVRElPX0VjaG9DYW5NYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19FQ0hPQ0FOVFlQRTsKKworCisvKiogRW5hYmxlIC8gRGlzYWJsZSBmb3IgZWNobyBjYW5jZWxhdGlvbiwgd2hpY2ggcmVtb3ZlcyB1bmRlc2lyZWQgZWNobydzCisgKiAgZnJvbSB0aGUgYXVkaW8KKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0FVRElPX0VDSE9DQU5UWVBFIGVFY2hvQ2FuY2VsYXRpb247IC8qKjwgRWNobyBjYW5jZWxhdGlvbiBzZXR0aW5ncyAqLworfSBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEU7CisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIG5vaXNlIHJlZHVjdGlvbiwgd2hpY2ggdW5kZXNpcmVkIG5vaXNlIGZyb20KKyAqIHRoZSBhdWRpbworICogQGluZ3JvdXAgZWZmZWN0cworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19OT0lTRVJFRFVDVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJOb2lzZVJlZHVjdGlvbjsgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIG5vaXNlIHJlZHVjdGlvbiAqLworfSBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRTsKKworLyoqIEB9ICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViNzg0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfQ29tcG9uZW50LmgKQEAgLTAsMCArMSw1OTYgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29tcG9uZW50LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0NvbXBvbmVudCBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKKyAqICB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhIGNvbXBvbmVudC4gIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8KKyAqICBiZSB1c2VkIGJ5IGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LgorICovCisKKyNpZm5kZWYgT01YX0NvbXBvbmVudF9oCisjZGVmaW5lIE9NWF9Db21wb25lbnRfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9JbWFnZS5oPgorI2luY2x1ZGUgPE9NWF9PdGhlci5oPgorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7IAorICAgIE9NWF9Qb3J0RG9tYWluQXVkaW8sIAorICAgIE9NWF9Qb3J0RG9tYWluVmlkZW8sIAorICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsIAorICAgIE9NWF9Qb3J0RG9tYWluT3RoZXIsCisgICAgT01YX1BvcnREb21haW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1BvcnREb21haW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Qb3J0RG9tYWluTWF4ID0gMHg3ZmZmZmZmCit9IE9NWF9QT1JURE9NQUlOVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IG51bWJlciB0aGUgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElSVFlQRSBlRGlyOyAgICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgb2YgdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRBY3R1YWw7ICAgIC8qKjwgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgb24gdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRNaW47ICAgICAgIC8qKjwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhpcyBwb3J0IHJlcXVpcmVzICovCisgICAgT01YX1UzMiBuQnVmZmVyU2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSwgaW4gYnl0ZXMsIGZvciBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAgICAgICAgICAvKio8IFBvcnRzIGRlZmF1bHQgdG8gZW5hYmxlZCBhbmQgYXJlIGVuYWJsZWQvZGlzYWJsZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUvT01YX0NvbW1hbmRQb3J0RGlzYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGVkIGEgcG9ydCBpcyB1bnBvcHVsYXRlZC4gQSBkaXNhYmxlZCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBvcHVsYXRlZCB3aXRoIGJ1ZmZlcnMgb24gYSB0cmFuc2l0aW9uIHRvIElETEUuICovCisgICAgT01YX0JPT0wgYlBvcHVsYXRlZDsgICAgICAgICAgIC8qKjwgUG9ydCBpcyBwb3B1bGF0ZWQgd2l0aCBhbGwgb2YgaXRzIGJ1ZmZlcnMgYXMgaW5kaWNhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZmZlckNvdW50QWN0dWFsLiBBIGRpc2FibGVkIHBvcnQgaXMgYWx3YXlzIHVucG9wdWxhdGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBlbmFibGVkIHBvcnQgaXMgcG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBPTVhfU3RhdGVJZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVucG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBsb2FkZWQuICovCisgICAgT01YX1BPUlRET01BSU5UWVBFIGVEb21haW47ICAgIC8qKjwgRG9tYWluIG9mIHRoZSBwb3J0LiBEZXRlcm1pbmVzIHRoZSBjb250ZW50cyBvZiBtZXRhZGF0YSBiZWxvdy4gKi8KKyAgICB1bmlvbiB7CisgICAgICAgIE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgYXVkaW87CisgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgdmlkZW87CisgICAgICAgIE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgaW1hZ2U7CisgICAgICAgIE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgb3RoZXI7CisgICAgfSBmb3JtYXQ7CisgICAgT01YX0JPT0wgYkJ1ZmZlcnNDb250aWd1b3VzOworICAgIE9NWF9VMzIgbkJ1ZmZlckFsaWdubWVudDsKK30gT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5VMzI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBVMzIgdmFsdWUgKi8KK30gT01YX1BBUkFNX1UzMlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgZW51bSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgeworICAgIE9NWF9TdXNwZW5zaW9uRGlzYWJsZWQsIC8qKjwgTm8gc3VzcGVuc2lvbjsgdjEuMCBiZWhhdmlvciAqLworICAgIE9NWF9TdXNwZW5zaW9uRW5hYmxlZCwgIC8qKjwgU3VzcGVuc2lvbiBhbGxvd2VkICovICAgCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5TWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAKKyAgICBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgZVBvbGljeTsKK30gT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05UWVBFIHsKKyAgICBPTVhfTm90U3VzcGVuZGVkLCAvKio8IGNvbXBvbmVudCBpcyBub3Qgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbmRlZCwgICAgLyoqPCBjb21wb25lbnQgaXMgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbnNpb25LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfU1VTUEVOU0lPTlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIAorICAgIE9NWF9TVVNQRU5TSU9OVFlQRSBlVHlwZTsgICAgICAgICAgICAgCit9IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSA7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAKK30gT01YX0NPTkZJR19CT09MRUFOVFlQRTsKKworLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnQgdXJpIHRvIHVzZS4gKi8KKy8qKiBAaW5ncm91cCBjcCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMsIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIFVSSSBuYW1lICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1U4IGNvbnRlbnRVUklbMV07ICAgICAgICAgICAgICAgLyoqPCBUaGUgVVJJIG5hbWUgKi8KK30gT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFOworCisvKiBQYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgcGlwZSB0byB1c2UuICovCisvKiogQGluZ3JvdXAgY3AgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX0hBTkRMRVRZUEUgaFBpcGU7ICAgICAgIC8qKjwgVGhlIHBpcGUgaGFuZGxlKi8KK30gT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9CT09MIGJSZXNvdXJjZUNvbmNlYWxtZW50Rm9yYmlkZGVuOyAvKio8IGRpc2FsbG93IHRoZSB1c2Ugb2YgcmVzb3VyY2UgY29uY2VhbG1lbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKGxpa2UgZGVncmFkaW5nIGFsZ29yaXRobSBxdWFsaXR5IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciByZXNvdXJjZSBjb25zdW1wdGlvbiBvciBmdW5jdGlvbmFsIGJ5cGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgY29tcG9uZW50IGFzIGEgcmVzb2x1dGlvbiB0byByZXNvdXJjZSBjb25mbGljdHMuICovCit9IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRTsKKworCisvKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSB7CisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVua25vd24gPSAwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRBU0NJSSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QmluYXJ5LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRDb2RlUGFnZTEyNTIsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjgsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEphdmFDb25mb3JtYW50VVRGOCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGNywKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SW1hcFVURjcsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2TEUsIAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkJFLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjEyMzQ1LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRIWkdCMjMxMiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IyMzEyLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjE4MDMwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQkssCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEJpZzUsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk0LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTYsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk3LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5OCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTksCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEzLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxNSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U2hpZnRKSVMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPMjAyMkpQMSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPRVVDSlAsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFNNUzdCaXQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VHlwZU1heD0gMHg3RkZGRkZGRgorfSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIGVudW0gT01YX01FVEFEQVRBU0NPUEVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2NvcGVBbGxMZXZlbHMsCisgICAgT01YX01ldGFkYXRhU2NvcGVUb3BMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZVBvcnRMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZU5vZGVMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTY29wZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX01ldGFkYXRhU2NvcGVUeXBlTWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfTUVUQURBVEFTQ09QRVRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2VhcmNoVmFsdWVTaXplQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hJdGVtQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hOZXh0SXRlbUJ5S2V5LAorICAgIE9NWF9NZXRhZGF0YVNlYXJjaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NZXRhZGF0YVNlYXJjaFR5cGVNYXggPSAweDdmZmZmZmZmCit9IE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFOworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRQoreworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9NRVRBREFUQVNDT1BFVFlQRSBlU2NvcGVNb2RlOworICAgIE9NWF9VMzIgblNjb3BlU3BlY2lmaWVyOworICAgIE9NWF9VMzIgbk1ldGFkYXRhSXRlbUNvdW50OworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKKyAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKKyAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1JbmRleDsgIAorICAgIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFIGVTZWFyY2hNb2RlOworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VOCBuS2V5U2l6ZVVzZWQ7CisgICAgT01YX1U4IG5LZXlbMTI4XTsKKyAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlVmFsdWVDaGFyc2V0OworICAgIE9NWF9TVFJJTkcgc0xhbmd1YWdlQ291bnRyeTsKKyAgICBPTVhfVTMyIG5WYWx1ZU1heFNpemU7CisgICAgT01YX1UzMiBuVmFsdWVTaXplVXNlZDsKKyAgICBPTVhfVTggblZhbHVlWzFdOworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEU7CisKKy8qIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTnVtTm9kZXM7Cit9IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTm9kZUluZGV4OyAKKyAgICBPTVhfVTMyIG5Ob2RlSUQ7IAorICAgIE9NWF9TVFJJTkcgY05vZGVOYW1lOworICAgIE9NWF9CT09MIGJJc0xlYWZUeXBlOworfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAKK3sgCisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsJLyogaWYgdHJ1ZSB0aGVuIHRoaXMgc3RydWN0dXJlIHJlZmVycyB0byBhbGwga2V5cyBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdGhyZWUga2V5IGZpZWxkcyBiZWxvdyBhcmUgaWdub3JlZCAqLworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VMzIgbktleVNpemVVc2VkOyAKKyAgICBPTVhfVTggICBuS2V5IFsxMjhdOyAKKyAgICBPTVhfVTMyIG5MYW5ndWFnZUNvdW50cnlTaXplVXNlZDsKKyAgICBPTVhfVTggbkxhbmd1YWdlQ291bnRyeVsxMjhdOworICAgIE9NWF9CT09MIGJFbmFibGVkOwkvKiBpZiB0cnVlIHRoZW4ga2V5IGlzIHBhcnQgb2YgZmlsdGVyIChlLmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0YWluZWQgZm9yIHF1ZXJ5IGxhdGVyKS4gSWYgZmFsc2UgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5IGlzIG5vdCBwYXJ0IG9mIGZpbHRlciAqLworfSBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFOyAKKworLyoqIFRoZSBPTVhfSEFORExFVFlQRSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29tcG9uZW50IGhhbmRsZS4gIFRoZSBjb21wb25lbnQgCisgKiAgaGFuZGxlIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY29tcG9uZW50J3MgcHVibGljIG1ldGhvZHMgYW5kIGFsc28KKyAqICBjb250YWlucyBwb2ludGVycyB0byB0aGUgY29tcG9uZW50J3MgcHJpdmF0ZSBkYXRhIGFyZWEuICBUaGUgY29tcG9uZW50CisgKiAgaGFuZGxlIGlzIGluaXRpYWxpemVkIGJ5IHRoZSBPTVggY29yZSAod2l0aCBoZWxwIGZyb20gdGhlIGNvbXBvbmVudCkKKyAqICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgY29tcG9uZW50LiAgQWZ0ZXIgdGhlIGNvbXBvbmVudCBpcworICogIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gc2FmZWx5IGFjY2VzcyBhbnkgb2YgdGhlCisgKiAgY29tcG9uZW50J3MgcHVibGljIGZ1bmN0aW9ucyAoYWx0aG91Z2ggc29tZSBtYXkgcmV0dXJuIGFuIGVycm9yIGJlY2F1c2UKKyAqICB0aGUgc3RhdGUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGFjY2VzcykuCisgKiAKKyAqICBAaW5ncm91cCBjb21wCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRUWVBFCit7CisgICAgLyoqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBieXRlcy4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQorICAgICAgICBvZiB0aGUgYWxsb2NhdG9yIG9mIHRoaXMgc3RydWN0dXJlIHRvIGZpbGwgaW4gdGhpcyB2YWx1ZS4gIFNpbmNlCisgICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLCB0aGlzCisgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGlzIHZhbHVlLiAqLworICAgIE9NWF9VMzIgblNpemU7CisKKyAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZSAKKyAgICAgICAgaXMgYnVpbHQgYWdhaW5zdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY3JlYXRvciBvZiB0aGlzIAorICAgICAgICBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFuZCBldmVyeSB1c2VyIG9mIHRoaXMgc3RydWN0dXJlIAorICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZiAKKyAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgZm91bmQgaGVyZWluLiAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKworICAgIC8qKiBwQ29tcG9uZW50UHJpdmF0ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBwcml2YXRlIGRhdGEgYXJlYS4gIAorICAgICAgICBUaGlzIG1lbWJlciBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgCisgICAgICAgIGNvbXBvbmVudCBpcyBmaXJzdCBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhY2Nlc3MgdGhpcyAKKyAgICAgICAgZGF0YSBhcmVhLiAqLworICAgIE9NWF9QVFIgcENvbXBvbmVudFByaXZhdGU7CisKKyAgICAvKiogcEFwcGxpY2F0aW9uUHJpdmF0ZSBpcyBhIHBvaW50ZXIgdGhhdCBpcyBhIHBhcmFtZXRlciB0byB0aGUgCisgICAgICAgIE9NWF9HZXRIYW5kbGUgbWV0aG9kLCBhbmQgY29udGFpbnMgYW4gYXBwbGljYXRpb24gcHJpdmF0ZSB2YWx1ZSAKKyAgICAgICAgcHJvdmlkZWQgYnkgdGhlIElMIGNsaWVudC4gIFRoaXMgYXBwbGljYXRpb24gcHJpdmF0ZSBkYXRhIGlzIAorICAgICAgICByZXR1cm5lZCB0byB0aGUgSUwgQ2xpZW50IGJ5IE9NWCBpbiBhbGwgY2FsbGJhY2tzICovCisgICAgT01YX1BUUiBwQXBwbGljYXRpb25Qcml2YXRlOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29tcG9uZW50VmVyc2lvbiBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldENvbXBvbmVudFZlcnNpb24pKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX09VVCBPTVhfU1RSSU5HIHBDb21wb25lbnROYW1lLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBDb21wb25lbnRWZXJzaW9uLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBTcGVjVmVyc2lvbiwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1VVSURUWVBFKiBwQ29tcG9uZW50VVVJRCk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX1NlbmRDb21tYW5kIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2VuZENvbW1hbmQgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZW5kQ29tbWFuZCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DT01NQU5EVFlQRSBDbWQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBhcmFtMSwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ21kRGF0YSk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFBhcmFtZXRlciBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldFBhcmFtZXRlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5QYXJhbUluZGV4LCAgCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRQYXJhbWV0ZXIgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRQYXJhbWV0ZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfU2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqU2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0RXh0ZW5zaW9uSW5kZXggbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRFeHRlbnNpb25JbmRleCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY1BhcmFtZXRlck5hbWUsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIHBJbmRleFR5cGUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0U3RhdGUgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRTdGF0ZSkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHBTdGF0ZSk7CisKKyAgICAKKyAgICAvKiogVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbm90aGVyIE9NWAorICAgICAgICBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBwb3NzaWJsZSBhbmQgdG8gc2V0dXAgdGhlCisgICAgICAgIHR1bm5lbGluZy4gIFRoZSByZXR1cm4gY29kZXMgZm9yIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBkZXRlcm1pbmUgaWYgdHVubmVsaW5nIGlzIG5vdCBwb3NzaWJsZSwgb3IgaWYgdHVubmVsaW5nIGlzIG5vdAorICAgICAgICBzdXBwb3J0ZWQuICAKKyAgICAgICAgCisgICAgICAgIEJhc2UgcHJvZmlsZSBjb21wb25lbnRzIChpLmUuIG5vbi1pbnRlcm9wKSBkbyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgIG1ldGhvZCBhbmQgc2hvdWxkIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCAKKworICAgICAgICBUaGUgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCBNVVNUIHN1cHBvcnQgdHVubmVsaW5nIHRvIGFub3RoZXIgCisgICAgICAgIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgd2l0aCBhIGNvbXBhdGlibGUgcG9ydCBwYXJhbWV0ZXJzLiAgCisgICAgICAgIEEgY29tcG9uZW50IG1heSBhbHNvIHN1cHBvcnQgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgCisgICAgICAgIElmIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIHRoZSBuZWdvdGlhdGlvbiBvZiAKKyAgICAgICAgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBkb25lIG91dHNpZGUgb2YgT01YIGluIGEgdmVuZG9yIAorICAgICAgICBzcGVjaWZpYyB3YXkuIEl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0aGUgcHJvcGVyIHJlc3VsdCBiZSAKKyAgICAgICAgcmV0dXJuZWQgYW5kIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgc2V0dXAgaXMgZG9uZSBpcyBsZWZ0IAorICAgICAgICB0byB0aGUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLiAgCisgICAgCisgICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIG91dHB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBQb3B1bGF0ZSB0aGUgcFR1bm5lbFNldHVwIHN0cnVjdHVyZSB3aXRoIHRoZSBvdXRwdXQgcG9ydCdzIAorICAgICAgICAgICAgcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIHR1bm5lbC4KKworICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBpbnB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8gCisgICAgICAgICAgICBkZXRlcm1pbmUgaWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlIGZvciB0dW5uZWxpbmcKKyAgICAgICAgMi4gIElmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSwgdGhlIGNvbXBvbmVudCBzaG91bGQgc3RvcmUKKyAgICAgICAgICAgIHRoZSB0dW5uZWwgc3RlcCBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHBvcnQKKyAgICAgICAgMy4gIERldGVybWluZSB3aGljaCBwb3J0IChlaXRoZXIgaW5wdXQgb3Igb3V0cHV0KSBpcyB0aGUgYnVmZmVyCisgICAgICAgICAgICBzdXBwbGllciwgYW5kIGNhbGwgT01YX1NldFBhcmFtZXRlciBvbiB0aGUgb3V0cHV0IHBvcnQgdG8KKyAgICAgICAgICAgIGluZGljYXRlIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAKKyAgICAgICAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgICAgICBAcGFyYW0gW2luXSBoQ29tcAorICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0CisgICAgICAgICAgICBuUG9ydCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRvIGJlIHVzZWQKKyAgICAgICAgICAgIGZvciB0dW5uZWxpbmcuCisgICAgICAgIEBwYXJhbSBbaW5dIGhUdW5uZWxlZENvbXAKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIHR1bm5lbCB3aXRoLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50IAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4gIFdoZW4KKyAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDB4MCB0aGUgY29tcG9uZW50IHNob3VsZCBzZXR1cCB0aGUgcG9ydCBmb3IKKyAgICAgICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0CisgICAgICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIGluZGljYXRlIHRoZSBwb3J0IHRoZSBjb21wb25lbnQgc2hvdWxkCisgICAgICAgICAgICB0dW5uZWwgd2l0aC4KKyAgICAgICAgQHBhcmFtIFtpbl0gcFR1bm5lbFNldHVwCisgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB0dW5uZWwgc2V0dXAgc3RydWN0dXJlLiAgV2hlbiBuUG9ydCBpcyBhbiBvdXRwdXQgcG9ydAorICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBzaG91bGQgcG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZS4gIFdoZW4KKyAgICAgICAgICAgIFdoZW4gblBvcnQgaXMgYW4gaW5wdXQgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZCByZXZpZXcgdGhlIHNldHVwCisgICAgICAgICAgICBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdpdGggdGhlIG91dHB1dCBwb3J0LgorICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICBAaW5ncm91cCB0dW4KKyAgICAqLworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFR1bm5lbFJlcXVlc3QpKAorICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wLAorICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnQsCisgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaFR1bm5lbGVkQ29tcCwKKyAgICAgICAgT01YX0lOICBPTVhfVTMyIG5UdW5uZWxlZFBvcnQsCisgICAgICAgIE9NWF9JTk9VVCAgT01YX1RVTk5FTFNFVFVQVFlQRSogcFR1bm5lbFNldHVwKTsgCisKKyAgICAvKiogcmVmZXIgdG8gT01YX1VzZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVzZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlckhkciwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMsCisgICAgICAgICAgICBPTVhfSU4gT01YX1U4KiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfQWxsb2NhdGVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBBbGxvY2F0ZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpBbGxvY2F0ZUJ1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVyLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblNpemVCeXRlcyk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0ZyZWVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGcmVlQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkZyZWVCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRW1wdHlUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRW1wdHlUaGlzQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkVtcHR5VGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRmlsbFRoaXNCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGaWxsVGhpc0J1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsVGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiBUaGUgU2V0Q2FsbGJhY2tzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBjb3JlIHRvIHNwZWNpZnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHN0cnVjdHVyZSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nCisgICAgICAgIGNhbGwuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIFtpbl0gcENhbGxiYWNrcworICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIAorICAgICAgICAgICAgY2FsbGJhY2sgaW5mb3JtYXRpb24gdG8gdGhlIGNvbXBvbmVudAorICAgICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCAKKyAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgb3IgYSAidGhpcworICAgICAgICAgICAgcG9pbnRlciIgaW4gdGhpcyBhcmVhIHRvIGFsbG93IHRoZSBjYWxsYmFjayAoaW4gdGhlIGFwcGxpY2F0aW9uKQorICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCisgICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKlNldENhbGxiYWNrcykoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsYmFja3MsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhKTsKKworICAgIC8qKiBDb21wb25lbnREZUluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBjb21wb25lbnQKKyAgICAgICAgcHJvdmlkaW5nIGEgbWVhbnMgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdCBjb21wb25lbnQKKyAgICAgICAgaW5pdGlhbGl6YXRpb24uICBOT1RFOiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb21wb25lbnQgaGFuZGxlIGlzCisgICAgICAgIG5vdCB2YWxpZCBmb3IgZnVydGhlciB1c2UuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50RGVJbml0KSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyAgICAvKiogQGluZ3JvdXAgYnVmICovCisgICAgT01YX0VSUk9SVFlQRSAoKlVzZUVHTEltYWdlKSgKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCisgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfSU4gdm9pZCogZWdsSW1hZ2UpOworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFJvbGVFbnVtKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisJCU9NWF9PVVQgT01YX1U4ICpjUm9sZSwKKwkJT01YX0lOIE9NWF9VMzIgbkluZGV4KTsKKworfSBPTVhfQ09NUE9ORU5UVFlQRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db250ZW50UGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlOWU0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvbnRlbnRQaXBlLmgKQEAgLTAsMCArMSwyMTIgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29udGVudFBpcGUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfQ29udGVudFBpcGUgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgdG8gZGVmaW5lCisgKiAgdGhlIHB1YmxpYyBpbnRlcmZhY2UgZm9yIGNvbnRlbnQgcGlwbGVzLiAgVGhpcyBoZWFkZXIgZmlsZSBpcyBpbnRlbmRlZCB0bworICogIGJlIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCisjaWZuZGVmIE9NWF9DT05URU5UUElQRV9ICisjZGVmaW5lIE9NWF9DT05URU5UUElQRV9ICisKKyNpZm5kZWYgS0RfRUFDQ0VTCisvKiBPcGVuS09ERSBlcnJvciBjb2Rlcy4gQ1BSZXN1bHQgdmFsdWVzIG1heSBiZSB6ZXJvIChpbmRpY2F0aW5nIHN1Y2Nlc3MKKyAgIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcykgKi8KKyNkZWZpbmUgS0RfRUFDQ0VTICgxKQorI2RlZmluZSBLRF9FQUREUklOVVNFICgyKQorI2RlZmluZSBLRF9FQUdBSU4gKDUpCisjZGVmaW5lIEtEX0VCQURGICg3KQorI2RlZmluZSBLRF9FQlVTWSAoOCkKKyNkZWZpbmUgS0RfRUNPTk5SRUZVU0VEICg5KQorI2RlZmluZSBLRF9FQ09OTlJFU0VUICgxMCkKKyNkZWZpbmUgS0RfRURFQURMSyAoMTEpCisjZGVmaW5lIEtEX0VERVNUQUREUlJFUSAoMTIpCisjZGVmaW5lIEtEX0VSQU5HRSAoMzUpCisjZGVmaW5lIEtEX0VFWElTVCAoMTMpCisjZGVmaW5lIEtEX0VGQklHICgxNCkKKyNkZWZpbmUgS0RfRUhPU1RVTlJFQUNIICgxNSkKKyNkZWZpbmUgS0RfRUlOVkFMICgxNykKKyNkZWZpbmUgS0RfRUlPICgxOCkKKyNkZWZpbmUgS0RfRUlTQ09OTiAoMjApCisjZGVmaW5lIEtEX0VJU0RJUiAoMjEpCisjZGVmaW5lIEtEX0VNRklMRSAoMjIpCisjZGVmaW5lIEtEX0VOQU1FVE9PTE9ORyAoMjMpCisjZGVmaW5lIEtEX0VOT0VOVCAoMjQpCisjZGVmaW5lIEtEX0VOT01FTSAoMjUpCisjZGVmaW5lIEtEX0VOT1NQQyAoMjYpCisjZGVmaW5lIEtEX0VOT1NZUyAoMjcpCisjZGVmaW5lIEtEX0VOT1RDT05OICgyOCkKKyNkZWZpbmUgS0RfRVBFUk0gKDMzKQorI2RlZmluZSBLRF9FVElNRURPVVQgKDM2KQorI2RlZmluZSBLRF9FSUxTRVEgKDE5KQorI2VuZGlmCisKKy8qKiBNYXAgdHlwZXMgZnJvbSBPTVggc3RhbmRhcmQgdHlwZXMgb25seSBoZXJlIHNvIGludGVyZmFjZSBpcyBhcyBnZW5lcmljIGFzIHBvc3NpYmxlLiAqLwordHlwZWRlZiBPTVhfVTMyICAgIENQcmVzdWx0OwordHlwZWRlZiBjaGFyICogICAgIENQc3RyaW5nOyAgCit0eXBlZGVmIHZvaWQgKiAgICAgQ1BoYW5kbGU7Cit0eXBlZGVmIE9NWF9VMzIgICAgQ1B1aW50OwordHlwZWRlZiBPTVhfUzMyICAgIENQaW50OyAgCit0eXBlZGVmIGNoYXIgICAgICAgQ1BieXRlOyAgCit0eXBlZGVmIE9NWF9CT09MICAgQ1Bib29sOworCisvKiogZW51bWVyYXRpb24gb2Ygb3JpZ2luIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgU2VlayBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9PUklHSU5UWVBFIHsKKyAgICBDUF9PcmlnaW5CZWdpbiwgICAgICAKKyAgICBDUF9PcmlnaW5DdXIsICAgICAgCisgICAgQ1BfT3JpZ2luRW5kLCAgICAgIAorICAgIENQX09yaWdpbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9PcmlnaW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX09yaWdpbk1heCA9IDBYN0ZGRkZGRkYKK30gQ1BfT1JJR0lOVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRhY3QgYWNjZXNzIHR5cGVzIHVzZWQgaW4gdGhlIENQX1BJUEVUWVBFJ3MgT3BlbiBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9BQ0NFU1NUWVBFIHsKKyAgICBDUF9BY2Nlc3NSZWFkLCAgICAgIAorICAgIENQX0FjY2Vzc1dyaXRlLCAgCisgICAgQ1BfQWNjZXNzUmVhZFdyaXRlICwgIAorICAgIENQX0FjY2Vzc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9BY2Nlc3NWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0FjY2Vzc01heCA9IDBYN0ZGRkZGRkYKK30gQ1BfQUNDRVNTVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIHJlc3VsdHMgcmV0dXJuZWQgYnkgdGhlIENQX1BJUEVUWVBFJ3MgQ2hlY2tBdmFpbGFibGVCeXRlcyBmdW5jdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRQoreworICAgIENQX0NoZWNrQnl0ZXNPaywgICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlcmUgYXJlIGF0IGxlYXN0IHRoZSByZXF1ZXN0IG51bWJlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBieXRlcyBhdmFpbGFibGUgKi8KKyAgICBDUF9DaGVja0J5dGVzTm90UmVhZHksICAgICAgICAgICAgICAvKio8IFRoZSBwaXBlIGlzIHN0aWxsIHJldHJpZXZpbmcgYnl0ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByZXNlbnRseSBsYWNrcyBzdWZmaWNpZW50IGJ5dGVzLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGV5IGFyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWZmaWNpZW50IGJ5dGVzIGFyZSBhdmFpbGFibGUuICovCisgICAgQ1BfQ2hlY2tCeXRlc0luc3VmZmljaWVudEJ5dGVzICAsICAgICAvKio8IFRoZSBwaXBlIGhhcyByZXRyaWV2ZWQgYWxsIGJ5dGVzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCB0aG9zZSBhdmFpbGFibGUgYXJlIGxlc3MgdGhhbiB0aG9zZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgKi8KKyAgICBDUF9DaGVja0J5dGVzQXRFbmRPZlN0cmVhbSwgICAgICAgICAvKio8IFRoZSBwaXBlIGhhcyByZWFjaGVkIHRoZSBlbmQgb2Ygc3RyZWFtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vIG1vcmUgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICBDUF9DaGVja0J5dGVzT3V0T2ZCdWZmZXJzLCAgICAgICAgICAvKio8IEFsbCByZWFkL3dyaXRlIGJ1ZmZlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UuICovCisgICAgQ1BfQ2hlY2tCeXRlc0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9DaGVja0J5dGVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBDUF9DaGVja0J5dGVzTWF4ID0gMFg3RkZGRkZGRgorfSBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRTsKKworLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrLiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgZW51bSBDUF9FVkVOVFRZUEV7CisgICAgQ1BfQnl0ZXNBdmFpbGFibGUsICAgICAgCSAgICAvKiogYnl0ZXMgcmVxdWVzdGVkIGluIGEgQ2hlY2tBdmFpbGFibGVCeXRlcyBjYWxsIGFyZSBub3cgYXZhaWxhYmxlKi8KKyAgICBDUF9PdmVyZmxvdywgIAkJICAgICAgICAgICAvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2sqLworICAgIENQX1BpcGVEaXNjb25uZWN0ZWQgICwgIAkJICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCisgICAgQ1BfRXZlbnRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgQ1BfRXZlbnRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0V2ZW50TWF4ID0gMFg3RkZGRkZGRgorfSBDUF9FVkVOVFRZUEU7CisKKy8qKiBjb250ZW50IHBpcGUgZGVmaW5pdGlvbiAKKyAqIEBpbmdyb3VwIGNwCisgKi8KK3R5cGVkZWYgc3RydWN0IENQX1BJUEVUWVBFCit7CisgICAgLyoqIE9wZW4gYSBjb250ZW50IHN0cmVhbSBmb3IgcmVhZGluZyBvciB3cml0aW5nLiAqLyAKKyAgICBDUHJlc3VsdCAoKk9wZW4pKCBDUGhhbmRsZSogaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJLCBDUF9BQ0NFU1NUWVBFIGVBY2Nlc3MgKTsKKworICAgIC8qKiBDbG9zZSBhIGNvbnRlbnQgc3RyZWFtLiAqLyAKKyAgICBDUHJlc3VsdCAoKkNsb3NlKSggQ1BoYW5kbGUgaENvbnRlbnQgKTsKKworICAgIC8qKiBDcmVhdGUgYSBjb250ZW50IHNvdXJjZSBhbmQgb3BlbiBpdCBmb3Igd3JpdGluZy4gKi8gCisgICAgQ1ByZXN1bHQgKCpDcmVhdGUpKCBDUGhhbmRsZSAqaENvbnRlbnQsIENQc3RyaW5nIHN6VVJJICk7CisKKyAgICAvKiogQ2hlY2sgdGhlIHRoYXQgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBhcmUgYXZhaWxhYmxlIGZvciByZWFkaW5nIG9yIHdyaXRpbmcgKGRlcGVuZGluZyBvbiBhY2Nlc3MgdHlwZSkuKi8KKyAgICBDUHJlc3VsdCAoKkNoZWNrQXZhaWxhYmxlQnl0ZXMpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1B1aW50IG5CeXRlc1JlcXVlc3RlZCwgQ1BfQ0hFQ0tCWVRFU1JFU1VMVFRZUEUgKmVSZXN1bHQgKTsKKworICAgIC8qKiBTZWVrIHRvIGNlcnRhaW4gcG9zaXRpb24gaW4gdGhlIGNvbnRlbnQgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBvcmlnaW4uICovCisgICAgQ1ByZXN1bHQgKCpTZXRQb3NpdGlvbikoIENQaGFuZGxlICBoQ29udGVudCwgQ1BpbnQgbk9mZnNldCwgQ1BfT1JJR0lOVFlQRSBlT3JpZ2luKTsKKworICAgIC8qKiBSZXRyaWV2ZSB0aGUgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQuICovCisgICAgQ1ByZXN1bHQgKCpHZXRQb3NpdGlvbikoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgKnBQb3NpdGlvbik7CisKKyAgICAvKiogUmV0cmlldmUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgZnJvbSB0aGUgY29udGVudCBzdHJlYW0gKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCisgICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgcmVhZHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcERhdGEsIENQdWludCBuU2l6ZSk7IAorCisgICAgLyoqIFJldHJpZXZlIGEgYnVmZmVyIGFsbG9jYXRlZCBieSB0aGUgcGlwZSB0aGF0IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIGJ5dGVzLiAKKyAgICAgICBCdWZmZXIgY29udGFpbnMgdGhlIG5leHQgYmxvY2sgb2YgYnl0ZXMsIGFzIHNwZWNpZmllZCBieSBuU2l6ZSwgb2YgdGhlIGNvbnRlbnQuIG5TaXplIGFsc28KKyAgICAgICByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBibG9jayBhY3R1YWxseSByZWFkLiBDb250ZW50IHBvaW50ZXIgYWR2YW5jZXMgdGhlIGJ5IHRoZSByZXR1cm5lZCBzaXplLiAKKyAgICAgICBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIGxhcmdlIHJlYWRzLiBUaGUgY2xpZW50IG11c3QgY2FsbCAKKyAgICAgICBSZWxlYXNlUmVhZEJ1ZmZlciB3aGVuIGRvbmUgd2l0aCBidWZmZXIuIAorCisgICAgICAgSW4gc29tZSBjYXNlcyB0aGUgcmVxdWVzdGVkIGJsb2NrIG1heSBub3QgcmVzaWRlIGluIGNvbnRpZ3VvdXMgbWVtb3J5IHdpdGhpbiB0aGUKKyAgICAgICBwaXBlIGltcGxlbWVudGF0aW9uLiBGb3IgaW5zdGFuY2UgaWYgdGhlIHBpcGUgbGV2ZXJhZ2VzIGEgY2lyY3VsYXIgYnVmZmVyIHRoZW4gdGhlIHJlcXVlc3RlZCAKKyAgICAgICBibG9jayBtYXkgc3RyYWRkbGUgdGhlIGJvdW5kYXJ5IG9mIHRoZSBjaXJjdWxhciBidWZmZXIuIEJ5IGRlZmF1bHQgYSBwaXBlIGltcGxlbWVudGF0aW9uIAorICAgICAgIHBlcmZvcm1zIGEgY29weSBpbiB0aGlzIGNhc2UgdG8gcHJvdmlkZSB0aGUgYmxvY2sgdG8gdGhlIHBpcGUgY2xpZW50IGluIG9uZSBjb250aWd1b3VzIGJ1ZmZlci4KKyAgICAgICBJZiwgaG93ZXZlciwgdGhlIGNsaWVudCBzZXRzIGJGb3JiaWRDb3B5LCB0aGVuIHRoZSBwaXBlIHJldHVybnMgb25seSB0aG9zZSBieXRlcyBwcmVjZWRpbmcgdGhlIG1lbW9yeSAKKyAgICAgICBib3VuZGFyeS4gSGVyZSB0aGUgY2xpZW50IG1heSByZXRyaWV2ZSB0aGUgZGF0YSBpbiBzZWdtZW50cyBvdmVyIHN1Y2Nlc3NpdmUgY2FsbHMuICovCisgICAgQ1ByZXN1bHQgKCpSZWFkQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgKm5TaXplLCBDUGJvb2wgYkZvcmJpZENvcHkpOworCisgICAgLyoqIFJlbGVhc2UgYSBidWZmZXIgb2J0YWluZWQgYnkgUmVhZEJ1ZmZlciBiYWNrIHRvIHRoZSBwaXBlLiAqLworICAgIENQcmVzdWx0ICgqUmVsZWFzZVJlYWRCdWZmZXIpKENQaGFuZGxlIGhDb250ZW50LCBDUGJ5dGUgKnBCdWZmZXIpOworCisgICAgLyoqIFdyaXRlIGRhdGEgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRvIHRoZSBjb250ZW50IChhZHZhbmNlIGNvbnRlbnQgcG9pbnRlciBieSBzaXplIG9mIGRhdGEpLgorICAgICAgIE5vdGU6IHBpcGUgY2xpZW50IHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUgZm9yIHNtYWxsIGhpZ2ggZnJlcXVlbmN5IHdyaXRlcy4gKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqZGF0YSwgQ1B1aW50IG5TaXplKTsgCisKKyAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHVzZWQgdG8gd3JpdGUgZGF0YSB0byB0aGUgY29udGVudC4gCisgICAgICAgQ2xpZW50IHdpbGwgZmlsbCBidWZmZXIgd2l0aCBvdXRwdXQgZGF0YS4gTm90ZTogcGlwZSBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlCisgICAgICAgZm9yIGxhcmdlIHdyaXRlcy4gVGhlIGNsaWVudCBtdXN0IGNhbGwgV3JpdGVCdWZmZXIgd2hlbiBkb25lIGl0IGhhcyBmaWxsZWQgdGhlIGJ1ZmZlciB3aXRoIGRhdGEuKi8KKyAgICBDUHJlc3VsdCAoKkdldFdyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqKnBwQnVmZmVyLCBDUHVpbnQgblNpemUpOworCisgICAgLyoqIERlbGl2ZXIgYSBidWZmZXIgb2J0YWluZWQgdmlhIEdldFdyaXRlQnVmZmVyIHRvIHRoZSBwaXBlLiBQaXBlIHdpbGwgd3JpdGUgdGhlIAorICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIGNvbnRlbnQgYW5kIGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHRoZSBzaXplIG9mIHRoZSBidWZmZXIgKi8KKyAgICBDUHJlc3VsdCAoKldyaXRlQnVmZmVyKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlciwgQ1B1aW50IG5GaWxsZWRTaXplKTsKKworICAgIC8qKiBSZWdpc3RlciBhIHBlci1oYW5kbGUgY2xpZW50IGNhbGxiYWNrIHdpdGggdGhlIGNvbnRlbnQgcGlwZS4gKi8KKyAgICBDUHJlc3VsdCAoKlJlZ2lzdGVyQ2FsbGJhY2spKCBDUGhhbmRsZSBoQ29udGVudCwgQ1ByZXN1bHQgKCpDbGllbnRDYWxsYmFjaykoQ1BfRVZFTlRUWVBFIGVFdmVudCwgQ1B1aW50IGlQYXJhbSkpOworCit9IENQX1BJUEVUWVBFOworCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db3JlLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmIwZjZmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9Db3JlLmgKQEAgLTAsMCArMSwxNDQ4IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogT01YX0NvcmUuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfQ29yZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCBieSBib3RoIHRoZQorICogIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IHRvIGFjY2VzcyBjb21tb24gaXRlbXMuCisgKi8KKworI2lmbmRlZiBPTVhfQ29yZV9oCisjZGVmaW5lIE9NWF9Db3JlX2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIEVhY2ggT01YIGhlYWRlciBzaGFsbCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9JbmRleC5oPgorCisKKy8qKiBUaGUgT01YX0NPTU1BTkRUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgYWN0aW9uIGluIHRoZQorICogIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4gIAorICogIEBpbmdyb3VwIGNvcmUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9DT01NQU5EVFlQRQoreworICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsICAgIC8qKjwgQ2hhbmdlIHRoZSBjb21wb25lbnQgc3RhdGUgKi8KKyAgICBPTVhfQ29tbWFuZEZsdXNoLCAgICAgICAvKio8IEZsdXNoIHRoZSBkYXRhIHF1ZXVlKHMpIG9mIGEgY29tcG9uZW50ICovCisgICAgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSwgLyoqPCBEaXNhYmxlIGEgcG9ydCBvbiBhIGNvbXBvbmVudC4gKi8KKyAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUsICAvKio8IEVuYWJsZSBhIHBvcnQgb24gYSBjb21wb25lbnQuICovCisgICAgT01YX0NvbW1hbmRNYXJrQnVmZmVyLCAgLyoqPCBNYXJrIGEgY29tcG9uZW50L2J1ZmZlciBmb3Igb2JzZXJ2YXRpb24gKi8KKyAgICBPTVhfQ29tbWFuZEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQ29tbWFuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0NvbW1hbmRNYXggPSAwWDdGRkZGRkZGCit9IE9NWF9DT01NQU5EVFlQRTsKKworCisKKy8qKiBUaGUgT01YX1NUQVRFVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIG9yIGNoYW5nZSB0aGUgY29tcG9uZW50CisgKiAgc3RhdGUuICBUaGlzIGVudW1lcmF0aW9uIHJlZmxlY3RzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjb21wb25lbnQgd2hlbgorICogIHVzZWQgd2l0aCB0aGUgT01YX0dldFN0YXRlIG1hY3JvIG9yIGJlY29tZXMgdGhlIHBhcmFtZXRlciBpbiBhIHN0YXRlIGNoYW5nZQorICogIGNvbW1hbmQgd2hlbiB1c2VkIHdpdGggdGhlIE9NWF9TZW5kQ29tbWFuZCBtYWNyby4KKyAqCisgKiAgVGhlIGNvbXBvbmVudCB3aWxsIGJlIGluIHRoZSBMb2FkZWQgc3RhdGUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBpcyBpbml0aWFsbHkKKyAqICBsb2FkZWQgaW50byBtZW1vcnkuICBJbiB0aGUgTG9hZGVkIHN0YXRlLCB0aGUgY29tcG9uZW50IGlzIG5vdCBhbGxvd2VkIHRvCisgKiAgYWxsb2NhdGUgb3IgaG9sZCByZXNvdXJjZXMgb3RoZXIgdGhhbiB0byBidWlsZCBpdCdzIGludGVybmFsIHBhcmFtZXRlcgorICogIGFuZCBjb25maWd1cmF0aW9uIHRhYmxlcy4gIFRoZSBhcHBsaWNhdGlvbiB3aWxsIHNlbmQgb25lIG9yIG1vcmUKKyAqICBTZXRQYXJhbWV0ZXJzL0dldFBhcmFtZXRlcnMgYW5kIFNldENvbmZpZy9HZXRDb25maWcgY29tbWFuZHMgdG8gdGhlCisgKiAgY29tcG9uZW50IGFuZCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIGVhY2ggb2YgdGhlc2UgcGFyYW1ldGVyIGFuZAorICogIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBmb3IgdXNlIGxhdGVyLiAgV2hlbiB0aGUgYXBwbGljYXRpb24gc2VuZHMgdGhlCisgKiAgSWRsZSBjb21tYW5kLCB0aGUgY29tcG9uZW50IHdpbGwgYWNxdWlyZSB0aGUgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlCisgKiAgc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24gYW5kIHdpbGwgdHJhbnNpdGlvbiB0byB0aGUgaWRsZSBzdGF0ZSBpZiB0aGUKKyAqICBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWwuICBJZiB0aGUgY29tcG9uZW50IGNhbm5vdCBzdWNjZXNzZnVsbHkKKyAqICB0cmFuc2l0aW9uIHRvIHRoZSBpZGxlIHN0YXRlIGZvciBhbnkgcmVhc29uLCB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudAorICogIHNoYWxsIGJlIGZ1bGx5IHJvbGxlZCBiYWNrIHRvIHRoZSBMb2FkZWQgc3RhdGUgKGUuZy4gYWxsIGFsbG9jYXRlZCAKKyAqICByZXNvdXJjZXMgc2hhbGwgYmUgcmVsZWFzZWQpLiAgV2hlbiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBjb21tYW5kCisgKiAgdG8gZ28gdG8gdGhlIEV4ZWN1dGluZyBzdGF0ZSwgaXQgc2hhbGwgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzIGJ5CisgKiAgc2VuZGluZyBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgYXBwbGljYXRpb24uICBXaGlsZQorICogIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIElkbGUgc3RhdGUsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBzZW5kIHRoZQorICogIFBhdXNlIGNvbW1hbmQuICBJZiB0aGUgY29tcG9uZW50IHJlY2VpdmVzIHRoZSBwYXVzZSBjb21tYW5kIHdoaWxlIGluIHRoZQorICogIElkbGUgc3RhdGUsIHRoZSBjb21wb25lbnQgc2hhbGwgc2VuZCBhbGwgaW5wdXQgYnVmZmVycyBpdCBob2xkcyB0byB0aGUgCisgKiAgYXBwbGljYXRpb24sIGJ1dCBzaGFsbCBub3QgYmVnaW4gcHJvY2Vzc2luZyBidWZmZXJzLiAgVGhpcyB3aWxsIGFsbG93IHRoZQorICogIGFwcGxpY2F0aW9uIHRvIHByZWZpbGwgYnVmZmVycy4KKyAqIAorICogIEBpbmdyb3VwIGNvbXAKKyAqLworCit0eXBlZGVmIGVudW0gT01YX1NUQVRFVFlQRQoreworICAgIE9NWF9TdGF0ZUludmFsaWQsICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIHRoYXQgaXQncyBpbnRlcm5hbCBkYXRhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBjb3JydXB0ZWQgdG8gdGhlIHBvaW50IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgY2Fubm90IGRldGVybWluZSBpdCdzIHN0YXRlIHByb3Blcmx5ICovCisgICAgT01YX1N0YXRlTG9hZGVkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGxvYWRlZCBidXQgaGFzIG5vdCBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24uICBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gYXJlIHRoZSBvbmx5IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBtYWNyb3MgYWxsb3dlZCB0byBiZSBzZW50IHRvIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGluIHRoaXMgc3RhdGUuICovCisgICAgT01YX1N0YXRlSWRsZSwgICAgICAgIC8qKjwgY29tcG9uZW50IGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGNvbXBsZXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgYW5kIHRoZSBjb21wb25lbnQgaXMgcmVhZHkgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQuICovCisgICAgT01YX1N0YXRlRXhlY3V0aW5nLCAgIC8qKjwgY29tcG9uZW50IGhhcyBhY2NlcHRlZCB0aGUgc3RhcnQgY29tbWFuZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJvY2Vzc2luZyBkYXRhIChpZiBkYXRhIGlzIGF2YWlsYWJsZSkgKi8KKyAgICBPTVhfU3RhdGVQYXVzZSwgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIHJlY2VpdmVkIHBhdXNlIGNvbW1hbmQgKi8KKyAgICBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzLCAvKio8IGNvbXBvbmVudCBpcyB3YWl0aW5nIGZvciByZXNvdXJjZXMsIGVpdGhlciBhZnRlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZW1wdGlvbiBvciBiZWZvcmUgaXQgZ2V0cyB0aGUgcmVzb3VyY2VzIHJlcXVlc3RlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIHNwZWNpZmljYXRpb24gZm9yIGNvbXBsZXRlIGRldGFpbHMuICovCisgICAgT01YX1N0YXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9TdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1N0YXRlTWF4ID0gMFg3RkZGRkZGRgorfSBPTVhfU1RBVEVUWVBFOworCisvKiogVGhlIE9NWF9FUlJPUlRZUEUgZW51bWVyYXRpb24gZGVmaW5lcyB0aGUgc3RhbmRhcmQgT01YIEVycm9ycy4gIFRoZXNlIAorICogIGVycm9ycyBzaG91bGQgY292ZXIgbW9zdCBvZiB0aGUgY29tbW9uIGZhaWx1cmUgY2FzZXMuICBIb3dldmVyLCAKKyAqICB2ZW5kb3JzIGFyZSBmcmVlIHRvIGFkZCBhZGRpdGlvbmFsIGVycm9yIG1lc3NhZ2VzIG9mIHRoZWlyIG93biBhcyAKKyAqICBsb25nIGFzIHRoZXkgZm9sbG93IHRoZXNlIHJ1bGVzOgorICogIDEuICBWZW5kb3IgZXJyb3IgbWVzc2FnZXMgc2hhbGwgYmUgaW4gdGhlIHJhbmdlIG9mIDB4OTAwMDAwMDAgdG8KKyAqICAgICAgMHg5MDAwRkZGRi4KKyAqICAyLiAgVmVuZG9yIGVycm9yIG1lc3NhZ2VzIHNoYWxsIGJlIGRlZmluZWQgaW4gYSBoZWFkZXIgZmlsZSBwcm92aWRlZAorICogICAgICB3aXRoIHRoZSBjb21wb25lbnQuICBObyBlcnJvciBtZXNzYWdlcyBhcmUgYWxsb3dlZCB0aGF0IGFyZQorICogICAgICBub3QgZGVmaW5lZC4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FUlJPUlRZUEUKK3sKKyAgT01YX0Vycm9yTm9uZSA9IDAsCisKKyAgLyoqIFRoZXJlIHdlcmUgaW5zdWZmaWNpZW50IHJlc291cmNlcyB0byBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uICovCisgIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyA9IChPTVhfUzMyKSAweDgwMDAxMDAwLAorCisgIC8qKiBUaGVyZSB3YXMgYW4gZXJyb3IsIGJ1dCB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yIGNvdWxkIG5vdCBiZSBkZXRlcm1pbmVkICovCisgIE9NWF9FcnJvclVuZGVmaW5lZCA9IChPTVhfUzMyKSAweDgwMDAxMDAxLAorCisgIC8qKiBUaGUgY29tcG9uZW50IG5hbWUgc3RyaW5nIHdhcyBub3QgdmFsaWQgKi8KKyAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWUgPSAoT01YX1MzMikgMHg4MDAwMTAwMiwKKworICAvKiogTm8gY29tcG9uZW50IHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHN0cmluZyB3YXMgZm91bmQgKi8KKyAgT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQgPSAoT01YX1MzMikgMHg4MDAwMTAwMywKKworICAvKiogVGhlIGNvbXBvbmVudCBzcGVjaWZpZWQgZGlkIG5vdCBoYXZlIGEgIk9NWF9Db21wb25lbnRJbml0IiBvcgorICAgICAgIk9NWF9Db21wb25lbnREZUluaXQgZW50cnkgcG9pbnQgKi8KKyAgT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCA9IChPTVhfUzMyKSAweDgwMDAxMDA0LAorCisgIC8qKiBPbmUgb3IgbW9yZSBwYXJhbWV0ZXJzIHdlcmUgbm90IHZhbGlkICovCisgIE9NWF9FcnJvckJhZFBhcmFtZXRlciA9IChPTVhfUzMyKSAweDgwMDAxMDA1LAorCisgIC8qKiBUaGUgcmVxdWVzdGVkIGZ1bmN0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCAqLworICBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDA2LAorCisgIC8qKiBUaGUgYnVmZmVyIHdhcyBlbXB0aWVkIGJlZm9yZSB0aGUgbmV4dCBidWZmZXIgd2FzIHJlYWR5ICovCisgIE9NWF9FcnJvclVuZGVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA3LAorCisgIC8qKiBUaGUgYnVmZmVyIHdhcyBub3QgYXZhaWxhYmxlIHdoZW4gaXQgd2FzIG5lZWRlZCAqLworICBPTVhfRXJyb3JPdmVyZmxvdyA9IChPTVhfUzMyKSAweDgwMDAxMDA4LAorCisgIC8qKiBUaGUgaGFyZHdhcmUgZmFpbGVkIHRvIHJlc3BvbmQgYXMgZXhwZWN0ZWQgKi8KKyAgT01YX0Vycm9ySGFyZHdhcmUgPSAoT01YX1MzMikgMHg4MDAwMTAwOSwKKworICAvKiogVGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgc3RhdGUgT01YX1N0YXRlSW52YWxpZCAqLworICBPTVhfRXJyb3JJbnZhbGlkU3RhdGUgPSAoT01YX1MzMikgMHg4MDAwMTAwQSwKKworICAvKiogU3RyZWFtIGlzIGZvdW5kIHRvIGJlIGNvcnJ1cHQgKi8KKyAgT01YX0Vycm9yU3RyZWFtQ29ycnVwdCA9IChPTVhfUzMyKSAweDgwMDAxMDBCLAorCisgIC8qKiBQb3J0cyBiZWluZyBjb25uZWN0ZWQgYXJlIG5vdCBjb21wYXRpYmxlICovCisgIE9NWF9FcnJvclBvcnRzTm90Q29tcGF0aWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDBDLAorCisgIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGlkbGUgY29tcG9uZW50IGhhdmUgYmVlbgorICAgICAgbG9zdCByZXN1bHRpbmcgaW4gdGhlIGNvbXBvbmVudCByZXR1cm5pbmcgdG8gdGhlIGxvYWRlZCBzdGF0ZSAqLworICBPTVhfRXJyb3JSZXNvdXJjZXNMb3N0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMEQsCisKKyAgLyoqIE5vIG1vcmUgaW5kaWNpZXMgY2FuIGJlIGVudW1lcmF0ZWQgKi8KKyAgT01YX0Vycm9yTm9Nb3JlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEUsCisKKyAgLyoqIFRoZSBjb21wb25lbnQgZGV0ZWN0ZWQgYSB2ZXJzaW9uIG1pc21hdGNoICovCisgIE9NWF9FcnJvclZlcnNpb25NaXNtYXRjaCA9IChPTVhfUzMyKSAweDgwMDAxMDBGLAorCisgIC8qKiBUaGUgY29tcG9uZW50IGlzIG5vdCByZWFkeSB0byByZXR1cm4gZGF0YSBhdCB0aGlzIHRpbWUgKi8KKyAgT01YX0Vycm9yTm90UmVhZHkgPSAoT01YX1MzMikgMHg4MDAwMTAxMCwKKworICAvKiogVGhlcmUgd2FzIGEgdGltZW91dCB0aGF0IG9jY3VycmVkICovCisgIE9NWF9FcnJvclRpbWVvdXQgPSAoT01YX1MzMikgMHg4MDAwMTAxMSwKKworICAvKiogVGhpcyBlcnJvciBvY2N1cnMgd2hlbiB0cnlpbmcgdG8gdHJhbnNpdGlvbiBpbnRvIHRoZSBzdGF0ZSB5b3UgYXJlIGFscmVhZHkgaW4gKi8KKyAgT01YX0Vycm9yU2FtZVN0YXRlID0gKE9NWF9TMzIpIDB4ODAwMDEwMTIsCisKKyAgLyoqIFJlc291cmNlcyBhbGxvY2F0ZWQgdG8gYW4gZXhlY3V0aW5nIG9yIHBhdXNlZCBjb21wb25lbnQgaGF2ZSBiZWVuIAorICAgICAgcHJlZW1wdGVkLCBjYXVzaW5nIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIHRvIHRoZSBpZGxlIHN0YXRlICovCisgIE9NWF9FcnJvclJlc291cmNlc1ByZWVtcHRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDEzLCAKKworICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKKyAgICAgIGR1cmluZyB0aGUgYWxsb2NhdGlvbiBvZiBidWZmZXJzIChvbiBhIHRyYW5zaXRpb24gZnJvbSB0aGUgTE9BREVEIHRvIHRoZSBJRExFIHN0YXRlIG9yCisgICAgICBvbiBhIHBvcnQgcmVzdGFydCkgd2hlbiBpdCBkZWVtcyB0aGF0IGl0IGhhcyB3YWl0ZWQgYW4gdW51c3VhbGx5IGxvbmcgdGltZSBmb3IgdGhlIHN1cHBsaWVyIAorICAgICAgdG8gc2VuZCBpdCBhbiBhbGxvY2F0ZWQgYnVmZmVyIHZpYSBhIFVzZUJ1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nQWxsb2NhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE0LAorCisgIC8qKiBBIG5vbi1zdXBwbGllciBwb3J0IHNlbmRzIHRoaXMgZXJyb3IgdG8gdGhlIElMIGNsaWVudCAodmlhIHRoZSBFdmVudEhhbmRsZXIgY2FsbGJhY2spIAorICAgICAgZHVyaW5nIHRoZSBkZWFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIHN0YXRlIG9yIAorICAgICAgb24gYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKKyAgICAgIHRvIHJlcXVlc3QgdGhlIGRlYWxsb2NhdGlvbiBvZiBhIGJ1ZmZlciBoZWFkZXIgdmlhIGEgRnJlZUJ1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nRGVhbGxvY2F0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTUsCisKKyAgLyoqIEEgc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKKyAgICAgIGR1cmluZyB0aGUgc3RvcHBpbmcgb2YgYSBwb3J0IChlaXRoZXIgb24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIElETEUgdG8gTE9BREVEIAorICAgICAgc3RhdGUgb3IgYSBwb3J0IHN0b3ApIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIAorICAgICAgdGhlIG5vbi1zdXBwbGllciB0byByZXR1cm4gYSBidWZmZXIgdmlhIGFuIEVtcHR5VGhpc0J1ZmZlciBvciBGaWxsVGhpc0J1ZmZlciBjYWxsLiAqLworICBPTVhfRXJyb3JQb3J0VW5yZXNwb25zaXZlRHVyaW5nU3RvcCA9IChPTVhfUzMyKSAweDgwMDAxMDE2LAorCisgIC8qKiBBdHRlbXB0aW5nIGEgc3RhdGUgdHJhbnN0aW9uIHRoYXQgaXMgbm90IGFsbG93ZWQgKi8KKyAgT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTcsCisKKyAgLyogQXR0ZW1wdGluZyBhIGNvbW1hbmQgdGhhdCBpcyBub3QgYWxsb3dlZCBkdXJpbmcgdGhlIHByZXNlbnQgc3RhdGUuICovCisgIE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uID0gKE9NWF9TMzIpIDB4ODAwMDEwMTgsIAorCisgIC8qKiBUaGUgdmFsdWVzIGVuY2Fwc3VsYXRlZCBpbiB0aGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBzdHJ1Y3R1cmUgYXJlIG5vdCBzdXBwb3J0ZWQuICovCisgIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZyA9IChPTVhfUzMyKSAweDgwMDAxMDE5LAorCisgIC8qKiBUaGUgcGFyYW1ldGVyIG9yIGNvbmZpZyBpbmRpY2F0ZWQgYnkgdGhlIGdpdmVuIGluZGV4IGlzIG5vdCBzdXBwb3J0ZWQuICovCisgIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQSwKKworICAvKiogVGhlIHBvcnQgaW5kZXggc3VwcGxpZWQgaXMgaW5jb3JyZWN0LiAqLworICBPTVhfRXJyb3JCYWRQb3J0SW5kZXggPSAoT01YX1MzMikgMHg4MDAwMTAxQiwKKworICAvKiogVGhlIHBvcnQgaGFzIGxvc3Qgb25lIG9yIG1vcmUgb2YgaXRzIGJ1ZmZlcnMgYW5kIGl0IHRodXMgdW5wb3B1bGF0ZWQuICovCisgIE9NWF9FcnJvclBvcnRVbnBvcHVsYXRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDFDLAorCisgIC8qKiBDb21wb25lbnQgc3VzcGVuZGVkIGR1ZSB0byB0ZW1wb3JhcnkgbG9zcyBvZiByZXNvdXJjZXMgKi8KKyAgT01YX0Vycm9yQ29tcG9uZW50U3VzcGVuZGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMUQsCisKKyAgLyoqIENvbXBvbmVudCBzdXNwZW5kZWQgZHVlIHRvIGFuIGluYWJpbGl0eSB0byBhY3F1aXJlIGR5bmFtaWMgcmVzb3VyY2VzICovCisgIE9NWF9FcnJvckR5bmFtaWNSZXNvdXJjZXNVbmF2YWlsYWJsZSA9IChPTVhfUzMyKSAweDgwMDAxMDFFLAorCisgIC8qKiBXaGVuIHRoZSBtYWNyb2Jsb2NrIGVycm9yIHJlcG9ydGluZyBpcyBlbmFibGVkIHRoZSBjb21wb25lbnQgcmV0dXJucyBuZXcgZXJyb3IgCisgIGZvciBldmVyeSBmcmFtZSB0aGF0IGhhcyBlcnJvcnMgKi8KKyAgT01YX0Vycm9yTWJFcnJvcnNJbkZyYW1lID0gKE9NWF9TMzIpIDB4ODAwMDEwMUYsCisKKyAgLyoqIEEgY29tcG9uZW50IHJlcG9ydHMgdGhpcyBlcnJvciB3aGVuIGl0IGNhbm5vdCBwYXJzZSBvciBkZXRlcm1pbmUgdGhlIGZvcm1hdCBvZiBhbiBpbnB1dCBzdHJlYW0uICovCisgIE9NWF9FcnJvckZvcm1hdE5vdERldGVjdGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjAsIAorCisgIC8qKiBUaGUgY29udGVudCBvcGVuIG9wZXJhdGlvbiBmYWlsZWQuICovCisgIE9NWF9FcnJvckNvbnRlbnRQaXBlT3BlbkZhaWxlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIxLAorCisgIC8qKiBUaGUgY29udGVudCBjcmVhdGlvbiBvcGVyYXRpb24gZmFpbGVkLiAqLworICBPTVhfRXJyb3JDb250ZW50UGlwZUNyZWF0aW9uRmFpbGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjIsCisKKyAgLyoqIFNlcGFyYXRlIHRhYmxlIGluZm9ybWF0aW9uIGlzIGJlaW5nIHVzZWQgKi8KKyAgT01YX0Vycm9yU2VwZXJhdGVUYWJsZXNVc2VkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjMsCisKKyAgLyoqIFR1bm5lbGluZyBpcyB1bnN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50Ki8KKyAgT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyNCwKKworICBPTVhfRXJyb3JLaHJvbm9zRXh0ZW5zaW9ucyA9IChPTVhfUzMyKTB4OEYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9FcnJvclZlbmRvclN0YXJ0VW51c2VkID0gKE9NWF9TMzIpMHg5MDAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9FcnJvck1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VSUk9SVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvcmUgKi8KK3R5cGVkZWYgT01YX0VSUk9SVFlQRSAoKiBPTVhfQ09NUE9ORU5USU5JVFRZUEUpKE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKy8qKiBAaW5ncm91cCBjb3JlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFCit7CisgIGNvbnN0IGNoYXIgICAgICAgICAgKiBwTmFtZTsgICAgICAgLyogQ29tcG9uZW50IG5hbWUsIDEyOCBieXRlIGxpbWl0IChpbmNsdWRpbmcgJ1wwJykgYXBwbGllcyAqLworICBPTVhfQ09NUE9ORU5USU5JVFRZUEUgcEluaXRpYWxpemU7IC8qIENvbXBvbmVudCBpbnN0YW5jZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiAqLworfSBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFOworCisvKiogQGluZ3JvdXAgY29yZSAqLworZXh0ZXJuIE9NWF9DT01QT05FTlRSRUdJU1RFUlRZUEUgT01YX0NvbXBvbmVudFJlZ2lzdGVyZWRbXTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BSSU9SSVRZTUdNVFRZUEUgeworIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgT01YX1UzMiBuR3JvdXBQcmlvcml0eTsgICAgICAgICAgICAvKio8IFByaW9yaXR5IG9mIHRoZSBjb21wb25lbnQgZ3JvdXAgKi8KKyBPTVhfVTMyIG5Hcm91cElEOyAgICAgICAgICAgICAgICAgIC8qKjwgSUQgb2YgdGhlIGNvbXBvbmVudCBncm91cCAqLworfSBPTVhfUFJJT1JJVFlNR01UVFlQRTsKKworLyogQ29tcG9uZW50IG5hbWUgYW5kIFJvbGUgbmFtZXMgYXJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnMgaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyAnXDAnLiAqLworI2RlZmluZSBPTVhfTUFYX1NUUklOR05BTUVfU0laRSAxMjgKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VOCBjUm9sZVtPTVhfTUFYX1NUUklOR05BTUVfU0laRV07ICAvKio8IG5hbWUgb2Ygc3RhbmRhcmQgY29tcG9uZW50IHdoaWNoIGRlZmluZXMgY29tcG9uZW50IHJvbGUgKi8KK30gT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFOworCisvKiogRW5kIG9mIFN0cmVhbSBCdWZmZXIgRmxhZzogCisgICoKKyAgKiBBIGNvbXBvbmVudCBzZXRzIEVPUyB3aGVuIGl0IGhhcyBubyBtb3JlIGRhdGEgdG8gZW1pdCBvbiBhIHBhcnRpY3VsYXIgCisgICogb3V0cHV0IHBvcnQuIFRodXMgYW4gb3V0cHV0IHBvcnQgc2hhbGwgc2V0IEVPUyBvbiB0aGUgbGFzdCBidWZmZXIgaXQgCisgICogZW1pdHMuIEEgY29tcG9uZW50J3MgZGV0ZXJtaW5hdGlvbiBvZiB3aGVuIGFuIG91dHB1dCBwb3J0IHNob3VsZCAKKyAgKiBjZWFzZSBzZW5kaW5nIGRhdGEgaXMgaW1wbGVtZW5hdGlvbiBzcGVjaWZpYy4KKyAgKiBAaW5ncm91cCBidWYKKyAgKi8KKworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FT1MgMHgwMDAwMDAwMSAKKworLyoqIFN0YXJ0IFRpbWUgQnVmZmVyIEZsYWc6IAorICoKKyAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIFNUQVJUVElNRQorICogZmxhZyBvbiB0aGUgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIHN0YXJ0aW5nIHRpbWVzdGFtcCBmb3IgdGhlCisgKiBzdHJlYW0uIFRoZSBzdGFydGluZyB0aW1lc3RhbXAgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGRhdGEgdGhhdAorICogc2hvdWxkIGJlIGRpc3BsYXllZCBhdCBzdGFydHVwIG9yIGFmdGVyIGEgc2Vlay4KKyAqIFRoZSBmaXJzdCB0aW1lc3RhbXAgb2YgdGhlIHN0cmVhbSBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHN0YXJ0IHRpbWUuCisgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBjYXNlIG9mIGEgc2VlayB0byBhIHBhcnRpY3VsYXIgdmlkZW8gZnJhbWUsIAorICogdGhlIHRhcmdldCBmcmFtZSBtYXkgYmUgYW4gaW50ZXJmcmFtZS4gVGh1cyB0aGUgZmlyc3QgYnVmZmVyIG9mIAorICogdGhlIHN0cmVhbSB3aWxsIGJlIHRoZSBpbnRyYS1mcmFtZSBwcmVjZWRpbmcgdGhlIHRhcmdldCBmcmFtZSBhbmQKKyAqIHRoZSBzdGFydHRpbWUgd2lsbCBvY2N1ciB3aXRoIHRoZSB0YXJnZXQgZnJhbWUgKHdpdGggYW55IG90aGVyCisgKiByZXF1aXJlZCBmcmFtZXMgcmVxdWlyZWQgdG8gcmVjb25zdHJ1Y3QgdGhlIHRhcmdldCBpbnRlcnZlbmluZykuCisgKgorICogVGhlIFNUQVJUVElNRSBmbGFnIGlzIGRpcmVjdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGUgYnVmZmVyJ3MgCisgKiB0aW1lc3RhbXAgJyB0aHVzIGl0cyBhc3NvY2lhdGlvbiB0byBidWZmZXIgZGF0YSBhbmQgaXRzIAorICogcHJvcGFnYXRpb24gaXMgaWRlbnRpY2FsIHRvIHRoZSB0aW1lc3RhbXAncy4KKyAqCisgKiBXaGVuIGEgU3luYyBDb21wb25lbnQgY2xpZW50IHJlY2VpdmVzIGEgYnVmZmVyIHdpdGggdGhlIAorICogU1RBUlRUSU1FIGZsYWcgaXQgc2hhbGwgcGVyZm9ybSBhIFNldENvbmZpZyBvbiBpdHMgc3luYyBwb3J0IAorICogdXNpbmcgT01YX0NvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWUgYW5kIHBhc3NpbmcgdGhlIGJ1ZmZlcidzCisgKiB0aW1lc3RhbXAuCisgKiAKKyAqIEBpbmdyb3VwIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIDB4MDAwMDAwMDIKKworIAorCisvKiogRGVjb2RlIE9ubHkgQnVmZmVyIEZsYWc6IAorICoKKyAqIFRoZSBzb3VyY2Ugb2YgYSBzdHJlYW0gKGUuZy4gYSBkZW11eCBjb21wb25lbnQpIHNldHMgdGhlIERFQ09ERU9OTFkKKyAqIGZsYWcgb24gYW55IGJ1ZmZlciB0aGF0IHNob3VsZCBzaGFsbCBiZSBkZWNvZGVkIGJ1dCBzaG91bGQgbm90IGJlCisgKiBkaXNwbGF5ZWQuIFRoaXMgZmxhZyBpcyB1c2VkLCBmb3IgaW5zdGFuY2UsIHdoZW4gYSBzb3VyY2Ugc2Vla3MgdG8gCisgKiBhIHRhcmdldCBpbnRlcmZyYW1lIHRoYXQgcmVxdWlyZXMgdGhlIGRlY29kZSBvZiBmcmFtZXMgcHJlY2VkaW5nIHRoZSAKKyAqIHRhcmdldCB0byBmYWNpbGl0YXRlIHRoZSB0YXJnZXQncyByZWNvbnN0cnVjdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSAKKyAqIHNvdXJjZSB3b3VsZCBlbWl0IHRoZSBmcmFtZXMgcHJlY2VkaW5nIHRoZSB0YXJnZXQgZG93bnN0cmVhbSAKKyAqIGJ1dCBtYXJrIHRoZW0gYXMgZGVjb2RlIG9ubHkuCisgKgorICogVGhlIERFQ09ERU9OTFkgaXMgYXNzb2NpYXRlZCB3aXRoIGJ1ZmZlciBkYXRhIGFuZCBwcm9wYWdhdGVkIGluIGEgCisgKiBtYW5uZXIgaWRlbnRpY2FsIHRvIHRoZSBidWZmZXIgdGltZXN0YW1wLgorICoKKyAqIEEgY29tcG9uZW50IHRoYXQgcmVuZGVycyBkYXRhIHNob3VsZCBpZ25vcmUgYWxsIGJ1ZmZlcnMgd2l0aCAKKyAqIHRoZSBERUNPREVPTkxZIGZsYWcgc2V0LgorICogCisgKiBAaW5ncm91cCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0RFQ09ERU9OTFkgMHgwMDAwMDAwNAorCisKKy8qIERhdGEgQ29ycnVwdCBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIElMIGNsaWVudCBiZWxpZXZlcyB0aGUgZGF0YSBpbiB0aGUgYXNzb2NpYXRlZCBidWZmZXIgaXMgY29ycnVwdCAKKyAqIEBpbmdyb3VwIGJ1ZgorICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfREFUQUNPUlJVUFQgMHgwMDAwMDAwOAorCisvKiBFbmQgb2YgRnJhbWU6IFRoZSBidWZmZXIgY29udGFpbnMgZXhhY3RseSBvbmUgZW5kIG9mIGZyYW1lIGFuZCBubyBkYXRhCisgKiAgb2NjdXJzIGFmdGVyIHRoZSBlbmQgb2YgZnJhbWUuIFRoaXMgZmxhZyBpcyBhbiBvcHRpb25hbCBoaW50LiBUaGUgYWJzZW5jZQorICogIG9mIHRoaXMgZmxhZyBkb2VzIG5vdCBpbXBseSB0aGUgYWJzZW5jZSBvZiBhbiBlbmQgb2YgZnJhbWUgd2l0aGluIHRoZSBidWZmZXIuIAorICogQGluZ3JvdXAgYnVmCisqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FIDB4MDAwMDAwMTAKKworLyogU3luYyBGcmFtZSBGbGFnOiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gdGhlIGJ1ZmZlciBjb250ZW50IGNvbnRhaW5zIGEgY29kZWQgc3luYyBmcmFtZSAnIAorICogIGEgZnJhbWUgdGhhdCBoYXMgbm8gZGVwZW5kZW5jeSBvbiBhbnkgb3RoZXIgZnJhbWUgaW5mb3JtYXRpb24gCisgKiAgQGluZ3JvdXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfU1lOQ0ZSQU1FIDB4MDAwMDAwMjAKKworLyogRXh0cmEgZGF0YSBwcmVzZW50IGZsYWc6IHRoZXJlIGlzIGV4dHJhIGRhdGEgYXBwZW5kZWQgdG8gdGhlIGRhdGEgc3RyZWFtCisgKiByZXNpZGluZyBpbiB0aGUgYnVmZmVyIAorICogQGluZ3JvdXAgYnVmICAKKyAqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19FWFRSQURBVEEgMHgwMDAwMDA0MAorCisvKiogQ29kZWMgQ29uZmlnIEJ1ZmZlciBGbGFnOiAKKyogT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcgaXMgYW4gb3B0aW9uYWwgZmxhZyB0aGF0IGlzIHNldCBieSBhbgorKiBvdXRwdXQgcG9ydCB3aGVuIGFsbCBieXRlcyBpbiB0aGUgYnVmZmVyIGZvcm0gcGFydCBvciBhbGwgb2YgYSBzZXQgb2YKKyogY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLiAgRXhhbXBsZXMgaW5jbHVkZSBTUFMvUFBTIG5hbCB1bml0cworKiBmb3IgT01YX1ZJREVPX0NvZGluZ0FWQyBvciBBdWRpb1NwZWNpZmljQ29uZmlnIGRhdGEgZm9yCisqIE9NWF9BVURJT19Db2RpbmdBQUMuICBBbnkgY29tcG9uZW50IHRoYXQgZm9yIGEgZ2l2ZW4gc3RyZWFtIHNldHMgCisqIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIHNoYWxsIG5vdCBtaXggY29kZWMgY29uZmlndXJhdGlvbiBieXRlcworKiB3aXRoIGZyYW1lIGRhdGEgaW4gdGhlIHNhbWUgYnVmZmVyLCBhbmQgc2hhbGwgc2VuZCBhbGwgYnVmZmVycworKiBjb250YWluaW5nIGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMgYmVmb3JlIGFueSBidWZmZXJzIGNvbnRhaW5pbmcKKyogZnJhbWUgZGF0YSB0aGF0IHRob3NlIGNvbmZpZ3VyYXRpb25zIGJ5dGVzIGRlc2NyaWJlLgorKiBJZiB0aGUgc3RyZWFtIGZvcm1hdCBmb3IgYSBwYXJ0aWN1bGFyIGNvZGVjIGhhcyBhIGZyYW1lIHNwZWNpZmljCisqIGhlYWRlciBhdCB0aGUgc3RhcnQgb2YgZWFjaCBmcmFtZSwgZm9yIGV4YW1wbGUgT01YX0FVRElPX0NvZGluZ01QMyBvcgorKiBPTVhfQVVESU9fQ29kaW5nQUFDIGluIEFEVFMgbW9kZSwgdGhlbiB0aGVzZSBzaGFsbCBiZSBwcmVzZW50ZWQgYXMKKyogbm9ybWFsIHdpdGhvdXQgc2V0dGluZyBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRy4KKyAqIEBpbmdyb3VwIGJ1ZgorICovCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIDB4MDAwMDAwODAKKworCisKKy8qKiBAaW5ncm91cCBidWYgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CVUZGRVJIRUFERVJUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VOCogcEJ1ZmZlcjsgICAgICAgICAgICAvKio8IFBvaW50ZXIgdG8gYWN0dWFsIGJsb2NrIG9mIG1lbW9yeSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGFjdGluZyBhcyB0aGUgYnVmZmVyICovCisgICAgT01YX1UzMiBuQWxsb2NMZW47ICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgYnVmZmVyIGFsbG9jYXRlZCwgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVTMyIG5GaWxsZWRMZW47ICAgICAgICAgLyoqPCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IGluIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKi8KKyAgICBPTVhfVTMyIG5PZmZzZXQ7ICAgICAgICAgICAgLyoqPCBzdGFydCBvZmZzZXQgb2YgdmFsaWQgZGF0YSBpbiBieXRlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIgKi8KKyAgICBPTVhfUFRSIHBBcHBQcml2YXRlOyAgICAgICAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCisgICAgT01YX1BUUiBwUGxhdGZvcm1Qcml2YXRlOyAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgcGxhdGZvcm0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLyAKKyAgICBPTVhfUFRSIHBJbnB1dFBvcnRQcml2YXRlOyAgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBpbnB1dCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8KKyAgICBPTVhfUFRSIHBPdXRwdXRQb3J0UHJpdmF0ZTsgLyoqPCBwb2ludGVyIHRvIGFueSBkYXRhIHRoZSBvdXRwdXQgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCisgICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7IC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgZ2VuZXJhdGUgYSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJrIGV2ZW50IHVwb24gcHJvY2Vzc2luZyB0aGlzIGJ1ZmZlci4gKi8KKyAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAgICAgICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFyayBzZW50IG9uIGEgbWFyayBldmVudCB0byBkaXNhbWJpZ3VhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLworICAgIE9NWF9VMzIgblRpY2tDb3VudDsgICAgICAgICAvKio8IE9wdGlvbmFsIGVudHJ5IHRoYXQgdGhlIGNvbXBvbmVudCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjYW4gdXBkYXRlIHdpdGggYSB0aWNrIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGFjY2VzcyB0aGUgY29tcG9uZW50LiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHNob3VsZCBiZSBpbiBtaWNyb3NlY29uZHMuICBTaW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgaXMgYSB2YWx1ZSByZWxhdGl2ZSB0byBhbiBhcmJpdHJhcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBwb2ludCwgdGhpcyB2YWx1ZSBjYW5ub3QgYmUgdXNlZCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkZXRlcm1pbmUgYWJzb2x1dGUgdGltZS4gIFRoaXMgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBlbnRyeSBhbmQgbm90IGFsbCBjb21wb25lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCB1cGRhdGUgaXQuKi8KKyBPTVhfVElDS1MgblRpbWVTdGFtcDsgICAgICAgICAgLyoqPCBUaW1lc3RhbXAgY29ycmVzcG9uZGluZyB0byB0aGUgc2FtcGxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0aW5nIGF0IHRoZSBmaXJzdCBsb2dpY2FsIHNhbXBsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZGFyeSBpbiB0aGUgYnVmZmVyLiBUaW1lc3RhbXBzIG9mIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3NpdmUgc2FtcGxlcyB3aXRoaW4gdGhlIGJ1ZmZlciBtYXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBpbmZlcnJlZCBieSBhZGRpbmcgdGhlIGR1cmF0aW9uIG9mIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcHJlY2VkaW5nIGJ1ZmZlciB0byB0aGUgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIuKi8KKyAgT01YX1UzMiAgICAgbkZsYWdzOyAgICAgICAgICAgLyoqPCBidWZmZXIgc3BlY2lmaWMgZmxhZ3MgKi8KKyAgT01YX1UzMiBuT3V0cHV0UG9ydEluZGV4OyAgICAgLyoqPCBUaGUgaW5kZXggb2YgdGhlIG91dHB1dCBwb3J0IChpZiBhbnkpIHVzaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCisgIE9NWF9VMzIgbklucHV0UG9ydEluZGV4OyAgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBpbnB1dCBwb3J0IChpZiBhbnkpIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBidWZmZXIgKi8KK30gT01YX0JVRkZFUkhFQURFUlRZUEU7CisKKy8qKiBUaGUgT01YX0VYVFJBREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBkZWZpbmUgdGhlIAorICogcG9zc2libGUgZXh0cmEgZGF0YSBwYXlsb2FkIHR5cGVzLgorICogTkI6IHRoaXMgZW51bSBpcyBiaW5hcnkgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB0aGUgcHJldmlvdXMKKyAqIE9NWF9FWFRSQURBVEFfUVVBTlQgZGVmaW5lLiAgVGhpcyBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAorICogT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbi4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FWFRSQURBVEFUWVBFCit7CisgICBPTVhfRXh0cmFEYXRhTm9uZSA9IDAsICAgICAgICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGF0IG5vIG1vcmUgZXh0cmEgZGF0YSBzZWN0aW9ucyBmb2xsb3cgKi8gICAgICAgIAorICAgT01YX0V4dHJhRGF0YVF1YW50aXphdGlvbiwgICAgICAgICAgICAgICAgICAgLyoqPCBUaGUgZGF0YSBwYXlsb2FkIGNvbnRhaW5zIHF1YW50aXphdGlvbiBkYXRhICovCisgICBPTVhfRXh0cmFEYXRhS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V4dHJhRGF0YVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICBPTVhfRXh0cmFEYXRhTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVhUUkFEQVRBVFlQRTsKKworCit0eXBlZGVmIHN0cnVjdCBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRSAgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfRVhUUkFEQVRBVFlQRSBlVHlwZTsgICAgICAgLyogRXh0cmEgRGF0YSB0eXBlICovCisgICAgT01YX1UzMiBuRGF0YVNpemU7ICAgLyogU2l6ZSBvZiB0aGUgc3VwcG9ydGluZyBkYXRhIHRvIGZvbGxvdyAqLworICAgIE9NWF9VOCAgZGF0YVsxXTsgICAgIC8qIFN1cHBvcnRpbmcgZGF0YSBoaW50ICAqLworfSBPTVhfT1RIRVJfRVhUUkFEQVRBVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QT1JUX1BBUkFNX1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0czsgICAgICAgICAgICAgLyoqPCBUaGUgbnVtYmVyIG9mIHBvcnRzIGZvciB0aGlzIGNvbXBvbmVudCAqLworICAgIE9NWF9VMzIgblN0YXJ0UG9ydE51bWJlcjsgICAvKiogZmlyc3QgcG9ydCBudW1iZXIgZm9yIHRoaXMgdHlwZSBvZiBwb3J0ICovCit9IE9NWF9QT1JUX1BBUkFNX1RZUEU7IAorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBlbnVtIE9NWF9FVkVOVFRZUEUKK3sKKyAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgc3VjZXNzZnVsbHkgY29tcGxldGVkIGEgY29tbWFuZCAqLworICAgIE9NWF9FdmVudEVycm9yLCAgICAgICAgICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCBhbiBlcnJvciBjb25kaXRpb24gKi8KKyAgICBPTVhfRXZlbnRNYXJrLCAgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBidWZmZXIgbWFyayAqLworICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qKjwgY29tcG9uZW50IGlzIHJlcG9ydGVkIGEgcG9ydCBzZXR0aW5ncyBjaGFuZ2UgKi8KKyAgICBPTVhfRXZlbnRCdWZmZXJGbGFnLCAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gRU9TICovIAorICAgIE9NWF9FdmVudFJlc291cmNlc0FjcXVpcmVkLCAgIC8qKjwgY29tcG9uZW50IGhhcyBiZWVuIGdyYW50ZWQgcmVzb3VyY2VzIGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBzdGFydGluZyB0aGUgc3RhdGUgY2hhbmdlIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMgdG8gT01YX1N0YXRlSWRsZS4gKi8KKyAgIE9NWF9FdmVudENvbXBvbmVudFJlc3VtZWQsICAgICAvKio8IENvbXBvbmVudCByZXN1bWVkIGR1ZSB0byByZWFjcXVpc2l0aW9uIG9mIHJlc291cmNlcyAqLworICAgT01YX0V2ZW50RHluYW1pY1Jlc291cmNlc0F2YWlsYWJsZSwgLyoqPCBDb21wb25lbnQgaGFzIGFjcXVpcmVkIHByZXZpb3VzbHkgdW5hdmFpbGFibGUgZHluYW1pYyByZXNvdXJjZXMgKi8KKyAgIE9NWF9FdmVudFBvcnRGb3JtYXREZXRlY3RlZCwgICAgICAvKio8IENvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYSBzdXBwb3J0ZWQgZm9ybWF0LiAqLworICAgT01YX0V2ZW50S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgT01YX0V2ZW50VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9FdmVudE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VWRU5UVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NBTExCQUNLVFlQRQoreworICAgIC8qKiBUaGUgRXZlbnRIYW5kbGVyIG1ldGhvZCBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gd2hlbiBhbgorICAgICAgICBldmVudCBvZiBpbnRlcmVzdCBvY2N1cnMuICBFdmVudHMgYXJlIGRlZmluZWQgaW4gdGhlIE9NWF9FVkVOVFRZUEUKKyAgICAgICAgZW51bWVyYXRpb24uICBQbGVhc2Ugc2VlIHRoYXQgZW51bWVyYXRpb24gZm9yIGRldGFpbHMgb2Ygd2hhdCB3aWxsCisgICAgICAgIGJlIHJldHVybmVkIGZvciBlYWNoIHR5cGUgb2YgZXZlbnQuIENhbGxiYWNrcyBzaG91bGQgbm90IHJldHVybgorICAgICAgICBhbiBlcnJvciB0byB0aGUgY29tcG9uZW50LCBzbyBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgc2hhbGwgaGFuZGxlIGl0IGludGVybmFsbHkuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKworICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjIHRvIGF2b2lkCisgICAgICAgIGJsb2NraW5nIHRoZSBjb21wb25lbnQgZm9yIGFuIGV4Y2Vzc2l2ZWx5IGxvbmcgcGVyaW9kIG9mIHRpbWUuCisKKyAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEBwYXJhbSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCisgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KKyAgICAgICAgQHBhcmFtIGVFdmVudAorICAgICAgICAgICAgRXZlbnQgdGhhdCB0aGUgY29tcG9uZW50IHdhbnRzIHRvIG5vdGlmeSB0aGUgYXBwbGljYXRpb24gYWJvdXQuCisgICAgICAgIEBwYXJhbSBuRGF0YTEKKyAgICAgICAgICAgIG5EYXRhIHdpbGwgYmUgdGhlIE9NWF9FUlJPUlRZUEUgZm9yIGFuIGVycm9yIGV2ZW50IGFuZCB3aWxsIGJlIAorICAgICAgICAgICAgYW4gT01YX0NPTU1BTkRUWVBFIGZvciBhIGNvbW1hbmQgY29tcGxldGUgZXZlbnQgYW5kIE9NWF9JTkRFWFRZUEUgZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCisgICAgICAgICBAcGFyYW0gbkRhdGEyCisgICAgICAgICAgICBuRGF0YTIgd2lsbCBob2xkIGZ1cnRoZXIgaW5mb3JtYXRpb24gcmVsYXRlZCB0byB0aGUgZXZlbnQuIENhbiBiZSBPTVhfU1RBVEVUWVBFIGZvcgorICAgICAgICAgICAgYSBPTVhfQ29tbWFuZFN0YXRlU2V0IGNvbW1hbmQgb3IgcG9ydCBpbmRleCBmb3IgYSBPTVhfUG9ydFNldHRpbmdzQ2hhbmdlZCBldmVudC4KKyAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgMCBpZiBub3QgdXNlZC4gKQorICAgICAgICBAcGFyYW0gcEV2ZW50RGF0YQorICAgICAgICAgICAgUG9pbnRlciB0byBhZGRpdGlvbmFsIGV2ZW50LXNwZWNpZmljIGRhdGEgKHNlZSBzcGVjIGZvciBtZWFuaW5nKS4KKyAgICAgICovCisKKyAgIE9NWF9FUlJPUlRZUEUgKCpFdmVudEhhbmRsZXIpKAorICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcERhdGEsCisgICAgICAgIE9NWF9JTiBPTVhfRVZFTlRUWVBFIGVFdmVudCwKKyAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGExLAorICAgICAgICBPTVhfSU4gT01YX1UzMiBuRGF0YTIsCisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBFdmVudERhdGEpOworCisgICAgLyoqIFRoZSBFbXB0eUJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGVtcHRpZWQgYnVmZmVycyBmcm9tIGFuCisgICAgICAgIGlucHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIHJldXNlLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgCisgICAgICAgIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gcmVmaWxsIHRoZSBidWZmZXJzIGR1cmluZyB0aGlzCisgICAgICAgIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlbSBhbmQgcmVmaWxsIHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZQorICAgICAgICBpcyBubyBlcnJvciByZXR1cm4sIHNvIHRoZSBhcHBsaWNhdGlvbiBzaGFsbCBoYW5kbGUgYW55IGVycm9ycyBnZW5lcmF0ZWQKKyAgICAgICAgaW50ZXJuYWxseS4gIAorICAgICAgICAKKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAgICAgCisgICAgICAgIEBwYXJhbSBoQ29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgICAgICBAcGFyYW0gcEFwcERhdGEKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCisgICAgICAgIEBwYXJhbSBwQnVmZmVyCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyIGluZGljYXRpbmcgdGhlIGJ1ZmZlciB0aGF0IHdhcyBlbXB0aWVkLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqRW1wdHlCdWZmZXJEb25lKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAorICAgICAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOworCisgICAgLyoqIFRoZSBGaWxsQnVmZmVyRG9uZSBtZXRob2QgaXMgdXNlZCB0byByZXR1cm4gZmlsbGVkIGJ1ZmZlcnMgZnJvbSBhbgorICAgICAgICBvdXRwdXQgcG9ydCBiYWNrIHRvIHRoZSBhcHBsaWNhdGlvbiBmb3IgZW1wdHlpbmcgYW5kIHRoZW4gcmV1c2UuICAKKyAgICAgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwgc28gdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBub3QgYXR0ZW1wdCB0byAKKyAgICAgICAgZW1wdHkgdGhlIGJ1ZmZlcnMgZHVyaW5nIHRoaXMgY2FsbCwgYnV0IHNob3VsZCBxdWV1ZSB0aGUgYnVmZmVycyAKKyAgICAgICAgYW5kIGVtcHR5IHRoZW0gaW4gYW5vdGhlciB0aHJlYWQuICBUaGVyZSBpcyBubyBlcnJvciByZXR1cm4sIHNvIAorICAgICAgICB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkIGludGVybmFsbHkuICBUaGUgCisgICAgICAgIGFwcGxpY2F0aW9uIHNoYWxsIGFsc28gdXBkYXRlIHRoZSBidWZmZXIgaGVhZGVyIHRvIGluZGljYXRlIHRoZQorICAgICAgICBudW1iZXIgb2YgYnl0ZXMgcGxhY2VkIGludG8gdGhlIGJ1ZmZlci4gIAorCisgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIAorICAgICAgICBAcGFyYW0gaENvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIHBBcHBEYXRhCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAorICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgorICAgICAgICBAcGFyYW0gcEJ1ZmZlcgorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZmlsbGVkLgorICAgICAgICBAaW5ncm91cCBidWYKKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqRmlsbEJ1ZmZlckRvbmUpKAorICAgICAgICBPTVhfT1VUIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9PVVQgT01YX1BUUiBwQXBwRGF0YSwKKyAgICAgICAgT01YX09VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSogcEJ1ZmZlcik7CisKK30gT01YX0NBTExCQUNLVFlQRTsKKworLyoqIFRoZSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGljdGF0ZSBwb3J0IHN1cHBsaWVyCisgICAgcHJlZmVyZW5jZSB3aGVuIHR1bm5lbGluZyBiZXR3ZWVuIHR3byBwb3J0cy4KKyAgICBAaW5ncm91cCB0dW4gYnVmCisqLwordHlwZWRlZiBlbnVtIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUKK3sKKyAgICBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQgPSAweDAsIC8qKjwgcG9ydCBzdXBwbHlpbmcgdGhlIGJ1ZmZlcnMgaXMgdW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgZG9uJ3QgY2FyZSAqLworICAgIE9NWF9CdWZmZXJTdXBwbHlJbnB1dCwgICAgICAgICAgICAgLyoqPCBpbnB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCisgICAgT01YX0J1ZmZlclN1cHBseU91dHB1dCwgICAgICAgICAgICAvKio8IG91dHB1dCBwb3J0IHN1cHBsaWVzIHRoZSBidWZmZXJzICovCisgICAgT01YX0J1ZmZlclN1cHBseUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQnVmZmVyU3VwcGx5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQnVmZmVyU3VwcGx5TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFOworCisKKy8qKiBidWZmZXIgc3VwcGxpZXIgcGFyYW1ldGVyIAorICogQGluZ3JvdXAgdHVuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7IC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7IC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVCdWZmZXJTdXBwbGllcjsgLyoqPCBidWZmZXIgc3VwcGxpZXIgKi8KK30gT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRTsKKworCisvKio8IGluZGljYXRlcyB0aGF0IGJ1ZmZlcnMgcmVjZWl2ZWQgYnkgYW4gaW5wdXQgcG9ydCBvZiBhIHR1bm5lbCAKKyAgICAgbWF5IG5vdCBtb2RpZnkgdGhlIGRhdGEgaW4gdGhlIGJ1ZmZlcnMgCisgICAgIEBpbmdyb3VwIHR1bgorICovCisjZGVmaW5lIE9NWF9QT1JUVFVOTkVMRkxBR19SRUFET05MWSAweDAwMDAwMDAxIAorCisKKy8qKiBUaGUgT01YX1RVTk5FTFNFVFVQVFlQRSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBwYXNzIGRhdGEgZnJvbSBhbiBvdXRwdXQKKyAgICBwb3J0IHRvIGFuIGlucHV0IHBvcnQgYXMgcGFydCB0aGUgdHdvIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgY2FsbHMKKyAgICByZXN1bHRpbmcgZnJvbSBhIE9NWF9TZXR1cFR1bm5lbCBjYWxsIGZyb20gdGhlIElMIENsaWVudC4gCisgICAgQGluZ3JvdXAgdHVuCisgKi8gICAKK3R5cGVkZWYgc3RydWN0IE9NWF9UVU5ORUxTRVRVUFRZUEUKK3sKKyAgICBPTVhfVTMyIG5UdW5uZWxGbGFnczsgICAgICAgICAgICAgLyoqPCBiaXQgZmxhZ3MgZm9yIHR1bm5lbGluZyAqLworICAgIE9NWF9CVUZGRVJTVVBQTElFUlRZUEUgZVN1cHBsaWVyOyAvKio8IHN1cHBsaWVyIHByZWZlcmVuY2UgKi8KK30gT01YX1RVTk5FTFNFVFVQVFlQRTsgCisKKy8qIE9NWCBDb21wb25lbnQgaGVhZGVycyBpcyBpbmNsdWRlZCB0byBlbmFibGUgdGhlIGNvcmUgdG8gdXNlCisgICBtYWNyb3MgZm9yIGZ1bmN0aW9ucyBpbnRvIHRoZSBjb21wb25lbnQgZm9yIE9NWCByZWxlYXNlIDEuMC4gIAorICAgRGV2ZWxvcGVycyBzaG91bGQgbm90IGFjY2VzcyBhbnkgc3RydWN0dXJlcyBvciBkYXRhIGZyb20gd2l0aGluCisgICB0aGUgY29tcG9uZW50IGhlYWRlciBkaXJlY3RseSAqLworLyogVE8gQkUgUkVNT1ZFRCAtICNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+ICovCisKKy8qKiBHZXRDb21wb25lbnRWZXJzaW9uIHdpbGwgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb21wb25lbnQuICAKKyAgICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZQorICAgIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYSBhIGNvcmUgbWFjcm8pLiAgVGhlCisgICAgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBoYW5kbGUgb2YgY29tcG9uZW50IHRvIGV4ZWN1dGUgdGhlIGNvbW1hbmQKKyAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudE5hbWUKKyAgICAgICAgcG9pbnRlciB0byBhbiBlbXB0eSBzdHJpbmcgb2YgbGVuZ3RoIDEyOCBieXRlcy4gIFRoZSBjb21wb25lbnQgCisgICAgICAgIHdpbGwgd3JpdGUgaXRzIG5hbWUgaW50byB0aGlzIHN0cmluZy4gIFRoZSBuYW1lIHdpbGwgYmUgCisgICAgICAgIHRlcm1pbmF0ZWQgYnkgYSBzaW5nbGUgemVybyBieXRlLiAgVGhlIG5hbWUgb2YgYSBjb21wb25lbnQgd2lsbCAKKyAgICAgICAgYmUgMTI3IGJ5dGVzIG9yIGxlc3MgdG8gbGVhdmUgcm9vbSBmb3IgdGhlIHRyYWlsaW5nIHplcm8gYnl0ZS4gIAorICAgICAgICBBbiBleGFtcGxlIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5BQkMuQ2hhbm5lbE1peGVyXDAiLgorICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VmVyc2lvbgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWCBWZXJzaW9uIHN0cnVjdHVyZSB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCBmaWxsIAorICAgICAgICBpbi4gIFRoZSBjb21wb25lbnQgd2lsbCBmaWxsIGluIGEgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIAorICAgICAgICBjb21wb25lbnQgdmVyc2lvbi4gIE5PVEU6IHRoZSBjb21wb25lbnQgdmVyc2lvbiBpcyBOT1QgdGhlIHNhbWUgCisgICAgICAgIGFzIHRoZSBPTVggU3BlY2lmaWNhdGlvbiB2ZXJzaW9uIChmb3VuZCBpbiBhbGwgc3RydWN0dXJlcykuICBUaGUgCisgICAgICAgIGNvbXBvbmVudCB2ZXJzaW9uIGlzIGRlZmluZWQgYnkgdGhlIHZlbmRvciBvZiB0aGUgY29tcG9uZW50IGFuZCAKKyAgICAgICAgaXRzIHZhbHVlIGlzIGVudGlyZWx5IHVwIHRvIHRoZSBjb21wb25lbnQgdmVuZG9yLgorICAgIEBwYXJhbSBbb3V0XSBwU3BlY1ZlcnNpb24KKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKKyAgICAgICAgaW4uICBUaGUgU3BlY1ZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIHNwZWNpZmljYXRpb24gdGhhdCB0aGUgCisgICAgICAgIGNvbXBvbmVudCB3YXMgYnVpbHQgYWdhaW5zdC4gIFBsZWFzZSBub3RlIHRoYXQgdGhpcyB2YWx1ZSBtYXkgb3IgCisgICAgICAgIG1heSBub3QgbWF0Y2ggdGhlIHN0cnVjdHVyZSdzIHZlcnNpb24uICBGb3IgZXhhbXBsZSwgaWYgdGhlIAorICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QgdGhlIDIuMCBzcGVjaWZpY2F0aW9uLCBidXQgdGhlIAorICAgICAgICBhcHBsaWNhdGlvbiAod2hpY2ggY3JlYXRlcyB0aGUgc3RydWN0dXJlIGlzIGJ1aWx0IGFnYWluc3QgdGhlIAorICAgICAgICAxLjAgc3BlY2lmaWNhdGlvbiB0aGUgdmVyc2lvbnMgd291bGQgYmUgZGlmZmVyZW50LgorICAgIEBwYXJhbSBbb3V0XSBwQ29tcG9uZW50VVVJRAorICAgICAgICBwb2ludGVyIHRvIHRoZSBVVUlEIG9mIHRoZSBjb21wb25lbnQgd2hpY2ggd2lsbCBiZSBmaWxsZWQgaW4gYnkgCisgICAgICAgIHRoZSBjb21wb25lbnQuICBUaGUgVVVJRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaXMgc2V0IGF0IAorICAgICAgICBSVU4gdGltZSBmb3IgdGhlIGNvbXBvbmVudCBhbmQgaXMgdW5pcXVlIHRvIGVhY2ggaW5zdGFudGlvbiBvZiAKKyAgICAgICAgdGhlIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX0dldENvbXBvbmVudFZlcnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29tcG9uZW50VmVyc2lvbiggIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudE5hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFZlcnNpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFNwZWNWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFVVSUQpICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogU2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbXBvbmVudC4gIFRoaXMgY2FsbCBpcyBhIG5vbi1ibG9ja2luZyBjYWxsLgorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIGNoZWNrIHRoZSBwYXJhbWV0ZXJzIGFuZCB0aGVuIHF1ZXVlIHRoZSBjb21tYW5kCisgICAgdG8gdGhlIGNvbXBvbmVudCB0aHJlYWQgdG8gYmUgZXhlY3V0ZWQuICBUaGUgY29tcG9uZW50IHRocmVhZCBzaGFsbCAKKyAgICBzZW5kIHRoZSBFdmVudEhhbmRsZXIoKSBjYWxsYmFjayBhdCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgY29tbWFuZC4gCisgICAgVGhpcyBtYWNybyB3aWxsIGdvIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uIHRvIHRoZSBjb21wb25lbnQgKHZpYQorICAgIGEgY29yZSBtYWNybykuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRTdGF0ZVNldCIgdGhlIGNvbXBvbmVudCB3aWxsIHF1ZXVlIGEKKyAgICBzdGF0ZSB0cmFuc2l0aW9uIHRvIHRoZSBuZXcgc3RhdGUgaWRlbmZpZWQgaW4gblBhcmFtLgorICAgIAorICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kRmx1c2giLCB0byBmbHVzaCBhIHBvcnQncyBidWZmZXIgcXVldWVzLAorICAgIHRoZSBjb21tYW5kIHdpbGwgZm9yY2UgdGhlIGNvbXBvbmVudCB0byByZXR1cm4gYWxsIGJ1ZmZlcnMgTk9UIENVUlJFTlRMWSAKKyAgICBCRUlORyBQUk9DRVNTRUQgdG8gdGhlIGFwcGxpY2F0aW9uLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGJ1ZmZlcnMgCisgICAgd2VyZSByZWNlaXZlZC4KKyAgICAKKyAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIiBvciAKKyAgICAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgKGdpdmVuIGJ5IHRoZSB2YWx1ZSBvZgorICAgIG5QYXJhbSkgd2lsbCBiZSBzdG9wcGVkIG9yIHJlc3RhcnRlZC4gCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIiBpcyB1c2VkIHRvIG1hcmsgYSBidWZmZXIsIHRoZQorICAgIHBDbWREYXRhIHdpbGwgcG9pbnQgdG8gYSBPTVhfTUFSS1RZUEUgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGNvbXBvbmVudAorICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGV4YW1pbmUgdGhlIGJ1ZmZlciBjaGFpbiBmb3IgdGhlIG1hcmsuICBuUGFyYW0xCisgICAgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBwb3J0IG9uIHdoaWNoIHRoZSBidWZmZXIgbWFyayBpcyBhcHBsaWVkLgorCisgICAgU3BlY2lmaWNhdGlvbiB0ZXh0IGZvciBtb3JlIGRldGFpbHMuIAorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCisgICAgQHBhcmFtIFtpbl0gQ21kCisgICAgICAgIENvbW1hbmQgZm9yIHRoZSBjb21wb25lbnQgdG8gZXhlY3V0ZQorICAgIEBwYXJhbSBbaW5dIG5QYXJhbQorICAgICAgICBQYXJhbWV0ZXIgZm9yIHRoZSBjb21tYW5kIHRvIGJlIGV4ZWN1dGVkLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAKKyAgICAgICAgT01YX0NvbW1hbmRTdGF0ZVNldCwgdmFsdWUgaXMgYSBtZW1iZXIgb2YgT01YX1NUQVRFVFlQRS4gIFdoZW4gQ21kIGhhcyAKKyAgICAgICAgdGhlIHZhbHVlIE9NWF9Db21tYW5kRmx1c2gsIHZhbHVlIG9mIG5QYXJhbSBpbmRpY2F0ZXMgd2hpY2ggcG9ydChzKSAKKyAgICAgICAgdG8gZmx1c2guIC0xIGlzIHVzZWQgdG8gZmx1c2ggYWxsIHBvcnRzIGEgc2luZ2xlIHBvcnQgaW5kZXggd2lsbCAKKyAgICAgICAgb25seSBmbHVzaCB0aGF0IHBvcnQuICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZFBvcnREaXNhYmxlIgorICAgICAgICBvciAiT01YX0NvbW1hbmRQb3J0RW5hYmxlIiwgdGhlIGNvbXBvbmVudCdzIHBvcnQgaXMgZ2l2ZW4gYnkgCisgICAgICAgIHRoZSB2YWx1ZSBvZiBuUGFyYW0uICBXaGVuIENtZCBoYXMgdGhlIHZhbHVlICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiCisgICAgICAgIHRoZSBjb21wb25lbnRzIHBvdCBpcyBnaXZlbiBieSB0aGUgdmFsdWUgb2YgblBhcmFtLgorICAgIEBwYXJhbSBbaW5dIHBDbWREYXRhCisgICAgICAgIFBhcmFtZXRlciBwb2ludGluZyB0byB0aGUgT01YX01BUktUWVBFIHN0cnVjdHVyZSB3aGVuIENtZCBoYXMgdGhlIHZhbHVlCisgICAgICAgICJPTVhfQ29tbWFuZE1hcmtCdWZmZXIiLiAgICAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9TZW5kQ29tbWFuZCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZW5kQ29tbWFuZCggICAgICAgICBcCisgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBDbWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBuUGFyYW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICBwQ21kRGF0YSkgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0dldFBhcmFtZXRlciBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIAorICAgIHNldHRpbmdzIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoaXMgbWFjcm8gY2Fubm90IG9ubHkgYmUgaW52b2tlZCB3aGVuIAorICAgIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUludmFsaWQgc3RhdGUuICBUaGUgblBhcmFtSW5kZXgKKyAgICBwYXJhbWV0ZXIgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20KKyAgICB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSAKKyAgICBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gYmVmb3JlIAorICAgIGludm9raW5nIHRoaXMgbWFjcm8uICBXaGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQsIHRoZQorICAgIGNhbGxlciBzaGFsbCBmaWxsIGluIHRoZSBhcHByb3ByaWF0ZSBuUG9ydEluZGV4IHZhbHVlIGluZGljYXRpbmcgdGhlCisgICAgcG9ydCBvbiB3aGljaCB0aGUgcGFyYW1ldGVyIGFwcGxpZXMuIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgCisgICAgYW55IHNldHRpbmdzIGNoYW5nZWQsIHRoZW4gdGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGEgc2V0IG9mIAorICAgIHZhbGlkIERFRkFVTFQgIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgCisgICAgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuUGFyYW1JbmRleAorICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KKyAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQorICAgICAgICBQb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKKyAgICAgICAgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0UGFyYW1ldGVyKCAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfU2V0UGFyYW1ldGVyIG1hY3JvIHdpbGwgc2VuZCBhbiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAgICBzdHJ1Y3R1cmUgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCisgICAgaW4gYSBzZXBhcmF0ZSBpbnZvY2F0aW9uIG9mIHRoZSBtYWNyby4gIFRoaXMgbWFjcm8gY2FuIG9ubHkgYmUKKyAgICBpbnZva2VkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLCBvciB0aGUKKyAgICBwb3J0IGlzIGRpc2FibGVkICh3aGVuIHRoZSBwYXJhbWV0ZXIgYXBwbGllcyB0byBhIHBvcnQpLiBUaGUgCisgICAgblBhcmFtSW5kZXggcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nCisgICAgcGFzc2VkIHRvIHRoZSBjb21wb25lbnQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIAorICAgIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiAKKyAgICBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLgorICAgIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgdGhlIGNhbGwKKyAgICBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgVGhpcyAKKyAgICBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gbkluZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KKyAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgorICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfU2V0UGFyYW1ldGVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUGFyYW1JbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0UGFyYW1ldGVyKCAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0Q29uZmlnIG1hY3JvIHdpbGwgZ2V0IG9uZSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmVzIAorICAgIGZyb20gYSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIGFueXRpbWUgYWZ0ZXIgdGhlIAorICAgIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgblBhcmFtSW5kZXggY2FsbCBwYXJhbWV0ZXIgaXMgdXNlZCB0byAKKyAgICBpbmRpY2F0ZSB3aGljaCBzdHJ1Y3R1cmUgaXMgYmVpbmcgcmVxdWVzdGVkIGZyb20gdGhlIGNvbXBvbmVudC4gIFRoZSAKKyAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIAorICAgIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSBpbnZva2luZyB0aGlzIG1hY3JvLiAgCisgICAgSWYgdGhlIGNvbXBvbmVudCBoYXMgbm90IGhhZCB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHNlbnQgYmVmb3JlLCAKKyAgICB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiB2YWxpZCBERUZBVUxUIHZhbHVlcyBmb3IgdGhlIAorICAgIGNvbXBvbmVudC4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gbkluZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkLiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uLgorICAgIEBwYXJhbSBbaW4sb3V0XSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQgYnkgdGhlIAorICAgICAgICBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorKi8gICAgICAgIAorI2RlZmluZSBPTVhfR2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0Q29uZmlnKCAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfU2V0Q29uZmlnIG1hY3JvIHdpbGwgc2VuZCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gCisgICAgc3RydWN0dXJlcyB0byBhIGNvbXBvbmVudC4gIEVhY2ggc3RydWN0dXJlIHNoYWxsIGJlIHNlbnQgb25lIGF0IGEgdGltZSwKKyAgICBlYWNoIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBiZSBpbnZva2VkIAorICAgIGFueXRpbWUgYWZ0ZXIgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hhbGwgCisgICAgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSAKKyAgICBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyB0aGUgYWN0dWFsIGRhdGEpIGJlZm9yZSBpbnZva2luZyAKKyAgICB0aGlzIG1hY3JvLiAgVGhlIGFwcGxpY2F0aW9uIGlzIGZyZWUgdG8gZGlzcG9zZSBvZiB0aGlzIHN0cnVjdHVyZSBhZnRlciAKKyAgICB0aGUgY2FsbCBhcyB0aGUgY29tcG9uZW50IGlzIHJlcXVpcmVkIHRvIGNvcHkgYW55IGRhdGEgaXQgc2hhbGwgcmV0YWluLiAgCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuQ29uZmlnSW5kZXgKKyAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBzZW50LiAgVGhpcyB2YWx1ZSBpcyBmcm9tIHRoZQorICAgICAgICBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGFib3ZlLgorICAgIEBwYXJhbSBbaW5dIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUKKyAgICAgICAgcG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIHVzZWQgZm9yCisgICAgICAgIGluaXRpYWxpemF0aW9uIGJ5IHRoZSBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9TZXRDb25maWcoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5TZXRDb25maWcoICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9HZXRFeHRlbnNpb25JbmRleCBtYWNybyB3aWxsIGludm9rZSBhIGNvbXBvbmVudCB0byB0cmFuc2xhdGUgCisgICAgYSB2ZW5kb3Igc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvciBwYXJhbWV0ZXIgc3RyaW5nIGludG8gYW4gT01YIAorICAgIHN0cnVjdHVyZSBpbmRleC4gIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IGZvciB0aGUgdmVuZG9yIHRvIHN1cHBvcnQgCisgICAgdGhpcyBjb21tYW5kIGZvciB0aGUgaW5kZXhlcyBhbHJlYWR5IGZvdW5kIGluIHRoZSBPTVhfSU5ERVhUWVBFIAorICAgIGVudW1lcmF0aW9uICh0aGlzIGlzIGRvbmUgdG8gc2F2ZSBzcGFjZSBpbiBzbWFsbCBjb21wb25lbnRzKS4gIFRoZSAKKyAgICBjb21wb25lbnQgc2hhbGwgc3VwcG9ydCBhbGwgdmVuZG9yIHN1cHBsaWVkIGV4dGVuc2lvbiBpbmRleGVzIG5vdCBmb3VuZAorICAgIGluIHRoZSBtYXN0ZXIgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBjUGFyYW1ldGVyTmFtZQorICAgICAgICBPTVhfU1RSSU5HIHRoYXQgc2hhbGwgYmUgbGVzcyB0aGFuIDEyOCBjaGFyYWN0ZXJzIGxvbmcgaW5jbHVkaW5nCisgICAgICAgIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgdGhhdCB3aWxsIGdldCAKKyAgICAgICAgdHJhbnNsYXRlZCBieSB0aGUgY29tcG9uZW50IGludG8gYSBjb25maWd1cmF0aW9uIGluZGV4LgorICAgIEBwYXJhbSBbb3V0XSBwSW5kZXhUeXBlCisgICAgICAgIGEgcG9pbnRlciB0byBhIE9NWF9JTkRFWFRZUEUgdG8gcmVjZWl2ZSB0aGUgaW5kZXggdmFsdWUuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9HZXRFeHRlbnNpb25JbmRleCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldEV4dGVuc2lvbkluZGV4KCAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNQYXJhbWV0ZXJOYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBJbmRleFR5cGUpICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0U3RhdGUgbWFjcm8gd2lsbCBpbnZva2UgdGhlIGNvbXBvbmVudCB0byBnZXQgdGhlIGN1cnJlbnQgCisgICAgc3RhdGUgb2YgdGhlIGNvbXBvbmVudCBhbmQgcGxhY2UgdGhlIHN0YXRlIHZhbHVlIGludG8gdGhlIGxvY2F0aW9uCisgICAgcG9pbnRlZCB0byBieSBwU3RhdGUuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcFN0YXRlCisgICAgICAgIHBvaW50ZXIgdG8gdGhlIGxvY2F0aW9uIHRvIHJlY2VpdmUgdGhlIHN0YXRlLiAgVGhlIHZhbHVlIHJldHVybmVkCisgICAgICAgIGlzIG9uZSBvZiB0aGUgT01YX1NUQVRFVFlQRSBtZW1iZXJzIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0U3RhdGUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRTdGF0ZSggICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwU3RhdGUpICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX1VzZUJ1ZmZlciBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQorICAgIGEgYnVmZmVyIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKSBhbHJlYWR5IGFsbG9jYXRlZCAKKyAgICBieSBhbm90aGVyIGNvbXBvbmVudCwgb3IgYnkgdGhlIElMIENsaWVudC4gVGhpcyBpcyBhIGJsb2NraW5nIAorICAgIGNhbGwuCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAorICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9Vc2VCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUJ1ZmZlciggICAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5TaXplQnl0ZXMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBCdWZmZXIpCisKKworLyoqIFRoZSBPTVhfQWxsb2NhdGVCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCBhbGxvY2F0ZSAKKyAgICBhIG5ldyBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuICBUaGUgY29tcG9uZW50IHdpbGwgYWxsb2NhdGUgdGhlIAorICAgIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBoZWFkZXIgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAKKyAgICBoZWFkZXIuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4KKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIAorICAgICAgICB0aGUgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5kZXgKKyAgICAgICAgblBvcnRJbmRleCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRoZSBidWZmZXIgd2lsbAorICAgICAgICBiZSB1c2VkIHdpdGguICBUaGUgcG9ydCBjYW4gYmUgZm91bmQgYnkgdXNpbmcgdGhlIG5Qb3J0SW5kZXgKKyAgICAgICAgdmFsdWUgYXMgYW4gaW5kZXggaW50byB0aGUgUG9ydCBEZWZpbml0aW9uIGFycmF5IG9mIHRoZSBjb21wb25lbnQuCisgICAgQHBhcmFtIFtpbl0gcEFwcFByaXZhdGUKKyAgICAgICAgcEFwcFByaXZhdGUgaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBwQXBwUHJpdmF0ZSBtZW1iZXIgb2YgdGhlIAorICAgICAgICBidWZmZXIgaGVhZGVyIHN0cnVjdHVyZS4KKyAgICBAcGFyYW0gW2luXSBuU2l6ZUJ5dGVzCisgICAgICAgIHNpemUgb2YgdGhlIGJ1ZmZlciB0byBhbGxvY2F0ZS4gIFVzZWQgd2hlbiBiQWxsb2NhdGVOZXcgaXMgdHJ1ZS4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovICAgIAorI2RlZmluZSBPTVhfQWxsb2NhdGVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5BbGxvY2F0ZUJ1ZmZlciggICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwcEJ1ZmZlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuU2l6ZUJ5dGVzKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0ZyZWVCdWZmZXIgbWFjcm8gd2lsbCByZWxlYXNlIGEgYnVmZmVyIGhlYWRlciBmcm9tIHRoZSBjb21wb25lbnQKKyAgICB3aGljaCB3YXMgYWxsb2NhdGVkIHVzaW5nIGVpdGhlciBPTVhfQWxsb2NhdGVCdWZmZXIgb3IgT01YX1VzZUJ1ZmZlci4gSWYgIAorICAgIHRoZSBjb21wb25lbnQgYWxsb2NhdGVkIHRoZSBidWZmZXIgKHNlZSB0aGUgT01YX1VzZUJ1ZmZlciBtYWNybykgdGhlbiAKKyAgICB0aGUgY29tcG9uZW50IHNoYWxsIGZyZWUgdGhlIGJ1ZmZlciBhbmQgYnVmZmVyIGhlYWRlci4gVGhpcyBpcyBhIAorICAgIGJsb2NraW5nIGNhbGwuIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CisgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKKyAgICAgICAgYmUgdXNlZCB3aXRoLgorICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0ZyZWVCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RnJlZUJ1ZmZlciggICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9FbXB0eVRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGEgYnVmZmVyIGZ1bGwgb2YgZGF0YSB0byBhbiAKKyAgICBpbnB1dCBwb3J0IG9mIGEgY29tcG9uZW50LiAgVGhlIGJ1ZmZlciB3aWxsIGJlIGVtcHRpZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBFbXB0eUJ1ZmZlckRvbmUgY2FsbCBiYWNrLgorICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgorICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZW1wdHkgdGhlIGJ1ZmZlciwgbGF0ZXIsIGF0IHRoZSBwcm9wZXIgCisgICAgdGltZS4gIEFzIGV4cGVjdGVkLCB0aGlzIG1hY3JvIG1heSBiZSBpbnZva2VkIG9ubHkgd2hpbGUgdGhlIGNvbXBvbmVudCAKKyAgICBpcyBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLiAgSWYgblBvcnRJbmRleCBkb2VzIG5vdCBzcGVjaWZ5IGFuIGlucHV0CisgICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisjZGVmaW5lIE9NWF9FbXB0eVRoaXNCdWZmZXIoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkVtcHR5VGhpc0J1ZmZlciggICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfRmlsbFRoaXNCdWZmZXIgbWFjcm8gd2lsbCBzZW5kIGFuIGVtcHR5IGJ1ZmZlciB0byBhbiAKKyAgICBvdXRwdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGNvbXBvbmVudAorICAgIGFuZCByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gdmlhIHRoZSBGaWxsQnVmZmVyRG9uZSBjYWxsIGJhY2suCisgICAgVGhpcyBpcyBhIG5vbi1ibG9ja2luZyBjYWxsIGluIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCB0aGUgYnVmZmVyCisgICAgYW5kIHJldHVybiBpbW1lZGlhdGVseSBhbmQgdGhlbiBmaWxsIHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAorICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCisgICAgaXMgaW4gdGhlIE9NWF9FeGVjdXRpbmdTdGF0ZS4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBvdXRwdXQKKyAgICBwb3J0LCB0aGUgY29tcG9uZW50IHNoYWxsIHJldHVybiBhbiBlcnJvci4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgIG9yIEFsbG9jYXRlQnVmZmVyLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX0ZpbGxUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+RmlsbFRoaXNCdWZmZXIoICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisKKy8qKiBUaGUgT01YX1VzZUVHTEltYWdlIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgdXNlCisgICAgYSBFR0xJbWFnZSBwcm92aWRlZCBieSBFR0wgKGFuZCBhbGxvY2F0ZSBpdHMgb3duIGJ1ZmZlciBoZWFkZXIpCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbb3V0XSBwcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHJlY2VpdmUgdGhlIAorICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIgaGVhZGVyLiAgTm90ZSB0aGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gdXNlZAorICAgICAgICBmb3IgdGhpcyBidWZmZXIgaXMgTk9UIHZpc2libGUgdG8gdGhlIElMIENsaWVudC4KKyAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CisgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKKyAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4CisgICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgorICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCisgICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKKyAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCisgICAgQHBhcmFtIFtpbl0gZWdsSW1hZ2UKKyAgICAgICAgZWdsSW1hZ2UgY29udGFpbnMgdGhlIGhhbmRsZSBvZiB0aGUgRUdMSW1hZ2UgdG8gdXNlIGFzIGEgYnVmZmVyIG9uIHRoZQorICAgICAgICBzcGVjaWZpZWQgcG9ydC4gIFRoZSBjb21wb25lbnQgaXMgZXhwZWN0ZWQgdG8gdmFsaWRhdGUgcHJvcGVydGllcyBvZiAKKyAgICAgICAgdGhlIEVHTEltYWdlIGFnYWluc3QgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBvcnQgdG8gZW5zdXJlIHRoZSBjb21wb25lbnQKKyAgICAgICAgY2FuIHVzZSB0aGUgRUdMSW1hZ2UgYXMgYSBidWZmZXIuICAgICAgICAgIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKyNkZWZpbmUgT01YX1VzZUVHTEltYWdlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZWdsSW1hZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+VXNlRUdMSW1hZ2UoICAgICAgICAgIFwKKyAgICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcHBCdWZmZXJIZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgZWdsSW1hZ2UpCisKKy8qKiBUaGUgT01YX0luaXQgbWV0aG9kIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSB0aGUKKyAgICBmaXJzdCBjYWxsIG1hZGUgaW50byBPTVggYW5kIGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkIG9uZSB0aW1lIHdpdGhvdXQKKyAgICBhbiBpbnRlcnZpZW5pbmcgT01YX0RlaW5pdCBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKworICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfSW5pdCh2b2lkKTsKKworCisvKiogVGhlIE9NWF9EZWluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBPTVggY29yZS4gIEl0IHNoYWxsIGJlIAorICAgIHRoZSBsYXN0IGNhbGwgbWFkZSBpbnRvIE9NWC4gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIGNvcmUgZGV0ZXJtaW5lcyB0aGF0IAorICAgIHRoYXJlIGFyZSBjb21wb25lbnRzIGxvYWRlZCB3aGVuIHRoaXMgY2FsbCBpcyBtYWRlLCB0aGUgY29yZSBtYXkgcmV0dXJuIAorICAgIHdpdGggYW4gZXJyb3IgcmF0aGVyIHRoYW4gdHJ5IHRvIHVubG9hZCB0aGUgY29tcG9uZW50cy4KKyAgICAgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0RlaW5pdCh2b2lkKTsKKworCisvKiogVGhlIE9NWF9Db21wb25lbnROYW1lRW51bSBtZXRob2Qgd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCBhbGwgdGhlIG5hbWVzIG9mCisgICAgcmVjb2duaXNlZCB2YWxpZCBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0uIFRoaXMgZnVuY3Rpb24gaXMgcHJvdmlkZWQKKyAgICBhcyBhIG1lYW5zIHRvIGRldGVjdCBhbGwgdGhlIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBydW4tdGltZS4gVGhlcmUgaXMKKyAgICBubyBzdHJpY3Qgb3JkZXJpbmcgdG8gdGhlIGVudW1lcmF0aW9uIG9yZGVyIG9mIGNvbXBvbmVudCBuYW1lcywgYWx0aG91Z2gKKyAgICBlYWNoIG5hbWUgd2lsbCBvbmx5IGJlIGVudW1lcmF0ZWQgb25jZS4gIElmIHRoZSBPTVggY29yZSBzdXBwb3J0cyBydW4tdGltZQorICAgIGluc3RhbGxhdGlvbiBvZiBuZXcgY29tcG9uZW50cywgaXQgaXMgb25seSByZXF1cmllZCB0byBkZXRlY3QgbmV3bHkKKyAgICBpbnN0YWxsZWQgY29tcG9uZW50cyB3aGVuIHRoZSBmaXJzdCBjYWxsIHRvIGVudW1lcmF0ZSBjb21wb25lbnQgbmFtZXMKKyAgICBpcyBtYWRlIChpLmUuIHdoZW4gbkluZGV4IGlzIDB4MCkuCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCBpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbb3V0XSBjQ29tcG9uZW50TmFtZQorICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQorICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAorICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAorICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKKyAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgorICAgIEBwYXJhbSBbaW5dIG5OYW1lTGVuZ3RoCisgICAgICAgIG51bWJlciBvZiBjaGFyYWN0ZXJzIGluIHRoZSBjQ29tcG9uZW50TmFtZSBzdHJpbmcuICBXaXRoIGFsbCAKKyAgICAgICAgY29tcG9uZW50IG5hbWUgc3RyaW5ncyByZXN0cmljdGVkIHRvIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyAKKyAgICAgICAgKGluY2x1ZGluZyB0aGUgdHJhaWxpbmcgbnVsbCkgaXQgaXMgcmVjb21lbmRlZCB0aGF0IHRoZSBjYWxsZXIKKyAgICAgICAgcHJvdmlkZSBhIGlucHV0IHN0cmluZyBmb3IgdGhlIGNDb21wb25lbnROYW1lIG9mIDEyOCBjaGFyYWN0ZXJzLgorICAgIEBwYXJhbSBbaW5dIG5JbmRleAorICAgICAgICBudW1iZXIgY29udGFpbmluZyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBjb21wb25lbnQuIAorICAgICAgICBNdWx0aXBsZSBjYWxscyB0byBPTVhfQ29tcG9uZW50TmFtZUVudW0gd2l0aCBpbmNyZWFzaW5nIHZhbHVlcworICAgICAgICBvZiBuSW5kZXggd2lsbCBlbnVtZXJhdGUgdGhyb3VnaCB0aGUgY29tcG9uZW50IG5hbWVzIGluIHRoZQorICAgICAgICBzeXN0ZW0gdW50aWwgT01YX0Vycm9yTm9Nb3JlIGlzIHJldHVybmVkLiAgVGhlIHZhbHVlIG9mIG5JbmRleAorICAgICAgICBpcyAwIHRvIChOLTEpLCB3aGVyZSBOIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgaW5zdGFsbGVkIGNvbXBvbmVudHMKKyAgICAgICAgaW4gdGhlIHN5c3RlbS4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgV2hlbiB0aGUgdmFsdWUgb2YgbkluZGV4IGV4Y2VlZHMgdGhlIG51bWJlciBvZiAKKyAgICAgICAgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtIG1pbnVzIDEsIE9NWF9FcnJvck5vTW9yZSB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLiBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfQ29tcG9uZW50TmFtZUVudW0oCisgICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KTsKKworCisvKiogVGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGJ5IHRoZQorICAgIGNvbXBvbmVudCBuYW1lIGdpdmVuLCBsb2FkIHRoYXQgY29tcG9uZW50IGludG8gbWVtb3J5IGFuZCB0aGVuIGludm9rZQorICAgIHRoZSBjb21wb25lbnQncyBtZXRob2RzIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50LiAgCisgICAgCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW291dF0gcEhhbmRsZQorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9IQU5ETEVUWVBFIHBvaW50ZXIgdG8gYmUgZmlsbGVkIGluIGJ5IHRoaXMgbWV0aG9kLgorICAgIEBwYXJhbSBbaW5dIGNDb21wb25lbnROYW1lCisgICAgICAgIHBvaW50ZXIgdG8gYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHdpdGggdGhlIGNvbXBvbmVudCBuYW1lLiAgVGhlCisgICAgICAgIG5hbWVzIG9mIHRoZSBjb21wb25lbnRzIGFyZSBzdHJpbmdzIGxlc3MgdGhhbiAxMjcgYnl0ZXMgaW4gbGVuZ3RoCisgICAgICAgIHBsdXMgdGhlIHRyYWlsaW5nIG51bGwgZm9yIGEgbWF4aW11bSBzaXplIG9mIDEyOCBieXRlcy4gIEFuIGV4YW1wbGUgCisgICAgICAgIG9mIGEgdmFsaWQgY29tcG9uZW50IG5hbWUgaXMgIk9NWC5USS5BVURJTy5EU1AuTUlYRVJcMCIuICBOYW1lcyBhcmUgCisgICAgICAgIGFzc2lnbmVkIGJ5IHRoZSB2ZW5kb3IsIGJ1dCBzaGFsbCBzdGFydCB3aXRoICJPTVguIiBhbmQgdGhlbiBoYXZlIAorICAgICAgICB0aGUgVmVuZG9yIGRlc2lnbmF0aW9uIG5leHQuCisgICAgQHBhcmFtIFtpbl0gcEFwcERhdGEKKyAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2lsbCBiZSByZXR1cm5lZAorICAgICAgICBkdXJpbmcgY2FsbGJhY2tzIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGNhbiBpZGVudGlmeSB0aGUgc291cmNlCisgICAgICAgIG9mIHRoZSBjYWxsYmFjay4KKyAgICBAcGFyYW0gW2luXSBwQ2FsbEJhY2tzCisgICAgICAgIHBvaW50ZXIgdG8gYSBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHRoZQorICAgICAgICBjb21wb25lbnQgdG8gaW5pdGlhbGl6ZSBpdCB3aXRoLiAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9HZXRIYW5kbGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSogcEhhbmRsZSwgCisgICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKKyAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsQmFja3MpOworCisKKy8qKiBUaGUgT01YX0ZyZWVIYW5kbGUgbWV0aG9kIHdpbGwgZnJlZSBhIGhhbmRsZSBhbGxvY2F0ZWQgYnkgdGhlIE9NWF9HZXRIYW5kbGUgCisgICAgbWV0aG9kLiAgSWYgdGhlIGNvbXBvbmVudCByZWZlcmVuY2UgY291bnQgZ29lcyB0byB6ZXJvLCB0aGUgY29tcG9uZW50IHdpbGwKKyAgICBiZSB1bmxvYWRlZCBmcm9tIG1lbW9yeS4gIAorICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMgd2hlbiB0aGUgY29tcG9uZW50IGlzIAorICAgIGluIHRoZSBPTVhfU3RhdGVMb2FkZWQgc3RhdGUuCisKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfRnJlZUhhbmRsZSgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisKKworLyoqIFRoZSBPTVhfU2V0dXBUdW5uZWwgbWV0aG9kIHdpbGwgaGFuZGxlIHRoZSBuZWNlc3NhcnkgY2FsbHMgdG8gdGhlIGNvbXBvbmVudHMKKyAgICB0byBzZXR1cCB0aGUgc3BlY2lmaWVkIHR1bm5lbCB0aGUgdHdvIGNvbXBvbmVudHMuICBOT1RFOiBUaGlzIGlzCisgICAgYW4gYWN0dWFsIG1ldGhvZCAobm90IGEgI2RlZmluZSBtYWNybykuICBUaGlzIG1ldGhvZCB3aWxsIG1ha2UgY2FsbHMgaW50bworICAgIHRoZSBjb21wb25lbnQgQ29tcG9uZW50VHVubmVsUmVxdWVzdCBtZXRob2QgdG8gZG8gdGhlIGFjdHVhbCB0dW5uZWwgCisgICAgY29ubmVjdGlvbi4gIAorCisgICAgVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIG9uIGJvdGggY29tcG9uZW50cyB3aWxsIGJlIGNhbGxlZC4gCisgICAgVGhpcyBtZXRob2Qgc2hhbGwgbm90IGJlIGNhbGxlZCB1bmxlc3MgdGhlIGNvbXBvbmVudCBpcyBpbiB0aGUgCisgICAgT01YX1N0YXRlTG9hZGVkIHN0YXRlIGV4Y2VwdCB3aGVuIHRoZSBwb3J0cyB1c2VkIGZvciB0aGUgdHVubmVsIGFyZQorICAgIGRpc2FibGVkLiBJbiB0aGlzIGNhc2UsIHRoZSBjb21wb25lbnQgbWF5IGJlIGluIHRoZSBPTVhfU3RhdGVFeGVjdXRpbmcsCisgICAgT01YX1N0YXRlUGF1c2UsIG9yIE9NWF9TdGF0ZUlkbGUgc3RhdGVzLiAKKworICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaE91dHB1dAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIEFsc28gdGhpcyBpcyB0aGUgaGFuZGxlCisgICAgICAgIG9mIHRoZSBjb21wb25lbnQgd2hvc2UgcG9ydCwgc3BlY2lmaWVkIGluIHRoZSBuUG9ydE91dHB1dCBwYXJhbWV0ZXIKKyAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBzb3VyY2UgZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKKyAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAorICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhPdXRwdXQgYmUgdGhlIHNvdXJjZSBmb3IgdGhlIGRhdGEgd2hlbgorICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRPdXRwdXQgaXMgYW4gb3V0cHV0IHBvcnQpLiAgSWYgMHgwLCB0aGUgY29tcG9uZW50CisgICAgICAgIHNwZWNpZmllZCBpbiBoSW5wdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRJbnB1dAorICAgICAgICBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbiB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIGNsaWVudC4KKyAgICBAcGFyYW0gW2luXSBuUG9ydE91dHB1dAorICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgc291cmNlIHBvcnQgb24gY29tcG9uZW50IHRvIGJlCisgICAgICAgIHVzZWQgaW4gdGhlIHR1bm5lbC4gCisgICAgQHBhcmFtIFtpbl0gaElucHV0CisgICAgICAgIFRoaXMgaXMgdGhlIGNvbXBvbmVudCB0byBzZXR1cCB0aGUgdHVubmVsIHdpdGguIFRoaXMgaXMgdGhlIGhhbmRsZQorICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRJbnB1dCBwYXJhbWV0ZXIKKyAgICAgICAgd2lsbCBiZSB1c2VkIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIHR1bm5lbC4gVGhpcyBpcyB0aGUgY29tcG9uZW50IGhhbmRsZQorICAgICAgICByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4gIFRoZXJlIGlzIGEgCisgICAgICAgIHJlcXVpcmVtZW50IHRoYXQgaElucHV0IGJlIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGRhdGEgd2hlbgorICAgICAgICB0dW5lbGxpbmcgKGkuZS4gblBvcnRJbnV0IGlzIGFuIGlucHV0IHBvcnQpLiAgIElmIDB4MCwgdGhlIGNvbXBvbmVudAorICAgICAgICBzcGVjaWZpZWQgaW4gaE91dHB1dCB3aWxsIGhhdmUgaXQncyBwb3J0IHNwZWNpZmllZCBpbiBuUG9ydFBPdXRwdXQKKyAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCisgICAgQHBhcmFtIFtpbl0gblBvcnRJbnB1dAorICAgICAgICBuUG9ydElucHV0IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBkZXN0aW5hdGlvbiBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQorICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICAgIFdoZW4gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgaXMgcmV0dXJuZWQsIG9uZSBvciBib3RoIGNvbXBvbmVudHMgaXMgCisgICAgICAgIGEgbm9uLWludGVyb3AgY29tcG9uZW50IGFuZCBkb2VzIG5vdCBzdXBwb3J0IHR1bm5lbGluZy4KKyAgICAgICAgCisgICAgICAgIE9uIGZhaWx1cmUsIHRoZSBwb3J0cyBvZiBib3RoIGNvbXBvbmVudHMgYXJlIHNldHVwIGZvciBjb21tdW5pY2F0aW9uCisgICAgICAgIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgQ2xpZW50LgorICAgIEBpbmdyb3VwIGNvcmUgdHVuCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX1NldHVwVHVubmVsKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaE91dHB1dCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnRPdXRwdXQsCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoSW5wdXQsCisgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5wdXQpOworICAgIAorLyoqIEBpbmdyb3VwIGNwICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgICBPTVhfR2V0Q29udGVudFBpcGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgc3pVUkkpOworCisvKiogVGhlIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdGhhdCBzdXBwb3J0IHRoZSBnaXZlbgorICAgIHJvbGUgYW5kIChpZiB0aGUgY29tcE5hbWVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2UgY29tcG9uZW50cy4gVGhlIGNhbGwgd2lsbCBmYWlsIGlmIAorICAgIGFuIGluc3VmZmljaWVudGx5IHNpemVkIGFycmF5IG9mIG5hbWVzIGlzIHN1cHBsaWVkLiBUbyBlbnN1cmUgdGhlIGFycmF5IGlzIHN1ZmZpY2llbnRseSBzaXplZCB0aGUKKyAgICBjbGllbnQgc2hvdWxkOgorICAgICAgICAqIGZpcnN0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBjb21wb25lbnQgbmFtZXMKKyAgICAgICAgKiBzZWNvbmQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGNvbXBOYW1lcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gcm9sZQorICAgICAgICBUaGlzIGlzIGdlbmVyaWMgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUgY29uc2lzdGluZyBvbmx5IG9mIGNvbXBvbmVudCBjbGFzcyAKKyAgICAgICAgbmFtZSBhbmQgdGhlIHR5cGUgd2l0aGluIHRoYXQgY2xhc3MgKGUuZy4gJ2F1ZGlvX2RlY29kZXIuYWFjJykuCisgICAgQHBhcmFtIFtpbm91dF0gcE51bUNvbXBzCisgICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAorIAorICAgICAgICBJZiBjb21wTmFtZXMgaXMgTlVMTCwgdGhlIGlucHV0IGlzIGlnbm9yZWQgYW5kIHRoZSBvdXRwdXQgc3BlY2lmaWVzIGhvdyBtYW55IGNvbXBvbmVudHMgc3VwcG9ydAorICAgICAgICB0aGUgZ2l2ZW4gcm9sZS4KKyAgICAgCisgICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAorICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIGNvbXBOYW1lcyBwYXJhbWV0ZXIuCisgICAgQHBhcmFtIFtpbm91dF0gY29tcE5hbWVzCisgICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIHdoaWNoIGFjY2VwdHMgCisgICAgICAgIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHBoeXNpY2FsIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgdGhlIHNwZWNpZmllZCBzdGFuZGFyZCBjb21wb25lbnQgbmFtZS4gCisgICAgICAgIEVhY2ggbmFtZSBpcyBOVUxMIHRlcm1pbmF0ZWQuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRDb21wb25lbnRzT2ZSb2xlICggCisJT01YX0lOICAgICAgT01YX1NUUklORyByb2xlLAorICAgIE9NWF9JTk9VVCAgIE9NWF9VMzIgKnBOdW1Db21wcywKKyAgICBPTVhfSU5PVVQgICBPTVhfVTggICoqY29tcE5hbWVzKTsKKworLyoqIFRoZSBPTVhfR2V0Um9sZXNPZkNvbXBvbmVudCBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiByb2xlcyBzdXBwb3J0ZWQgYnkgdGhlIGdpdmVuCisgICAgY29tcG9uZW50IGFuZCAoaWYgdGhlIHJvbGVzIGZpZWxkIGlzIG5vbi1OVUxMKSB0aGUgbmFtZXMgb2YgdGhvc2Ugcm9sZXMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKKyAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCisgICAgY2xpZW50IHNob3VsZDoKKyAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgTlVMTCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiByb2xlIG5hbWVzCisgICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSByb2xlcyBmaWVsZCBwb2ludGluZyB0byBhbiBhcnJheSBvZiBuYW1lcyBhbGxvY2F0ZWQgCisgICAgICAgICAgYWNjb3JkaW5nIHRvIHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIGZpcnN0IGNhbGwuCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisKKyAgICBAcGFyYW0gW2luXSBjb21wTmFtZQorICAgICAgICBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgcXVlcmllZCBhYm91dC4KKyAgICBAcGFyYW0gW2lub3V0XSBwTnVtUm9sZXMKKyAgICAgICAgVGhpcyBpcyB1c2VkIGJvdGggYXMgaW5wdXQgYW5kIG91dHB1dC4gCisgCisgICAgICAgIElmIHJvbGVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSByb2xlcyB0aGUgY29tcG9uZW50IHN1cHBvcnRzLgorICAgICAKKyAgICAgICAgSWYgY29tcE5hbWVzIGlzIG5vdCBOVUxMLCBvbiBpbnB1dCBpdCBib3VuZHMgdGhlIHNpemUgb2YgdGhlIGlucHV0IHN0cnVjdHVyZSBhbmQgCisgICAgICAgIG9uIG91dHB1dCwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3RyaW5nIG5hbWVzIGxpc3RlZCB3aXRoaW4gdGhlIHJvbGVzIHBhcmFtZXRlci4KKyAgICBAcGFyYW0gW291dF0gcm9sZXMKKyAgICAgICAgSWYgTlVMTCB0aGlzIGZpZWxkIGlzIGlnbm9yZWQuIElmIG5vbi1OVUxMIHRoaXMgcG9pbnRzIHRvIGFuIGFycmF5IG9mIDEyOC1ieXRlIHN0cmluZ3MgCisgICAgICAgIHdoaWNoIGFjY2VwdHMgYSBsaXN0IG9mIHRoZSBuYW1lcyBvZiBhbGwgc3RhbmRhcmQgY29tcG9uZW50cyByb2xlcyBpbXBsZW1lbnRlZCBvbiB0aGUgCisgICAgICAgIHNwZWNpZmllZCBjb21wb25lbnQgbmFtZS4gbnVtQ29tcHMgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgbmFtZXMuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgKCAKKwlPTVhfSU4gICAgICBPTVhfU1RSSU5HIGNvbXBOYW1lLCAKKyAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtUm9sZXMsCisgICAgT01YX09VVCAgICAgT01YX1U4ICoqcm9sZXMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSVZDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmI0ZGVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JVkNvbW1vbi5oCkBAIC0wLDAgKzEsOTQ3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworLyoqCisgKiBAZmlsZSBPTVhfSVZDb21tb24uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBWaWRlbyBhbmQgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZQorICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9JVkNvbW1vbl9oCisjZGVmaW5lIE9NWF9JVkNvbW1vbl9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlIGhlYWRlcgorICogdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgZm9yIHRoaXMgaGVhZGVyCisgKiBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5CisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKy8qKiBAZGVmZ3JvdXAgaXYgT3Blbk1BWCBJTCBJbWFnaW5nIGFuZCBWaWRlbyBEb21haW4KKyAqIENvbW1vbiBzdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIEltYWdpbmcgYW5kIFZpZGVvIGRvbWFpbnMKKyAqIEB7CisgKi8KKworCisvKioKKyAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHBvc3NpYmxlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXRzLgorICoKKyAqIEVOVU1TOgorICogIFVudXNlZCAgICAgICAgICAgICAgICAgOiBQbGFjZWhvbGRlciB2YWx1ZSB3aGVuIGZvcm1hdCBpcyBOL0EKKyAqICBNb25vY2hyb21lICAgICAgICAgICAgIDogYmxhY2sgYW5kIHdoaXRlCisgKiAgOGJpdFJHQjMzMiAgICAgICAgICAgICA6IFJlZCA3OjUsIEdyZWVuIDQ6MiwgQmx1ZSAxOjAKKyAqICAxMmJpdFJHQjQ0NCAgICAgICAgICAgIDogUmVkIDExOjgsIEdyZWVuIDc6NCwgQmx1ZSAzOjAKKyAqICAxNmJpdEFSR0I0NDQ0ICAgICAgICAgIDogQWxwaGEgMTU6MTIsIFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCisgKiAgMTZiaXRBUkdCMTU1NSAgICAgICAgICA6IEFscGhhIDE1LCBSZWQgMTQ6MTAsIEdyZWVuIDk6NSwgQmx1ZSA0OjAKKyAqICAxNmJpdFJHQjU2NSAgICAgICAgICAgIDogUmVkIDE1OjExLCBHcmVlbiAxMDo1LCBCbHVlIDQ6MAorICogIDE2Yml0QkdSNTY1ICAgICAgICAgICAgOiBCbHVlIDE1OjExLCBHcmVlbiAxMDo1LCBSZWQgNDowCisgKiAgMThiaXRSR0I2NjYgICAgICAgICAgICA6IFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKKyAqICAxOGJpdEFSR0IxNjY1ICAgICAgICAgIDogQWxwaGEgMTcsIFJlZCAxNjoxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKKyAqICAxOWJpdEFSR0IxNjY2ICAgICAgICAgIDogQWxwaGEgMTgsIFJlZCAxNzoxMiwgR3JlZW4gMTE6NiwgQmx1ZSA1OjAKKyAqICAyNGJpdFJHQjg4OCAgICAgICAgICAgIDogUmVkIDI0OjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAorICogIDI0Yml0QkdSODg4ICAgICAgICAgICAgOiBCbHVlIDI0OjE2LCBHcmVlbiAxNTo4LCBSZWQgNzowCisgKiAgMjRiaXRBUkdCMTg4NyAgICAgICAgICA6IEFscGhhIDIzLCBSZWQgMjI6MTUsIEdyZWVuIDE0OjcsIEJsdWUgNjowCisgKiAgMjViaXRBUkdCMTg4OCAgICAgICAgICA6IEFscGhhIDI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCisgKiAgMzJiaXRCR1JBODg4OCAgICAgICAgICA6IEJsdWUgMzE6MjQsIEdyZWVuIDIzOjE2LCBSZWQgMTU6OCwgQWxwaGEgNzowCisgKiAgMzJiaXRBUkdCODg4OCAgICAgICAgICA6IEFscGhhIDMxOjI0LCBSZWQgMjM6MTYsIEdyZWVuIDE1OjgsIEJsdWUgNzowCisgKiAgWVVWNDExUGxhbmFyICAgICAgICAgICA6IFUsWSBhcmUgc3Vic2FtcGxlZCBieSBhIGZhY3RvciBvZiA0IGhvcml6b250YWxseQorICogIFlVVjQxMVBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcworICogIFlVVjQyMFBsYW5hciAgICAgICAgICAgOiBUaHJlZSBhcnJheXMgWSxVLFYuCisgKiAgWVVWNDIwUGFja2VkUGxhbmFyICAgICA6IHBhY2tlZCBwZXIgcGF5bG9hZCBpbiBwbGFuYXIgc2xpY2VzCisgKiAgWVVWNDIwU2VtaVBsYW5hciAgICAgICA6IFR3byBhcnJheXMsIG9uZSBpcyBhbGwgWSwgdGhlIG90aGVyIGlzIFUgYW5kIFYKKyAqICBZVVY0MjJQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgorICogIFlVVjQyMlBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcworICogIFlVVjQyMlNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCisgKiAgWUNiWUNyICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVVlWIChpLmUuIFlDYllDcikKKyAqICBZQ3JZQ2IgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFlWWVUgKGkuZS4gWUNyWUNiKQorICogIENiWUNyWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVVlWWSAoaS5lLiBDYllDclkpCisgKiAgQ3JZQ2JZICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBWWVVZIChpLmUuIENyWUNiWSkKKyAqICBZVVY0NDRJbnRlcmxlYXZlZCAgICAgIDogRWFjaCBwaXhlbCBjb250YWlucyBlcXVhbCBwYXJ0cyBZVVYKKyAqICBSYXdCYXllcjhiaXQgICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAorICogIFJhd0JheWVyMTBiaXQgICAgICAgICAgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0CisgKiAgUmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHsKKyAgICBPTVhfQ09MT1JfRm9ybWF0VW51c2VkLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRNb25vY2hyb21lLAorICAgIE9NWF9DT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxMmJpdFJHQjQ0NCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCNDQ0NCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOGJpdFJHQjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRBUkdCMTY2NSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTliaXRBUkdCMTY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QkdSODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdEFSR0IxODg3LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEFSR0I4ODg4LAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MTFQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBhY2tlZFBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZQ2JZQ3IsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlDcllDYiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRDcllDYlksCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQsCisgICAgT01YX0NPTE9SX0Zvcm1hdEwyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMNCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDgsCisgICAgT01YX0NPTE9SX0Zvcm1hdEwxNiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDI0LAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMMzIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFSR0I2NjY2LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2LAorICAgIE9NWF9DT0xPUl9Gb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQ09MT1JfRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICAvKio8UmVzZXJ2ZWQgYW5kcm9pZCBvcGFxdWUgY29sb3Jmb3JtYXQuIFRlbGxzIHRoZSBlbmNvZGVyIHRoYXQKKyAgICAgKiB0aGUgYWN0dWFsIGNvbG9yZm9ybWF0IHdpbGwgYmUgIHJlbGF5ZWQgYnkgdGhlCisgICAgICogR3JhbGxvYyBCdWZmZXJzLgorICAgICAqIEZJWE1FOiBJbiB0aGUgcHJvY2VzcyBvZiByZXNlcnZpbmcgc29tZSBlbnVtIHZhbHVlcyBmb3IKKyAgICAgKiBBbmRyb2lkLXNwZWNpZmljIE9NWCBJTCBjb2xvcmZvcm1hdHMuIENoYW5nZSB0aGlzIGVudW0gdG8KKyAgICAgKiBhbiBhY2NlcHRhYmxlIHJhbmdlIG9uY2UgdGhhdCBpcyBkb25lLgorICAgICAqICovCisgICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgPSAweDdGMDAwNzg5LAorICAgIE9NWF9USV9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyID0gMHg3RjAwMDEwMCwKKyAgICBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyID0gMHg3RkEzMEMwMCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQ09MT1JfRk9STUFUVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgdGhlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIFJHQiB0byBZVVYgb3IgdmljZSB2ZXJzYS4KKyAqIGlDb2xvck1hdHJpeCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZml4ZWQgcG9pbnQgdmFsdWVzCisgKiB1c2VkIGluIGNvbnZlcnRpbmcgYmV0d2VlbiBmb3JtYXRzLgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCisgICAgT01YX1MzMiB4Q29sb3JNYXRyaXhbM11bM107IC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCisgICAgT01YX1MzMiB4Q29sb3JPZmZzZXRbNF07ICAgIC8qKjwgU3RvcmVkIGluIHNpZ25lZCBRMTYgZm9ybWF0ICovCit9T01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIGRlZmluaW5nIHBlcmNlbnQgdG8gc2NhbGUgZWFjaCBmcmFtZSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZToKKyAqIFRvIG1ha2UgdGhlIHdpZHRoIDUwJSBsYXJnZXIsIHVzZSBmV2lkdGggPSAxLjUgYW5kIHRvIG1ha2UgdGhlIHdpZHRoCisgKiAxLzIgdGhlIG9yaWdpbmFsIHNpemUsIHVzZSBmV2lkdGggPSAwLjUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCisgICAgT01YX1MzMiB4V2lkdGg7ICAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfUzMyIHhIZWlnaHQ7ICAgICAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLworfU9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFOworCisKKy8qKgorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgaW1hZ2UgZmlsdGVyIHR5cGVzCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VGSUxURVJUWVBFIHsKKyAgICBPTVhfSW1hZ2VGaWx0ZXJOb25lLAorICAgIE9NWF9JbWFnZUZpbHRlck5vaXNlLAorICAgIE9NWF9JbWFnZUZpbHRlckVtYm9zcywKKyAgICBPTVhfSW1hZ2VGaWx0ZXJOZWdhdGl2ZSwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJTa2V0Y2gsCisgICAgT01YX0ltYWdlRmlsdGVyT2lsUGFpbnQsCisgICAgT01YX0ltYWdlRmlsdGVySGF0Y2gsCisgICAgT01YX0ltYWdlRmlsdGVyR3BlbiwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJBbnRpYWxpYXMsCisgICAgT01YX0ltYWdlRmlsdGVyRGVSaW5nLAorICAgIE9NWF9JbWFnZUZpbHRlclNvbGFyaXplLAorICAgIE9NWF9JbWFnZUZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JbWFnZUZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0ltYWdlRmlsdGVyTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VGSUxURVJUWVBFOworCisKKy8qKgorICogSW1hZ2UgZmlsdGVyIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlSW1hZ2VGaWx0ZXIgOiBJbWFnZSBmaWx0ZXIgdHlwZSBlbnVtZXJhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRUZJTFRFUlRZUEUgZUltYWdlRmlsdGVyOworfSBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRTsKKworCisvKioKKyAqIEN1c3RvbWl6ZWQgVSBhbmQgViBmb3IgY29sb3IgZW5oYW5jZW1lbnQKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiQ29sb3JFbmhhbmNlbWVudCA6IEVuYWJsZS9kaXNhYmxlIGNvbG9yIGVuaGFuY2VtZW50CisgKiAgbkN1c3RvbWl6ZWRVICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvcgorICogICAgICAgICAgICAgICAgICAgICAgVSBjb21wb25lbnQKKyAqICBuQ3VzdG9taXplZFYgICAgICA6IFByYWN0aWNhbCB2YWx1ZXM6IDE2LTI0MCwgcmFuZ2U6IDAtMjU1LCB2YWx1ZSBzZXQgZm9yCisgKiAgICAgICAgICAgICAgICAgICAgICBWIGNvbXBvbmVudAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkNvbG9yRW5oYW5jZW1lbnQ7CisgICAgT01YX1U4IG5DdXN0b21pemVkVTsKKyAgICBPTVhfVTggbkN1c3RvbWl6ZWRWOworfSBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFOworCisKKy8qKgorICogRGVmaW5lIGNvbG9yIGtleSBhbmQgY29sb3Iga2V5IG1hc2sKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuQVJHQkNvbG9yIDogMzJiaXQgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgQ29sb3IKKyAqICBuQVJHQk1hc2sgIDogMzJiaXQgTWFzayBmb3IgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgY2hhbm5lbHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUktFWVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5BUkdCQ29sb3I7CisgICAgT01YX1UzMiBuQVJHQk1hc2s7Cit9IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFOworCisKKy8qKgorICogTGlzdCBvZiBjb2xvciBibGVuZCB0eXBlcyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZworICoKKyAqIEVOVU1TOgorICogIE5vbmUgICAgICAgICAgOiBObyBjb2xvciBibGVuZGluZyBwcmVzZW50CisgKiAgQWxwaGFDb25zdGFudCA6IEZ1bmN0aW9uIGlzIChhbHBoYV9jb25zdGFudCAqIHNyYykgKworICogICAgICAgICAgICAgICAgICAoMSAtIGFscGhhX2NvbnN0YW50KSAqIGRzdCkKKyAqICBBbHBoYVBlclBpeGVsIDogRnVuY3Rpb24gaXMgKGFscGhhICogc3JjKSArICgxIC0gYWxwaGEpICogZHN0KQorICogIEFsdGVybmF0ZSAgICAgOiBGdW5jdGlvbiBpcyBhbHRlcm5hdGluZyBwaXhlbHMgZnJvbSBzcmMgYW5kIGRzdAorICogIEFuZCAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjICYgZHN0KQorICogIE9yICAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjIHwgZHN0KQorICogIEludmVydCAgICAgICAgOiBGdW5jdGlvbiBpcyB+c3JjCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09MT1JCTEVORFRZUEUgeworICAgIE9NWF9Db2xvckJsZW5kTm9uZSwKKyAgICBPTVhfQ29sb3JCbGVuZEFscGhhQ29uc3RhbnQsCisgICAgT01YX0NvbG9yQmxlbmRBbHBoYVBlclBpeGVsLAorICAgIE9NWF9Db2xvckJsZW5kQWx0ZXJuYXRlLAorICAgIE9NWF9Db2xvckJsZW5kQW5kLAorICAgIE9NWF9Db2xvckJsZW5kT3IsCisgICAgT01YX0NvbG9yQmxlbmRJbnZlcnQsCisgICAgT01YX0NvbG9yQmxlbmRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQ29sb3JCbGVuZFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0NvbG9yQmxlbmRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9DT0xPUkJMRU5EVFlQRTsKKworCisvKioKKyAqIENvbG9yIGJsZW5kIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuUkdCQWxwaGFDb25zdGFudCA6IENvbnN0YW50IGdsb2JhbCBhbHBoYSB2YWx1ZXMgd2hlbiBnbG9iYWwgYWxwaGEgaXMgdXNlZAorICogIGVDb2xvckJsZW5kICAgICAgIDogQ29sb3IgYmxlbmQgdHlwZSBlbnVtZXJhdGlvbgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUkdCQWxwaGFDb25zdGFudDsKKyAgICBPTVhfQ09MT1JCTEVORFRZUEUgIGVDb2xvckJsZW5kOworfSBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFOworCisKKy8qKgorICogSG9sZCBmcmFtZSBkaW1lbnNpb24KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzCisgKiAgbkhlaWdodCAgICA6IEZyYW1lIGhlaWdodCBpbiBwaXhlbHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0ZSQU1FU0laRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5XaWR0aDsKKyAgICBPTVhfVTMyIG5IZWlnaHQ7Cit9IE9NWF9GUkFNRVNJWkVUWVBFOworCisKKy8qKgorICogUm90YXRpb24gY29uZmlndXJhdGlvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5Sb3RhdGlvbiAgOiArLy0gaW50ZWdlciByb3RhdGlvbiB2YWx1ZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgblJvdGF0aW9uOworfSBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRTsKKworCisvKioKKyAqIFBvc3NpYmxlIG1pcnJvcmluZyBkaXJlY3Rpb25zIGZvciBwcmUvcG9zdCBwcm9jZXNzaW5nCisgKgorICogRU5VTVM6CisgKiAgTm9uZSAgICAgICA6IE5vIG1pcnJvcmluZworICogIFZlcnRpY2FsICAgOiBWZXJ0aWNhbCBtaXJyb3JpbmcsIGZsaXAgb24gWCBheGlzCisgKiAgSG9yaXpvbnRhbCA6IEhvcml6b250YWwgbWlycm9yaW5nLCBmbGlwIG9uIFkgYXhpcworICogIEJvdGggICAgICAgOiBCb3RoIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIG1pcnJvcmluZworICovCit0eXBlZGVmIGVudW0gT01YX01JUlJPUlRZUEUgeworICAgIE9NWF9NaXJyb3JOb25lID0gMCwKKyAgICBPTVhfTWlycm9yVmVydGljYWwsCisgICAgT01YX01pcnJvckhvcml6b250YWwsCisgICAgT01YX01pcnJvckJvdGgsCisgICAgT01YX01pcnJvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NaXJyb3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NaXJyb3JNYXggPSAweDdGRkZGRkZGCit9IE9NWF9NSVJST1JUWVBFOworCisKKy8qKgorICogTWlycm9yaW5nIGNvbmZpZ3VyYXRpb24KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlTWlycm9yICAgIDogTWlycm9yIHR5cGUgZW51bWVyYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NSVJST1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX01JUlJPUlRZUEUgIGVNaXJyb3I7Cit9IE9NWF9DT05GSUdfTUlSUk9SVFlQRTsKKworCisvKioKKyAqIFBvc2l0aW9uIGluZm9ybWF0aW9uIG9ubHkKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuWCAgICAgICAgIDogWCBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKKyAqICBuWSAgICAgICAgIDogWSBjb29yZGluYXRlIGZvciB0aGUgcG9pbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QT0lOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5YOworICAgIE9NWF9TMzIgblk7Cit9IE9NWF9DT05GSUdfUE9JTlRUWVBFOworCisKKy8qKgorICogRnJhbWUgc2l6ZSBwbHVzIHBvc2l0aW9uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkxlZnQgICAgICA6IFggQ29vcmRpbmF0ZSBvZiB0aGUgdG9wIGxlZnQgY29ybmVyIG9mIHRoZSByZWN0YW5nbGUKKyAqICBuVG9wICAgICAgIDogWSBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICogIG5XaWR0aCAgICAgOiBXaWR0aCBvZiB0aGUgcmVjdGFuZ2xlCisgKiAgbkhlaWdodCAgICA6IEhlaWdodCBvZiB0aGUgcmVjdGFuZ2xlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUkVDVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5MZWZ0OworICAgIE9NWF9TMzIgblRvcDsKKyAgICBPTVhfVTMyIG5XaWR0aDsKKyAgICBPTVhfVTMyIG5IZWlnaHQ7Cit9IE9NWF9DT05GSUdfUkVDVFRZUEU7CisKKworLyoqCisgKiBEZWJsb2NraW5nIHN0YXRlOyBpdCBpcyByZXF1aXJlZCB0byBiZSBzZXQgdXAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb2RlYworICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJEZWJsb2NraW5nIDogRW5hYmxlL2Rpc2FibGUgZGVibG9ja2luZyBtb2RlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJEZWJsb2NraW5nOworfSBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEU7CisKKworLyoqCisgKiBTdGFiaWxpemF0aW9uIHN0YXRlCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgYlN0YWIgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZyYW1lIHN0YWJpbGl6YXRpb24gc3RhdGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVNUQUJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYlN0YWI7Cit9IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRTsKKworCisvKioKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCB0eXBlCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgU3VuTGlnaHQgOiBSZWZlcmVuY2VkIGluIEpTUi0yMzQKKyAqICBGbGFzaCAgICA6IE9wdGltYWwgZm9yIGRldmljZSdzIGludGVncmF0ZWQgZmxhc2gKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9XSElURUJBTENPTlRST0xUWVBFIHsKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sT2ZmID0gMCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sQXV0bywKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU3VuTGlnaHQsCisgICAgT01YX1doaXRlQmFsQ29udHJvbENsb3VkeSwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU2hhZGUsCisgICAgT01YX1doaXRlQmFsQ29udHJvbFR1bmdzdGVuLAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbHVvcmVzY2VudCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSW5jYW5kZXNjZW50LAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbGFzaCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSG9yaXpvbiwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCisgICAgT01YX1doaXRlQmFsQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1doaXRlQmFsQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1dISVRFQkFMQ09OVFJPTFRZUEU7CisKKworLyoqCisgKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVXaGl0ZUJhbENvbnRyb2wgOiBXaGl0ZSBiYWxhbmNlIGVudW1lcmF0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9XSElURUJBTENPTlRST0xUWVBFIGVXaGl0ZUJhbENvbnRyb2w7Cit9IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRTsKKworCisvKioKKyAqIEV4cG9zdXJlIGNvbnRyb2wgdHlwZQorICovCit0eXBlZGVmIGVudW0gT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgeworICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xPZmYgPSAwLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xBdXRvLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xOaWdodCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sQmFja0xpZ2h0LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTcG90TGlnaHQsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNwb3J0cywKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU25vdywKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sQmVhY2gsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbExhcmdlQXBlcnR1cmUsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNtYWxsQXBwZXJ0dXJlLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRXhwb3N1cmVDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRXhwb3N1cmVDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRTsKKworCisvKioKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUV4cG9zdXJlQ29udHJvbCA6IEV4cG9zdXJlIGNvbnRyb2wgZW51bWVyYXRpb24KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgZUV4cG9zdXJlQ29udHJvbDsKK30gT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFOworCisKKy8qKgorICogRGVmaW5lcyBzZW5zb3Igc3VwcG9ydGVkIG1vZGUuCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkZyYW1lUmF0ZSA6IFNpbmdsZSBzaG90IG1vZGUgaXMgaW5kaWNhdGVkIGJ5IGEgMAorICogIGJPbmVTaG90ICAgOiBFbmFibGUgZm9yIHNpbmdsZSBzaG90LCBkaXNhYmxlIGZvciBzdHJlYW1pbmcKKyAqICBzRnJhbWVTaXplIDogRnJhbWVzaXplCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TRU5TT1JNT0RFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKKyAgICBPTVhfQk9PTCBiT25lU2hvdDsKKyAgICBPTVhfRlJBTUVTSVpFVFlQRSBzRnJhbWVTaXplOworfSBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEU7CisKKworLyoqCisgKiBEZWZpbmVzIGNvbnRyYXN0IGxldmVsCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkNvbnRyYXN0ICA6IFZhbHVlcyBhbGxvd2VkIGZvciBjb250cmFzdCAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyBjaGFuZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UUkFTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5Db250cmFzdDsKK30gT01YX0NPTkZJR19DT05UUkFTVFRZUEU7CisKKworLyoqCisgKiBEZWZpbmVzIGJyaWdodG5lc3MgbGV2ZWwKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuQnJpZ2h0bmVzcyA6IDAtMTAwJQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuQnJpZ2h0bmVzczsKK30gT01YX0NPTkZJR19CUklHSFRORVNTVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgYmFja2xpZ2h0IGxldmVsIGNvbmZpZ3VyYXRpb24gZm9yIGEgdmlkZW8gc2luaywgZS5nLiBMQ0QgcGFuZWwKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuQmFja2xpZ2h0IDogVmFsdWVzIGFsbG93ZWQgZm9yIGJhY2tsaWdodCAwLTEwMCUKKyAqICBuVGltZW91dCAgIDogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYmFja2xpZ2h0IGF1dG9tYXRpY2FsbHkgdHVybnMKKyAqICAgICAgICAgICAgICAgb2ZmLiAgQSB2YWx1ZSBvZiAweDAgZGlzYWJsZXMgYmFja2lnaHQgdGltZW91dAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5CYWNrbGlnaHQ7CisgICAgT01YX1UzMiBuVGltZW91dDsKK30gT01YX0NPTkZJR19CQUNLTElHSFRUWVBFOworCisKKy8qKgorICogRGVmaW5lcyBzZXR0aW5nIGZvciBHYW1tYQorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5HYW1tYSAgICAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgZ2FtbWEgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfR0FNTUFUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuR2FtbWE7Cit9IE9NWF9DT05GSUdfR0FNTUFUWVBFOworCisKKy8qKgorICogRGVmaW5lIGZvciBzZXR0aW5nIHNhdHVyYXRpb24KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuU2F0dXJhdGlvbiA6IFZhbHVlcyBhbGxvd2VkIGZvciBzYXR1cmF0aW9uIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zCisgKiAgICAgICAgICAgICAgICBubyBjaGFuZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19TQVRVUkFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgblNhdHVyYXRpb247Cit9IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEU7CisKKworLyoqCisgKiBEZWZpbmUgZm9yIHNldHRpbmcgTGlnaHRuZXNzCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8KKyAqICAgICAgICAgICAgICAgY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9TMzIgbkxpZ2h0bmVzczsKK30gT01YX0NPTkZJR19MSUdIVE5FU1NUWVBFOworCisKKy8qKgorICogUGxhbmUgYmxlbmQgY29uZmlndXJhdGlvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBJbmRleCBvZiBpbnB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGxhbmUuCisgKiAgbkRlcHRoICAgICA6IERlcHRoIG9mIHRoZSBwbGFuZSBpbiByZWxhdGlvbiB0byB0aGUgc2NyZWVuLiBIaWdoZXIKKyAqICAgICAgICAgICAgICAgbnVtYmVyZWQgZGVwdGhzIGFyZSAiYmVoaW5kIiBsb3dlciBudW1iZXIgZGVwdGhzLgorICogICAgICAgICAgICAgICBUaGlzIG51bWJlciBkZWZhdWx0cyB0byB0aGUgUG9ydCBJbmRleCBudW1iZXIuCisgKiAgbkFscGhhICAgICA6IFRyYW5zcGFyZW5jeSBibGVuZGluZyBjb21wb25lbnQgZm9yIHRoZSBlbnRpcmUgcGxhbmUuCisgKiAgICAgICAgICAgICAgIFNlZSBibGVuZGluZyBtb2RlcyBmb3IgbW9yZSBkZXRhaWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5EZXB0aDsKKyAgICBPTVhfVTMyIG5BbHBoYTsKK30gT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRTsKKworCisvKioKKyAqIERlZmluZSBpbnRlcmxhY2UgdHlwZQorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZSBjb250cm9sIHZhcmlhYmxlIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGJlbG93KQorICogIG5JbnRlcmxlYXZlUG9ydEluZGV4ICA6IEluZGV4IG9mIGlucHV0IG9yIG91dHB1dCBwb3J0IGFzc29jaWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmxlYXZlZCBwbGFuZS4KKyAqICBwUGxhbmFyUG9ydEluZGV4ZXNbNF0gOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcGxhbmFyIHBvcnRzLgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiRW5hYmxlOworICAgIE9NWF9VMzIgbkludGVybGVhdmVQb3J0SW5kZXg7Cit9IE9NWF9QQVJBTV9JTlRFUkxFQVZFVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgdGhlIHBpY3R1cmUgZWZmZWN0IHVzZWQgZm9yIGFuIGlucHV0IHBpY3R1cmUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSB7CisgICAgT01YX0VmZmVjdE5vbmUsCisgICAgT01YX0VmZmVjdEZhZGVGcm9tQmxhY2ssCisgICAgT01YX0VmZmVjdEZhZGVUb0JsYWNrLAorICAgIE9NWF9FZmZlY3RVbnNwZWNpZmllZFRocm91Z2hDb25zdGFudENvbG9yLAorICAgIE9NWF9FZmZlY3REaXNzb2x2ZSwKKyAgICBPTVhfRWZmZWN0V2lwZSwKKyAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRNaXhPZlR3b1NjZW5lcywKKyAgICBPTVhfRWZmZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCisgICAgT01YX0VmZmVjdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0VmZmVjdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHJhbnNpdGlvbiBlZmZlY3QKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqIGVFZmZlY3QgICAgOiBFZmZlY3QgdG8gZW5hYmxlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVFJBTlNJVElPTkVGRkVDVFRZUEUgZUVmZmVjdDsKK30gT01YX0NPTkZJR19UUkFOU0lUSU9ORUZGRUNUVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgcG9zc2libGUgZGF0YSB1bml0IHR5cGVzIGZvciBlbmNvZGVkIHZpZGVvIGRhdGEuIFRoZSBkYXRhIHVuaXQKKyAqIHR5cGVzIGFyZSB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIHBsYXliYWNrIGFzIHdlbGwgYXMKKyAqIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLgorICovCit0eXBlZGVmIGVudW0gT01YX0RBVEFVTklUVFlQRSB7CisgICAgT01YX0RhdGFVbml0Q29kZWRQaWN0dXJlLAorICAgIE9NWF9EYXRhVW5pdFZpZGVvU2VnbWVudCwKKyAgICBPTVhfRGF0YVVuaXRTZXZlcmFsU2VnbWVudHMsCisgICAgT01YX0RhdGFVbml0QXJiaXRyYXJ5U3RyZWFtU2VjdGlvbiwKKyAgICBPTVhfRGF0YVVuaXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRGF0YVVuaXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EYXRhVW5pdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0RBVEFVTklUVFlQRTsKKworCisvKioKKyAqIERlZmluZXMgcG9zc2libGUgZW5jYXBzdWxhdGlvbiB0eXBlcyBmb3IgY29kZWQgdmlkZW8gZGF0YSB1bml0LiBUaGUKKyAqIGVuY2Fwc3VsYXRpb24gaW5mb3JtYXRpb24gaXMgdXNlZCBib3RoIGZvciBlbmNvZGVkIHZpZGVvIGlucHV0IGZvcgorICogcGxheWJhY2sgYXMgd2VsbCBhcyBlbmNvZGVkIHZpZGVvIG91dHB1dCBmcm9tIHJlY29yZGluZy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIHsKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25FbGVtZW50YXJ5U3RyZWFtLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkdlbmVyaWNQYXlsb2FkLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblJ0cFBheWxvYWQsCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25NYXggPSAweDdGRkZGRkZGCit9IE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSB0eXBlIG9mIGJlaW5nIGRlY29kZWQvZW5jb2RlZAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREFUQVVOSVRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfREFUQVVOSVRUWVBFIGVVbml0VHlwZTsKKyAgICBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRSBlRW5jYXBzdWxhdGlvblR5cGU7Cit9IE9NWF9QQVJBTV9EQVRBVU5JVFRZUEU7CisKKworLyoqCisgKiBEZWZpbmVzIGRpdGhlciB0eXBlcworICovCit0eXBlZGVmIGVudW0gT01YX0RJVEhFUlRZUEUgeworICAgIE9NWF9EaXRoZXJOb25lLAorICAgIE9NWF9EaXRoZXJPcmRlcmVkLAorICAgIE9NWF9EaXRoZXJFcnJvckRpZmZ1c2lvbiwKKyAgICBPTVhfRGl0aGVyT3RoZXIsCisgICAgT01YX0RpdGhlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EaXRoZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EaXRoZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9ESVRIRVJUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIHVzZWQgdG8gY29uZmlndXJlIGN1cnJlbnQgdHlwZSBvZiBkaXRoZXJpbmcKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19ESVRIRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElUSEVSVFlQRSBlRGl0aGVyOyAgIC8qKjwgVHlwZSBvZiBkaXRoZXJpbmcgdG8gdXNlICovCit9IE9NWF9DT05GSUdfRElUSEVSVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiQ29udGludW91czsgICAvKio8IElmIHRydWUgdGhlbiBpZ25vcmUgZnJhbWUgcmF0ZSBhbmQgZW1pdCBjYXB0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBkYXRhIGFzIGZhc3QgYXMgcG9zc2libGUgKG90aGVyd2lzZSBvYmV5IHBvcnQncyBmcmFtZSByYXRlKS4gKi8KKyAgICBPTVhfQk9PTCBiRnJhbWVMaW1pdGVkOyAvKio8IElmIHRydWUgdGhlbiB0ZXJtaW5hdGUgY2FwdHVyZSBhZnRlciB0aGUgcG9ydCBlbWl0cyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzIChvdGhlcndpc2UgdGhlIHBvcnQgZG9lcyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSB1bnRpbCBpbnN0cnVjdGVkIHRvIGRvIHNvIGJ5IHRoZSBjbGllbnQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgRXZlbiBpZiBzZXQsIHRoZSBjbGllbnQgbWF5IG1hbnVhbGx5IHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSBwcmlvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdG8gcmVhY2hpbmcgdGhlIGxpbWl0LiAqLworICAgIE9NWF9VMzIgbkZyYW1lTGltaXQ7ICAgICAgLyoqPCBMaW1pdCBvbiBudW1iZXIgb2YgZnJhbWVzIGVtaXR0ZWQgZHVyaW5nIGEgY2FwdHVyZSAob25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB2YWxpZCBpZiBiRnJhbWVMaW1pdGVkIGlzIHNldCkuICovCit9IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFOworCit0eXBlZGVmIGVudW0gT01YX01FVEVSSU5HVFlQRSB7CisKKyAgICBPTVhfTWV0ZXJpbmdNb2RlQXZlcmFnZSwgICAgIC8qKjwgQ2VudGVyLXdlaWdodGVkIGF2ZXJhZ2UgbWV0ZXJpbmcuICovCisgICAgT01YX01ldGVyaW5nTW9kZVNwb3QsICAJICAgICAgLyoqPCBTcG90IChwYXJ0aWFsKSBtZXRlcmluZy4gKi8KKyAgICBPTVhfTWV0ZXJpbmdNb2RlTWF0cml4LCAgICAgIC8qKjwgTWF0cml4IG9yIGV2YWx1YXRpdmUgbWV0ZXJpbmcuICovCisKKyAgICBPTVhfTWV0ZXJpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWV0ZXJpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9FVk1vZGVNYXggPSAweDdmZmZmZmZmCit9IE9NWF9NRVRFUklOR1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfTUVURVJJTkdUWVBFIGVNZXRlcmluZzsKKyAgICBPTVhfUzMyIHhFVkNvbXBlbnNhdGlvbjsgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfVTMyIG5BcGVydHVyZUZOdW1iZXI7ICAgICAvKio8IGUuZy4gbkFwZXJ0dXJlRk51bWJlciA9IDIgaW1wbGllcyAiZi8yIiAtIFExNiBmb3JtYXQgKi8KKyAgICBPTVhfQk9PTCBiQXV0b0FwZXJ0dXJlOwkJLyoqPCBXaGV0aGVyIGFwZXJ0dXJlIG51bWJlciBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBPTVhfVTMyIG5TaHV0dGVyU3BlZWRNc2VjOyAgICAvKio8IFNodXR0ZXJzcGVlZCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQk9PTCBiQXV0b1NodXR0ZXJTcGVlZDsJLyoqPCBXaGV0aGVyIHNodXR0ZXIgc3BlZWQgaXMgZGVmaW5lZCBhdXRvbWF0aWNhbGx5ICovCisgICAgT01YX1UzMiBuU2Vuc2l0aXZpdHk7ICAgICAgICAgLyoqPCBlLmcuIG5TZW5zaXRpdml0eSA9IDEwMCBpbXBsaWVzICJJU08gMTAwIiAqLworICAgIE9NWF9CT09MIGJBdXRvU2Vuc2l0aXZpdHk7CS8qKjwgV2hldGhlciBzZW5zaXRpdml0eSBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KK30gT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRTsKKworLyoqCisgKiBGb2N1cyByZWdpb24gY29uZmlndXJhdGlvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJDZW50ZXIgICAgICAgICA6IFVzZSBjZW50ZXIgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJMZWZ0ICAgICAgICAgICA6IFVzZSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiUmlnaHQgICAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3AgICAgICAgICAgICA6IFVzZSB0b3AgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b20gICAgICAgICA6IFVzZSBib3R0b20gcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BMZWZ0ICAgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcFJpZ2h0ICAgICAgIDogVXNlIHRvcCByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkJvdHRvbUxlZnQgICAgIDogVXNlIGJvdHRvbSBsZWZ0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tUmlnaHQgICAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiQ2VudGVyOworICAgIE9NWF9CT09MIGJMZWZ0OworICAgIE9NWF9CT09MIGJSaWdodDsKKyAgICBPTVhfQk9PTCBiVG9wOworICAgIE9NWF9CT09MIGJCb3R0b207CisgICAgT01YX0JPT0wgYlRvcExlZnQ7CisgICAgT01YX0JPT0wgYlRvcFJpZ2h0OworICAgIE9NWF9CT09MIGJCb3R0b21MZWZ0OworICAgIE9NWF9CT09MIGJCb3R0b21SaWdodDsKK30gT01YX0NPTkZJR19GT0NVU1JFR0lPTlRZUEU7CisKKy8qKgorICogRm9jdXMgU3RhdHVzIHR5cGUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9GT0NVU1NUQVRVU1RZUEUgeworICAgIE9NWF9Gb2N1c1N0YXR1c09mZiA9IDAsCisgICAgT01YX0ZvY3VzU3RhdHVzUmVxdWVzdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNSZWFjaGVkLAorICAgIE9NWF9Gb2N1c1N0YXR1c1VuYWJsZVRvUmVhY2gsCisgICAgT01YX0ZvY3VzU3RhdHVzTG9zdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRm9jdXNTdGF0dXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Gb2N1c1N0YXR1c01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0ZPQ1VTU1RBVFVTVFlQRTsKKworLyoqCisgKiBGb2N1cyBzdGF0dXMgY29uZmlndXJhdGlvbgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb2N1c1N0YXR1cyAgICAgICAgOiBTcGVjaWZpZXMgdGhlIGZvY3VzIHN0YXR1cworICogIGJDZW50ZXJTdGF0dXMgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiTGVmdFN0YXR1cyAgICAgICAgIDogVXNlIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJSaWdodFN0YXR1cyAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BTdGF0dXMgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tU3RhdHVzICAgICAgIDogVXNlIGJvdHRvbSByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcExlZnRTdGF0dXMgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcFJpZ2h0U3RhdHVzICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21MZWZ0U3RhdHVzICAgOiBVc2UgYm90dG9tIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21SaWdodFN0YXR1cyAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9GT0NVU1NUQVRVU1RZUEUgZUZvY3VzU3RhdHVzOworICAgIE9NWF9CT09MIGJDZW50ZXJTdGF0dXM7CisgICAgT01YX0JPT0wgYkxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYlJpZ2h0U3RhdHVzOworICAgIE9NWF9CT09MIGJUb3BTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wTGVmdFN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wUmlnaHRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbUxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVJpZ2h0U3RhdHVzOworfSBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbWFnZS5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTM5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX0ltYWdlLmgKQEAgLTAsMCArMSwzNDUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKioKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICovCisKKy8qKiAKKyAqIEBmaWxlIE9NWF9JbWFnZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgSW1hZ2UgY29tcG9uZW50cyB0byBleGNoYW5nZSBwYXJhbWV0ZXJzIGFuZCAKKyAqIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9JbWFnZV9oCisjZGVmaW5lIE9NWF9JbWFnZV9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKioKKyAqIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUgCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQgIAorICogZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9JVkNvbW1vbi5oPgorCisvKiogQGRlZmdyb3VwIGltYWdpbmcgT3Blbk1BWCBJTCBJbWFnaW5nIERvbWFpbgorICogQGluZ3JvdXAgaXYKKyAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgSW1hZ2luZyBkb21haW4KKyAqIEB7CisgKi8KKworLyoqIAorICogRW51bWVyYXRpb24gdXNlZCB0byBkZWZpbmUgdGhlIHBvc3NpYmxlIGltYWdlIGNvbXByZXNzaW9uIGNvZGluZy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfQ09ESU5HVFlQRSB7CisgICAgT01YX0lNQUdFX0NvZGluZ1VudXNlZCwgICAgICAvKio8IFZhbHVlIHdoZW4gZm9ybWF0IGlzIE4vQSAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdBdXRvRGV0ZWN0LCAgLyoqPCBBdXRvIGRldGVjdGlvbiBvZiBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nSlBFRywgICAgICAgIC8qKjwgSlBFRy9KRklGIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHMkssICAgICAgLyoqPCBKUEVHIDIwMDAgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0VYSUYsICAgICAgICAvKio8IEVYSUYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ1RJRkYsICAgICAgICAvKio8IFRJRkYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0dJRiwgICAgICAgICAvKio8IEdyYXBoaWNzIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdQTkcsICAgICAgICAgLyoqPCBQTkcgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0xaVywgICAgICAgICAvKio8IExaVyBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nQk1QLCAgICAgICAgIC8qKjwgV2luZG93cyBCaXRtYXAgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfQ09ESU5HVFlQRTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGFuIGltYWdlIHBhdGguIFRoZSBudW1iZXIgb2YgaW1hZ2UgcGF0aHMgCisgKiBmb3IgaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgaW1hZ2UgY29tcG9uZW50LiAgCisgKiAKKyAqICBJbnB1dCAoYWthIFNvdXJjZSkgOiBaZXJvIElucHV0cywgb25lIE91dHB1dCwKKyAqICBTcGxpdHRlciAgICAgICAgICAgOiBPbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAorICogIFByb2Nlc3NpbmcgRWxlbWVudCA6IE9uZSBJbnB1dCwgb25lIG91dHB1dCwKKyAqICBNaXhlciAgICAgICAgICAgICAgOiAyIG9yIG1vcmUgaW5wdXRzLCBvbmUgb3V0cHV0LAorICogIE91dHB1dCAoYWthIFNpbmspICA6IE9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgorICogCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0ICAKKyAqIGltYWdlIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgIAorICogYmUgdHJhbnNtaXR0ZWQgdG8gdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgQ3VzdG9tQ29tbWFuZCBmdW5jdGlvbi4gICAKKyAqIENvbXBsaWFudCBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsICAKKyAqIHZhbHVlcyBkdXJpbmcgdGhlIE9NWF9HZXRQYXJhbWV0ZXIoKSBjb21tYW5kLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIGNNSU1FVHlwZSAgICAgICAgICAgICA6IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydAorICogIHBOYXRpdmVSZW5kZXIgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSBkaXNwbGF5IGlmIGEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3luYywgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMAorICogIG5GcmFtZVdpZHRoICAgICAgICAgICA6IFdpZHRoIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuICBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIHBvcnQgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93biwgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQgZnJvbQorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgaW1hZ2UgaXMgYm90dG9tIHVwCisgKiAgblNsaWNlSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IHVzZWQgd2hlbiBlbmNvZGluZyBpbiBzbGljZXMKKyAqICBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQgOiBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyBzdXBwb3J0ZWQgYnkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIE9NWCBjb21wb25lbnQKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgICAgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICBwTmF0aXZlV2luZG93ICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOworICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7IAorICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OworICAgIE9NWF9TMzIgblN0cmlkZTsgICAgIAorICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKKyAgICBPTVhfSU1BR0VfQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OworfSBPTVhfSU1BR0VfUE9SVERFRklOSVRJT05UWVBFOworCisKKy8qKiAgCisgKiBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZSB0aGUgdmFyaW91cyAKKyAqIGRhdGEgaW5wdXQvb3V0cHV0IGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhlIHBvcnQuCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgOiBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQKKyAqICBuSW5kZXggICAgICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gCisgKiAgICAgICAgICAgICAgICAgICAgICAgMHgwIHRvIE4tMQorICogIGVDb21wcmVzc2lvbkZvcm1hdCA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfSU1BR0VfQ29kaW5nVW51c2VkIGlzIHNwZWNpZmllZCwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgZUNvbG9yRm9ybWF0IGlzIHZhbGlkCisgKiAgZUNvbG9yRm9ybWF0ICAgICAgIDogRGVjb21wcmVzc2VkIGZvcm1hdCB1c2VkIGJ5IHRoaXMgY29tcG9uZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkluZGV4OworICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7Cit9IE9NWF9JTUFHRV9QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIHR5cGUgCisgKgorICogRU5VTVMKKyAqICBUb3JjaCA6IEZsYXNoIGZvcmNlZCBjb25zdGFudGx5IG9uCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbE9uID0gMCwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT2ZmLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xBdXRvLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xSZWRFeWVSZWR1Y3Rpb24sCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEZpbGxpbiwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVG9yY2gsCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfRkxBU0hDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBGbGFzaCBjb250cm9sIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUZsYXNoQ29udHJvbCA6IEZsYXNoIGNvbnRyb2wgdHlwZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIGVGbGFzaENvbnRyb2w7Cit9IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgdHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIHsKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sT24gPSAwLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPZmYsCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG8sCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEF1dG9Mb2NrLAorICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEU7CisKKyAKKy8qKiAKKyAqIEZvY3VzIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9jdXNDb250cm9sICAgOiBGb2N1cyBjb250cm9sCisgKiAgbkZvY3VzU3RlcHMgICAgIDogRm9jdXMgY2FuIHRha2Ugb24gdmFsdWVzIGZyb20gMCBtbSB0byBpbmZpbml0eS4gCisgKiAgICAgICAgICAgICAgICAgICAgSW50ZXJlc3QgaXMgb25seSBpbiBudW1iZXIgb2Ygc3RlcHMgb3ZlciB0aGlzIHJhbmdlLgorICogIG5Gb2N1c1N0ZXBJbmRleCA6IEN1cnJlbnQgZm9jdXMgc3RlcCBpbmRleAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRSBlRm9jdXNDb250cm9sOworICAgIE9NWF9VMzIgbkZvY3VzU3RlcHM7CisgICAgT01YX1UzMiBuRm9jdXNTdGVwSW5kZXg7Cit9IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBRIEZhY3RvciBmb3IgSlBFRyBjb21wcmVzc2lvbiwgd2hpY2ggY29udHJvbHMgdGhlIHRyYWRlb2ZmIGJldHdlZW4gaW1hZ2UKKyAqIHF1YWxpdHkgYW5kIHNpemUuICBRIEZhY3RvciBwcm92aWRlcyBhIG1vcmUgc2ltcGxlIG1lYW5zIG9mIGNvbnRyb2xsaW5nCisgKiBKUEVHIGNvbXByZXNzaW9uIHF1YWxpdHksIHdpdGhvdXQgZGlyZWN0bHkgcHJvZ3JhbW1pbmcgUXVhbnRpemF0aW9uCisgKiB0YWJsZXMgZm9yIGNocm9tYSBhbmQgbHVtYSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAorICogIG5RRmFjdG9yICAgOiBKUEVHIFEgZmFjdG9yIHZhbHVlIGluIHRoZSByYW5nZSBvZiAxLTEwMC4gQSBmYWN0b3Igb2YgMSAKKyAqICAgICAgICAgICAgICAgcHJvZHVjZXMgdGhlIHNtYWxsZXN0LCB3b3JzdCBxdWFsaXR5IGltYWdlcywgYW5kIGEgZmFjdG9yIAorICogICAgICAgICAgICAgICBvZiAxMDAgcHJvZHVjZXMgdGhlIGxhcmdlc3QsIGJlc3QgcXVhbGl0eSBpbWFnZXMuICBBIAorICogICAgICAgICAgICAgICB0eXBpY2FsIGRlZmF1bHQgaXMgNzUgZm9yIHNtYWxsIGdvb2QgcXVhbGl0eSBpbWFnZXMgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfVTMyIG5RRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX0lNQUdFX1BBUkFNX1FGQUNUT1JUWVBFOworCisvKiogCisgKiBRdWFudGl6YXRpb24gdGFibGUgdHlwZSAKKyAqLworCit0eXBlZGVmIGVudW0gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7CisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTHVtYSA9IDAsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNiLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUNocm9tYUNyLAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKKworLyoqIAorICogSlBFRyBxdWFudGl6YXRpb24gdGFibGVzIGFyZSB1c2VkIHRvIGRldGVybWluZSBEQ1QgY29tcHJlc3Npb24gZm9yCisgKiBZVVYgZGF0YSwgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gc3BlY2lmeWluZyBRIGZhY3RvciwgcHJvdmlkaW5nIGV4YWN0IAorICogY29udHJvbCBvZiBjb21wcmVzc2lvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZVF1YW50aXphdGlvblRhYmxlICAgICAgOiBRdWFudGl6YXRpb24gdGFibGUgdHlwZQorICogIG5RdWFudGl6YXRpb25NYXRyaXhbNjRdIDogSlBFRyBxdWFudGl6YXRpb24gdGFibGUgb2YgY29lZmZpY2llbnRzIHN0b3JlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGluY3JlYXNpbmcgY29sdW1ucyB0aGVuIGJ5IHJvd3Mgb2YgZGF0YSAoaS5lLiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdyAxLCAuLi4gcm93IDgpLiBRdWFudGl6YXRpb24gdmFsdWVzIGFyZSBpbiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByYW5nZSAwLTI1NSBhbmQgc3RvcmVkIGluIGxpbmVhciBvcmRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhlIGNvbXBvbmVudCB3aWxsIHppZy16YWcgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uIHRhYmxlIGRhdGEgaWYgcmVxdWlyZWQgaW50ZXJuYWxseSkgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIGVRdWFudGl6YXRpb25UYWJsZTsKKyAgICBPTVhfVTggblF1YW50aXphdGlvbk1hdHJpeFs2NF07Cit9IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEU7CisKKworLyoqIAorICogSHVmZm1hbiB0YWJsZSB0eXBlLCB0aGUgc2FtZSBIdWZmbWFuIHRhYmxlIGlzIGFwcGxpZWQgZm9yIGNocm9tYSBhbmQgCisgKiBsdW1hIGNvbXBvbmVudCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIHsKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUMgPSAwLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQywKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlQUNMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlRENMdW1hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0Nocm9tYSwKKyAgICBPTVhfSU1BR0VfSHVmZm1hblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFOworCisvKiogCisgKiBKUEVHIEh1ZmZtYW4gdGFibGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUh1ZmZtYW5UYWJsZSAgICAgICAgICAgICAgICAgICAgOiBIdWZmbWFuIHRhYmxlIHR5cGUKKyAqICBuTnVtYmVyT2ZIdWZmbWFuQ29kZU9mTGVuZ3RoWzE2XSA6IDAtMTYsIG51bWJlciBvZiBIdWZmbWFuIGNvZGVzIG9mIGVhY2ggCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBsZW5ndGgKKyAqICBuSHVmZm1hblRhYmxlWzI1Nl0gICAgICAgICAgICAgICA6IDAtMjU1LCB0aGUgc2l6ZSB1c2VkIGZvciBBQyBhbmQgREMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdWZmbWFuVGFibGUgYXJlIDE2IGFuZCAxNjIgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9IVUZGTUFOVEFCTEVUWVBFIGVIdWZmbWFuVGFibGU7CisgICAgT01YX1U4IG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdOworICAgIE9NWF9VOCBuSHVmZm1hblRhYmxlWzI1Nl07Cit9T01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFOworCisvKiogQH0gKi8KKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGI4ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9JbmRleC5oCkBAIC0wLDAgKzEsMjc1IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKKyAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogQGZpbGUgT01YX0luZGV4LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0luZGV4IGhlYWRlciBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9ucyBmb3IgYm90aCBhcHBsaWNhdGlvbnMKKyAqICBhbmQgY29tcG9uZW50cyAuCisgKi8KKworCisjaWZuZGVmIE9NWF9JbmRleF9oCisjZGVmaW5lIE9NWF9JbmRleF9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKyNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KKworCisvKiogVGhlIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYSBzdHJ1Y3R1cmUgd2hlbiBlaXRoZXIKKyAqICBnZXR0aW5nIG9yIHNldHRpbmcgcGFyYW1ldGVycyBhbmQvb3IgY29uZmlndXJhdGlvbiBkYXRhLiAgRWFjaCBlbnRyeSBpbiAKKyAqICB0aGlzIGVudW1lcmF0aW9uIG1hcHMgdG8gYW4gT01YIHNwZWNpZmllZCBzdHJ1Y3R1cmUuICBXaGVuIHRoZSAKKyAqICBPTVhfR2V0UGFyYW1ldGVyLCBPTVhfU2V0UGFyYW1ldGVyLCBPTVhfR2V0Q29uZmlnIG9yIE9NWF9TZXRDb25maWcgbWV0aG9kcworICogIGFyZSB1c2VkLCB0aGUgc2Vjb25kIHBhcmFtZXRlciB3aWxsIGFsd2F5cyBiZSBhbiBlbnRyeSBmcm9tIHRoaXMgZW51bWVyYXRpb24KKyAqICBhbmQgdGhlIHRoaXJkIGVudHJ5IHdpbGwgYmUgdGhlIHN0cnVjdHVyZSBzaG93biBpbiB0aGUgY29tbWVudHMgZm9yIHRoZSBlbnRyeS4KKyAqICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIGluaXRpYWxpemluZyBhIGNyb3BwaW5nIGZ1bmN0aW9uLCB0aGUgCisgKiAgT01YX1NldENvbmZpZyBjb21tYW5kIHdvdWxkIGhhdmUgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIAorICogIGFuZCB3b3VsZCBzZW5kIGEgcG9pbnRlciB0byBhbiBpbml0aWFsaXplZCBPTVhfUkVDVFRZUEUgc3RydWN0dXJlIGFzIHRoZSAKKyAqICB0aGlyZCBwYXJhbWV0ZXIuCisgKiAgCisgKiAgVGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUgT01YX0NvbmZpZyBwcmVmaXggYXJlIHNlbnQgdXNpbmcKKyAqICB0aGUgT01YX1NldENvbmZpZyBjb21tYW5kIGFuZCB0aGUgZW51bWVyYXRpb24gZW50cmllcyBuYW1lZCB3aXRoIHRoZQorICogIE9NWF9QQVJBTV8gcHJlZml4IGFyZSBzZW50IHVzaW5nIHRoZSBPTVhfU2V0UGFyYW1ldGVyIGNvbW1hbmQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfSU5ERVhUWVBFIHsKKworICAgIE9NWF9JbmRleENvbXBvbmVudFN0YXJ0VW51c2VkID0gMHgwMTAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbVByaW9yaXR5TWdtdCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QUklPUklUWU1HTVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1JbWFnZUluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0luaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1PdGhlckluaXQsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUE9SVF9QQVJBTV9UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1OdW1BdmFpbGFibGVTdHJlYW1zLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fVTMyVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQWN0aXZlU3RyZWFtLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVN1c3BlbnNpb25Qb2xpY3ksICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tcG9uZW50U3VzcGVuZGVkLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NVU1BFTlNJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ2FwdHVyaW5nLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAorICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmVNb2RlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgKi8gCisgICAgT01YX0luZGV4QXV0b1BhdXNlQWZ0ZXJDYXB0dXJlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JPT0xFQU5UWVBFICovIAorICAgIE9NWF9JbmRleFBhcmFtQ29udGVudFVSSSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1DdXN0b21Db250ZW50UGlwZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fQ09OVEVOVFBJUEVUWVBFICovIAorICAgIE9NWF9JbmRleFBhcmFtRGlzYWJsZVJlc291cmNlQ29uY2VhbG1lbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUkVTT1VSQ0VDT05DRUFMTUVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW1Db3VudCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNQ09VTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29udGFpbmVyTm9kZUNvdW50LCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdNZXRhZGF0YUl0ZW0sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUVUQURBVEFJVEVNVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvdW50ZXJOb2RlSUQsICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UQUlORVJOT0RFSURUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUZpbHRlclR5cGUsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1NZXRhZGF0YUtleUZpbHRlciwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnUHJpb3JpdHlNZ210LCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUFJJT1JJVFlNR01UVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICovCisKKyAgICBPTVhfSW5kZXhQb3J0U3RhcnRVbnVzZWQgPSAweDAyMDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb24sICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhSZXNlcnZlZFN0YXJ0VW51c2VkID0gMHgwMzAwMDAwMCwKKworICAgIC8qIEF1ZGlvIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4QXVkaW9TdGFydFVudXNlZCA9IDB4MDQwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGNtLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QQ01NT0RFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BYWMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FBQ1BST0ZJTEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1JhLCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUkFUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb01wMywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTVAzVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9BZHBjbSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzIzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0c3MjksICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQW1yLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1dtYSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TYmMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NCQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTWlkaSwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NSURJVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NaWRpTG9hZFVzZXJTb3VuZCwgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI2LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0dzbV9FRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fSFIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUhSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRlIsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9QZGNfRUZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0hSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVGRtYV9GUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRUZSLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVERNQUVGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUWNlbHA4LCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwMTMsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRXZyYywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9FVlJDVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9TbXYsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1NNVlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvVm9yYmlzLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFICovCisKKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlJbW1lZGlhdGVFdmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTWlkaUNvbnRyb2wsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTb3VuZEJhbmtQcm9ncmFtLCAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NSURJU09VTkRCQU5LUFJPR1JBTVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlTdGF0dXMsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnQsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlNZXRhRXZlbnREYXRhLCAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Wb2x1bWUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0JhbGFuY2UsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQkFMQU5DRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxNdXRlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NdXRlLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Mb3VkbmVzcywgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvRWNob0NhbmNlbGF0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9Ob2lzZVJlZHVjdGlvbiwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX05PSVNFUkVEVUNUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQmFzcywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvVHJlYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9TdGVyZW9XaWRlbmluZywgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvQ2hvcnVzLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9FcXVhbGl6ZXIsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb1JldmVyYmVyYXRpb24sICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfUkVWRVJCRVJBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0NoYW5uZWxWb2x1bWUsICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTFZPTFVNRVRZUEUgKi8KKworICAgIC8qIEltYWdlIHNwZWNpZmljIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4SW1hZ2VTdGFydFVudXNlZCA9IDB4MDUwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1JbWFnZVBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUZsYXNoQ29udHJvbCwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnRm9jdXNDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfQ09ORklHX0ZPQ1VTQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVFGYWN0b3IsICAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9RRkFDVE9SVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtUXVhbnRpemF0aW9uVGFibGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtSHVmZm1hblRhYmxlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnRmxhc2hDb250cm9sLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSAqLworCisgICAgLyogVmlkZW8gc3BlY2lmaWMgcGFyYW1ldGVycyBhbmQgY29uZmlndXJhdGlvbnMgKi8KKyAgICBPTVhfSW5kZXhWaWRlb1N0YXJ0VW51c2VkID0gMHgwNjAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9RdWFudGl6YXRpb24sICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1FVQU5USVpBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvRmFzdFVwZGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTW90aW9uVmVjdG9yLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0ludHJhUmVmcmVzaCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb24sICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvVkJTTUMsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzIsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvTXBlZzQsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvV212LCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1J2LCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUlZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0F2YywgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9IMjYzLCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkLCAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudCwgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9CaXRyYXRlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9GcmFtZXJhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFNQlJlZnJlc2gsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9NQkVycm9yUmVwb3J0aW5nLCAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb01hY3JvYmxvY2tzUGVyRnJhbWUsIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9NYWNyb0Jsb2NrRXJyb3JNYXAsIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvU2xpY2VGTU8sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvQVZDSW50cmFQZXJpb2QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19BVkNJTlRSQVBFUklPRCAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTmFsU2l6ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFICovCisKKyAgICAvKiBJbWFnZSAmIFZpZGVvIGNvbW1vbiBDb25maWd1cmF0aW9ucyAqLworICAgIE9NWF9JbmRleENvbW1vblN0YXJ0VW51c2VkID0gMHgwNzAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkRlYmxvY2tpbmcsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uU2Vuc29yTW9kZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1Db21tb25JbnRlcmxlYXZlLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckZvcm1hdENvbnZlcnNpb24sIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25TY2FsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW1hZ2VGaWx0ZXIsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yRW5oYW5jZW1lbnQsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkVOSEFOQ0VNRU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbG9yS2V5LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUktFWVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckJsZW5kLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JCTEVORFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25GcmFtZVN0YWJpbGlzYXRpb24sLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblJvdGF0ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ST1RBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25NaXJyb3IsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUlSUk9SVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dFBvc2l0aW9uLCAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19QT0lOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25JbnB1dENyb3AsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25EaWdpdGFsWm9vbSwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3B0aWNhbFpvb20sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uV2hpdGVCYWxhbmNlLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1dISVRFQkFMQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeHBvc3VyZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRVhQT1NVUkVDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkNvbnRyYXN0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UUkFTVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25CcmlnaHRuZXNzLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25CYWNrbGlnaHQsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQkFDS0xJR0hUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkdhbW1hLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19HQU1NQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25TYXR1cmF0aW9uLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25MaWdodG5lc3MsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4Y2x1c2lvblJlY3QsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19SRUNUVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkRpdGhlcmluZywgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19ESVRIRVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uUGxhbmVCbGVuZCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1BMQU5FQkxFTkRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhwb3N1cmVWYWx1ZSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0U2l6ZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfRlJBTUVTSVpFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uRXh0cmFRdWFudERhdGEsICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0VYVFJBREFUQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Gb2N1c1JlZ2lvbiwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRm9jdXNTdGF0dXMsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uVHJhbnNpdGlvbkVmZmVjdCwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFICovCisKKyAgICAvKiBSZXNlcnZlZCBDb25maWd1cmF0aW9uIHJhbmdlICovCisgICAgT01YX0luZGV4T3RoZXJTdGFydFVudXNlZCA9IDB4MDgwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1PdGhlclBvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdPdGhlclBvd2VyLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnT3RoZXJTdGF0cywgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfQ09ORklHX1NUQVRTVFlQRSAqLworCisKKyAgICAvKiBSZXNlcnZlZCBUaW1lIHJhbmdlICovCisgICAgT01YX0luZGV4VGltZVN0YXJ0VW51c2VkID0gMHgwOTAwMDAwMCwKKyAgICBPTVhfSW5kZXhDb25maWdUaW1lU2NhbGUsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xvY2tTdGF0ZSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19DTE9DS1NUQVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVBY3RpdmVSZWZDbG9jaywgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50TWVkaWFUaW1lLCAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHJlYWQgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFdhbGxUaW1lLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIChyZWFkIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRBdWRpb1JlZmVyZW5jZSwgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lTWVkaWFUaW1lUmVxdWVzdCwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19NRURJQVRJTUVSRVFVRVNUVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lLCAgICAgLyoqPHJlZmVyZW5jZTogIE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICh3cml0ZSBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVQb3NpdGlvbiwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lU2Vla01vZGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19TRUVLTU9ERVRZUEUgKi8KKworCisgICAgT01YX0luZGV4S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIC8qIFZlbmRvciBzcGVjaWZpYyBhcmVhICovCisgICAgT01YX0luZGV4VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLAorICAgIC8qIFZlbmRvciBzcGVjaWZpYyBzdHJ1Y3R1cmVzIHNob3VsZCBiZSBpbiB0aGUgcmFuZ2Ugb2YgMHg3RjAwMDAwMCAKKyAgICAgICB0byAweDdGRkZGRkZFLiAgVGhpcyByYW5nZSBpcyBub3QgYnJva2VuIG91dCBieSB2ZW5kb3IsIHNvCisgICAgICAgcHJpdmF0ZSBpbmRleGVzIGFyZSBub3QgZ3VhcmFudGVlZCB1bmlxdWUgYW5kIHRoZXJlZm9yZSBzaG91bGQKKyAgICAgICBvbmx5IGJlIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIGNvbXBvbmVudC4gKi8KKworICAgIE9NWF9JbmRleE1heCA9IDB4N0ZGRkZGRkYKKworfSBPTVhfSU5ERVhUWVBFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX090aGVyLmggYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX090aGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiY2U4MwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfT3RoZXIuaApAQCAtMCwwICsxLDM1NCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIEBmaWxlIE9NWF9PdGhlci5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IE90aGVyIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KKyAqLworCisjaWZuZGVmIE9NWF9PdGhlcl9oCisjZGVmaW5lIE9NWF9PdGhlcl9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKworLyoqIAorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGF0YSB0eXBlcyB3aGljaCBtYXRjaCB0byBtdWx0aXBsZSBkb21haW5zIG9yIG5vCisgKiBkb21haW4gYXQgYWxsLiAgRm9yIHR5cGVzIHdoaWNoIGFyZSB2ZW5kb3Igc3BlY2lmaWMsIGEgdmFsdWUgYWJvdmUKKyAqIE9NWF9PVEhFUl9WRU5ET1JUU1RBUlQgc2hvdWxkIGJlIHVzZWQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfT1RIRVJfRk9STUFUVFlQRSB7CisgICAgT01YX09USEVSX0Zvcm1hdFRpbWUgPSAwLCAvKio8IFRyYW5zbWlzc2lvbiBvZiB2YXJpb3VzIHRpbWVzdGFtcHMsIGVsYXBzZWQgdGltZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsIGV0YyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRCaW5hcnksICAgLyoqPCBBcmJpdHJhcnkgYmluYXJ5IGRhdGEgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yUmVzZXJ2ZWQgPSAxMDAwLCAvKio8IFN0YXJ0aW5nIHZhbHVlIGZvciB2ZW5kb3Igc3BlY2lmaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzICovCisKKyAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9PVEhFUl9GT1JNQVRUWVBFOworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBzZWVrIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfU0VFS01PREVUWVBFIHsKKyAgICBPTVhfVElNRV9TZWVrTW9kZUZhc3QgPSAwLCAvKio8IFByZWZlciBzZWVraW5nIHRvIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlciAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NpdGlvbiBvdmVyIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gZXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGl0IHJlc3VsdHMgaW4gYSBzbG93ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVElNRV9TZWVrTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1RJTUVfU2Vla01vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1NFRUtNT0RFVFlQRTsKKworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc2Vla21vZGUgb2YgdGhlIGNvbXBvbmVudCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfU0VFS01PREVUWVBFIGVUeXBlOyAgICAvKio8IFRoZSBzZWVrIG1vZGUgKi8KK30gT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRTsKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MgCisgKiBvbiB0aGUgQ2xvY2sgQ29tcG9uZW50IChDQyk6CisgKiAKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgd2FsbCAgCisgKiAgICAgdGltZQorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgbWVkaWEKKyAqICAgICB0aW1lCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCisgKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKKyAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCisgKiAgICAgY2xpZW50IHBvcnQgd2hlbiBpdCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoCisgKiAgICAgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIHNldC4gSXQgbXVzdCB1c2UgdGhlIHRpbWVzdGFtcAorICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLiAKKyAqCisgKiBJdJJzIGFsc28gdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9uIGNvbXBvbmVudHMgaW4gZ2VuZXJhbDoKKyAqCisgKiBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb246IElMIGNsaWVudCBxdWVyeWluZyBjb21wb25lbnQgcG9zaXRpb24gCisgKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCisgKiAoU2V0Q29uZmlnKQorICovCQordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVElDS1MgblRpbWVzdGFtcDsgIAkgICAgIC8qKjwgdGltZXN0YW1wIC4qLyAKK30gT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEU7ICAKKworLyoqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJlZmVyZW5jZSBjbG9ja3MgdG8gdGhlIG1lZGlhIHRpbWUuICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfVVBEQVRFVFlQRSB7CisgICAgICBPTVhfVElNRV9VcGRhdGVSZXF1ZXN0RnVsZmlsbG1lbnQsICAgIC8qKjwgVXBkYXRlIGlzIHRoZSBmdWxmaWxsbWVudCBvZiBhIG1lZGlhIHRpbWUgcmVxdWVzdC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwJICAgICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIHNjYWxlIGNoYWduZWQuICovCisgICAgICBPTVhfVElNRV9VcGRhdGVDbG9ja1N0YXRlQ2hhbmdlZCwgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgY2xvY2sgc3RhdGUgY2hhbmdlZC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1VQREFURVRZUEU7CisKKy8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwordHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7CisgICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja1ZpZGVvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UgKi8KKyAgICAgIE9NWF9USU1FX1JlZkNsb2NrS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKKworLyoqIEVudW1lcmF0aW9uIG9mIGNsb2NrIHN0YXRlcy4gKi8KK3R5cGVkZWYgZW51bSBPTVhfVElNRV9DTE9DS1NUQVRFIHsKKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVSdW5uaW5nLCAgICAgICAgICAgICAvKio8IENsb2NrIHJ1bm5pbmcuICovCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlV2FpdGluZ0ZvclN0YXJ0VGltZSwgLyoqPCBDbG9jayB3YWl0aW5nIHVudGlsIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLworICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX0NMT0NLU1RBVEU7CisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgbWVkaWEgdGltZSByZXF1ZXN0IHRvIHRoZSBjbG9jayBjb21wb25lbnQuCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZworICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKKyAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCisgKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCisgKiAgdGltZXN0YW1wLgorICoKKyAqICBUaGUgY2xpZW50IG1heSByZXF1aXJlIGEgbWVkaWEgdGltZSByZXF1ZXN0IGJlIGZ1bGZpbGxlZCBzbGlnaHRseQorICogIGVhcmxpZXIgdGhhbiB0aGUgbWVkaWEgdGltZSBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xpZW50IHNwZWNpZmllcyAKKyAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZyAKKyAqICB0byB0aGUgcmVxdWVzdGVkIG1lZGlhIHRpbWUgYW5kIHRoZSB3YWxsIHRpbWUgd2hlbiBpdCB3aWxsIGJlIAorICogIGZ1bGZpbGxlZC4gCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KKyAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0CisgKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCisgKiAgbWVkaWEgdGltZSByZXF1ZXN0IGF0IFQgKHBlcmhhcHMgc3BlY2lmeWluZyBhbiBvZmZzZXQgdG8gZW5zdXJlIHRoZSByZXF1ZXN0IGZ1bGZpbGxtZW50CisgKiAgaXMgYSBsaXR0bGUgZWFybHkpLiBXaGVuIHRoZSBjbG9jayBjb21wb25lbnQgcGFzc2VzIHRoZSByZXN1bHRpbmcgT01YX1RJTUVfTUVESUFUSU1FVFlQRQorICogIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjbGllbnQgY29tcG9uZW50LCB0aGUgY2xpZW50IG1heSBwZXJmb3JtIG9wZXJhdGlvbiBPIChwZXJoYXBzIGhhdmluZworICogIHRvIHdhaXQgYSBzbGlnaHQgYW1vdW50IG1vcmUgdGltZSBpdHNlbGYgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWVzKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHVwZGF0ZXMuICovCisgICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgIC8qKjwgTWVkaWEgdGltZXN0YW1wIHJlcXVlc3RlZC4qLyAKKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KK30gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOworCisvKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKKyAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCisgKgorICogICBJbiB0aGUgZm9ybWVyIGNhc2UgdGhlIENsb2NrIENvbXBvbmVudCBmaWxscyB0aGlzIHN0cnVjdHVyZSBhbmQgdGltZXMgaXRzIGVtaXNzaW9uIAorICogICB0byBhIGNsaWVudCBjb21wb25lbnQgKHZpYSB0aGUgY2xpZW50IHBvcnQpIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtZWRpYSAKKyAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKKyAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKKyAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAorICoKKyAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAorICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAorICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKKyAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKKyAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKKyAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKKyAqCisgKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgc29tZSBjbG9jayBjb21wb25lbnRzIG1heSBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3RzCisgKiAgIGF0IGV4YWN0bHkgdGhlIHByZXNjcmliZWQgdGltZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNvIGxvbmcgYXMgdGhlIHJlcXVlc3QgaXMgCisgKiAgIGZ1bGZpbGxlZCBhdCBsZWFzdCBhcyBlYXJseSBhcyBkZXNjcmliZWQgYW5kIG5vdCBsYXRlci4gVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgCisgKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgorICoKKyAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAorICogICB3YWxsIHRpbWUgdW50aWwgdGhlIG5NZWRpYVRpbWVzdGFtcCBhY3R1YWxseSBvY2N1cnMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKKyAqICAgY2xpZW50IGNhbiBnZXQgYSBtb3JlIGFjY3VyYXRlIHZhbHVlIGZvciBvZmZzZXQgYnkgZ2V0dGluZyB0aGUgY3VycmVudCB3YWxsCisgKiAgIGZyb20gdGhlIGNsb2MgY29tcG9uZW50IGFuZCBzdWJ0cmFjdGluZyBpdCBmcm9tIG5XYWxsVGltZUF0TWVkaWEuIAorICovCisKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX01FRElBVElNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgbkNsaWVudFByaXZhdGU7ICAgICAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIHZhbHVlIG9mIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIHRpbWUgc2NhbGUgdXBkYXRlcy4gKi8KKyAgICBPTVhfVElNRV9VUERBVEVUWVBFIGVVcGRhdGVUeXBlOyAvKio8IFJlYXNvbiBmb3IgdGhlIHVwZGF0ZSAqLworICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAgICAgLyoqPCBNZWRpYSB0aW1lIHJlcXVlc3RlZC4gSWYgbm8gbWVkaWEgdGltZSB3YXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8gCisgICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgYnkgd2hpY2ggdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHdhcyBhY3R1YWxseSBmdWxmaWxsZWQgZWFybHkgKi8KKworICAgIE9NWF9USUNLUyBuV2FsbFRpbWVBdE1lZGlhVGltZTsgLyoqPCBXYWxsIHRpbWUgY29ycmVzcG9uZGluZyB0byBuTWVkaWFUaW1lU3RhbXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgY2xpZW50IG1heSBjb21wYXJlIHRoaXMgdmFsdWUgdG8gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBtZWRpYSB0aW1lIG9idGFpbmVkIGZyb20gdGhlIENsb2NrIENvbXBvbmVudCB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIHdhbGwgdGltZSB1bnRpbCB0aGUgbWVkaWEgdGltZXN0YW1wIGlzIHJlYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50LiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KKyAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLworfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCisgKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKKyAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAorICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLworfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOworIAorLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQwIDB4MDAwMDAwMDEKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDEgMHgwMDAwMDAwMgorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMiAweDAwMDAwMDA0CisjZGVmaW5lIE9NWF9DTE9DS1BPUlQzIDB4MDAwMDAwMDgKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDQgMHgwMDAwMDAxMAorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNSAweDAwMDAwMDIwCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQ2IDB4MDAwMDAwNDAKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDcgMHgwMDAwMDA4MAorCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBtZWRpYSBjbG9jay4gCisgKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZSAKKyAqICBtZWRpYSBjbG9jayBvZiB0aGUgY2xvY2sgY29tcG9uZW50LiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sKKyAqICBjb21wb25lbnQuIAorICogIAorICogIE9uIGEgU2V0Q29uZmlnIGlmIGVTdGF0ZSBpcyBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZyBtZWRpYSB0aW1lCisgKiAgc3RhcnRzIGltbWVkaWF0ZWx5IGF0IHRoZSBwcmVzY3JpYmVkIHN0YXJ0IHRpbWUuIElmCisgKiAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUgdGhlIENsb2NrIENvbXBvbmVudCBpZ25vcmVzCisgKiAgdGhlIGdpdmVuIG5TdGFydFRpbWUgYW5kIHdhaXRzIGZvciBhbGwgY2xpZW50cyBzcGVjaWZpZWQgaW4gdGhlIAorICogIG5XYWl0TWFzayB0byBzZW5kIHN0YXJ0dGltZXMgKHZpYSAKKyAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cyAKKyAqICB0aGUgbWVkaWEgY2xvY2sgdXNpbmcgdGhlIGVhcmxpZXN0IHN0YXJ0IHRpbWUgc3VwcGxpZWQuICovICAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIG1lZGlhIHRpbWUuICovCisgICAgT01YX1RJQ0tTIG5TdGFydFRpbWU7ICAgICAgIC8qKjwgU3RhcnQgdGltZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBUaW1lIHRvIG9mZnNldCB0aGUgbWVkaWEgdGltZSBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGUuZy4gcHJlcm9sbCkuIE1lZGlhIHRpbWUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXBvcnRlZCB0byBiZSBuT2Zmc2V0IHRpY2tzIGVhcmxpZXIuICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KK30gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOworCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCisgKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAorICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRTsKKworLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHBvd2VyIHR5cGUuCisgKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlUE07ICAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgUG93ZXIgTWFuYWdlbWVudCAqLworfSBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRTsKKworCisvKiogRGVzY3JpcHRvciBmb3Igc2V0dGluZyBzcGVjaWZpY3Mgb2Ygc3RhdHMgdHlwZS4KKyAqICBOb3RlOiB0aGlzIHN0cnVjdHVyZSBpcyBsaXN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIC8qIHdoYXQgZ29lcyBoZXJlICovCit9IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFOworCisKKy8qKgorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBvdGhlciAKKyAqIHBhdGguCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCit9IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEU7CisKKy8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKKyAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KKyAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KK30gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9UeXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZmQ0YmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL29wZW5tYXgvT01YX1R5cGVzLmgKQEAgLTAsMCArMSwzNjUgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKKyAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucworICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICovCisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfVHlwZXMuaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBPTVhfVHlwZXMgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIHByaW1pdGl2ZSB0eXBlIGRlZmluaXRpb25zIHVzZWQgYnkgCisgKiAgdGhlIGNvcmUsIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudC4gIFRoaXMgZmlsZSBtYXkgbmVlZCB0byBiZQorICogIG1vZGlmaWVkIHRvIGJlIHVzZWQgb24gc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlICJjaGFyIiBzZXQgdG8gOCBiaXRzLCAKKyAqICAic2hvcnQiIHNldCB0byAxNiBiaXRzIGFuZCAibG9uZyIgc2V0IHRvIDMyIGJpdHMuCisgKi8KKworI2lmbmRlZiBPTVhfVHlwZXNfaAorI2RlZmluZSBPTVhfVHlwZXNfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBUaGUgT01YX0FQSSBhbmQgT01YX0FQSUVOVFJZIGFyZSBwbGF0Zm9ybSBzcGVjaWZpYyBkZWZpbml0aW9ucyB1c2VkCisgKiAgdG8gZGVjbGFyZSBPTVggZnVuY3Rpb24gcHJvdG90eXBlcy4gIFRoZXkgYXJlIG1vZGlmaWVkIHRvIG1lZXQgdGhlCisgKiAgcmVxdWlyZW1lbnRzIGZvciBhIHBhcnRpY3VsYXIgcGxhdGZvcm0gKi8KKyNpZmRlZiBfX1NZTUJJQU4zMl9fICAgCisjICAgaWZkZWYgX19PTVhfRVhQT1JUUworIyAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyMgICBlbHNlCisjICAgICAgIGlmZGVmIF9XSU4zMgorIyAgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpIAorIyAgICAgICBlbHNlCisjICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICAgZW5kaWYKKyMgICBlbmRpZgorI2Vsc2UKKyMgICBpZmRlZiBfV0lOMzIKKyMgICAgICBpZmRlZiBfX09NWF9FWFBPUlRTCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgICAgIGVsc2UKKy8vIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyNkZWZpbmUgT01YX0FQSQorIyAgICAgIGVuZGlmCisjICAgZWxzZQorIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKKyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkKKyMgICAgICBlbHNlCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJIGV4dGVybgorIyAgICAgIGVuZGlmCisjICAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIE9NWF9BUElFTlRSWQorI2RlZmluZSBPTVhfQVBJRU5UUlkgCisjZW5kaWYgCisKKy8qKiBPTVhfSU4gaXMgdXNlZCB0byBpZGVudGlmeSBpbnB1dHMgdG8gYW4gT01YIGZ1bmN0aW9uLiAgVGhpcyBkZXNpZ25hdGlvbiAKKyAgICB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCBwb2ludHMgdG8gYSBwYXJhbWV0ZXIgCisgICAgdGhhdCBpcyB1c2VkIGFzIGFuIG91dHB1dC4gKi8KKyNpZm5kZWYgT01YX0lOCisjZGVmaW5lIE9NWF9JTgorI2VuZGlmCisKKy8qKiBPTVhfT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgb3V0cHV0cyBmcm9tIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgCisgICAgZGVzaWduYXRpb24gd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzIAorICAgIHRvIGEgcGFyYW1ldGVyIHRoYXQgaXMgdXNlZCBhcyBhbiBpbnB1dC4gKi8KKyNpZm5kZWYgT01YX09VVAorI2RlZmluZSBPTVhfT1VUCisjZW5kaWYKKworCisvKiogT01YX0lOT1VUIGlzIHVzZWQgdG8gaWRlbnRpZnkgcGFyYW1ldGVycyB0aGF0IG1heSBiZSBlaXRoZXIgaW5wdXRzIG9yCisgICAgb3V0cHV0cyBmcm9tIGFuIE9NWCBmdW5jdGlvbiBhdCB0aGUgc2FtZSB0aW1lLiAgVGhpcyBkZXNpZ25hdGlvbiB3aWxsIAorICAgIGFsc28gYmUgdXNlZCBpbiB0aGUgY2FzZSBvZiBhIHBvaW50ZXIgdGhhdCAgcG9pbnRzIHRvIGEgcGFyYW1ldGVyIHRoYXQgCisgICAgaXMgdXNlZCBib3RoIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQuICovCisjaWZuZGVmIE9NWF9JTk9VVAorI2RlZmluZSBPTVhfSU5PVVQKKyNlbmRpZgorCisvKiogT01YX0FMTCBpcyB1c2VkIHRvIGFzIGEgd2lsZGNhcmQgdG8gc2VsZWN0IGFsbCBlbnRpdGllcyBvZiB0aGUgc2FtZSB0eXBlCisgKiAgd2hlbiBzcGVjaWZ5aW5nIHRoZSBpbmRleCwgb3IgcmVmZXJyaW5nIHRvIGEgb2JqZWN0IGJ5IGFuIGluZGV4LiAgKGkuZS4KKyAqICB1c2UgT01YX0FMTCB0byBpbmRpY2F0ZSBhbGwgTiBjaGFubmVscykuIFdoZW4gdXNlZCBhcyBhIHBvcnQgaW5kZXgKKyAqICBmb3IgYSBjb25maWcgb3IgcGFyYW1ldGVyIHRoaXMgT01YX0FMTCBkZW5vdGVzIHRoYXQgdGhlIGNvbmZpZyBvcgorICogIHBhcmFtZXRlciBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY29tcG9uZW50IG5vdCBqdXN0IG9uZSBwb3J0LiAqLworI2RlZmluZSBPTVhfQUxMIDB4RkZGRkZGRkYKKworLyoqIEluIHRoZSBmb2xsb3dpbmcgd2UgZGVmaW5lIGdyb3VwcyB0aGF0IGhlbHAgYnVpbGRpbmcgZG94eWdlbiBkb2N1bWVudGF0aW9uICovCisKKy8qKiBAZGVmZ3JvdXAgY29yZSBPcGVuTUFYIElMIGNvcmUKKyAqIEZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIE9NWCBJTCBjb3JlCisgKi8KKyAKKyAvKiogQGRlZmdyb3VwIGNvbXAgT3Blbk1BWCBJTCBjb21wb25lbnQKKyAqIEZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlIHJlbGF0ZWQgdG8gdGhlIE9NWCBJTCBjb21wb25lbnQKKyAqLworIAorLyoqIEBkZWZncm91cCBycG0gUmVzb3VyY2UgYW5kIFBvbGljeSBNYW5hZ2VtZW50IAorICogU3RydWN0dXJlcyBmb3IgcmVzb3VyY2UgYW5kIHBvbGljeSBtYW5hZ2VtZW50IG9mIGNvbXBvbmVudHMKKyAqLworCisvKiogQGRlZmdyb3VwIGJ1ZiBCdWZmZXIgTWFuYWdlbWVudAorICogQnVmZmVyIGhhbmRsaW5nIGZ1bmN0aW9ucyBhbmQgc3RydWN0dXJlcworICovCisgIAorLyoqIEBkZWZncm91cCB0dW4gVHVubmVsaW5nCisgKiBAaW5ncm91cCBjb3JlIGNvbXAKKyAqIFN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyB0byBtYW5hZ2UgdHVubmVscyBhbW9uZyBjb21wb25lbnQgcG9ydHMKKyAqLworIAorLyoqIEBkZWZncm91cCBjcCBDb250ZW50IFBpcGVzCisgKiAgQGluZ3JvdXAgY29yZQorICovCisgCisgLyoqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YSBoYW5kbGluZworICAqIAorICAqLyAKKworLyoqIE9NWF9VOCBpcyBhbiA4IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIGJ5dGUgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VODsKKworLyoqIE9NWF9TOCBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIGNoYXIgT01YX1M4OworCisvKiogT01YX1UxNiBpcyBhIDE2IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgT01YX1UxNjsKKworLyoqIE9NWF9TMTYgaXMgYSAxNiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMTYgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgc2hvcnQgT01YX1MxNjsKKworLyoqIE9NWF9VMzIgaXMgYSAzMiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgT01YX1UzMjsKKworLyoqIE9NWF9TMzIgaXMgYSAzMiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBPTVhfUzMyOworCisKKy8qIFVzZXJzIHdpdGggY29tcGlsZXJzIHRoYXQgY2Fubm90IGFjY2VwdCB0aGUgImxvbmcgbG9uZyIgZGVzaWduYXRpb24gc2hvdWxkCisgICBkZWZpbmUgdGhlIE9NWF9TS0lQNjRCSVQgbWFjcm8uICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG1heSBjYXVzZSAKKyAgIHNvbWUgY29tcG9uZW50cyB0byBmYWlsIHRvIGNvbXBpbGUgaWYgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbiB0byByZXF1aXJlCisgICA2NCBiaXQgaW50ZWdyYWwgdHlwZXMuICBIb3dldmVyLCB0aGVzZSBjb21wb25lbnRzIHdvdWxkIE5PVCBjb21waWxlIGFueXdheQorICAgc2luY2UgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgdGhlIHdheSB0aGUgY29tcG9uZW50IHdhcyB3cml0dGVuLgorKi8KKyNpZm5kZWYgT01YX1NLSVA2NEJJVAorI2lmZGVmIF9fU1lNQklBTjMyX18KKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKKworLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7CisKKyNlbGlmIGRlZmluZWQoV0lOMzIpCisKKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLyAgIAordHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBPTVhfVTY0OworCisvKiogT01YX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCAgIF9faW50NjQgIE9NWF9TNjQ7CisKKyNlbHNlIC8qIFdJTjMyICovCisKKy8qKiBPTVhfVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgT01YX1U2NDsKKworLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgbG9uZyBsb25nIE9NWF9TNjQ7CisKKyNlbmRpZiAvKiBXSU4zMiAqLworI2VuZGlmCisKKworLyoqIFRoZSBPTVhfQk9PTCB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcmVwcmVzZW50IGEgdHJ1ZSBvciBhIGZhbHNlIAorICAgIHZhbHVlIHdoZW4gcGFzc2luZyBwYXJhbWV0ZXJzIHRvIGFuZCBmcm9tIHRoZSBPTVggY29yZSBhbmQgY29tcG9uZW50cy4gIFRoZQorICAgIE9NWF9CT09MIGlzIGEgMzIgYml0IHF1YW50aXR5IGFuZCBpcyBhbGlnbmVkIG9uIGEgMzIgYml0IHdvcmQgYm91bmRhcnkuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQk9PTCB7CisgICAgT01YX0ZBTFNFID0gMCwKKyAgICBPTVhfVFJVRSA9ICFPTVhfRkFMU0UsCisgICAgT01YX0JPT0xfTUFYID0gMHg3RkZGRkZGRgorfSBPTVhfQk9PTDsgCisgCisvKiogVGhlIE9NWF9QVFIgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgcG9pbnRlcnMgYmV0d2VlbiB0aGUgT01YCisgICAgYXBwbGljYXRpb25zIGFuZCB0aGUgT01YIENvcmUgYW5kIGNvbXBvbmVudHMuICBUaGlzIGlzIGEgMzIgYml0IHBvaW50ZXIgYW5kCisgICAgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCBib3VuZGFyeS4KKyAqLwordHlwZWRlZiB2b2lkKiBPTVhfUFRSOworCisvKiogVGhlIE9NWF9TVFJJTkcgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgIkMiIHR5cGUgc3RyaW5ncyBiZXR3ZWVuCisgICAgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29yZSBhbmQgY29tcG9uZW50LiAgVGhlIE9NWF9TVFJJTkcgdHlwZSBpcyBhIDMyIAorICAgIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkIGFsaWduZWQgYW5kIAorICAgIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLiAgCisgKi8KK3R5cGVkZWYgY2hhciogT01YX1NUUklORzsKKworLyoqIFRoZSBPTVhfQllURSB0eXBlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gcGFzcyBhcnJheXMgb2YgYnl0ZXMgc3VjaCBhcworICAgIGJ1ZmZlcnMgYmV0d2VlbiB0aGUgYXBwbGljYXRpb24gYW5kIHRoZSBjb21wb25lbnQgYW5kIGNvcmUuICBUaGUgT01YX0JZVEUgCisgICAgdHlwZSBpcyBhIDMyIGJpdCBwb2ludGVyIHRvIGEgemVybyB0ZXJtaW5hdGVkIHN0cmluZy4gIFRoZSAgcG9pbnRlciBpcyB3b3JkCisgICAgYWxpZ25lZCBhbmQgdGhlIHN0cmluZyBpcyBieXRlIGFsaWduZWQuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciogT01YX0JZVEU7CisKKy8qKiBPTVhfVVVJRFRZUEUgaXMgYSB2ZXJ5IGxvbmcgdW5pcXVlIGlkZW50aWZpZXIgdG8gdW5pcXVlbHkgaWRlbnRpZnkKKyAgICBhdCBydW50aW1lLiAgVGhpcyBpZGVudGlmaWVyIHNob3VsZCBiZSBnZW5lcmF0ZWQgYnkgYSBjb21wb25lbnQgaW4gYSB3YXkKKyAgICB0aGF0IGd1YXJhbnRlZXMgdGhhdCBldmVyeSBpbnN0YW5jZSBvZiB0aGUgaWRlbnRpZmllciBydW5uaW5nIG9uIHRoZSBzeXN0ZW0KKyAgICBpcyB1bmlxdWUuICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgT01YX1VVSURUWVBFWzEyOF07CisKKy8qKiBUaGUgT01YX0RJUlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBhIHBvcnQgaXMgYW4gaW5wdXQgb3IKKyAgICBhbiBvdXRwdXQgcG9ydC4gIFRoaXMgZW51bWVyYXRpb24gaXMgY29tbW9uIGFjcm9zcyBhbGwgY29tcG9uZW50IHR5cGVzLiAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9ESVJUWVBFCit7CisgICAgT01YX0RpcklucHV0LCAgICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGFuIGlucHV0IHBvcnQgKi8KKyAgICBPTVhfRGlyT3V0cHV0LCAgICAgICAgICAgICAvKio8IFBvcnQgaXMgYW4gb3V0cHV0IHBvcnQgKi8KKyAgICBPTVhfRGlyTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRElSVFlQRTsKKworLyoqIFRoZSBPTVhfRU5ESUFOVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGluZGljYXRlIHRoZSBiaXQgb3JkZXJpbmcgCisgICAgZm9yIG51bWVyaWNhbCBkYXRhIChpLmUuIGJpZyBlbmRpYW4sIG9yIGxpdHRsZSBlbmRpYW4pLiAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9FTkRJQU5UWVBFCit7CisgICAgT01YX0VuZGlhbkJpZywgLyoqPCBiaWcgZW5kaWFuICovCisgICAgT01YX0VuZGlhbkxpdHRsZSwgLyoqPCBsaXR0bGUgZW5kaWFuICovCisgICAgT01YX0VuZGlhbk1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VORElBTlRZUEU7CisKKworLyoqIFRoZSBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBpZiBkYXRhIAorICAgIGlzIHNpZ25lZCBvciB1bnNpZ25lZAorICovCit0eXBlZGVmIGVudW0gT01YX05VTUVSSUNBTERBVEFUWVBFCit7CisgICAgT01YX051bWVyaWNhbERhdGFTaWduZWQsIC8qKjwgc2lnbmVkIGRhdGEgKi8KKyAgICBPTVhfTnVtZXJpY2FsRGF0YVVuc2lnbmVkLCAvKio8IHVuc2lnbmVkIGRhdGEgKi8KKyAgICBPTVhfTnVtZXJjaWFsRGF0YU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX05VTUVSSUNBTERBVEFUWVBFOworCisKKy8qKiBVbnNpZ25lZCBib3VuZGVkIHZhbHVlIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CVTMyIHsKKyAgICBPTVhfVTMyIG5WYWx1ZTsgLyoqPCBhY3R1YWwgdmFsdWUgKi8KKyAgICBPTVhfVTMyIG5NaW47ICAgLyoqPCBtaW5pbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPj0gbk1pbikgKi8KKyAgICBPTVhfVTMyIG5NYXg7ICAgLyoqPCBtYXhpbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPD0gbk1heCkgKi8KK30gT01YX0JVMzI7CisKKworLyoqIFNpZ25lZCBib3VuZGVkIHZhbHVlIHR5cGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9CUzMyIHsKKyAgICBPTVhfUzMyIG5WYWx1ZTsgLyoqPCBhY3R1YWwgdmFsdWUgKi8KKyAgICBPTVhfUzMyIG5NaW47ICAgLyoqPCBtaW5pbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPj0gbk1pbikgKi8KKyAgICBPTVhfUzMyIG5NYXg7ICAgLyoqPCBtYXhpbXVtIGZvciB2YWx1ZSAoaS5lLiBuVmFsdWUgPD0gbk1heCkgKi8KK30gT01YX0JTMzI7CisKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgc29tZSB0aW1lIG9yIGR1cmF0aW9uIGluIG1pY3Jvc2Vjb25kcy4gVGhpcyBzdHJ1Y3R1cmUKKyAgKiAgbXVzdCBiZSBpbnRlcnByZXRlZCBhcyBhIHNpZ25lZCA2NCBiaXQgdmFsdWUuIFRoZSBxdWFudGl0eSBpcyBzaWduZWQgdG8gYWNjb21tb2RhdGUgCisgICogIG5lZ2F0aXZlIGRlbHRhcyBhbmQgcHJlcm9sbCBzY2VuYXJpb3MuIFRoZSBxdWFudGl0eSBpcyByZXByZXNlbnRlZCBpbiBtaWNyb3NlY29uZHMgCisgICogIHRvIGFjY29tb2RhdGUgaGlnaCByZXNvbHV0aW9uIHRpbWVzdGFtcHMgKGUuZy4gRFZEIHByZXNlbnRhdGlvbiB0aW1lc3RhbXBzIGJhc2VkCisgICogIG9uIGEgOTBrSHogY2xvY2spIGFuZCB0byBhbGxvdyBtb3JlIGFjY3VyYXRlIGFuZCBzeW5jaHJvbml6ZWQgZGVsaXZlcnkgKGUuZy4gCisgICogIGluZGl2aWR1YWwgYXVkaW8gc2FtcGxlcyBkZWxpdmVyZWQgYXQgMTkyIGtIeikuIFRoZSBxdWFudGl0eSBpcyA2NCBiaXQgdG8gCisgICogIGFjY29tbW9kYXRlIGEgbGFyZ2UgZHluYW1pYyByYW5nZSAoc2lnbmVkIDMyIGJpdCB2YWx1ZXMgd291bGQgYWxsb3cgb25seSBmb3IgcGx1cworICAqICBvciBtaW51cyAzNSBtaW51dGVzKS4KKyAgKgorICAqICBJbXBsZW1lbnRhdGlvbnMgd2l0aCBsaW1pdGVkIHByZWNpc2lvbiBtYXkgY29udmVydCB0aGUgc2lnbmVkIDY0IGJpdCB2YWx1ZSB0byAKKyAgKiAgYSBzaWduZWQgMzIgYml0IHZhbHVlIGludGVybmFsbHkgYnV0IHJpc2sgbG9zcyBvZiBwcmVjaXNpb24uICAKKyAgKi8KKyNpZm5kZWYgT01YX1NLSVA2NEJJVAordHlwZWRlZiBPTVhfUzY0IE9NWF9USUNLUzsKKyNlbHNlCit0eXBlZGVmIHN0cnVjdCBPTVhfVElDS1MKK3sKKyAgICBPTVhfVTMyIG5Mb3dQYXJ0OyAgICAvKiogbG93IGJpdHMgb2YgdGhlIHNpZ25lZCA2NCBiaXQgdGljayB2YWx1ZSAqLworICAgIE9NWF9VMzIgbkhpZ2hQYXJ0OyAgIC8qKiBoaWdoIGJpdHMgb2YgdGhlIHNpZ25lZCA2NCBiaXQgdGljayB2YWx1ZSAqLworfSBPTVhfVElDS1M7CisjZW5kaWYKKyNkZWZpbmUgT01YX1RJQ0tTX1BFUl9TRUNPTkQgMTAwMDAwMAorCisvKiogRGVmaW5lIHRoZSBwdWJsaWMgaW50ZXJmYWNlIGZvciB0aGUgT01YIEhhbmRsZS4gIFRoZSBjb3JlIHdpbGwgbm90IHVzZQorICAgIHRoaXMgdmFsdWUgaW50ZXJuYWxseSwgYnV0IHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgb25seSB1c2UgdGhpcyB2YWx1ZS4KKyAqLwordHlwZWRlZiB2b2lkKiBPTVhfSEFORExFVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX01BUktUWVBFCit7CisgICAgT01YX0hBTkRMRVRZUEUgaE1hcmtUYXJnZXRDb21wb25lbnQ7ICAgLyoqPCBUaGUgY29tcG9uZW50IHRoYXQgd2lsbCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIGEgbWFyayBldmVudCB1cG9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyB0aGUgbWFyay4gKi8KKyAgICBPTVhfUFRSIHBNYXJrRGF0YTsgICAvKio8IEFwcGxpY2F0aW9uIHNwZWNpZmljIGRhdGEgYXNzb2NpYXRlZCB3aXRoIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmsgc2VudCBvbiBhIG1hcmsgZXZlbnQgdG8gZGlzYW1iaWd1YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXJrIGZyb20gb3RoZXJzLiAqLworfSBPTVhfTUFSS1RZUEU7CisKKworLyoqIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBpcyB1c2VkIHRvIG1hcCBhIE9NWCB2aWRlbyBwb3J0IHRvIHRoZQorICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgZGlzcGxheSAKKyAqICBvciBjYW4gYmUgdXNlZCBieSBhIGF1ZGlvIHBvcnQgZm9yIG5hdGl2ZSBhdWRpbyByZW5kZXJpbmcgKi8KK3R5cGVkZWYgdm9pZCogT01YX05BVElWRV9ERVZJQ0VUWVBFOworCisvKiogT01YX05BVElWRV9XSU5ET1dUWVBFIGlzIHVzZWQgdG8gbWFwIGEgT01YIHZpZGVvIHBvcnQgdG8gdGhlCisgKiAgcGxhdGZvcm0gJiBvcGVyYXRpbmcgc3BlY2lmaWMgb2JqZWN0IHVzZWQgdG8gcmVmZXJlbmNlIHRoZSB3aW5kb3cgKi8KK3R5cGVkZWYgdm9pZCogT01YX05BVElWRV9XSU5ET1dUWVBFOworCisvKiogVGhlIE9NWF9WRVJTSU9OVFlQRSB1bmlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIHZlcnNpb24gZm9yCisgICAgYSBzdHJ1Y3R1cmUgb3IgY29tcG9uZW50LiAgRm9yIGEgY29tcG9uZW50LCB0aGUgdmVyc2lvbiBpcyBlbnRpcmVseQorICAgIHNwZWNpZmllZCBieSB0aGUgY29tcG9uZW50IHZlbmRvci4gIENvbXBvbmVudHMgZG9pbmcgdGhlIHNhbWUgZnVuY3Rpb24KKyAgICBmcm9tIGRpZmZlcmVudCB2ZW5kb3JzIG1heSBvciBtYXkgbm90IGhhdmUgdGhlIHNhbWUgdmVyc2lvbi4gIEZvciAKKyAgICBzdHJ1Y3R1cmVzLCB0aGUgdmVyc2lvbiBzaGFsbCBiZSBzZXQgYnkgdGhlIGVudGl0eSB0aGF0IGFsbG9jYXRlcyB0aGUKKyAgICBzdHJ1Y3R1cmUuICBGb3Igc3RydWN0dXJlcyBzcGVjaWZpZWQgaW4gdGhlIE9NWCAxLjEgc3BlY2lmaWNhdGlvbiwgdGhlCisgICAgdmFsdWUgb2YgdGhlIHZlcnNpb24gc2hhbGwgYmUgc2V0IHRvIDEuMS4wLjAgaW4gYWxsIGNhc2VzLiAgQWNjZXNzIHRvIHRoZQorICAgIE9NWF9WRVJTSU9OVFlQRSBjYW4gYmUgYnkgYSBzaW5nbGUgMzIgYml0IGFjY2VzcyAoZS5nLiBieSBuVmVyc2lvbikgb3IKKyAgICBieSBhY2Nlc3Npbmcgb25lIG9mIHRoZSBzdHJ1Y3R1cmUgZWxlbWVudHMgdG8sIGZvciBleGFtcGxlLCBjaGVjayBvbmx5CisgICAgdGhlIE1ham9yIHJldmlzaW9uLgorICovCit0eXBlZGVmIHVuaW9uIE9NWF9WRVJTSU9OVFlQRQoreworICAgIHN0cnVjdAorICAgIHsKKyAgICAgICAgT01YX1U4IG5WZXJzaW9uTWFqb3I7ICAgLyoqPCBNYWpvciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5WZXJzaW9uTWlub3I7ICAgLyoqPCBNaW5vciB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5SZXZpc2lvbjsgICAgICAgLyoqPCBSZXZpc2lvbiB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICAgICAgT01YX1U4IG5TdGVwOyAgICAgICAgICAgLyoqPCBTdGVwIHZlcnNpb24gYWNjZXNzb3IgZWxlbWVudCAqLworICAgIH0gczsKKyAgICBPTVhfVTMyIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCAzMiBiaXQgdmFsdWUgdG8gbWFrZSBhY2Nlc3NpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGVhc2lseSBkb25lIGluIGEgc2luZ2xlIHdvcmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgY29weS9jb21wYXJlIG9wZXJhdGlvbiAqLworfSBPTVhfVkVSU0lPTlRZUEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZgorLyogRmlsZSBFT0YgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaCBiL2luY2x1ZGUvbWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjg0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9vcGVubWF4L09NWF9WaWRlby5oCkBAIC0wLDAgKzEsMTA3OCBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgorICogZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCisgKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiAKKyAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCisgKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9WaWRlb19oCisjZGVmaW5lIE9NWF9WaWRlb19oCisKKy8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KKyAqIEBpbmdyb3VwIGl2CisgKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgorICogQHsKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqCisgKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KKworCisvKioKKyAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCisgKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAorICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAorICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCisgKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAorICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCisgKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgeworICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLworICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCisgICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLworICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCisgICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCisgICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nVlBYLCAgICAgICAgLyoqPCBHb29nbGUgVlBYLCBmb3JtZXJseSBrbm93biBhcyBPbjIgVlA4ICovCisgICAgT01YX1ZJREVPX0NvZGluZ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQ29kaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fQ09ESU5HVFlQRTsKKworCisvKioKKyAqIERhdGEgc3RydWN0dXJlIHVzZWQgdG8gZGVmaW5lIGEgdmlkZW8gcGF0aC4gIFRoZSBudW1iZXIgb2YgVmlkZW8gcGF0aHMgZm9yIAorICogaW5wdXQgYW5kIG91dHB1dCB3aWxsIHZhcnkgYnkgdHlwZSBvZiB0aGUgVmlkZW8gY29tcG9uZW50LiAgCisgKiAKKyAqICAgIElucHV0IChha2EgU291cmNlKSA6IHplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAorICogICAgU3BsaXR0ZXIgICAgICAgICAgIDogb25lIElucHV0LCAyIG9yIG1vcmUgT3V0cHV0cywKKyAqICAgIFByb2Nlc3NpbmcgRWxlbWVudCA6IG9uZSBJbnB1dCwgb25lIG91dHB1dCwKKyAqICAgIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCisgKiAgICBPdXRwdXQgKGFrYSBTaW5rKSAgOiBvbmUgSW5wdXQsIHplcm8gb3V0cHV0cy4KKyAqIAorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCB2aWRlbyAKKyAqIHBhdGguICBJZiBhZGRpdGlvbmFsIHZlbmRvciBzcGVjaWZpYyBkYXRhIGlzIHJlcXVpcmVkLCBpdCBzaG91bGQgYmUgCisgKiB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgQ29tcGxpYW50IAorICogY29tcG9uZW50cyB3aWxsIHByZXBvcHVsYXRlIHRoaXMgc3RydWN0dXJlIHdpdGggb3B0aW1hbCB2YWx1ZXMgZHVyaW5nIHRoZSAKKyAqIEdldERlZmF1bHRJbml0UGFyYW1zIGNvbW1hbmQuCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0CisgKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCisgKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciB1bmtub3duLAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRvbid0IGNhcmUgb3IgdmFyaWFibGUKKyAqICBuRnJhbWVIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5TdHJpZGUgICAgICAgICAgICAgICA6IE51bWJlciBvZiBieXRlcyBwZXIgc3BhbiBvZiBhbiBpbWFnZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBnZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHNwYW4gTiB0byBzcGFuIE4rMSwgd2hlcmUgbmVnYXRpdmUgc3RyaWRlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKKyAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcworICogIG5CaXRyYXRlICAgICAgICAgICAgICA6IEJpdCByYXRlIG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gY2hhbm5lbCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIHhGcmFtZXJhdGUgICAgICAgICAgICA6IEZyYW1lIHJhdGUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIHVuY29tcHJlc3NlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgaXMgdXNlZC4gVXNlIDAgZm9yIHVua25vd24sIGRvbid0IGNhcmUgb3IgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUuICBVbml0cyBhcmUgUTE2IGZyYW1lcyBwZXIgc2Vjb25kLgorICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAorICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC4gV2hlbiBPTVhfVklERU9fQ29kaW5nVW51c2VkIGlzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCwgZUNvbG9yRm9ybWF0IGlzIHVzZWQKKyAqICBlQ29sb3JGb3JtYXQgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICBwTmF0aXZlV2luZG93IDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIHdpbmRvdyBvYmplY3QgaWYgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IHNpbmsgLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAweDAuIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFIHsKKyAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsKKyAgICBPTVhfTkFUSVZFX0RFVklDRVRZUEUgcE5hdGl2ZVJlbmRlcjsKKyAgICBPTVhfVTMyIG5GcmFtZVdpZHRoOworICAgIE9NWF9VMzIgbkZyYW1lSGVpZ2h0OworICAgIE9NWF9TMzIgblN0cmlkZTsKKyAgICBPTVhfVTMyIG5TbGljZUhlaWdodDsKKyAgICBPTVhfVTMyIG5CaXRyYXRlOworICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKKyAgICBPTVhfQk9PTCBiRmxhZ0Vycm9yQ29uY2VhbG1lbnQ7CisgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKKyAgICBPTVhfTkFUSVZFX1dJTkRPV1RZUEUgcE5hdGl2ZVdpbmRvdzsKK30gT01YX1ZJREVPX1BPUlRERUZJTklUSU9OVFlQRTsKKworLyoqICAKKyAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAorICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAorICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCisgKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdXNlZCAKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqICB4RnJhbWVSYXRlICAgICAgICAgOiBJbmRpY2F0ZXMgdGhlIHZpZGVvIGZyYW1lIHJhdGUgaW4gUTE2IGZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5JbmRleDsKKyAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7IAorICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKKyAgICBPTVhfVTMyIHhGcmFtZXJhdGU7Cit9IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRTsKKworCisvKioKKyAqIFRoaXMgaXMgYSBzdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyaW5nIHZpZGVvIGNvbXByZXNzaW9uIHF1YW50aXphdGlvbiAKKyAqIHBhcmFtZXRlciB2YWx1ZXMuICBDb2RlY3MgbWF5IHN1cHBvcnQgZGlmZmVyZW50IFFQIHZhbHVlcyBmb3IgZGlmZmVyZW50CisgKiBmcmFtZSB0eXBlcy4KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5RcEkgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIGluZGV4IGZyYW1lcworICogIG5RcFAgICAgICAgOiBRUCB2YWx1ZSB0byB1c2UgZm9yIFAgZnJhbWVzCisgKiAgblFwQiAgICAgICA6IFFQIHZhbHVlcyB0byB1c2UgZm9yIGJpZGlyZWN0aW9uYWwgZnJhbWVzIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblFwSTsKKyAgICBPTVhfVTMyIG5RcFA7CisgICAgT01YX1UzMiBuUXBCOworfSBPTVhfVklERU9fUEFSQU1fUVVBTlRJWkFUSU9OVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgZm9yIGNvbmZpZ3VyYXRpb24gb2YgdmlkZW8gZmFzdCB1cGRhdGUgcGFyYW1ldGVycy4gCisgKiAgCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mbyAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiRW5hYmxlVkZVIDogRW5hYmxlL0Rpc2FibGUgdmlkZW8gZmFzdCB1cGRhdGUKKyAqICBuRmlyc3RHT0IgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgdGhlIGZpcnN0IG1hY3JvYmxvY2sgcm93CisgKiAgbkZpcnN0TUIgICA6IHNwZWNpZmllcyB0aGUgZmlyc3QgTUIgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBmaXJzdCBHT0IKKyAqICBuTnVtTUJzICAgIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgTUJzIHRvIGJlIHJlZnJlc2hlZCBmcm9tIG5GaXJzdEdPQiAKKyAqICAgICAgICAgICAgICAgYW5kIG5GaXJzdE1CCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlVkZVOyAgICAgIAorICAgIE9NWF9VMzIgbkZpcnN0R09COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5GaXJzdE1COyAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5OdW1NQnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBiaXRyYXRlIGNvbnRyb2wgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFIHsKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50LAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlU2tpcEZyYW1lcywKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVDb25zdGFudFNraXBGcmFtZXMsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fQ09OVFJPTFJBVEVUWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KKyAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCisgKiAgZUNvbnRyb2xSYXRlICAgOiBDb250cm9sIHJhdGUgdHlwZSBlbnVtCisgKiAgblRhcmdldEJpdHJhdGUgOiBUYXJnZXQgYml0cmF0ZSB0byBlbmNvZGUgd2l0aAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgZUNvbnRyb2xSYXRlOyAKKyAgICBPTVhfVTMyIG5UYXJnZXRCaXRyYXRlOyAgICAgICAgICAgICAgICAgCit9IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtb3Rpb24gdmVjdG9yIChNVikgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRSB7CisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclBpeGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JIYWxmUGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JRdWFydGVyUGVsLAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JFaWdodGhQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3Rvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fTU9USU9OVkVDVE9SVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdGhlIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB1c2VkIGFzIHdlbGwKKyAqIGFzIHRoZWlyIGFjY3VyYWN5LgorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggICAgICAgOiBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVBY2N1cmFjeSAgICAgICAgOiBFbnVtZXJhdGVkIE1WIGFjY3VyYWN5CisgKiAgYlVucmVzdHJpY3RlZE1WcyA6IEFsbG93IHVucmVzdHJpY3RlZCBNVnMKKyAqICBiRm91ck1WICAgICAgICAgIDogQWxsb3cgdXNlIG9mIDQgTVZzCisgKiAgc1hTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiBob3Jpem9udGFsIGRpcmVjdGlvbiBmb3IgTVZzCisgKiAgc1lTZWFyY2hSYW5nZSAgICA6IFNlYXJjaCByYW5nZSBpbiB2ZXJ0aWNhbCBkaXJlY3Rpb24gZm9yIE1WcworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIGVBY2N1cmFjeTsKKyAgICBPTVhfQk9PTCBiVW5yZXN0cmljdGVkTVZzOworICAgIE9NWF9CT09MIGJGb3VyTVY7CisgICAgT01YX1MzMiBzWFNlYXJjaFJhbmdlOworICAgIE9NWF9TMzIgc1lTZWFyY2hSYW5nZTsKK30gT01YX1ZJREVPX1BBUkFNX01PVElPTlZFQ1RPUlRZUEU7CisKKworLyoqIAorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgbWV0aG9kcyB0byB1c2UgZm9yIEludHJhIFJlZnJlc2ggCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRSB7CisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYywKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQWRhcHRpdmUsCisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEJvdGgsCisgICAgT01YX1ZJREVPX0ludHJhUmVmcmVzaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fSU5UUkFSRUZSRVNIVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgaW50cmEgcmVmcmVzaCBtb2RlIAorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlUmVmcmVzaE1vZGUgOiBDeWNsaWMsIEFkYXB0aXZlLCBvciBCb3RoCisgKiAgbkFpck1CcyAgICAgIDogTnVtYmVyIG9mIGludHJhIG1hY3JvYmxvY2tzIHRvIHJlZnJlc2ggaW4gYSBmcmFtZSB3aGVuIAorICogICAgICAgICAgICAgICAgIEFJUiBpcyBlbmFibGVkCisgKiAgbkFpclJlZiAgICAgIDogTnVtYmVyIG9mIHRpbWVzIGEgbW90aW9uIG1hcmtlZCBtYWNyb2Jsb2NrIGhhcyB0byBiZSAgCisgKiAgICAgICAgICAgICAgICAgaW50cmEgY29kZWQKKyAqICBuQ2lyTUJzICAgICAgOiBOdW1iZXIgb2YgY29uc2VjdXRpdmUgbWFjcm9ibG9ja3MgdG8gYmUgY29kZWQgYXMgImludHJhIiAgCisgKiAgICAgICAgICAgICAgICAgd2hlbiBDSVIgaXMgZW5hYmxlZAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIGVSZWZyZXNoTW9kZTsKKyAgICBPTVhfVTMyIG5BaXJNQnM7CisgICAgT01YX1UzMiBuQWlyUmVmOworICAgIE9NWF9VMzIgbkNpck1CczsKK30gT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEU7CisKKworLyoqCisgKiBTdHJ1Y3R1cmUgZm9yIGVuYWJsaW5nIHZhcmlvdXMgZXJyb3IgY29ycmVjdGlvbiBtZXRob2RzIGZvciB2aWRlbyAKKyAqIGNvbXByZXNzaW9uLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgYkVuYWJsZUhFQyAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBoZWFkZXIgZXh0ZW5zaW9uIGNvZGVzIChIRUMpCisgKiAgYkVuYWJsZVJlc3luYyAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXN5bmNocm9uaXphdGlvbiBtYXJrZXJzCisgKiAgblJlc3luY2hNYXJrZXJTcGFjaW5nICAgOiBSZXN5bmNoIG1hcmtlcnMgaW50ZXJ2YWwgKGluIGJpdHMpIHRvIGJlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGllZCBpbiB0aGUgc3RyZWFtIAorICogIGJFbmFibGVEYXRhUGFydGl0aW9uaW5nIDogRW5hYmxlL2Rpc2FibGUgZGF0YSBwYXJ0aXRpb25pbmcgCisgKiAgYkVuYWJsZVJWTEMgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGluZworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJFbmFibGVIRUM7CisgICAgT01YX0JPT0wgYkVuYWJsZVJlc3luYzsKKyAgICBPTVhfVTMyICBuUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgT01YX0JPT0wgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgT01YX0JPT0wgYkVuYWJsZVJWTEM7Cit9IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFOworCisKKy8qKiAKKyAqIENvbmZpZ3VyYXRpb24gb2YgdmFyaWFibGUgYmxvY2stc2l6ZSBtb3Rpb24gY29tcGVuc2F0aW9uIChWQlNNQykgCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiMTZ4MTYgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCAxNngxNgorICogIGIxNng4ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDgKKyAqICBiOHgxNiAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDE2CisgKiAgYjh4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg4CisgKiAgYjh4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggOHg0CisgKiAgYjR4OCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg4CisgKiAgYjR4NCAgICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggNHg0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAKKyAgICBPTVhfQk9PTCBiMTZ4MTY7IAorICAgIE9NWF9CT09MIGIxNng4OyAKKyAgICBPTVhfQk9PTCBiOHgxNjsKKyAgICBPTVhfQk9PTCBiOHg4OworICAgIE9NWF9CT09MIGI4eDQ7CisgICAgT01YX0JPT0wgYjR4ODsKKyAgICBPTVhfQk9PTCBiNHg0OworfSBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFOworCisKKy8qKiAKKyAqIEguMjYzIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKKyAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCisgKgorICogRU5VTVM6CisgKiAgQmFzZWxpbmUgICAgICAgICAgIDogQmFzZWxpbmUgUHJvZmlsZTogSC4yNjMgKFYxKSwgbm8gb3B0aW9uYWwgbW9kZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSDMyMCBDb2RpbmcgICAgICAgIDogSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgQmFja3dhcmQgQ29tcGF0aWJpbGl0eSAKKyAqICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlOiBILjI2MysgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBMLjQKKyAqICAgICAgICAgICAgICAgICAgICAgICBhbmQgVAorICogIEJhY2t3YXJkQ29tcGF0aWJsZSA6IEJhY2t3YXJkIENvbXBhdGliaWxpdHkgUHJvZmlsZTogSC4yNjMgKFYxKSwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgYW5uZXggRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIElTV1YyICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYyKSwgaW5jbHVkZXMgYW5uZXhlcyBJLCBKLCBLIGFuZCBUICAgICAgICAgICAgICAgICAKKyAqICBJU1dWMyAgICAgICAgICAgICAgOiBJbnRlcmFjdGl2ZSBTdHJlYW1pbmcgV2lyZWxlc3MgUHJvZmlsZTogSC4yNjMrKyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZSAzIGFuZCBhbm5leGVzIFYgYW5kIFcuNi4zLjggICAKKyAqICBIaWdoQ29tcHJlc3Npb24gICAgOiBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIFByb2ZpbGU6IEguMjYzKysgIAorICogICAgICAgICAgICAgICAgICAgICAgIChWMyksIGluY2x1ZGVzIHByb2ZpbGVzIDEgJiAyIGFuZCBhbm5leGVzIEQgYW5kIFUgICAKKyAqICBJbnRlcm5ldCAgICAgICAgICAgOiBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCBQcm9maWxlOiBILjI2MysrIChWMyksICAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IEsgICAgICAgICAgICAgICAgICAgICAgIAorICogIEludGVybGFjZSAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybGFjZSBQcm9maWxlOiBILjI2MysrIChWMyksICAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBwcm9maWxlIDUgYW5kIGFubmV4IFcuNi4zLjExICAgICAgICAgICAgICAgCisgKiAgSGlnaExhdGVuY3kgICAgICAgIDogSGlnaCBMYXRlbmN5IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgaW5jbHVkZXMgIAorICogICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgNiBhbmQgYW5uZXhlcyBPLjEgYW5kIFAuNSAgICAgICAgICAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSAgICAgICAgICAgID0gMHgwMSwgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcgICAgICAgICAgPSAweDAyLCAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgID0gMHgwNCwgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyICAgICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YzICAgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hDb21wcmVzc2lvbiAgICAgPSAweDIwLCAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJuZXQgICAgICAgICAgICA9IDB4NDAsICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICA9IDB4ODAsICAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgID0gMHgxMDAsICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlTWF4ICAgICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIEguMjYzIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIHNpemVzLCAKKyAqIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzTEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fSDI2M0xldmVsMTAgID0gMHgwMSwgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWwyMCAgPSAweDAyLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWwzMCAgPSAweDA0LCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0MCAgPSAweDA4LCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw0NSAgPSAweDEwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw1MCAgPSAweDIwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw2MCAgPSAweDQwLCAgICAgIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWw3MCAgPSAweDgwLCAKKyAgICBPTVhfVklERU9fSDI2M0xldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19IMjYzTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEU7CisKKworLyoqIAorICogU3BlY2lmaWVzIHRoZSBwaWN0dXJlIHR5cGUuIFRoZXNlIHZhbHVlcyBzaG91bGQgYmUgT1InZCB0byBzaWduYWwgYWxsIAorICogcGljdHVyZXMgdHlwZXMgd2hpY2ggYXJlIGFsbG93ZWQuCisgKgorICogRU5VTVM6CisgKiAgR2VuZXJpYyBQaWN0dXJlIFR5cGVzOiAgICAgICAgICBJLCBQIGFuZCBCCisgKiAgSC4yNjMgU3BlY2lmaWMgUGljdHVyZSBUeXBlczogICBTSSBhbmQgU1AKKyAqICBILjI2NCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIEVJIGFuZCBFUAorICogIE1QRUctNCBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgUworICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX1BJQ1RVUkVUWVBFIHsKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVJICAgPSAweDAxLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVAgICA9IDB4MDIsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlQiAgID0gMHgwNCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVTSSAgPSAweDA4LAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNQICA9IDB4MTAsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlRUkgID0gMHgxMSwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFUCAgPSAweDEyLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVMgICA9IDB4MTQsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fUElDVFVSRVRZUEU7CisKKworLyoqIAorICogSC4yNjMgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBlUHJvZmlsZSAgICAgICAgICAgICAgICAgOiBILjI2MyBwcm9maWxlKHMpIHRvIHVzZQorICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICA6IEguMjYzIGxldmVsKHMpIHRvIHVzZQorICogIGJQTFVTUFRZUEVBbGxvd2VkICAgICAgICA6IEluZGljYXRpbmcgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZSBQTFVTUFRZUEUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwZWNpZmllZCBpbiB0aGUgMTk5OCB2ZXJzaW9uIG9mIEguMjYzKSB0byAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZSBjdXN0b20gcGljdHVyZSBzaXplcyBvciBjbG9jayAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyAKKyAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiAgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvIDogdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCAoYml0IDYgb2YgTVBQVFlQRSkgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnN0cmFpbmVkLiBJdCBpcyByZWNvbW1lbmRlZCB0byBjaGFuZ2UgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBSVFlQRSBiaXQgZm9yIGVhY2ggcmVmZXJlbmNlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmUgaW4gZXJyb3ItZnJlZSBjb21tdW5pY2F0aW9uCisgKiAgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uIDogU3BlY2lmaWVzIHRoZSBmcmVxdWVuY3kgb2YgcGljdHVyZSBoZWFkZXIgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZXRpdGlvbgorICogIG5HT0JIZWFkZXJJbnRlcnZhbCAgICAgICA6IFNwZWNpZmllcyB0aGUgaW50ZXJ2YWwgb2Ygbm9uLWVtcHR5IEdPQiAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyBpbiB1bml0cyBvZiBHT0JzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblBGcmFtZXM7CisgICAgT01YX1UzMiBuQkZyYW1lczsKKyAgICBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFIGVQcm9maWxlOworCU9NWF9WSURFT19IMjYzTEVWRUxUWVBFIGVMZXZlbDsKKyAgICBPTVhfQk9PTCBiUExVU1BUWVBFQWxsb3dlZDsKKyAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOworICAgIE9NWF9CT09MIGJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybzsKKyAgICBPTVhfVTMyIG5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbjsKKyAgICBPTVhfVTMyIG5HT0JIZWFkZXJJbnRlcnZhbDsKK30gT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTaW1wbGUgPSAwLCAgLyoqPCBTaW1wbGUgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYWluLCAgICAgICAgLyoqPCBNYWluIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlNDIyLCAgICAgICAgIC8qKjwgNDoyOjIgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTTlIsICAgICAgICAgLyoqPCBTTlIgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVTcGF0aWFsLCAgICAgLyoqPCBTcGF0aWFsIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlSGlnaCwgICAgICAgIC8qKjwgSGlnaCBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlTWF4ID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19NUEVHMlBST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKKyAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbExMID0gMCwgIC8qKjwgTG93IExldmVsICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsTUwsICAgICAgLyoqPCBNYWluIExldmVsICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsSDE0LCAgICAgLyoqPCBIaWdoIDE0NDAgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxITCwgICAgICAvKio8IEhpZ2ggTGV2ZWwgKi8gICAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFOworCisKKy8qKiAKKyAqIE1QRUctMiBwYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblBGcmFtZXMgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5CRnJhbWVzICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBlUHJvZmlsZSAgIDogTVBFRy0yIHByb2ZpbGUocykgdG8gdXNlCisgKiAgZUxldmVsICAgICA6IE1QRUctMiBsZXZlbHMocykgdG8gdXNlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NUEVHMlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgIAorICAgIE9NWF9VMzIgblBGcmFtZXM7ICAgICAgICAKKyAgICBPTVhfVTMyIG5CRnJhbWVzOyAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEUgZVByb2ZpbGU7CisJT01YX1ZJREVPX01QRUcyTEVWRUxUWVBFIGVMZXZlbDsgICAKK30gT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRTsKKworCisvKiogCisgKiBNUEVHLTQgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqIAorICogRU5VTVM6CisgKiAgLSBTaW1wbGUgUHJvZmlsZSwgTGV2ZWxzIDEtMworICogIC0gU2ltcGxlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gTWFpbiBQcm9maWxlLCBMZXZlbHMgMi00CisgKiAgLSBOLWJpdCBQcm9maWxlLCBMZXZlbCAyCisgKiAgLSBTY2FsYWJsZSBUZXh0dXJlIFByb2ZpbGUsIExldmVsIDEKKyAqICAtIFNpbXBsZSBGYWNlIEFuaW1hdGlvbiBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBTaW1wbGUgRmFjZSBhbmQgQm9keSBBbmltYXRpb24gKEZCQSkgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQmFzaWMgQW5pbWF0ZWQgVGV4dHVyZSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBIeWJyaWQgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQWR2YW5jZWQgUmVhbCBUaW1lIFNpbXBsZSBQcm9maWxlcywgTGV2ZWxzIDEtNAorICogIC0gQ29yZSBTY2FsYWJsZSBQcm9maWxlLCBMZXZlbHMgMS0zCisgKiAgLSBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeSBQcm9maWxlLCBMZXZlbHMgMS00CisgKiAgLSBBZHZhbmNlZCBDb3JlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIEFkdmFuY2VkIFNjYWxhYmxlIFRleHR1cmUsIExldmVscyAyLTMKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICA9IDB4MDEsICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlU2NhbGFibGUgICA9IDB4MDIsICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVDb3JlICAgICAgICAgICAgID0gMHgwNCwgICAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYWluICAgICAgICAgICAgID0gMHgwOCwgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU5iaXQgICAgICAgICAgICAgPSAweDEwLCAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNjYWxhYmxlVGV4dHVyZSAgPSAweDIwLCAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGYWNlICAgICAgID0gMHg0MCwgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVGQkEgICAgICAgID0gMHg4MCwgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZCAgICA9IDB4MTAwLCAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUh5YnJpZCAgICAgICAgICAgPSAweDIwMCwgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZSA9IDB4NDAwLCAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmVTY2FsYWJsZSAgICAgPSAweDgwMCwgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb2RpbmcgICA9IDB4MTAwMCwgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkQ29yZSAgICAgPSAweDIwMDAsICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgPSAweDQwMDAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlICAgPSAweDgwMDAsCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTWF4ICAgICAgICAgICAgICA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRTsKKworCisvKiogCisgKiBNUEVHLTQgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgCisgKiBzaXplcywgYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSB7CisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwICA9IDB4MDEsICAgLyoqPCBMZXZlbCAwICovICAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwwYiA9IDB4MDIsICAgLyoqPCBMZXZlbCAwYiAqLyAgIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsMSAgPSAweDA0LCAgIC8qKjwgTGV2ZWwgMSAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDIgID0gMHgwOCwgICAvKio8IExldmVsIDIgKi8gCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwzICA9IDB4MTAsICAgLyoqPCBMZXZlbCAzICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsNCAgPSAweDIwLCAgIC8qKjwgTGV2ZWwgNCAqLyAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0YSA9IDB4NDAsICAgLyoqPCBMZXZlbCA0YSAqLyAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw1ICA9IDB4ODAsICAgLyoqPCBMZXZlbCA1ICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBjb25maWd1cmF0aW9uLiAgVGhpcyBzdHJ1Y3R1cmUgaGFuZGxlcyBjb25maWd1cmF0aW9uIG9wdGlvbnMKKyAqIHdoaWNoIGFyZSBzcGVjaWZpYyB0byBNUEVHNCBhbGdvcml0aG1zCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIgKEgyNjMrIAorICogICAgICAgICAgICAgICAgICAgICAgICAgQW5uZXggSykuIFB1dCB6ZXJvIGlmIG5vdCB1c2VkCisgKiAgYlNWSCAgICAgICAgICAgICAgICAgOiBFbmFibGUgU2hvcnQgVmlkZW8gSGVhZGVyIG1vZGUKKyAqICBiR292ICAgICAgICAgICAgICAgICA6IEZsYWcgdG8gZW5hYmxlIEdPVgorICogIG5QRnJhbWVzICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lIChhbHNvIGNhbGxlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEdPViBwZXJpb2QpCisgKiAgbkJGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgQiBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuSURDVkxDVGhyZXNob2xkICAgICA6IFZhbHVlIG9mIGludHJhIERDIFZMQyB0aHJlc2hvbGQKKyAqICBiQUNQcmVkICAgICAgICAgICAgICA6IEZsYWcgdG8gdXNlIGFjIHByZWRpY3Rpb24KKyAqICBuTWF4UGFja2V0U2l6ZSAgICAgICA6IE1heGltdW0gc2l6ZSBvZiBwYWNrZXQgaW4gYnl0ZXMuCisgKiAgblRpbWVJbmNSZXMgICAgICAgICAgOiBVc2VkIHRvIHBhc3MgVk9QIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gZm9yIE1QRUc0LiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIEludGVycHJldGVkIGFzIGRlc2NyaWJlZCBpbiBNUEVHNCBzdGFuZGFyZC4KKyAqICBlUHJvZmlsZSAgICAgICAgICAgICA6IE1QRUctNCBwcm9maWxlKHMpIHRvIHVzZS4KKyAqICBlTGV2ZWwgICAgICAgICAgICAgICA6IE1QRUctNCBsZXZlbChzKSB0byB1c2UuCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgYml0c3RyZWFtCisgKiAgbkhlYWRlckV4dGVuc2lvbiAgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSB2aWRlbyBwYWNrZXQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMgd2l0aGluIGEgVk9QCisgKiAgYlJldmVyc2libGVWTEMgICAgICAgOiBTcGVjaWZpZXMgd2hldGhlciByZXZlcnNpYmxlIHZhcmlhYmxlIGxlbmd0aCBjb2RpbmcgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiB1c2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgblNsaWNlSGVhZGVyU3BhY2luZzsKKyAgICBPTVhfQk9PTCBiU1ZIOworICAgIE9NWF9CT09MIGJHb3Y7CisgICAgT01YX1UzMiBuUEZyYW1lczsKKyAgICBPTVhfVTMyIG5CRnJhbWVzOworICAgIE9NWF9VMzIgbklEQ1ZMQ1RocmVzaG9sZDsKKyAgICBPTVhfQk9PTCBiQUNQcmVkOworICAgIE9NWF9VMzIgbk1heFBhY2tldFNpemU7CisgICAgT01YX1UzMiBuVGltZUluY1JlczsKKyAgICBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKyAgICBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgZUxldmVsOworICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CisgICAgT01YX1UzMiBuSGVhZGVyRXh0ZW5zaW9uOworICAgIE9NWF9CT09MIGJSZXZlcnNpYmxlVkxDOworfSBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFOworCisKKy8qKiAKKyAqIFdNViBWZXJzaW9ucyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIHsKKyAgICBPTVhfVklERU9fV01WRm9ybWF0VW51c2VkID0gMHgwMSwgICAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ3ICAgICAgPSAweDAyLCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgNyAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ4ICAgICAgPSAweDA0LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOCAqLworICAgIE9NWF9WSURFT19XTVZGb3JtYXQ5ICAgICAgPSAweDA4LCAgIC8qKjwgV2luZG93cyBNZWRpYSBWaWRlbyBmb3JtYXQgOSAqLworICAgIE9NWF9WSURFT19XTUZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1dNRkZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdE1heCAgICA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEU7CisKKworLyoqIAorICogV01WIFBhcmFtcyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9ybWF0ICAgIDogVmVyc2lvbiBvZiBXTVYgc3RyZWFtIC8gZGF0YQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fV01WVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVklERU9fV01WRk9STUFUVFlQRSBlRm9ybWF0OworfSBPTVhfVklERU9fUEFSQU1fV01WVFlQRTsKKworCisvKiogCisgKiBSZWFsIFZpZGVvIFZlcnNpb24gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fUlZGT1JNQVRUWVBFIHsKKyAgICBPTVhfVklERU9fUlZGb3JtYXRVbnVzZWQgPSAwLCAvKio8IEZvcm1hdCB1bnVzZWQgb3IgdW5rbm93biAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdDgsICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOCAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdDksICAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBmb3JtYXQgOSAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdEcyLCAgICAgICAgIC8qKjwgUmVhbCBWaWRlbyBGb3JtYXQgRzIgKi8KKyAgICBPTVhfVklERU9fUlZGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1JWRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fUlZGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19SVkZPUk1BVFRZUEU7CisKKworLyoqIAorICogUmVhbCBWaWRlbyBQYXJhbXMgCisgKgorICogU1RVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUZvcm1hdCAgICAgICAgICAgIDogVmVyc2lvbiBvZiBSViBzdHJlYW0gLyBkYXRhCisgKiAgbkJpdHNQZXJQaXhlbCAgICAgIDogQml0cyBwZXIgcGl4ZWwgY29kZWQgaW4gdGhlIGZyYW1lCisgKiAgblBhZGRlZFdpZHRoICAgICAgIDogUGFkZGVkIHdpZHRoIGluIHBpeGVsIG9mIGEgdmlkZW8gZnJhbWUKKyAqICBuUGFkZGVkSGVpZ2h0ICAgICAgOiBQYWRkZWQgSGVpZ2h0IGluIHBpeGVscyBvZiBhIHZpZGVvIGZyYW1lCisgKiAgbkZyYW1lUmF0ZSAgICAgICAgIDogUmF0ZSBvZiB2aWRlbyBpbiBmcmFtZXMgcGVyIHNlY29uZAorICogIG5CaXRzdHJlYW1GbGFncyAgICA6IEZsYWdzIHdoaWNoIGludGVybmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiaXRzdHJlYW0KKyAqICBuQml0c3RyZWFtVmVyc2lvbiAgOiBCaXRzdHJlYW0gdmVyc2lvbgorICogIG5NYXhFbmNvZGVGcmFtZVNpemU6IE1heCBlbmNvZGVkIGZyYW1lIHNpemUKKyAqICBiRW5hYmxlUG9zdEZpbHRlciAgOiBUdXJuIG9uL29mZiBwb3N0IGZpbHRlcgorICogIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb24gOiBUdXJuIG9uL29mZiB0ZW1wb3JhbCBpbnRlcnBvbGF0aW9uCisgKiAgYkVuYWJsZUxhdGVuY3lNb2RlIDogV2hlbiBlbmFibGVkLCB0aGUgZGVjb2RlciBkb2VzIG5vdCBkaXNwbGF5IGEgZGVjb2RlZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSB1bnRpbCBpdCBoYXMgZGV0ZWN0ZWQgdGhhdCBubyBlbmhhbmNlbWVudCBsYXllciAKKyAqICAJCQkJCSBmcmFtZXMgb3IgZGVwZW5kZW50IEIgZnJhbWVzIHdpbGwgYmUgY29taW5nLiBUaGlzIAorICogIAkJCQkJIGRldGVjdGlvbiB1c3VhbGx5IG9jY3VycyB3aGVuIGEgc3Vic2VxdWVudCBub24tQiAKKyAqICAJCQkJCSBmcmFtZSBpcyBlbmNvdW50ZXJlZCAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1JWVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgZUZvcm1hdDsKKyAgICBPTVhfVTE2IG5CaXRzUGVyUGl4ZWw7CisgICAgT01YX1UxNiBuUGFkZGVkV2lkdGg7CisgICAgT01YX1UxNiBuUGFkZGVkSGVpZ2h0OworICAgIE9NWF9VMzIgbkZyYW1lUmF0ZTsKKyAgICBPTVhfVTMyIG5CaXRzdHJlYW1GbGFnczsKKyAgICBPTVhfVTMyIG5CaXRzdHJlYW1WZXJzaW9uOworICAgIE9NWF9VMzIgbk1heEVuY29kZUZyYW1lU2l6ZTsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUG9zdEZpbHRlcjsKKyAgICBPTVhfQk9PTCBiRW5hYmxlVGVtcG9yYWxJbnRlcnBvbGF0aW9uOworICAgIE9NWF9CT09MIGJFbmFibGVMYXRlbmN5TW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX1JWVFlQRTsKKworCisvKiogCisgKiBBVkMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSA9IDB4MDEsICAgLyoqPCBCYXNlbGluZSBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluICAgICA9IDB4MDIsICAgLyoqPCBNYWluIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUV4dGVuZGVkID0gMHgwNCwgICAvKio8IEV4dGVuZGVkIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2ggICAgID0gMHgwOCwgICAvKio8IEhpZ2ggcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDEwICAgPSAweDEwLCAgIC8qKjwgSGlnaCAxMCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoNDIyICA9IDB4MjAsICAgLyoqPCBIaWdoIDQ6MjoyIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0NDQgID0gMHg0MCwgICAvKio8IEhpZ2ggNDo0OjQgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19BVkNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1heCAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRTsKKworCisvKiogCisgKiBBVkMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAorICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLiAgTm8gbmVlZCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19BVkNMZXZlbDEgICA9IDB4MDEsICAgICAvKio8IExldmVsIDEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwxYiAgPSAweDAyLCAgICAgLyoqPCBMZXZlbCAxYiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDExICA9IDB4MDQsICAgICAvKio8IExldmVsIDEuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDEyICA9IDB4MDgsICAgICAvKio8IExldmVsIDEuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDEzICA9IDB4MTAsICAgICAvKio8IExldmVsIDEuMyAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIgICA9IDB4MjAsICAgICAvKio8IExldmVsIDIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwyMSAgPSAweDQwLCAgICAgLyoqPCBMZXZlbCAyLjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwyMiAgPSAweDgwLCAgICAgLyoqPCBMZXZlbCAyLjIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzICAgPSAweDEwMCwgICAgLyoqPCBMZXZlbCAzICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMzEgID0gMHgyMDAsICAgIC8qKjwgTGV2ZWwgMy4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMzIgID0gMHg0MDAsICAgIC8qKjwgTGV2ZWwgMy4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNCAgID0gMHg4MDAsICAgIC8qKjwgTGV2ZWwgNCAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDQxICA9IDB4MTAwMCwgICAvKio8IExldmVsIDQuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDQyICA9IDB4MjAwMCwgICAvKio8IExldmVsIDQuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDUgICA9IDB4NDAwMCwgICAvKio8IExldmVsIDUgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWw1MSAgPSAweDgwMDAsICAgLyoqPCBMZXZlbCA1LjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0FWQ0xldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRTsKKworCisvKiogCisgKiBBVkMgbG9vcCBmaWx0ZXIgbW9kZXMgCisgKgorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZQorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlICAgICAgICAgICAgICA6IERpc2FibGUKKyAqIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZVNsaWNlQm91bmRhcnkgOiBEaXNhYmxlZCBvbiBzbGljZSBib3VuZGFyaWVzCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgeworICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRW5hYmxlID0gMCwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUsCisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlclZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRTsKKworCisvKiogCisgKiBBVkMgcGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5TbGljZUhlYWRlclNwYWNpbmcgICAgICAgOiBOdW1iZXIgb2YgbWFjcm9ibG9ja3MgYmV0d2VlbiBzbGljZSBoZWFkZXIsIHB1dCAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHplcm8gaWYgbm90IHVzZWQKKyAqICBuUEZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgbkJGcmFtZXMgICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGJVc2VIYWRhbWFyZCAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBIYWRhbWFyZCB0cmFuc2Zvcm0KKyAqICBuUmVmRnJhbWVzICAgICAgICAgICAgICAgIDogTWF4IG51bWJlciBvZiByZWZlcmVuY2UgZnJhbWVzIHRvIHVzZSBmb3IgaW50ZXIKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW90aW9uIHNlYXJjaCAoMS0xNikKKyAqICBuUmVmSWR4VHJhaWxpbmcgICAgICAgICAgIDogUGljIHBhcmFtIHNldCByZWYgZnJhbWUgaW5kZXggKGluZGV4IGludG8gcmVmCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIGJ1ZmZlciBvZiB0cmFpbGluZyBmcmFtZXMgbGlzdCksIEIgZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAorICogIG5SZWZJZHhGb3J3YXJkICAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIGZvcndhcmQgZnJhbWVzIGxpc3QpLCBCIGZyYW1lCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnQKKyAqICBiRW5hYmxlVUVQICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgdW5lcXVhbCBlcnJvciBwcm90ZWN0aW9uLiBUaGlzIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHZhbGlkIG9mIGRhdGEgcGFydGl0aW9uaW5nIGlzIGVuYWJsZWQuCisgKiAgYkVuYWJsZUZNTyAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGZsZXhpYmxlIG1hY3JvYmxvY2sgb3JkZXJpbmcKKyAqICBiRW5hYmxlQVNPICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgYXJiaXRyYXJ5IHNsaWNlIG9yZGVyaW5nCisgKiAgYkVuYWJsZVJTICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHNlbmRpbmcgb2YgcmVkdW5kYW50IHNsaWNlcworICogIGVQcm9maWxlICAgICAgICAgICAgICAgICAgOiBBVkMgcHJvZmlsZShzKSB0byB1c2UKKyAqICBlTGV2ZWwgICAgICAgICAgICAgICAgICAgIDogQVZDIGxldmVsKHMpIHRvIHVzZQorICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICAgOiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZXMgYWxsb3dlZCBpbiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHN0cmVhbQorICogIGJGcmFtZU1Cc09ubHkgICAgICAgICAgICAgOiBzcGVjaWZpZXMgdGhhdCBldmVyeSBjb2RlZCBwaWN0dXJlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWQgdmlkZW8gc2VxdWVuY2UgaXMgYSBjb2RlZCBmcmFtZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZyBvbmx5IGZyYW1lIG1hY3JvYmxvY2tzCisgKiAgYk1CQUZGICAgICAgICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHN3aXRjaGluZyBiZXR3ZWVuIGZyYW1lIGFuZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQgbWFjcm9ibG9ja3Mgd2l0aGluIGEgcGljdHVyZQorICogIGJFbnRyb3B5Q29kaW5nQ0FCQUMgICAgICAgOiBFbnRyb3B5IGRlY29kaW5nIG1ldGhvZCB0byBiZSBhcHBsaWVkIGZvciB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCBlbGVtZW50cyBmb3Igd2hpY2ggdHdvIGRlc2NyaXB0b3JzIGFwcGVhciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHN5bnRheCB0YWJsZXMKKyAqICBiV2VpZ2h0ZWRQUHJlZGljdGlvbiAgICAgIDogRW5hYmxlL2Rpc2FibGUgd2VpZ2h0ZWQgcHJlZGljdGlvbiBzaGFsbCBub3QgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gUCBhbmQgU1Agc2xpY2VzCisgKiAgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZSA6IERlZmF1bHQgd2VpZ2h0ZWQgcHJlZGljdGlvbiBpcyBhcHBsaWVkIHRvIEIgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlcyAKKyAqICBiY29uc3RJcHJlZCAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgaW50cmEgcHJlZGljdGlvbgorICogIGJEaXJlY3Q4eDhJbmZlcmVuY2UgICAgICAgOiBTcGVjaWZpZXMgdGhlIG1ldGhvZCB1c2VkIGluIHRoZSBkZXJpdmF0aW9uIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGZvciBsdW1hIG1vdGlvbiB2ZWN0b3JzIGZvciBCX1NraXAsIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCX0RpcmVjdF8xNngxNiBhbmQgQl9EaXJlY3RfOHg4IGFzIHNwZWNpZmllZCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3ViY2xhdXNlIDguNC4xLjIgb2YgdGhlIEFWQyBzcGVjIAorICogIGJEaXJlY3RTcGF0aWFsVGVtcG9yYWwgICAgOiBGbGFnIGluZGljYXRpbmcgc3BhdGlhbCBvciB0ZW1wb3JhbCBkaXJlY3QKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB1c2VkIGluIEIgc2xpY2UgY29kaW5nIChyZWxhdGVkIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiRGlyZWN0OHg4SW5mZXJlbmNlKSAuIFNwYXRpYWwgZGlyZWN0IG1vZGUgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmUgY29tbW9uIGFuZCBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCisgKiAgbkNhYmFjSW5pdElkeCAgICAgICAgICAgICA6IEluZGV4IHVzZWQgdG8gaW5pdCBDQUJBQyBjb250ZXh0cworICogIGVMb29wRmlsdGVyTW9kZSAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBsb29wIGZpbHRlcgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgCisgICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOyAgCisgICAgT01YX1UzMiBuUEZyYW1lczsgICAgIAorICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAKKyAgICBPTVhfQk9PTCBiVXNlSGFkYW1hcmQ7CisgICAgT01YX1UzMiBuUmVmRnJhbWVzOyAgCisJT01YX1UzMiBuUmVmSWR4MTBBY3RpdmVNaW51czE7CisJT01YX1UzMiBuUmVmSWR4MTFBY3RpdmVNaW51czE7CisgICAgT01YX0JPT0wgYkVuYWJsZVVFUDsgIAorICAgIE9NWF9CT09MIGJFbmFibGVGTU87ICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlQVNPOyAgCisgICAgT01YX0JPT0wgYkVuYWJsZVJTOyAgIAorICAgIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKwlPTVhfVklERU9fQVZDTEVWRUxUWVBFIGVMZXZlbDsgCisgICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsgIAorCU9NWF9CT09MIGJGcmFtZU1Cc09ubHk7ICAgICAgICAJCQkJCQkJCQkKKyAgICBPTVhfQk9PTCBiTUJBRkY7ICAgICAgICAgICAgICAgCisgICAgT01YX0JPT0wgYkVudHJvcHlDb2RpbmdDQUJBQzsgIAorICAgIE9NWF9CT09MIGJXZWlnaHRlZFBQcmVkaWN0aW9uOyAKKyAgICBPTVhfVTMyIG5XZWlnaHRlZEJpcHJlZGljaXRvbk1vZGU7IAorICAgIE9NWF9CT09MIGJjb25zdElwcmVkIDsKKyAgICBPTVhfQk9PTCBiRGlyZWN0OHg4SW5mZXJlbmNlOyAgCisJT01YX0JPT0wgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbDsKKwlPTVhfVTMyIG5DYWJhY0luaXRJZGM7CisJT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFIGVMb29wRmlsdGVyTW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFIHsKKyAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAKKyAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAKKyAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKKyAgIE9NWF9VMzIgZVByb2ZpbGU7ICAgICAgLyoqPCB0eXBlIGlzIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSwgT01YX1ZJREVPX0gyNjNQUk9GSUxFVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLworICAgT01YX1UzMiBlTGV2ZWw7ICAgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSwgT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgZGVwZW5kaW5nIG9uIGNvbnRleHQgKi8KKyAgIE9NWF9VMzIgblByb2ZpbGVJbmRleDsgLyoqPCBVc2VkIHRvIHF1ZXJ5IGZvciBpbmRpdmlkdWFsIHByb2ZpbGUgc3VwcG9ydCBpbmZvcm1hdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBpcyB2YWxpZCBvbmx5IGZvciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsUXVlcnlTdXBwb3J0ZWQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGFsbCBvdGhlciBpbmRpY2VzIHRoaXMgcGFyYW1ldGVyIGlzIHRvIGJlIGlnbm9yZWQuICovCit9IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFOworCisvKiogCisgKiBTdHJ1Y3R1cmUgZm9yIGR5bmFtaWNhbGx5IGNvbmZpZ3VyaW5nIGJpdHJhdGUgbW9kZSBvZiBhIGNvZGVjLiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdCBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3QgYXBwbGllcyB0bworICogIG5FbmNvZGVCaXRyYXRlIDogVGFyZ2V0IGF2ZXJhZ2UgYml0cmF0ZSB0byBiZSBnZW5lcmF0ZWQgaW4gYnBzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQklUUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbkVuY29kZUJpdHJhdGU7ICAgICAgICAgICAgICAgICAKK30gT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRTsKKworLyoqIAorICogRGVmaW5lcyBFbmNvZGVyIEZyYW1lIFJhdGUgc2V0dGluZworICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICB4RW5jb2RlRnJhbWVyYXRlIDogRW5jb2RpbmcgZnJhbWVyYXRlIHJlcHJlc2VudGVkIGluIFExNiBmb3JtYXQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiB4RW5jb2RlRnJhbWVyYXRlOyAvKiBRMTYgZm9ybWF0ICovCit9IE9NWF9DT05GSUdfRlJBTUVSQVRFVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19JTlRSQVJFRlJFU0hWT1BUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgSW50cmFSZWZyZXNoVk9QOworfSBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkVyck1hcFNpemU7ICAgICAgICAgICAvKiBTaXplIG9mIHRoZSBFcnJvciBNYXAgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVTggIEVyck1hcFsxXTsgICAgICAgICAgICAgLyogRXJyb3IgbWFwIGhpbnQgKi8KK30gT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01CRVJST1JSRVBPUlRJTkdUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZWQ7Cit9IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9NQUNST0JMT0NLU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5NYWNyb2Jsb2NrczsKK30gT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRTsKKworLyoqIAorICogQVZDIFNsaWNlIE1vZGUgbW9kZXMgCisgKgorICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ICAgOiBOb3JtYWwgZnJhbWUgZW5jb2RpbmcsIG9uZSBzbGljZSBwZXIgZnJhbWUKKyAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSAgIDogTkFMIG1vZGUsIG51bWJlciBvZiBNQnMgcGVyIGZyYW1lCisgKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSA6IE5BTCBtb2RlLCBudW1iZXIgb2YgYnl0ZXMgcGVyIGZyYW1lCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSB7CisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNEZWZhdWx0ID0gMCwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ01CU2xpY2UsCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNCeXRlU2xpY2UsCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTGV2ZWxNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFOworCisvKiogCisgKiBBVkMgRk1PIFNsaWNlIE1vZGUgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5OdW1TbGljZUdyb3VwcyA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHNsaWNlIGdyb3VwcworICogIG5TbGljZUdyb3VwTWFwVHlwZSA6IFNwZWNpZmllcyB0aGUgdHlwZSBvZiBzbGljZSBncm91cHMKKyAqICBlU2xpY2VNb2RlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNTTElDRUZNTyB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTggbk51bVNsaWNlR3JvdXBzOworICAgIE9NWF9VOCBuU2xpY2VHcm91cE1hcFR5cGU7CisgICAgT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEUgZVNsaWNlTW9kZTsKK30gT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1POworCisvKiogCisgKiBBVkMgSURSIFBlcmlvZCBDb25maWdzCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbklEUlBlcmlvZCA6IFNwZWNpZmllcyBwZXJpb2RpY2l0eSBvZiBJRFIgZnJhbWVzCisgKiAgblBGcmFtZXMgOiBTcGVjaWZpZXMgaW50ZXJuYWwgb2YgY29kaW5nIEludHJhIGZyYW1lcworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbklEUlBlcmlvZDsKKyAgICBPTVhfVTMyIG5QRnJhbWVzOworfSBPTVhfVklERU9fQ09ORklHX0FWQ0lOVFJBUEVSSU9EOworCisvKiogCisgKiBBVkMgTkFMIFNpemUgQ29uZmlncworICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5OYWx1Qnl0ZXMgOiBTcGVjaWZpZXMgdGhlIE5BTCB1bml0IHNpemUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbk5hbHVCeXRlczsKK30gT01YX1ZJREVPX0NPTkZJR19OQUxTSVpFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLworCg==