ZGlmZiAtLWdpdCBhL0FuZHJvaWQubWsgYi9BbmRyb2lkLm1rCmluZGV4IDQ1MWI3MmYuLmZlN2FkZGYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQubWsKKysrIGIvQW5kcm9pZC5tawpAQCAtMjAsMyArMjAsOSBAQAogaW5jbHVkZSBoYXJkd2FyZS9zYW1zdW5nL2V4eW5vczR4MTIubWsKIGVuZGlmCiBlbmRpZgorCitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksczVwYzExMCkKK2lmbmVxICgkKFRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUpLGhlcnJpbmcpCitpbmNsdWRlIGhhcmR3YXJlL3NhbXN1bmcvczVwYzExMC5taworZW5kaWYKK2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACisjCisjIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpZmVxICgkKFRBUkdFVF9CT0FSRF9QTEFURk9STSksczVwYzExMCkKKworIyBhdWRpbywgY2FtZXJhLCBzZW5zb3IgYW5kIGxpZ2h0IEhBTHMgYXJlIGRldmljZSBzcGVjaWZjCitzNXBjMTEwX2RpcnMgOj0gbGliaHdjb21wb3NlciBsaWJzM2NqcGVnIGxpYnN0YWdlZnJpZ2h0aHcgc2VjX21tCisKK2luY2x1ZGUgJChjYWxsIGFsbC1uYW1lZC1zdWJkaXItbWFrZWZpbGVzLCQoczVwYzExMF9kaXJzKSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL2hhbF9wdWJsaWMuaCBiL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL2hhbF9wdWJsaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGYzM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvaGFsX3B1YmxpYy5oCkBAIC0wLDAgKzEsMTcxIEBACisvKiBDb3B5cmlnaHQgKGMpIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBMdGQuCisgKgorICogVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTUlUIGxpY2Vuc2UgYXMgc2V0IG91dCBiZWxvdy4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CisgKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAorICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cworICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCisgKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCisgKiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKKyAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCisgKiBUSEUgU09GVFdBUkUuCisgKi8KKworI2lmbmRlZiBIQUxfUFVCTElDX0gKKyNkZWZpbmUgSEFMX1BVQkxJQ19ICisKKy8qIEF1dGhvcnMgb2YgdGhpcmQgcGFydHkgaGFyZHdhcmUgY29tcG9zZXIgKEhXQykgbW9kdWxlcyB3aWxsIG5lZWQgdG8gaW5jbHVkZQorICogdGhpcyBoZWFkZXIgdG8gYWNjZXNzIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIGdyYWxsb2MgYW5kIGZyYW1lYnVmZmVyIEhBTHMuCisgKi8KKworI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKworI2RlZmluZSBBTElHTih4LGEpICgoKHgpICsgKGEpIC0gMUwpICYgfigoYSkgLSAxTCkpCisjZGVmaW5lIEhXX0FMSUdOICAgMzIKKworLyogVGhpcyBjYW4gYmUgdHVuZWQgZG93biBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIFNPQy4KKyAqCisgKiBJTUcgZm9ybWF0cyBhcmUgdXN1YWxseSBhIHNpbmdsZSBzdWItYWxsb2MuCisgKiBTb21lIE9FTSB2aWRlbyBmb3JtYXRzIGFyZSB0d28gc3ViLWFsbG9jcyAoWSwgVVYgcGxhbmVzKS4KKyAqIEZ1dHVyZSBPRU0gdmlkZW8gZm9ybWF0cyBtaWdodCBiZSB0aHJlZSBzdWItYWxsb2NzIChZLCBVLCBWIHBsYW5lcykuCisgKi8KKyNkZWZpbmUgTUFYX1NVQl9BTExPQ1MgMworCit0eXBlZGVmIHN0cnVjdAoreworICAgIG5hdGl2ZV9oYW5kbGVfdCBiYXNlOworCisgICAgLyogVGhlc2UgZmllbGRzIGNhbiBiZSBzZW50IGNyb3NzIHByb2Nlc3MuIFRoZXkgYXJlIGFsc28gdmFsaWQKKyAgICAgKiB0byBkdXBsaWNhdGUgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBBIHRhYmxlIGlzIHN0b3JlZCB3aXRoaW4gcHNQcml2YXRlRGF0YSBvbiBncmFsbG9jX21vZHVsZV90ICh0aGlzCisgICAgICogaXMgb2J2aW91c2x5IHBlci1wcm9jZXNzKSB3aGljaCBtYXBzIHN0YW1wcyB0byBhIG1hcHBlZAorICAgICAqIFBWUlNSVl9DTElFTlRfTUVNX0lORk8gaW4gdGhhdCBwcm9jZXNzLiBFYWNoIG1hcCBlbnRyeSBoYXMgYSBsb2NrCisgICAgICogY291bnQgYXNzb2NpYXRlZCB3aXRoIGl0LCBzYXRpc2Z5aW5nIHRoZSByZXF1aXJlbWVudHMgb2YgdGhlCisgICAgICogQW5kcm9pZCBBUEkuIFRoaXMgYWxzbyBwcmV2ZW50cyB1cyBmcm9tIGxlYWtpbmcgbWFwcy9hbGxvY2F0aW9ucy4KKyAgICAgKgorICAgICAqIFRoaXMgdGFibGUgaGFzIGVudHJpZXMgaW5zZXJ0ZWQgZWl0aGVyIGJ5IGFsbG9jKCkKKyAgICAgKiAoYWxsb2NfZGV2aWNlX3QpIG9yIG1hcCgpIChncmFsbG9jX21vZHVsZV90KS4gRW50cmllcyBhcmUgcmVtb3ZlZAorICAgICAqIGJ5IGZyZWUoKSAoYWxsb2NfZGV2aWNlX3QpIGFuZCB1bm1hcCgpIChncmFsbG9jX21vZHVsZV90KS4KKyAgICAgKgorICAgICAqIEFzIGEgc3BlY2lhbCBjYXNlIGZvciBmcmFtZWJ1ZmZlcl9kZXZpY2VfdCwgZnJhbWVidWZmZXJfb3BlbigpCisgICAgICogd2lsbCBhZGQgYW5kIGZyYW1lYnVmZmVyX2Nsb3NlKCkgd2lsbCByZW1vdmUgZnJvbSB0aGlzIHRhYmxlLgorICAgICAqLworCisjZGVmaW5lIElNR19OQVRJVkVfSEFORExFX05VTUZEUyBNQVhfU1VCX0FMTE9DUworICAgIC8qIFRoZSBgZmQnIGZpZWxkIGlzIHVzZWQgdG8gImV4cG9ydCIgYSBtZW1pbmZvIHRvIGFub3RoZXIgcHJvY2Vzcy4KKyAgICAgKiBUaGVyZWZvcmUsIGl0IGlzIGFsbG9jYXRlZCBieSBhbGxvY19kZXZpY2VfdCwgYW5kIGNvbnN1bWVkIGJ5CisgICAgICogZ3JhbGxvY19tb2R1bGVfdC4gVGhlIGZyYW1lYnVmZmVyX2RldmljZV90IGRvZXMgbm90IG5lZWQgYSBoYW5kbGUsCisgICAgICogYW5kIHRoZSBzcGVjaWFsIHZhbHVlIElNR19GUkFNRUJVRkZFUl9GRCBpcyB1c2VkIGluc3RlYWQuCisgICAgICovCisgICAgaW50IGZkW01BWF9TVUJfQUxMT0NTXTsKKworI2RlZmluZSBJTUdfTkFUSVZFX0hBTkRMRV9OVU1JTlRTICgoc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZykgLyBzaXplb2YoaW50KSkgKyA1KQorICAgIC8qIEEgS0VSTkVMIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBhbnkgZXhwb3J0ZWQga2VybmVsIG1lbWluZm8uIEVhY2gKKyAgICAgKiBleHBvcnRlZCBrZXJuZWwgbWVtaW5mbyB3aWxsIGhhdmUgYSB1bmlxdWUgc3RhbXAsIGJ1dCBub3RlIHRoYXQgaW4KKyAgICAgKiB1c2Vyc3BhY2UsIHNldmVyYWwgbWVtaW5mb3MgYWNyb3NzIG11bHRpcGxlIHByb2Nlc3NlcyBjb3VsZCBoYXZlCisgICAgICogdGhlIHNhbWUgc3RhbXAuIEFzIHRoZSBuYXRpdmVfaGFuZGxlIGNhbiBiZSBkdXAoMiknZCwgdGhlcmUgY291bGQgYmUKKyAgICAgKiBtdWx0aXBsZSBoYW5kbGVzIHdpdGggdGhlIHNhbWUgc3RhbXAgYnV0IGRpZmZlcmVudCBmaWxlIGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1aTY0U3RhbXA7CisKKyAgICAvKiBUaGlzIGlzIHVzZWQgZm9yIGJ1ZmZlciB1c2FnZSB2YWxpZGF0aW9uIHdoZW4gbG9ja2luZyBhIGJ1ZmZlciwKKyAgICAgKiBhbmQgYWxzbyBpbiBXU0VHTCAoZm9yIHRoZSBjb21wb3NpdGlvbiBieXBhc3MgZmVhdHVyZSkuCisgICAgICovCisgICAgaW50IHVzYWdlOworCisgICAgLy9pbnQgZHVtbXk7CisgICAgLyogSW4gb3JkZXIgdG8gZG8gZWZmaWNpZW50IGNhY2hlIGZsdXNoZXMgd2UgbmVlZCB0aGUgYnVmZmVyIGRpbWVuc2lvbnMKKyAgICAgKiBhbmQgZm9ybWF0LiBUaGVzZSBhcmUgYXZhaWxhYmxlIG9uIHRoZSBBTmF0aXZlV2luZG93QnVmZmVyLAorICAgICAqIGJ1dCB0aGUgcGxhdGZvcm0gZG9lc24ndCBwYXNzIHRoZW0gZG93biB0byB0aGUgZ3JhcGhpY3MgSEFMLgorICAgICAqCisgICAgICogVGhlc2UgZmllbGRzIGFyZSBhbHNvIHVzZWQgaW4gdGhlIGNvbXBvc2l0aW9uIGJ5cGFzcy4gSW4gdGhpcworICAgICAqIGNhcGFjaXR5LCB0aGVzZSBhcmUgdGhlICJyZWFsIiB2YWx1ZXMgZm9yIHRoZSBiYWNraW5nIGFsbG9jYXRpb24uCisgICAgICovCisgICAgaW50IGlXaWR0aDsKKyAgICBpbnQgaUhlaWdodDsKKyAgICBpbnQgaUZvcm1hdDsKKyAgICB1bnNpZ25lZCBpbnQgdWlCcHA7Cit9CitfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKHNpemVvZihpbnQpKSxwYWNrZWQpKSBJTUdfbmF0aXZlX2hhbmRsZV90OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGZyYW1lYnVmZmVyX2RldmljZV90IGJhc2U7CisKKyAgICAvKiBUaGUgSFdDIHdhcyBsb2FkZWQuIHBvc3QoKSBpcyBubyBsb25nZXIgcmVzcG9uc2libGUgZm9yIHByZXNlbnRzICovCisgICAgaW50IGJCeXBhc3NQb3N0OworCisgICAgLyogQ3VzdG9tLWJsaXQgY29tcG9uZW50cyBpbiBsaWV1IG9mIG92ZXJsYXkgaGFyZHdhcmUgKi8KKyAgICBpbnQgKCpCbGl0KShmcmFtZWJ1ZmZlcl9kZXZpY2VfdCAqZGV2aWNlLCBidWZmZXJfaGFuZGxlX3Qgc3JjLAorICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBkZXN0LCBpbnQgdywgaW50IGgsIGludCB4LCBpbnQgeSk7CisKKyAgICAvKiBIV0MgcGF0aCBmb3IgcHJlc2VudCBwb3N0cyAqLworICAgIGludCAoKlBvc3QyKShmcmFtZWJ1ZmZlcl9kZXZpY2VfdCAqZmIsIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVycywKKyAgICAgICAgICAgICAgICAgaW50IG51bV9idWZmZXJzLCB2b2lkICpkYXRhLCBpbnQgZGF0YV9sZW5ndGgpOworfQorSU1HX2ZyYW1lYnVmZmVyX2RldmljZV9wdWJsaWNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190Cit7CisgICAgZ3JhbGxvY19tb2R1bGVfdCBiYXNlOworCisgICAgLyogSWYgdGhlIGZyYW1lYnVmZmVyIGhhcyBiZWVuIG9wZW5lZCwgdGhpcyB3aWxsIHBvaW50IHRvIHRoZQorICAgICAqIGZyYW1lYnVmZmVyIGRldmljZSBkYXRhIHJlcXVpcmVkIGJ5IHRoZSBhbGxvY2F0b3IsIFdTRUdMCisgICAgICogbW9kdWxlcyBhbmQgY29tcG9zZXJoYWwuCisgICAgICovCisgICAgSU1HX2ZyYW1lYnVmZmVyX2RldmljZV9wdWJsaWNfdCAqcHNGcmFtZUJ1ZmZlckRldmljZTsKKworICAgIGludCAoKkdldFBoeUFkZHJzKShzdHJ1Y3QgSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190IGNvbnN0KiBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhdWlQaHlBZGRyW01BWF9TVUJfQUxMT0NTXSk7CisJLyogQ3VzdG9tLWJsaXQgY29tcG9uZW50cyBpbiBsaWV1IG9mIG92ZXJsYXkgaGFyZHdhcmUgKi8KKwlpbnQgKCpCbGl0KShzdHJ1Y3QgSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190IGNvbnN0ICptb2R1bGUsCisJCQkJYnVmZmVyX2hhbmRsZV90IHNyYywKKwkJCQl2b2lkICpkZXN0W01BWF9TVUJfQUxMT0NTXSwgaW50IGZvcm1hdCk7CisKKwlpbnQgKCpCbGl0Mikoc3RydWN0IElNR19ncmFsbG9jX21vZHVsZV9wdWJsaWNfdCBjb25zdCAqbW9kdWxlLAorCQkJCSBidWZmZXJfaGFuZGxlX3Qgc3JjLCBidWZmZXJfaGFuZGxlX3QgZGVzdCwKKwkJCQkgaW50IHcsIGludCBoLCBpbnQgeCwgaW50IHkpOworfQorSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190OworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGludCBsLCB0LCB3LCBoOworfQorSU1HX3dyaXRlX2xvY2tfcmVjdF90OworCit0eXBlZGVmIHN0cnVjdCBJTUdfYnVmZmVyX2Zvcm1hdF9wdWJsaWNfdAoreworICAgIC8qIEJ1ZmZlciBmb3JtYXRzIGFyZSByZXR1cm5lZCBhcyBhIGxpbmtlZCBsaXN0ICovCisgICAgc3RydWN0IElNR19idWZmZXJfZm9ybWF0X3B1YmxpY190ICpwc05leHQ7CisKKyAgICAvKiBIQUxfUElYRUxfRk9STUFUXy4uLiBlbnVtZXJhbnQgKi8KKyAgICBpbnQgaUhhbFBpeGVsRm9ybWF0OworCisgICAgLyogV1NFR0xfUElYRUxGT1JNQVRfLi4uIGVudW1lcmFudCAqLworICAgIGludCBpV1NFR0xQaXhlbEZvcm1hdDsKKworICAgIC8qIEZyaWVuZGx5IG5hbWUgZm9yIGZvcm1hdCAqLworICAgIGNvbnN0IGNoYXIgKmNvbnN0IHN6TmFtZTsKKworICAgIC8qIEJpdHMgKG5vdCBieXRlcykgcGVyIHBpeGVsICovCisgICAgdW5zaWduZWQgaW50IHVpQnBwOworCisgICAgLyogR1BVIG91dHB1dCBmb3JtYXQgKGNyZWF0ZXMgRUdMQ29uZmlnIGZvciBmb3JtYXQpICovCisgICAgaW50IGJHUFVSZW5kZXJhYmxlOworfQorSU1HX2J1ZmZlcl9mb3JtYXRfcHVibGljX3Q7CisKKyNlbmRpZiAvKiBIQUxfUFVCTElDX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3MzY19iYy5oIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvczNjX2JjLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWZhYjU0NAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3MzY19iYy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0BGaWxlICAgICAgICAgICBzM2NfYmMuaAorCitAVGl0bGUgICAgICAgICAgczNjX2JjIGtlcm5lbCBkcml2ZXIgcGFyYW1ldGVycworCitAQXV0aG9yICAgICAgICAgSW1hZ2luYXRpb24gVGVjaG5vbG9naWVzCisJCVNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uIExURAorCitARGF0ZSAgICAgICAgICAgMDMvMDMvMjAxMAorCitAQ29weXJpZ2h0ICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisJCXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKwkJWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKwkJaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKwkJVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorCQlkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorCQlXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKwkJU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorCQlsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworQFBsYXRmb3JtICAgICAgIEdlbmVyaWMKKworQERlc2NyaXB0aW9uICAgIHMzY19iYyBrZXJuZWwgZHJpdmVyIHBhcmFtZXRlcnMKKworQERveHlnZW5WZXIKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitNb2RpZmljYXRpb25zIDotCiskTG9nOiBzM2NfYmMuaCAkCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaWZuZGVmIF9fUzNDX0JDX0hfXworI2RlZmluZSBfX1MzQ19CQ19IX18KKworI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisKKyNkZWZpbmUgUzNDX0JDX0RFVklDRV9OQU1FCQkJCQkiczNjX2JjIgorCisjZGVmaW5lIFMzQ19CQ19ERVZJQ0VfSUQJCQkJCTAKKyNkZWZpbmUgUzNDX0JDX0RFVklDRV9CVUZGRVJfQ09VTlQJCQk0CQkJCQkJCQkvKiBUT0RPOiBNb2RpZnkgdGhpcyBhY2NvcmRpbmdseS4gKi8KKworI2RlZmluZSBTM0NfQkNfREVWSUNFX1BIWVNfUEFHRV9TSVpFCQkweDEwMDAJCQkJCQkJLyogNEtCICovCisKK3R5cGVkZWYgc3RydWN0IFMzQ19CQ19pb2N0bF9wYWNrYWdlX1RBRworeworCWludCBpbnB1dHBhcmFtOworCWludCBvdXRwdXRwYXJhbTsKK30gUzNDX0JDX2lvY3RsX3BhY2thZ2UsICpQUzNDX0JDX2lvY3RsX3BhY2thZ2U7CisKKy8qITwgTm92IDIwMDY6IGFjY29yZGluZyB0byBpb2N0bC1udW1iZXIudHh0ICdnJyB3YXNuJ3QgaW4gdXNlLiAqLworI2RlZmluZSBTM0NfQkNfSU9DX0dJRCAgICAgICdnJworCisjZGVmaW5lIFMzQ19CQ19JT1dSKElOREVYKSAgX0lPV1IoUzNDX0JDX0lPQ19HSUQsIElOREVYLCBTM0NfQkNfaW9jdGxfcGFja2FnZSkKKworI2RlZmluZSBTM0NfQkNfaW9jdGxfZ2V0X3BoeXNpY2FsX2Jhc2VfYWRkcmVzcwkJUzNDX0JDX0lPV1IoMCkKKworI2VuZGlmIC8qIF9fUzNDX0JDX19IX18gKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBFbmQgb2YgZmlsZSAoczNjX2JjLmgpCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zM2NfbWVtLmggYi9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zM2NfbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDUxMzk4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3MzY19tZW0uaApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfUzNDX01FTV9DT01NT05fSF8KKyNkZWZpbmUgX1MzQ19NRU1fQ09NTU9OX0hfCisKKyNkZWZpbmUgTUVNX0lPQ1RMX01BR0lDCQkJJ00nCisKKyNkZWZpbmUgUzNDX01FTV9BTExPQwkJCV9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzEwLCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKyNkZWZpbmUgUzNDX01FTV9GUkVFCQkJX0lPV1IoTUVNX0lPQ1RMX01BR0lDLCAzMTEsIHN0cnVjdCBzM2NfbWVtX2FsbG9jKQorCisjZGVmaW5lIFMzQ19NRU1fU0hBUkVfQUxMT0MJCV9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE0LCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKyNkZWZpbmUgUzNDX01FTV9TSEFSRV9GUkVFCQlfSU9XUihNRU1fSU9DVExfTUFHSUMsIDMxNSwgc3RydWN0IHMzY19tZW1fYWxsb2MpCisKKyNkZWZpbmUgUzNDX01FTV9DQUNIRUFCTEVfQUxMT0MJCV9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE2LCBzdHJ1Y3QgczNjX21lbV9hbGxvYykKKyNkZWZpbmUgUzNDX01FTV9DQUNIRUFCTEVfU0hBUkVfQUxMT0MJX0lPV1IoTUVNX0lPQ1RMX01BR0lDLCAzMTcsIHN0cnVjdCBzM2NfbWVtX2FsbG9jKQorCisjZGVmaW5lIFMzQ19NRU1fRE1BX0NPUFkJCV9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE4LCBzdHJ1Y3QgczNjX21lbV9kbWFfcGFyYW0pCisjZGVmaW5lIFMzQ19NRU1fRE1BX1NFVAkJCV9JT1dSKE1FTV9JT0NUTF9NQUdJQywgMzE5LCBzdHJ1Y3QgczNjX21lbV9kbWFfcGFyYW0pCisKKyNkZWZpbmUgUzNDX01FTV9DQUNIRV9JTlYJCQlfSU9XUihNRU1fSU9DVExfTUFHSUMsIDMzMCwgc3RydWN0IHMzY19tZW1fZG1hX3BhcmFtKQorCisKK3N0cnVjdCBzM2NfbWVtX2FsbG9jIHsKKwlpbnQJCXNpemU7CisJdW5zaWduZWQgaW50IAl2aXJfYWRkcjsKKwl1bnNpZ25lZCBpbnQgCXBoeV9hZGRyOworfTsKKworc3RydWN0IHMzY19tZW1fZG1hX3BhcmFtIHsKKwlpbnQJCXNpemU7CisJdW5zaWduZWQgaW50IAlzcmNfYWRkcjsKKwl1bnNpZ25lZCBpbnQgCWRzdF9hZGRyOworCWludAkJY2ZnOworfTsKKworI2lmIDAKK3R5cGVkZWYgc3RydWN0IF9zM2NfbWVtX3R7CisgICAgIGludCAgICAgZGV2X2ZkOworICAgICBzdHJ1Y3QgIHMzY19tZW1fYWxsb2MgICAgICAgbWVtX2FsbG9jX2luZm87Cit9czNjX21lbV90OworI2VuZGlmCisjZW5kaWYgLy8gX1MzQ19NRU1fQ09NTU9OX0hfCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zNXBfZmltYy5oIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvczVwX2ZpbWMuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmM3NjBjCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvczVwX2ZpbWMuaApAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBfUzVQX0ZJTUNfSF8KKyNkZWZpbmUgX1M1UF9GSU1DX0hfCisKKyNpbmNsdWRlIDxsaW51eC92aWRlb2RldjIuaD4KKworLyoKKyAqIEcgRSBOIEUgUiBBIEwgUworICoKKyovCisjZGVmaW5lIE1JTih4LCB5KQkJKCh4IDwgeSkgPyB4IDogeSkKKworLyoKKyAqIFAgSSBYIEUgTCAgIEYgTyBSIE0gQSBUICAgRyBVIEkgRCBFCisgKgorICogVGhlICd4JyBtZWFucyAnRE8gTk9UIENBUkUnCisgKiBUaGUgJyonIG1lYW5zICdGSU1DIFNQRUNJRklDJworICogRm9yIHNvbWUgZmltYyBmb3JtYXRzLCB3ZSBjb3VsZG4ndCBmaW5kIGVxdWl2YWxlbnQgZm9ybWF0IGluIHRoZSBWNEwyIEZPVVJDQy4KKyAqCisgKiBGSU1DIFRZUEUJUExBTkVTCU9SREVSCQlWNEwyX1BJWF9GTVQKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogUkdCNTY1CXgJeAkJVjRMMl9QSVhfRk1UX1JHQjU2NQorICogUkdCODg4CXgJeAkJVjRMMl9QSVhfRk1UX1JHQjI0CisgKiBZVVY0MjAJMglMU0JfQ0JDUglWNEwyX1BJWF9GTVRfTlYxMgorICogWVVWNDIwCTIJTFNCX0NSQ0IJVjRMMl9QSVhfRk1UX05WMjEKKyAqIFlVVjQyMAkyCU1TQl9DQkNSCVY0TDJfUElYX0ZNVF9OVjIxWCoKKyAqIFlVVjQyMAkyCU1TQl9DUkNCCVY0TDJfUElYX0ZNVF9OVjEyWCoKKyAqIFlVVjQyMAkzCXgJCVY0TDJfUElYX0ZNVF9ZVVY0MjAKKyAqIFlVVjQyMgkxCVlDQllDUgkJVjRMMl9QSVhfRk1UX1lVWVYKKyAqIFlVVjQyMgkxCVlDUllDQgkJVjRMMl9QSVhfRk1UX1lWWVUKKyAqIFlVVjQyMgkxCUNCWUNSWQkJVjRMMl9QSVhfRk1UX1VZVlkKKyAqIFlVVjQyMgkxCUNSWUNCWQkJVjRMMl9QSVhfRk1UX1ZZVVkqCisgKiBZVVY0MjIJMglMU0JfQ0JDUglWNEwyX1BJWF9GTVRfTlYxNioKKyAqIFlVVjQyMgkyCUxTQl9DUkNCCVY0TDJfUElYX0ZNVF9OVjYxKgorICogWVVWNDIyCTIJTVNCX0NCQ1IJVjRMMl9QSVhfRk1UX05WMTZYKgorICogWVVWNDIyCTIJTVNCX0NSQ0IJVjRMMl9QSVhfRk1UX05WNjFYKgorICogWVVWNDIyCTMJeAkJVjRMMl9QSVhfRk1UX1lVVjQyMlAKKyAqCisqLworCisvKgorICogViA0IEwgMiAgIEYgSSBNIEMgICBFIFggVCBFIE4gUyBJIE8gTiBTCisgKgorKi8KKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1lWWVUJCXY0bDJfZm91cmNjKCdZJywgJ1YnLCAnWScsICdVJykKKworLyogRk9VUkNDIGZvciBGSU1DIHNwZWNpZmljICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyWAkJdjRsMl9mb3VyY2MoJ04nLCAnMScsICcyJywgJ1gnKQorI2RlZmluZSBWNEwyX1BJWF9GTVRfTlYyMVgJCXY0bDJfZm91cmNjKCdOJywgJzInLCAnMScsICdYJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX1ZZVVkJCXY0bDJfZm91cmNjKCdWJywgJ1knLCAnVScsICdZJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTYJCXY0bDJfZm91cmNjKCdOJywgJ1YnLCAnMScsICc2JykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WNjEJCXY0bDJfZm91cmNjKCdOJywgJ1YnLCAnNicsICcxJykKKyNkZWZpbmUgVjRMMl9QSVhfRk1UX05WMTZYCQl2NGwyX2ZvdXJjYygnTicsICcxJywgJzYnLCAnWCcpCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjYxWAkJdjRsMl9mb3VyY2MoJ04nLCAnNicsICcxJywgJ1gnKQorCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyVCAgICAJdjRsMl9mb3VyY2MoJ1QnLCAnVicsICcxJywgJzInKSAvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCisKKy8qIENJRCBleHRlbnNpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX1JPVEFUSU9OCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMCkKKyNkZWZpbmUgVjRMMl9DSURfUkVTRVJWRURfTUVNX0JBU0VfQUREUgkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMjApCisjZGVmaW5lIFY0TDJfQ0lEX0ZJTUNfVkVSU0lPTgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIxKQorLyoKKyAqIFUgUyBFIFIgICBEIEUgRiBJIE4gRSBEICAgVCBZIFAgRSBTCisgKgorKi8KKwordHlwZWRlZiB1bnNpZ25lZCBpbnQgZG1hX2FkZHJfdDsKKworc3RydWN0IGZpbWNfYnVmIHsKKwlkbWFfYWRkcl90CWJhc2VbM107CisgCXNpemVfdAkJbGVuZ3RoWzNdOworfTsKKworc3RydWN0IGZpbWNfYnVmZmVyIHsKKwl2b2lkCSp2aXJ0X2FkZHI7CisJdm9pZAkqcGh5c19hZGRyOworCXNpemVfdAlsZW5ndGg7Cit9OworCitzdHJ1Y3QgeXV2X2ZtdF9saXN0IHsKKwljb25zdCBjaGFyIAkJKm5hbWU7CisJY29uc3QgY2hhciAJCSpkZXNjOworCXVuc2lnbmVkIGludCAJZm10OworCWludAkJCQlicHA7CisJaW50CQkJCXBsYW5lczsKK307CisKK3N0cnVjdCBpbWdfb2Zmc2V0IHsKKyAgICBpbnQgeV9oOworICAgIGludCB5X3Y7CisgICAgaW50IGNiX2g7CisgICAgaW50IGNiX3Y7CisgICAgaW50IGNyX2g7CisgICAgaW50IGNyX3Y7Cit9OworCisvLy0tLS0tLS0tLS0tLSBTVFJVQ1QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKwordHlwZWRlZglzdHJ1Y3QKK3sKKwl1bnNpZ25lZCBpbnQgZnVsbF93aWR0aDsJCQkvLyBTb3VyY2UgSW1hZ2UgRnVsbCBXaWR0aCAoVmlydHVhbCBzY3JlZW4gc2l6ZSkKKwl1bnNpZ25lZCBpbnQgZnVsbF9oZWlnaHQ7CQkJLy8gU291cmNlIEltYWdlIEZ1bGwgSGVpZ2h0IChWaXJ0dWFsIHNjcmVlbiBzaXplKQorCXVuc2lnbmVkIGludCBzdGFydF94OwkJCQkvLyBTb3VyY2UgSW1hZ2UgU3RhcnQgd2lkdGggb2Zmc2V0CisJdW5zaWduZWQgaW50IHN0YXJ0X3k7CQkJCS8vIFNvdXJjZSBJbWFnZSBTdGFydCBoZWlnaHQgb2Zmc2V0CisJdW5zaWduZWQgaW50IHdpZHRoOwkJCQkJLy8gU291cmNlIEltYWdlIFdpZHRoCisJdW5zaWduZWQgaW50IGhlaWdodDsJCQkJLy8gU291cmNlIEltYWdlIEhlaWdodAorCXVuc2lnbmVkIGludCBidWZfYWRkcl9waHlfcmdiX3k7CS8vIEJhc2UgQWRkcmVzcyBvZiB0aGUgU291cmNlIEltYWdlIChSR0Igb3IgWSk6IFBoeXNpY2FsIEFkZHJlc3MKKwl1bnNpZ25lZCBpbnQgYnVmX2FkZHJfcGh5X2NiOwkJLy8gQmFzZSBBZGRyZXNzIG9mIHRoZSBTb3VyY2UgSW1hZ2UgKENCIENvbXBvbmVudCkgOiBQaHlzaWNhbCBBZGRyZXNzCisJdW5zaWduZWQgaW50IGJ1Zl9hZGRyX3BoeV9jcjsJCS8vIEJhc2UgQWRkcmVzcyBvZiB0aGUgU291cmNlIEltYWdlIChDUiBDb21wb25lbnQpIDogUGh5c2ljYWwgQWRkcmVzcworCXVuc2lnbmVkIGludCBjb2xvcl9zcGFjZTsJCQkvLyBDb2xvciBTcGFjZSBvZiB0aGUgU291cmNlIEltYWdlCit9IHM1cF9maW1jX2ltZ19pbmZvOworCit0eXBlZGVmIHN0cnVjdCAKK3sKKwlzNXBfZmltY19pbWdfaW5mbwlzcmM7CisJczVwX2ZpbWNfaW1nX2luZm8JZHN0OworfSBzNXBfZmltY19wYXJhbXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgX3M1cF9maW1jX3QgeworICAgIGludCAgICAgICAgICAgICAgICBkZXZfZmQ7CisgICAgc3RydWN0IGZpbWNfYnVmZmVyICBvdXRfYnVmOworCisgICAgczVwX2ZpbWNfcGFyYW1zX3QgICBwYXJhbXM7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgIHVzZV9leHRfb3V0X21lbTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgIGh3X3ZlcjsKK31zNXBfZmltY190OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgZnVuY3Rpb25zIGZvciB2NGwyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCitpbnQgZmltY192NGwyX3NldF9zcmMoaW50IGZkLCB1bnNpZ25lZCBpbnQgaHdfdmVyLCBzNXBfZmltY19pbWdfaW5mbyAqc3JjKTsKK2ludCBmaW1jX3Y0bDJfc2V0X2RzdChpbnQgZmQsIHM1cF9maW1jX2ltZ19pbmZvICpkc3QsIGludCByb3RhdGlvbiwgdW5zaWduZWQgaW50IGFkZHIpOworaW50IGZpbWNfdjRsMl9zdHJlYW1fb24oaW50IGZkLCBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZSk7CitpbnQgZmltY192NGwyX3F1ZXVlKGludCBmZCwgc3RydWN0IGZpbWNfYnVmICpmaW1jX2J1Zik7CitpbnQgZmltY192NGwyX2RlcXVldWUoaW50IGZkKTsKK2ludCBmaW1jX3Y0bDJfc3RyZWFtX29mZihpbnQgZmQpOworaW50IGZpbWNfdjRsMl9jbHJfYnVmKGludCBmZCk7CitpbnQgZmltY19oYW5kbGVfb25lc2hvdChpbnQgZmQsIHN0cnVjdCBmaW1jX2J1ZiAqZmltY19idWYpOworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zZWNfZm9ybWF0LmggYi9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zZWNfZm9ybWF0LmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTlhNDdiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3NlY19mb3JtYXQuaApAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIF9TRUNfRk9STUFUX0hfCisjZGVmaW5lIF9TRUNfRk9STUFUX0hfCisKKy8qIGVudW0gcmVsYXRlZCB0byBwaXhlbCBmb3JtYXQgKi8KKworZW51bSB7CisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1AgICAgICAgID0gMHgxMDAsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfUCAgICAgICAgID0gMHgxMDEsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfSSAgICAgICAgID0gMHgxMDIsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIyX0kgICAgICAgID0gMHgxMDMsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIwX0kgICAgICAgID0gMHgxMDQsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUCAgICAgICAgID0gMHgxMDUsCisgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjJfU1AgICAgICAgID0gMHgxMDYsCisgICAgLy8gc3VwcG9ydCBjdXN0b20gZm9ybWF0IGZvciB6ZXJvIGNvcHkKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1AgPSAweDExMCwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjBfU1AgPSAweDExMSwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1BfVElMRUQgPSAweDExMiwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfU1AgPSAweDExMywKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfU1AgPSAweDExNCwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjJfSSAgPSAweDExNSwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfSSAgPSAweDExNiwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DYllDcllfNDIyX0kgPSAweDExNywKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DcllDYllfNDIyX0kgPSAweDExOCwKKyAgICBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9NQVgKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvc2VjX2xjZC5oIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvc2VjX2xjZC5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZhM2EzNGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS9zZWNfbGNkLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodEAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1NFQ19GQl9MQ0RfCisjZGVmaW5lIF9TRUNfRkJfTENEXworCisvKgorICogUyBUIFIgVSBDIFQgVSBSIEUgUyAgRiBPIFIgIEMgVSBTIFQgTyBNICBJIE8gQyBUIEwgUworICoKKyovCitzdHJ1Y3Qgc2VjZmJfdXNlcl93aW5kb3cgeworICAgIGludCB4OworICAgIGludCB5OworfTsKKworLyoKKyAqIEMgVSBTIFQgTyBNICBJIE8gQyBUIEwgUworICoKKyovCisKKyNkZWZpbmUgRkJJT19XQUlURk9SVlNZTkMgICAgICAgX0lPICAoJ0YnLCAzMikKKyNkZWZpbmUgU0VDRkJfV0lOX1BPU0lUSU9OICAgICAgX0lPVyAoJ0YnLCAyMDMsIHN0cnVjdCBzZWNmYl91c2VyX3dpbmRvdykKKyNkZWZpbmUgUzNDRkJfU0VUX1ZTWU5DX0lOVCAgICAgX0lPVyAoJ0YnLCAyMDYsIHVpbnQzMl90KQorCisjZGVmaW5lIERFRkFVTFRfTENEX1dJRFRIICAgKDQ4MCkKKyNkZWZpbmUgREVGQVVMVF9MQ0RfSEVJR0hUICAoODAwKQorI2RlZmluZSBERUZBVUxUX0xDRF9CUFAgICAgICgzMikKKworLyoqKioqKioqKioqKioqKioqIExDRCBmcmFtZSBidWZmZXIgKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEZCMF9OQU1FICAgICIvZGV2L2ZiMCIKKyNkZWZpbmUgRkIxX05BTUUgICAgIi9kZXYvZmIxIgorI2RlZmluZSBGQjJfTkFNRSAgICAiL2Rldi9mYjIiCisjZGVmaW5lIEZCM19OQU1FICAgICIvZGV2L2ZiMyIKKyNkZWZpbmUgRkI0X05BTUUgICAgIi9kZXYvZmI0IgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3NlY191dGlscy5oIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvc2VjX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0MWFmZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9pbmNsdWRlL3NlY191dGlscy5oCkBAIC0wLDAgKzEsMzMxIEBACisvKgorICogQ29weXJpZ2h0QCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIF9fU0FNU1VOR19TWVNMU0lfU0VDX0NPTU1PTl9IX18KKyNkZWZpbmUgX19TQU1TVU5HX1NZU0xTSV9TRUNfQ09NTU9OX0hfXworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisvLyBJbmNsdWRlCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS8vCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgInNlY19mb3JtYXQuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8bGludXgvdmlkZW9kZXYyLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIENvbW1vbiBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK3N0cnVjdCBBRERSUyB7CisgICAgdW5zaWduZWQgaW50IGFkZHJfeTsKKyAgICB1bnNpZ25lZCBpbnQgYWRkcl9jYmNyOworICAgIHVuc2lnbmVkIGludCBidWZfaWR4OworICAgIHVuc2lnbmVkIGludCByZXNlcnZlZDsKK307CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KKy8vIENvbW1vbiBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLy8KK2lubGluZSBpbnQgSEFMX1BJWEVMX0ZPUk1BVF8yX1Y0TDJfUElYKGludCBIQUxfUElYRUxfRk9STUFUKQoreworICAgIGludCBWNEwyX1BJWCA9IC0xOworCisgICAgc3dpdGNoIChIQUxfUElYRUxfRk9STUFUKSB7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0IzMjsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCMjQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1JHQjU2NTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQkdSQV84ODg4OgorICAgICAgICAvL1Y0TDJfUElYID0gVjRMMl9QSVhfRk1UX0JHUjMyOyAvLyB0aGlzIGlzIG5vdCBwcm9wZXIgb24gZmltYy4KKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCMzI7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfNTU1MToKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfUkdCNTU1WDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9SR0I0NDQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9QOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9ZVVY0MjA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9TUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlY2MTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9OVjEyOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9ZVVlWOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfWVVWNDIyUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ2JZQ3JZXzQyMl9JOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fQ2JZQ3JZXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9VWVZZOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ3JDYl80MjJfU1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfU1A6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX05WMTY7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMF9TUDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlYyMTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUF9USUxFRDoKKyAgICAgICAgVjRMMl9QSVggPSBWNEwyX1BJWF9GTVRfTlYxMlQ7CisgICAgICAgIGJyZWFrOworCisgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9JOgorICAgICAgICBWNEwyX1BJWCA9IFY0TDJfUElYX0ZNVF9ZVllVOworICAgICAgICBicmVhazsKKworICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DcllDYllfNDIyX0k6CisgICAgICAgIFY0TDJfUElYID0gVjRMMl9QSVhfRk1UX1ZZVVk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOjp1bm1hdGNoZWQgSEFMX1BJWEVMX0ZPUk1BVCBjb2xvcl9zcGFjZSgweCV4KVxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgSEFMX1BJWEVMX0ZPUk1BVCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBWNEwyX1BJWDsKK30KKworaW5saW5lIGludCBWNEwyX1BJWF8yX0hBTF9QSVhFTF9GT1JNQVQoaW50IFY0TDJfUElYKQoreworICAgIGludCBIQUxfUElYRUxfRk9STUFUID0gLTE7CisKKyAgICBzd2l0Y2ggKFY0TDJfUElYKSB7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODsKKyAgICAgICAgLy9IQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzg4ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMjQ6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl84ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX0JHUjMyOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzg4ODg7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTU1WDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV81NTUxOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1JHQjQ0NDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKyAgICAgICAgLy9IQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgorICAgICAgICAvL0hBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMl9TUDsKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDckNiXzQyMl9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorICAgICAgICAvL0hBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1lDckNiXzQyMF9TUDsKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMF9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorICAgICAgICAvL0hBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMl9JOworICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX0k7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfWVVWNDIyUDoKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1A7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfVVlWWToKKyAgICAgICAgLy9IQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DYllDcllfNDIyX0k7CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9DYllDcllfNDIyX0k7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKyAgICAgICAgLy9IQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfU1A7CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjBfU1A7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMlQ6CisgICAgICAgIEhBTF9QSVhFTF9GT1JNQVQgPSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ2JDcl80MjBfU1BfVElMRUQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX1lDYkNyXzQyMl9TUDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVllVOgorICAgICAgICBIQUxfUElYRUxfRk9STUFUID0gSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX0k7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBWNEwyX1BJWF9GTVRfVllVWToKKyAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVCA9IEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NyWUNiWV80MjJfSTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXM6OnVubWF0Y2hlZCBWNEwyX1BJWCBjb2xvcl9zcGFjZSglZClcbiIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIFY0TDJfUElYKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIEhBTF9QSVhFTF9GT1JNQVQ7Cit9CisKKyNkZWZpbmUgQUxJR05fVE9fMzJCKHgpICAgKCgoKHgpICsgKDEgPDwgIDUpIC0gMSkgPj4gIDUpIDw8ICA1KQorI2RlZmluZSBBTElHTl9UT18xMjhCKHgpICAoKCgoeCkgKyAoMSA8PCAgNykgLSAxKSA+PiAgNykgPDwgIDcpCisjZGVmaW5lIEFMSUdOX1RPXzhLQih4KSAgICgoKCh4KSArICgxIDw8IDEzKSAtIDEpID4+IDEzKSA8PCAxMykKKworI2RlZmluZSBHRVRfMzJCUFBfRlJBTUVfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpIDw8IDIpCisjZGVmaW5lIEdFVF8yNEJQUF9GUkFNRV9TSVpFKHcsIGgpICAoKCh3KSAqIChoKSkgKiAzKQorI2RlZmluZSBHRVRfMTZCUFBfRlJBTUVfU0laRSh3LCBoKSAgKCgodykgKiAoaCkpIDw8IDEpCisKK2lubGluZSB1bnNpZ25lZCBpbnQgRlJBTUVfU0laRShpbnQgSEFMX1BJWEVMX0ZPUk1BVCwgaW50IHcsIGludCBoKQoreworICAgIHVuc2lnbmVkIGludCBmcmFtZV9zaXplID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZSAgICAgICA9IDA7CisKKyAgICBzd2l0Y2ggKEhBTF9QSVhFTF9GT1JNQVQpIHsKKyAgICAvLyAxNmJwcAorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JfNTY1OgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzU1NTE6CisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfQVJHQl8xNTU1OgorICAgIC8vY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfNTU1MToKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9BQkdSXzE1NTU6CisKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9SR0JYXzU1NTE6CisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfWFJHQl8xNTU1OgorICAgIC8vY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUlhfNTU1MToKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9YQkdSXzE1NTU6CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCQV80NDQ0OgorICAgIC8vY2FzZSBIQUxfUElYRUxfRk9STUFUX0FSR0JfNDQ0NDoKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JBXzQ0NDQ6CisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfQUJHUl80NDQ0OgorCisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF80NDQ0OgorICAgIC8vY2FzZSBIQUxfUElYRUxfRk9STUFUX1hSR0JfNDQ0NDoKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JYXzQ0NDQ6CisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfWEJHUl80NDQ0OgorICAgICAgICBmcmFtZV9zaXplID0gR0VUXzE2QlBQX0ZSQU1FX1NJWkUodywgaCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gMjRicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCXzg4ODoKKyAgICAgICAgZnJhbWVfc2l6ZSA9IEdFVF8yNEJQUF9GUkFNRV9TSVpFKHcsIGgpOworICAgICAgICBicmVhazsKKworICAgIC8vIDMyYnBwCisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1JHQkFfODg4ODoKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9BUkdCXzg4ODg6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0JHUkFfODg4ODoKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9BQkdSXzg4ODg6CisKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OgorICAgIC8vY2FzZSBIQUxfUElYRUxfRk9STUFUX1hSR0JfODg4ODoKKyAgICAvL2Nhc2UgSEFMX1BJWEVMX0ZPUk1BVF9CR1JYXzg4ODg6CisgICAgLy9jYXNlIEhBTF9QSVhFTF9GT1JNQVRfWEJHUl84ODg4OgorICAgICAgICBmcmFtZV9zaXplID0gR0VUXzMyQlBQX0ZSQU1FX1NJWkUodywgaCk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gMTJicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWVYxMjoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIwX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfUDoKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NiWUNyWV80MjBfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIwX1NQOgorICAgICAgICBzaXplID0gdyAqIGg7CisgICAgICAgIC8vIGZyYW1lX3NpemUgPSB3aWR0aCAqIGhlaWdodCAqIDMgLyAyOworICAgICAgICAvLyBzdzU3NzEucGFyayA6IHZlcnkgY3VyaW91cy4uLgorICAgICAgICAvLyBmcmFtZV9zaXplID0gc2l6ZSArICgoc2l6ZSAvIDQpICogMik7CisgICAgICAgIGZyYW1lX3NpemUgPSBzaXplICsgKChzaXplID4+IDIpIDw8IDEpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIwX1NQX1RJTEVEOgorICAgICAgICBmcmFtZV9zaXplID0gICBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4Qih3KSAqIEFMSUdOX1RPXzMyQihoKSkKKyAgICAgICAgICAgICAgICAgICAgICsgQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIodykgKiBBTElHTl9UT18zMkIoaCA+PiAxKSk7CisgICAgICAgIGJyZWFrOworCisgICAgLy8gMTZicHAKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIyX1A6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NiWUNyWV80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfWUNyQ2JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNyQ2JfNDIyX1NQOgorICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9DVVNUT01fWUNiQ3JfNDIyX0k6CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0NVU1RPTV9ZQ3JDYl80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NiWUNyWV80MjJfSToKKyAgICBjYXNlIEhBTF9QSVhFTF9GT1JNQVRfQ1VTVE9NX0NyWUNiWV80MjJfSToKKyAgICAgICAgZnJhbWVfc2l6ZSA9IEdFVF8xNkJQUF9GUkFNRV9TSVpFKHcsIGgpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dEKCIlczo6bm8gbWF0Y2hpbmcgc291cmNlIGNvbG9yZm9ybWF0KDB4JXgpLCB3KCVkKSwgaCglZCkgZmFpbFxuIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgSEFMX1BJWEVMX0ZPUk1BVCwgdywgaCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiBmcmFtZV9zaXplOworfQorCisjZW5kaWYgLy9fX1NBTVNVTkdfU1lTTFNJX1NFQ19DT01NT05fSF9fCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvaW5jbHVkZS92aWRlb2RldjJfc2Ftc3VuZy5oIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvdmlkZW9kZXYyX3NhbXN1bmcuaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDRkY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2luY2x1ZGUvdmlkZW9kZXYyX3NhbXN1bmcuaApAQCAtMCwwICsxLDYzNiBAQAorLyoKKyAqIFZpZGVvIGZvciBMaW51eCBUd28gaGVhZGVyIGZpbGUgZm9yIHNhbXN1bmcKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDksIFNhbXN1bmcgRWxlY3Ryb25pY3MKKyAqCisgKiBUaGlzIGhlYWRlciBmaWxlIGNvbnRhaW5zIHNldmVyYWwgdjRsMiBBUElzIHRvIGJlIHByb3Bvc2VkIHRvIHY0bDIKKyAqIGNvbW11bml0eSBhbmQgdW50aWwgYmVpbiBhY2NlcHRlZCwgd2lsbCBiZSB1c2VkIHJlc3RyaWN0bHkgaW4gU2Ftc3VuZydzCisgKiBjYW1lcmEgaW50ZXJmYWNlIGRyaXZlciBGSU1DLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQWx0ZXJuYXRpdmVseSwgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MSU5VWF9WSURFT0RFVjJfU0FNU1VOR19ICisjZGVmaW5lIF9fTElOVVhfVklERU9ERVYyX1NBTVNVTkdfSAorCisvKiBWYWx1ZXMgZm9yICdjYXBhYmlsaXRpZXMnIGZpZWxkICovCisvKiBPYmplY3QgZGV0ZWN0aW9uIGRldmljZSAqLworI2RlZmluZSBWNEwyX0NBUF9PQkpfUkVDT0dOSVRJT04JMHgxMDAwMDAwMAorLyogc3Ryb2JlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVjRMMl9DQVBfU1RST0JFCQkJMHgyMDAwMDAwMAorCisjZGVmaW5lIFY0TDJfQ0lEX0ZPQ1VTX01PREUJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDE3KQorLyogRm9jdXMgTWV0aG9kcyAqLworZW51bSB2NGwyX2ZvY3VzX21vZGUgeworCVY0TDJfRk9DVVNfTU9ERV9BVVRPCQk9IDAsCisJVjRMMl9GT0NVU19NT0RFX01BQ1JPCQk9IDEsCisJVjRMMl9GT0NVU19NT0RFX01BTlVBTAkJPSAyLAorCVY0TDJfRk9DVVNfTU9ERV9MQVNUUAkJPSAyLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9aT09NX01PREUJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDE4KQorLyogWm9vbSBNZXRob2RzICovCitlbnVtIHY0bDJfem9vbV9tb2RlIHsKKwlWNEwyX1pPT01fTU9ERV9DT05USU5VT1VTCT0gMCwKKwlWNEwyX1pPT01fTU9ERV9PUFRJQ0FMCQk9IDEsCisJVjRMMl9aT09NX01PREVfRElHSVRBTAkJPSAyLAorCVY0TDJfWk9PTV9NT0RFX0xBU1RQCQk9IDIsCit9OworCisvKiBFeHBvc3VyZSBNZXRob2RzICovCisjZGVmaW5lIFY0TDJfQ0lEX1BIT1RPTUVUUlkJCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDE5KQorZW51bSB2NGwyX3Bob3RvbWV0cnlfbW9kZSB7CisJVjRMMl9QSE9UT01FVFJZX01VTFRJU0VHID0gMCwJLypNdWx0aSBTZWdtZW50ICovCisJVjRMMl9QSE9UT01FVFJZX0NXQQk9IDEsCS8qQ2VudHJlIFdlaWdodGVkIEF2ZXJhZ2UgKi8KKwlWNEwyX1BIT1RPTUVUUllfU1BPVAk9IDIsCisJVjRMMl9QSE9UT01FVFJZX0FGU1BPVAk9IDMsCS8qU3BvdCBtZXRlcmluZyBvbiBmb2N1c2VkIHBvaW50ICovCisJVjRMMl9QSE9UT01FVFJZX0xBU1RQID0gVjRMMl9QSE9UT01FVFJZX0FGU1BPVCwKK307CisKKy8qIE1hbnVhbCBleHBvc3VyZSBjb250cm9sIGl0ZW1zIG1lbnUgdHlwZTogaXJpcywgc2h1dHRlciwgaXNvICovCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9BUEVSVFVSRQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAyMCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1NIVVRURVIJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMjEpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9JU08JKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMjIpCisKKy8qIEZvbGxvd2luZyBDSURzIGFyZSBtZW51IHR5cGUgKi8KKyNkZWZpbmUgVjRMMl9DSURfU0NFTkVNT0RFCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDIzKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fU1RBQklMSVpFCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDI0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fTVVMVElTSE9UCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDI1KQorCisvKiBDb250cm9sIGR5bmFtaWMgcmFuZ2UgKi8KKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RSCQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAyNikKKworLyogV2hpdGUgYmFsYW5jZSBwcmVzZXQgY29udHJvbCAqLworI2RlZmluZSBWNEwyX0NJRF9XSElURV9CQUxBTkNFX1BSRVNFVAkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAyNykKKworLyogQ0lEIGV4dGVuc2lvbnMgKi8KKyNkZWZpbmUgVjRMMl9DSURfUk9UQVRJT04JCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAwKQorI2RlZmluZSBWNEwyX0NJRF9QQUREUl9ZCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMSkKKyNkZWZpbmUgVjRMMl9DSURfUEFERFJfQ0IJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyKQorI2RlZmluZSBWNEwyX0NJRF9QQUREUl9DUgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMpCisjZGVmaW5lIFY0TDJfQ0lEX1BBRERSX0NCQ1IJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0KQorI2RlZmluZSBWNEwyX0NJRF9PVkVSTEFZX0FVVE8JCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1KQorI2RlZmluZSBWNEwyX0NJRF9PVkVSTEFZX1ZBRERSMAkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDYpCisjZGVmaW5lIFY0TDJfQ0lEX09WRVJMQVlfVkFERFIxCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNykKKyNkZWZpbmUgVjRMMl9DSURfT1ZFUkxBWV9WQUREUjIJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4KQorI2RlZmluZSBWNEwyX0NJRF9PVkxZX01PREUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5KQorI2RlZmluZSBWNEwyX0NJRF9EU1RfSU5GTwkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDEwKQorI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9FRkZFQ1RfRk4JKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDE2KQorI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9FRkZFQ1RfQVBQTFkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDE3KQorI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9FRkZFQ1RfQ0IJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDE4KQorI2RlZmluZSBWNEwyX0NJRF9JTUFHRV9FRkZFQ1RfQ1IJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDE5KQorI2RlZmluZSBWNEwyX0NJRF9SRVNFUlZFRF9NRU1fQkFTRV9BRERSCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyMCkKKyNkZWZpbmUgVjRMMl9DSURfRklNQ19WRVJTSU9OCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMjEpCisKKyNkZWZpbmUgVjRMMl9DSURfU1RSRUFNX1BBVVNFCQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDUzKQorCisvKiBDSUQgRXh0ZW5zaW9ucyBmb3IgY2FtZXJhIHNlbnNvciBvcGVyYXRpb25zICovCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9QUkVWSUVXX09OT0ZGCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNjQpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9DQVBUVVJFCQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDY1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19NRU1TSVpFCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNjYpCisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RBVEVfSU5GT19ZRUFSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTQpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9EQVRFX0lORk9fTU9OVEgJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0RBVEVfSU5GT19EQVRFCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMjIpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9TRU5TT1JfVkVSCQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDIzKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fRldfTUlOT1JfVkVSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMjQpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9GV19NQUpPUl9WRVIJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1BSTV9NSU5PUl9WRVIJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1BSTV9NQUpPUl9WRVIJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyNykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0ZXX1ZFUgkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAyOCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX1NFVF9GV19BRERSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMjkpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9TRVRfRldfU0laRQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMwKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fVVBEQVRFX0ZXCQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDMxKQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19NQUlOX1NJWkUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzMikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfTUFJTl9PRkZTRVQJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzMykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfVEhVTUJfU0laRQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fSlBFR19USFVNQl9PRkZTRVQJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzNSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfUE9TVFZJRVdfT0ZGU0VUCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAzNikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0pQRUdfUVVBTElUWQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM3KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fU0VOU09SX01BS0VSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMzgpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9TRU5TT1JfT1BUSUNBTAkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDM5KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fQUZfVkVSX0xPVwkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0MCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0FGX1ZFUl9ISUdICQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNDEpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTV9HQU1NQV9SR19MT1cJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0MikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0dBTU1BX1JHX0hJR0gJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0MykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0dBTU1BX0JHX0xPVwkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fR0FNTUFfQkdfSElHSAkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1fRFVNUF9GVwkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0NikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNX0dFVF9EVU1QX1NJWkUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA0NykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1ZUX01PREUJCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNDgpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9WR0FfQkxVUgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDQ5KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQ0FQVFVSRQkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1MCkKKworI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX0RBVEVfSU5GT19ZRUFSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNTQpCisjZGVmaW5lIFY0TDJfQ0lEX01BSU5fU1dfREFURV9JTkZPX01PTlRICShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1NSkKKyNkZWZpbmUgVjRMMl9DSURfTUFJTl9TV19EQVRFX0lORk9fREFURQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDU2KQorI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX0ZXX01JTk9SX1ZFUgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDU3KQorI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX0ZXX01BSk9SX1ZFUgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDU4KQorI2RlZmluZSBWNEwyX0NJRF9NQUlOX1NXX1BSTV9NSU5PUl9WRVIJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA1OSkKKyNkZWZpbmUgVjRMMl9DSURfTUFJTl9TV19QUk1fTUFKT1JfVkVSCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNjApCisKK2VudW0gdjRsMl9ibHVyIHsKKwlCTFVSX0xFVkVMXzAgPSAwLAorCUJMVVJfTEVWRUxfMSwKKwlCTFVSX0xFVkVMXzIsCisJQkxVUl9MRVZFTF8zLAorCUJMVVJfTEVWRUxfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0NFTkVfTU9ERQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDcwKQorZW51bSB2NGwyX3NjZW5lX21vZGUgeworCVNDRU5FX01PREVfQkFTRSwKKwlTQ0VORV9NT0RFX05PTkUsCisJU0NFTkVfTU9ERV9QT1JUUkFJVCwKKwlTQ0VORV9NT0RFX05JR0hUU0hPVCwKKwlTQ0VORV9NT0RFX0JBQ0tfTElHSFQsCisJU0NFTkVfTU9ERV9MQU5EU0NBUEUsCisJU0NFTkVfTU9ERV9TUE9SVFMsCisJU0NFTkVfTU9ERV9QQVJUWV9JTkRPT1IsCisJU0NFTkVfTU9ERV9CRUFDSF9TTk9XLAorCVNDRU5FX01PREVfU1VOU0VULAorCVNDRU5FX01PREVfRFVTVF9EQVdOLAorCVNDRU5FX01PREVfRkFMTF9DT0xPUiwKKwlTQ0VORV9NT0RFX0ZJUkVXT1JLUywKKwlTQ0VORV9NT0RFX1RFWFQsCisJU0NFTkVfTU9ERV9DQU5ETEVfTElHSFQsCisJU0NFTkVfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GTEFTSF9NT0RFCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzEpCitlbnVtIHY0bDJfZmxhc2hfbW9kZSB7CisJRkxBU0hfTU9ERV9CQVNFLAorCUZMQVNIX01PREVfT0ZGLAorCUZMQVNIX01PREVfQVVUTywKKwlGTEFTSF9NT0RFX09OLAorCUZMQVNIX01PREVfVE9SQ0gsCisJRkxBU0hfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9CUklHSFRORVNTCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzIpCitlbnVtIHY0bDJfZXZfbW9kZSB7CisJRVZfTUlOVVNfNCA9IDAsCisJRVZfTUlOVVNfMywKKwlFVl9NSU5VU18yLAorCUVWX01JTlVTXzEsCisJRVZfREVGQVVMVCwKKwlFVl9QTFVTXzEsCisJRVZfUExVU18yLAorCUVWX1BMVVNfMywKKwlFVl9QTFVTXzQsCisJRVZfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfV0hJVEVfQkFMQU5DRQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDczKQorZW51bSB2NGwyX3diX21vZGUgeworCVdISVRFX0JBTEFOQ0VfQkFTRSA9IDAsCisJV0hJVEVfQkFMQU5DRV9BVVRPLAorCVdISVRFX0JBTEFOQ0VfU1VOTlksCisJV0hJVEVfQkFMQU5DRV9DTE9VRFksCisJV0hJVEVfQkFMQU5DRV9UVU5HU1RFTiwKKwlXSElURV9CQUxBTkNFX0ZMVU9SRVNDRU5ULAorCVdISVRFX0JBTEFOQ0VfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfRUZGRUNUCQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDc0KQorZW51bSB2NGwyX2VmZmVjdF9tb2RlIHsKKwlJTUFHRV9FRkZFQ1RfQkFTRSA9IDAsCisJSU1BR0VfRUZGRUNUX05PTkUsCisJSU1BR0VfRUZGRUNUX0JOVywKKwlJTUFHRV9FRkZFQ1RfU0VQSUEsCisJSU1BR0VfRUZGRUNUX0FRVUEsCisJSU1BR0VfRUZGRUNUX0FOVElRVUUsCisJSU1BR0VfRUZGRUNUX05FR0FUSVZFLAorCUlNQUdFX0VGRkVDVF9TSEFSUEVOLAorCUlNQUdFX0VGRkVDVF9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9JU08JCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzUpCitlbnVtIHY0bDJfaXNvX21vZGUgeworCUlTT19BVVRPID0gMCwKKwlJU09fNTAsCisJSVNPXzEwMCwKKwlJU09fMjAwLAorCUlTT180MDAsCisJSVNPXzgwMCwKKwlJU09fMTYwMCwKKwlJU09fU1BPUlRTLAorCUlTT19OSUdIVCwKKwlJU09fTU9WSUUsCisJSVNPX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX01FVEVSSU5HCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzYpCitlbnVtIHY0bDJfbWV0ZXJpbmdfbW9kZSB7CisJTUVURVJJTkdfQkFTRSA9IDAsCisJTUVURVJJTkdfTUFUUklYLAorCU1FVEVSSU5HX0NFTlRFUiwKKwlNRVRFUklOR19TUE9ULAorCU1FVEVSSU5HX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NPTlRSQVNUCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzcpCitlbnVtIHY0bDJfY29udHJhc3RfbW9kZSB7CisJQ09OVFJBU1RfTUlOVVNfMiA9IDAsCisJQ09OVFJBU1RfTUlOVVNfMSwKKwlDT05UUkFTVF9ERUZBVUxULAorCUNPTlRSQVNUX1BMVVNfMSwKKwlDT05UUkFTVF9QTFVTXzIsCisJQ09OVFJBU1RfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0FUVVJBVElPTgkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDc4KQorZW51bSB2NGwyX3NhdHVyYXRpb25fbW9kZSB7CisJU0FUVVJBVElPTl9NSU5VU18yID0gMCwKKwlTQVRVUkFUSU9OX01JTlVTXzEsCisJU0FUVVJBVElPTl9ERUZBVUxULAorCVNBVFVSQVRJT05fUExVU18xLAorCVNBVFVSQVRJT05fUExVU18yLAorCVNBVFVSQVRJT05fTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0hBUlBORVNTCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgNzkpCitlbnVtIHY0bDJfc2hhcnBuZXNzX21vZGUgeworCVNIQVJQTkVTU19NSU5VU18yID0gMCwKKwlTSEFSUE5FU1NfTUlOVVNfMSwKKwlTSEFSUE5FU1NfREVGQVVMVCwKKwlTSEFSUE5FU1NfUExVU18xLAorCVNIQVJQTkVTU19QTFVTXzIsCisJU0hBUlBORVNTX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1dEUgkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4MCkKK2VudW0gdjRsMl93ZHJfbW9kZSB7CisJV0RSX09GRiwKKwlXRFJfT04sCisJV0RSX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0FOVElfU0hBS0UJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4MSkKK2VudW0gdjRsMl9hbnRpX3NoYWtlX21vZGUgeworCUFOVElfU0hBS0VfT0ZGLAorCUFOVElfU0hBS0VfU1RJTExfT04sCisJQU5USV9TSEFLRV9NT1ZJRV9PTiwKKwlBTlRJX1NIQUtFX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1RPVUNIX0FGX1NUQVJUX1NUT1AJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDgyKQorZW51bSB2NGwyX3RvdWNoX2FmIHsKKwlUT1VDSF9BRl9TVE9QID0gMCwKKwlUT1VDSF9BRl9TVEFSVCwKKwlUT1VDSF9BRl9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TTUFSVF9BVVRPCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgODMpCitlbnVtIHY0bDJfc21hcnRfYXV0byB7CisJU01BUlRfQVVUT19PRkYgPSAwLAorCVNNQVJUX0FVVE9fT04sCisJU01BUlRfQVVUT19NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9WSU5UQUdFX01PREUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA4NCkKK2VudW0gdjRsMl92aW50YWdlX21vZGUgeworCVZJTlRBR0VfTU9ERV9CQVNFLAorCVZJTlRBR0VfTU9ERV9PRkYsCisJVklOVEFHRV9NT0RFX05PUk1BTCwKKwlWSU5UQUdFX01PREVfV0FSTSwKKwlWSU5UQUdFX01PREVfQ09PTCwKKwlWSU5UQUdFX01PREVfQk5XLAorCVZJTlRBR0VfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9KUEVHX1FVQUxJVFkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDg1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfR1BTX0xBVElUVURFCShWNEwyX0NJRF9DQU1FUkFfQ0xBU1NfQkFTRSArIDMwKQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfR1BTX0xPTkdJVFVERQkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAzMSkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0dQU19USU1FU1RBTVAJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMzIpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9HUFNfQUxUSVRVREUJKFY0TDJfQ0lEX0NBTUVSQV9DTEFTU19CQVNFICsgMzMpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9FWElGX1RJTUVfSU5GTwkoVjRMMl9DSURfQ0FNRVJBX0NMQVNTX0JBU0UgKyAzNCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1pPT00JCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5MCkKK2VudW0gdjRsMl96b29tX2xldmVsIHsKKwlaT09NX0xFVkVMXzAgPSAwLAorCVpPT01fTEVWRUxfMSwKKwlaT09NX0xFVkVMXzIsCisJWk9PTV9MRVZFTF8zLAorCVpPT01fTEVWRUxfNCwKKwlaT09NX0xFVkVMXzUsCisJWk9PTV9MRVZFTF82LAorCVpPT01fTEVWRUxfNywKKwlaT09NX0xFVkVMXzgsCisJWk9PTV9MRVZFTF85LAorCVpPT01fTEVWRUxfMTAsCisJWk9PTV9MRVZFTF8xMSwKKwlaT09NX0xFVkVMXzEyLAorCVpPT01fTEVWRUxfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfRkFDRV9ERVRFQ1RJT04JCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5MSkKK2VudW0gdjRsMl9mYWNlX2RldGVjdGlvbiB7CisJRkFDRV9ERVRFQ1RJT05fT0ZGID0gMCwKKwlGQUNFX0RFVEVDVElPTl9PTiwKKwlGQUNFX0RFVEVDVElPTl9OT0xJTkUsCisJRkFDRV9ERVRFQ1RJT05fT05fQkVBVVRZLAorCUZBQ0VfREVURUNUSU9OX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1NNQVJUX0FVVE9fU1RBVFVTCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5MikKK2VudW0gdjRsMl9zbWFydF9hdXRvX3N0YXR1cyB7CisJU01BUlRfQVVUT19TVEFUVVNfQVVUTyA9IDAsCisJU01BUlRfQVVUT19TVEFUVVNfTEFORFNDQVBFLAorCVNNQVJUX0FVVE9fU1RBVFVTX1BPUlRSQUlULAorCVNNQVJUX0FVVE9fU1RBVFVTX01BQ1JPLAorCVNNQVJUX0FVVE9fU1RBVFVTX05JR0hULAorCVNNQVJUX0FVVE9fU1RBVFVTX1BPUlRSQUlUX05JR0hULAorCVNNQVJUX0FVVE9fU1RBVFVTX0JBQ0tMSVQsCisJU01BUlRfQVVUT19TVEFUVVNfUE9SVFJBSVRfQkFDS0xJVCwKKwlTTUFSVF9BVVRPX1NUQVRVU19BTlRJU0hBS0UsCisJU01BUlRfQVVUT19TVEFUVVNfUE9SVFJBSVRfQU5USVNIQUtFLAorCVNNQVJUX0FVVE9fU1RBVFVTX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX1NFVF9BVVRPX0ZPQ1VTCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgOTMpCitlbnVtIHY0bDJfYXV0b19mb2N1cyB7CisJQVVUT19GT0NVU19PRkYgPSAwLAorCUFVVE9fRk9DVVNfT04sCisJQVVUT19GT0NVU19NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9CRUFVVFlfU0hPVAkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDk0KQorZW51bSB2NGwyX2JlYXV0eV9zaG90IHsKKwlCRUFVVFlfU0hPVF9PRkYgPSAwLAorCUJFQVVUWV9TSE9UX09OLAorCUJFQVVUWV9TSE9UX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0FFQVdCX0xPQ0tfVU5MT0NLCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5NSkKK2VudW0gdjRsMl9hZV9hd2JfbG9ja3VubG9jayB7CisJQUVfVU5MT0NLX0FXQl9VTkxPQ0sgPSAwLAorCUFFX0xPQ0tfQVdCX1VOTE9DSywKKwlBRV9VTkxPQ0tfQVdCX0xPQ0ssCisJQUVfTE9DS19BV0JfTE9DSywKKwlBRV9BV0JfTUFYCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GQUNFREVURUNUX0xPQ0tVTkxPQ0sJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDk2KQorZW51bSB2NGwyX2ZhY2VfbG9jayB7CisJRkFDRV9MT0NLX09GRiA9IDAsCisJRkFDRV9MT0NLX09OLAorCUZJUlNUX0ZBQ0VfVFJBQ0tJTkcsCisJRkFDRV9MT0NLX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX09CSkVDVF9QT1NJVElPTl9YCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5NykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX09CSkVDVF9QT1NJVElPTl9ZCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5OCkKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0ZPQ1VTX01PREUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyA5OSkKK2VudW0gdjRsMl9mb2N1c21vZGUgeworCUZPQ1VTX01PREVfQVVUTyA9IDAsCisJRk9DVVNfTU9ERV9NQUNSTywKKwlGT0NVU19NT0RFX0ZBQ0VERVRFQ1QsCisJRk9DVVNfTU9ERV9BVVRPX0RFRkFVTFQsCisJRk9DVVNfTU9ERV9NQUNST19ERUZBVUxULAorCUZPQ1VTX01PREVfRkFDRURFVEVDVF9ERUZBVUxULAorCUZPQ1VTX01PREVfSU5GSU5JVFksCisJRk9DVVNfTU9ERV9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9PQkpfVFJBQ0tJTkdfU1RBVFVTCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMDApCitlbnVtIHY0bDJfb2JqX3RyYWNraW5nX3N0YXR1cyB7CisJT0JKRUNUX1RSQUNLSU5HX1NUQVRVU19CQVNFLAorCU9CSkVDVF9UUkFDS0lOR19TVEFUVVNfUFJPR1JFU1NJTkcsCisJT0JKRUNUX1RSQUNLSU5HX1NUQVRVU19TVUNDRVNTLAorCU9CSkVDVF9UUkFDS0lOR19TVEFUVVNfRkFJTCwKKwlPQkpFQ1RfVFJBQ0tJTkdfU1RBVFVTX01JU1NJTkcsCisJT0JKRUNUX1RSQUNLSU5HX1NUQVRVU19NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9PQkpfVFJBQ0tJTkdfU1RBUlRfU1RPUAkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTAxKQorZW51bSB2NGwyX290X3N0YXJ0X3N0b3AgeworCU9UX1NUT1AgPSAwLAorCU9UX1NUQVJULAorCU9UX01BWCwKK307CisKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NBRl9TVEFSVF9TVE9QCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTAyKQorZW51bSB2NGwyX2NhZl9zdGFydF9zdG9wIHsKKwlDQUZfU1RPUCA9IDAsCisJQ0FGX1NUQVJULAorCUNBRl9NQVgsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9BVVRPX0ZPQ1VTX1JFU1VMVF9GSVJTVAkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTAzKQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQVVUT19GT0NVU19SRVNVTFRfU0VDT05ECShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMjApCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GSU5JU0hfQVVUT19GT0NVUwkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTIxKQorCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9GUkFNRV9SQVRFCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTA0KQorZW51bSB2NGwyX2ZyYW1lX3JhdGUgeworCUZSQU1FX1JBVEVfQVVUTwk9IDAsCisJRlJBTUVfUkFURV83CT0gNywKKwlGUkFNRV9SQVRFXzE1CT0gMTUsCisJRlJBTUVfUkFURV8zMAk9IDMwLAorCUZSQU1FX1JBVEVfNjAJPSA2MCwKKwlGUkFNRV9SQVRFXzEyMAk9IDEyMCwKKwlGUkFNRV9SQVRFX01BWAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQU5USV9CQU5ESU5HCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTA1KQorZW51bSB2NGwyX2FudGlfYmFuZGluZyB7CisJQU5USV9CQU5ESU5HX0FVVE8JPSAwLAorCUFOVElfQkFORElOR181MEhaCT0gMSwKKwlBTlRJX0JBTkRJTkdfNjBIWgk9IDIsCisJQU5USV9CQU5ESU5HX09GRgk9IDMsCit9OworCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9TRVRfR0FNTUEJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMDYpCitlbnVtIHY0bDJfZ2FtbWFfbW9kZSB7CisJR0FNTUFfT0ZGCT0gMCwKKwlHQU1NQV9PTgk9IDEsCisJR0FNTUFfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0VUX1NMT1dfQUUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMDcpCitlbnVtIHY0bDJfc2xvd19hZV9tb2RlIHsKKwlTTE9XX0FFX09GRiwKKwlTTE9XX0FFX09OLAorCVNMT1dfQUVfTUFYLAorfTsKKworI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfQkFUQ0hfUkVGTEVDVElPTgkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTA4KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfRVhJRl9PUklFTlRBVElPTgkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTA5KQorCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9SRVNFVAkJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMTEpCisjZGVmaW5lIFY0TDJfQ0lEX0NBTUVSQV9DSEVDS19EQVRBTElORQkJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDExMikKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0NIRUNLX0RBVEFMSU5FX1NUT1AJKFY0TDJfQ0lEX1BSSVZBVEVfQkFTRSArIDExMykKKyNkZWZpbmUgVjRMMl9DSURfQ0FNRVJBX0dFVF9JU08JCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTE0KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfR0VUX1NIVF9USU1FCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTE1KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfU0VOU09SX01PREUJCShWNEwyX0NJRF9QUklWQVRFX0JBU0UgKyAxMTYpCisjZGVmaW5lIFY0TDJfQ0lEX0VTRF9JTlQJCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTE3KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfR0VUX0ZMQVNIX09OT0ZGCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTE4KQorI2RlZmluZSBWNEwyX0NJRF9DQU1FUkFfUkVUVVJOX0ZPQ1VTCQkoVjRMMl9DSURfUFJJVkFURV9CQVNFICsgMTE5KQorCisvKiBQaXhlbCBmb3JtYXQgRk9VUkNDIGRlcHRoIERlc2NyaXB0aW9uICovCisvKiAxMiAgWS9DYkNyIDQ6MjowIDY0eDMyIG1hY3JvYmxvY2tzICovCisjZGVmaW5lIFY0TDJfUElYX0ZNVF9OVjEyVCAgICB2NGwyX2ZvdXJjYygnVCcsICdWJywgJzEnLCAnMicpCisKKy8qCisgKiAgKiBWNEwyIGV4dGVudGlvbiBmb3IgZGlnaXRhbCBjYW1lcmEKKyAqICAgKi8KKy8qIFN0cm9iZSBmbGFzaCBsaWdodCAqLworZW51bSB2NGwyX3N0cm9iZV9jb250cm9sIHsKKwkvKiB0dXJuIG9mZiB0aGUgZmxhc2ggbGlnaHQgKi8KKwlWNEwyX1NUUk9CRV9DT05UUk9MX09GRgkJPSAwLAorCS8qIHR1cm4gb24gdGhlIGZsYXNoIGxpZ2h0ICovCisJVjRMMl9TVFJPQkVfQ09OVFJPTF9PTgkJPSAxLAorCS8qIGFjdCBndWlkZSBsaWdodCBiZWZvcmUgc3BsYXNoICovCisJVjRMMl9TVFJPQkVfQ09OVFJPTF9BRkdVSURFCT0gMiwKKwkvKiBjaGFyZ2UgdGhlIGZsYXNoIGxpZ2h0ICovCisJVjRMMl9TVFJPQkVfQ09OVFJPTF9DSEFSR0UJPSAzLAorfTsKKworZW51bSB2NGwyX3N0cm9iZV9jb25mIHsKKwlWNEwyX1NUUk9CRV9PRkYJCQk9IDAsCS8qIEFsd2F5cyBvZmYgKi8KKwlWNEwyX1NUUk9CRV9PTgkJCT0gMSwJLyogQWx3YXlzIHNwbGFzaGVzICovCisJLyogQXV0byBjb250cm9sIHByZXNldHMgKi8KKwlWNEwyX1NUUk9CRV9BVVRPCQk9IDIsCisJVjRMMl9TVFJPQkVfUkVERVlFX1JFRFVDVElPTgk9IDMsCisJVjRMMl9TVFJPQkVfU0xPV19TWU5DCQk9IDQsCisJVjRMMl9TVFJPQkVfRlJPTlRfQ1VSVEFJTgk9IDUsCisJVjRMMl9TVFJPQkVfUkVBUl9DVVJUQUlOCT0gNiwKKwkvKiBFeHRyYSBtYW51YWwgY29udHJvbCBwcmVzZXRzICovCisJLyoga2VlcCB0dXJuZWQgb24gdW50aWwgdHVybmluZyBvZmYgKi8KKwlWNEwyX1NUUk9CRV9QRVJNQU5FTlQJCT0gNywKKwlWNEwyX1NUUk9CRV9FWFRFUk5BTAkJPSA4LAorfTsKKworZW51bSB2NGwyX3N0cm9iZV9zdGF0dXMgeworCVY0TDJfU1RST0JFX1NUQVRVU19PRkYJCT0gMCwKKwkvKiB3aGlsZSBwcm9jZXNzaW5nIGNvbmZpZ3VyYXRpb25zICovCisJVjRMMl9TVFJPQkVfU1RBVFVTX0JVU1kJCT0gMSwKKwlWNEwyX1NUUk9CRV9TVEFUVVNfRVJSCQk9IDIsCisJVjRMMl9TVFJPQkVfU1RBVFVTX0NIQVJHSU5HCT0gMywKKwlWNEwyX1NUUk9CRV9TVEFUVVNfQ0hBUkdFRAk9IDQsCit9OworCisvKiBjYXBhYmlsaXRpZXMgZmllbGQgKi8KKy8qIE5vIHN0cm9iZSBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgVjRMMl9TVFJPQkVfQ0FQX05PTkUJCTB4MDAwMAorLyogQWx3YXlzIGZsYXNoIG9mZiBtb2RlICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9PRkYJCTB4MDAwMQorLyogQWx3YXlzIHVzZSBmbGFzaCBsaWdodCBtb2RlICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9PTgkJMHgwMDAyCisvKiBGbGFzaGxpZ2h0IHdvcmtzIGF1dG9tYXRpYyAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfQVVUTwkJMHgwMDA0CisvKiBSZWQtZXllIHJlZHVjdGlvbiAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfUkVERVlFCQkweDAwMDgKKy8qIFNsb3cgc3luYyAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfU0xPV1NZTkMJMHgwMDEwCisvKiBGcm9udCBjdXJ0YWluICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9GUk9OVF9DVVJUQUlOCTB4MDAyMAorLyogUmVhciBjdXJ0YWluICovCisjZGVmaW5lIFY0TDJfU1RST0JFX0NBUF9SRUFSX0NVUlRBSU4JMHgwMDQwCisvKiBrZWVwIHR1cm5lZCBvbiB1bnRpbCB0dXJuaW5nIG9mZiAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfUEVSTUFORU5UCTB4MDA4MAorLyogdXNlIGV4dGVybmFsIHN0cm9iZSAqLworI2RlZmluZSBWNEwyX1NUUk9CRV9DQVBfRVhURVJOQUwJMHgwMTAwCisKKy8qIFNldCBtb2RlIGFuZCBHZXQgc3RhdHVzICovCitzdHJ1Y3QgdjRsMl9zdHJvYmUgeworCS8qIG9mZi9vbi9jaGFyZ2U6MC8xLzIgKi8KKwllbnVtIHY0bDJfc3Ryb2JlX2NvbnRyb2wgY29udHJvbDsKKwkvKiBzdXBwb3J0ZWQgc3Ryb2JlIGNhcGFiaWxpdGllcyAqLworCV9fdTMyIGNhcGFiaWxpdGllczsKKwllbnVtIHY0bDJfc3Ryb2JlX2NvbmYgbW9kZTsKKwllbnVtIHY0bDJfc3Ryb2JlX3N0YXR1cyBzdGF0dXM7CS8qIHJlYWQgb25seSAqLworCS8qIGRlZmF1bHQgaXMgMCBhbmQgcmFuZ2Ugb2YgdmFsdWUgdmFyaWVzIGZyb20gZWFjaCBtb2RlbHMgKi8KKwlfX3UzMiBmbGFzaF9ldjsKKwlfX3UzMiByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgVklESU9DX1NfU1RST0JFICAgICBfSU9XUignVicsIDgzLCBzdHJ1Y3QgdjRsMl9zdHJvYmUpCisjZGVmaW5lIFZJRElPQ19HX1NUUk9CRSAgICAgX0lPUignVicsIDg0LCBzdHJ1Y3QgdjRsMl9zdHJvYmUpCisKKy8qIE9iamVjdCByZWNvZ25pdGlvbiBhbmQgY29sbGF0ZXJhbCBhY3Rpb25zICovCitlbnVtIHY0bDJfcmVjb2dfbW9kZSB7CisJVjRMMl9SRUNPR05JVElPTl9NT0RFX09GRgk9IDAsCisJVjRMMl9SRUNPR05JVElPTl9NT0RFX09OCT0gMSwKKwlWNEwyX1JFQ09HTklUSU9OX01PREVfTE9DSwk9IDIsCit9OworCitlbnVtIHY0bDJfcmVjb2dfYWN0aW9uIHsKKwlWNEwyX1JFQ09HTklUSU9OX0FDVElPTl9OT05FCT0gMCwJLyogb25seSByZWNvZ25pdGlvbiAqLworCVY0TDJfUkVDT0dOSVRJT05fQUNUSU9OX0JMSU5LCT0gMSwJLyogQ2FwdHVyZSBvbiBibGlua2luZyAqLworCVY0TDJfUkVDT0dOSVRJT05fQUNUSU9OX1NNSUxFCT0gMiwJLyogQ2FwdHVyZSBvbiBzbWlsaW5nICovCit9OworCitlbnVtIHY0bDJfcmVjb2dfcGF0dGVybiB7CisJVjRMMl9SRUNPR19QQVRURVJOX0ZBQ0UJCT0gMCwJLyogRmFjZSAqLworCVY0TDJfUkVDT0dfUEFUVEVSTl9IVU1BTgk9IDEsCS8qIEh1bWFuICovCisJVjRMMl9SRUNPR19QQVRURVJOX0NIQVIJCT0gMiwJLyogQ2hhcmFjdGVyICovCit9OworCitzdHJ1Y3QgdjRsMl9yZWNvZ19yZWN0IHsKKwllbnVtIHY0bDJfcmVjb2dfcGF0dGVybiBwOwkvKiBkZXRlY3RlZCBwYXR0ZXJuICovCisJc3RydWN0IHY0bDJfcmVjdCBvOwkJLyogZGV0ZWN0ZWQgYXJlYSAqLworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHY0bDJfcmVjb2dfZGF0YSB7CisJX191OCBkZXRlY3RfY250OwkvKiBkZXRlY3RlZCBvYmplY3QgY291bnRlciAqLworCXN0cnVjdCB2NGwyX3JlY3QgbzsJLyogZGV0ZWN0ZWQgYXJlYSAqLworCV9fdTMyIHJlc2VydmVkWzRdOworfTsKKworc3RydWN0IHY0bDJfcmVjb2duaXRpb24geworCWVudW0gdjRsMl9yZWNvZ19tb2RlIG1vZGU7CisKKwkvKiBXaGljaCBwYXR0ZXJuIHRvIGRldGVjdCAqLworCWVudW0gdjRsMl9yZWNvZ19wYXR0ZXJuIHBhdHRlcm47CisKKwkvKiBIb3cgbWFueSBvYmplY3QgdG8gZGV0ZWN0ICovCisJX191OCBvYmpfbnVtOworCisJLyogc2VsZWN0IGRldGVjdGVkIG9iamVjdCAqLworCV9fdTMyIGRldGVjdF9pZHg7CisKKwkvKiByZWFkIG9ubHkgOkdldCBvYmplY3QgY29vcmRpbmF0aW9uICovCisJc3RydWN0IHY0bDJfcmVjb2dfZGF0YSBkYXRhOworCisJZW51bSB2NGwyX3JlY29nX2FjdGlvbiBhY3Rpb247CisJX191MzIgcmVzZXJ2ZWRbNF07Cit9OworCisjZGVmaW5lIFZJRElPQ19TX1JFQ09HTklUSU9OCV9JT1dSKCdWJywgODUsIHN0cnVjdCB2NGwyX3JlY29nbml0aW9uKQorI2RlZmluZSBWSURJT0NfR19SRUNPR05JVElPTglfSU9SKCdWJywgODYsIHN0cnVjdCB2NGwyX3JlY29nbml0aW9uKQorCisvKiBXZSB1c2UgdGhpcyBzdHJ1Y3QgYXMgdGhlIHY0bDJfc3RyZWFtcGFybSByYXdfZGF0YSBmb3IKKyAqIFZJRElPQ19HX1BBUk0gYW5kIFZJRElPQ19TX1BBUk0KKyAqLworc3RydWN0IHNlY19jYW1fcGFybSB7CisJc3RydWN0IHY0bDJfY2FwdHVyZXBhcm0gY2FwdHVyZTsKKwlpbnQgY29udHJhc3Q7CisJaW50IGVmZmVjdHM7CisJaW50IGJyaWdodG5lc3M7CisJaW50IGZsYXNoX21vZGU7CisJaW50IGZvY3VzX21vZGU7CisJaW50IGlzbzsKKwlpbnQgbWV0ZXJpbmc7CisJaW50IHNhdHVyYXRpb247CisJaW50IHNjZW5lX21vZGU7CisJaW50IHNoYXJwbmVzczsKKwlpbnQgd2hpdGVfYmFsYW5jZTsKK307CisKKyNlbmRpZiAvKiBfX0xJTlVYX1ZJREVPREVWMl9TQU1TVU5HX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9saWJod2NvbXBvc2VyL0FuZHJvaWQubWsgYi9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZmRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzIgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorIyBIQUwgbW9kdWxlIGltcGxlbWVuYXRpb24sIG5vdCBwcmVsaW5rZWQgYW5kIHN0b3JlZCBpbgorIyBody88Q09QWVBJWF9IQVJEV0FSRV9NT0RVTEVfSUQ+Ljxyby5wcm9kdWN0LmJvYXJkPi5zbworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX1BSRUxJTktfTU9EVUxFIDo9IGZhbHNlCitMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfU0hBUkVEX0xJQlJBUklFUykvaHcKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nIGxpYmN1dGlscyBsaWJFR0wgbGliR0xFU3YxX0NNIGxpYmhhcmR3YXJlIGxpYmhhcmR3YXJlX2xlZ2FjeQorTE9DQUxfQ0ZMQUdTICs9IC1ETE9HX1RBRz1cImh3Y29tcG9zZXJcIgorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFNlY0hXQ1V0aWxzLmNwcCBTZWNIV0MuY3BwCisKK0xPQ0FMX01PRFVMRSA6PSBod2NvbXBvc2VyLiQoVEFSR0VUX0JPQVJEX1BMQVRGT1JNKQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9saWJod2NvbXBvc2VyL1NlY0hXQy5jcHAgYi9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9TZWNIV0MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYTExMDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9TZWNIV0MuY3BwCkBAIC0wLDAgKzEsNjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqCisgKiBAYXV0aG9yIFJhbWEsIE1la2Eodi5tZWthQHNhbXN1bmcuY29tKQorICAgICAgICAgICBTYW5nd29vLCBQYXJrKHN3NTc3MS5wYXJrQHNhbXN1bmcuY29tKQorICAgICAgICAgICBKYW1pZSBPaCAoanVuZy1taW4ub2hAc2Ftc3VuZy5jb20pCisgKiBAZGF0ZSAgIDIwMTEtMDctMjgKKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8RUdML2VnbC5oPgorI2luY2x1ZGUgPEdMRVMvZ2wuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvdWV2ZW50Lmg+CisjaW5jbHVkZSAiU2VjSFdDVXRpbHMuaCIKKworc3RhdGljIElNR19ncmFsbG9jX21vZHVsZV9wdWJsaWNfdCAqZ3BzR3JhbGxvY01vZHVsZTsKKworc3RhdGljIGludCBod2NfZGV2aWNlX29wZW4oY29uc3Qgc3RydWN0IGh3X21vZHVsZV90KiBtb2R1bGUsIGNvbnN0IGNoYXIqIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpOworCitzdGF0aWMgc3RydWN0IGh3X21vZHVsZV9tZXRob2RzX3QgaHdjX21vZHVsZV9tZXRob2RzID0geworICAgIG9wZW46IGh3Y19kZXZpY2Vfb3BlbgorfTsKKworaHdjX21vZHVsZV90IEhBTF9NT0RVTEVfSU5GT19TWU0gPSB7CisgICAgY29tbW9uOiB7CisgICAgICAgIHRhZzogSEFSRFdBUkVfTU9EVUxFX1RBRywKKyAgICAgICAgbW9kdWxlX2FwaV92ZXJzaW9uOiBIV0NfTU9EVUxFX0FQSV9WRVJTSU9OXzBfMSwKKyAgICAgICAgaGFsX2FwaV92ZXJzaW9uOiBIQVJEV0FSRV9IQUxfQVBJX1ZFUlNJT04sCisgICAgICAgIGlkOiBIV0NfSEFSRFdBUkVfTU9EVUxFX0lELAorICAgICAgICBuYW1lOiAiU2Ftc3VuZyBTNVBDMTFYIGh3Y29tcG9zZXIgbW9kdWxlIiwKKyAgICAgICAgYXV0aG9yOiAiU0FNU1VORyIsCisgICAgICAgIG1ldGhvZHM6ICZod2NfbW9kdWxlX21ldGhvZHMsCisgICAgfQorfTsKKworc3RhdGljIHZvaWQgZHVtcF9sYXllcihod2NfbGF5ZXJfdCBjb25zdCogbCkgeworICAgIEFMT0dEKCJcdHR5cGU9JWQsIGZsYWdzPSUwOHgsIGhhbmRsZT0lcCwgdHI9JTAyeCwgYmxlbmQ9JTA0eCwgeyVkLCVkLCVkLCVkfSwgeyVkLCVkLCVkLCVkfSIsCisgICAgICAgICAgICBsLT5jb21wb3NpdGlvblR5cGUsIGwtPmZsYWdzLCBsLT5oYW5kbGUsIGwtPnRyYW5zZm9ybSwgbC0+YmxlbmRpbmcsCisgICAgICAgICAgICBsLT5zb3VyY2VDcm9wLmxlZnQsCisgICAgICAgICAgICBsLT5zb3VyY2VDcm9wLnRvcCwKKyAgICAgICAgICAgIGwtPnNvdXJjZUNyb3AucmlnaHQsCisgICAgICAgICAgICBsLT5zb3VyY2VDcm9wLmJvdHRvbSwKKyAgICAgICAgICAgIGwtPmRpc3BsYXlGcmFtZS5sZWZ0LAorICAgICAgICAgICAgbC0+ZGlzcGxheUZyYW1lLnRvcCwKKyAgICAgICAgICAgIGwtPmRpc3BsYXlGcmFtZS5yaWdodCwKKyAgICAgICAgICAgIGwtPmRpc3BsYXlGcmFtZS5ib3R0b20pOworfQorCitzdGF0aWMgaW50IHNldF9zcmNfZHN0X2luZm8oaHdjX2xheWVyX3QgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjX2ltZyAqc3JjX2ltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjX2ltZyAqZHN0X2ltZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2VjX3JlY3QgKnNyY19yZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzZWNfcmVjdCAqZHN0X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbl9pZHgpCit7CisgICAgSU1HX25hdGl2ZV9oYW5kbGVfdCAqcHJldl9oYW5kbGUgPSAoSU1HX25hdGl2ZV9oYW5kbGVfdCAqKShjdXItPmhhbmRsZSk7CisKKyAgICAvLyBzZXQgc3JjIGltYWdlCisgICAgc3JjX2ltZy0+dyAgICAgICA9IHByZXZfaGFuZGxlLT5pV2lkdGg7CisgICAgc3JjX2ltZy0+aCAgICAgICA9IHByZXZfaGFuZGxlLT5pSGVpZ2h0OworICAgIHNyY19pbWctPmZvcm1hdCAgPSBwcmV2X2hhbmRsZS0+aUZvcm1hdDsKKyAgICBzcmNfaW1nLT5iYXNlICAgID0gTlVMTDsKKyAgICBzcmNfaW1nLT5vZmZzZXQgID0gMDsKKyAgICBzcmNfaW1nLT5tZW1faWQgID0wOworCisgICAgc3JjX2ltZy0+bWVtX3R5cGUgPSBIV0NfUEhZU19NRU1fVFlQRTsKKyAgICBzcmNfaW1nLT53ID0gKHNyY19pbWctPncgKyAxNSkgJiAofjE1KTsKKyAgICBzcmNfaW1nLT5oID0gKHNyY19pbWctPmggKyAxKSAmICh+MSkgOworCisgICAgLy9zZXQgc3JjIHJlY3QKKyAgICBzcmNfcmVjdC0+eCA9IFNFQ19NQVgoY3VyLT5zb3VyY2VDcm9wLmxlZnQsIDApOworICAgIHNyY19yZWN0LT55ID0gU0VDX01BWChjdXItPnNvdXJjZUNyb3AudG9wLCAwKTsKKyAgICBzcmNfcmVjdC0+dyA9IFNFQ19NQVgoY3VyLT5zb3VyY2VDcm9wLnJpZ2h0IC0gY3VyLT5zb3VyY2VDcm9wLmxlZnQsIDApOworICAgIHNyY19yZWN0LT53ID0gU0VDX01JTihzcmNfcmVjdC0+dywgc3JjX2ltZy0+dyAtIHNyY19yZWN0LT54KTsKKyAgICBzcmNfcmVjdC0+aCA9IFNFQ19NQVgoY3VyLT5zb3VyY2VDcm9wLmJvdHRvbSAtIGN1ci0+c291cmNlQ3JvcC50b3AsIDApOworICAgIHNyY19yZWN0LT5oID0gU0VDX01JTihzcmNfcmVjdC0+aCwgc3JjX2ltZy0+aCAtIHNyY19yZWN0LT55KTsKKworICAgIC8vc2V0IGRzdCBpbWFnZQorICAgIGRzdF9pbWctPncgPSB3aW4tPmxjZF9pbmZvLnhyZXM7CisgICAgZHN0X2ltZy0+aCA9IHdpbi0+bGNkX2luZm8ueXJlczsKKworICAgIHN3aXRjaCAod2luLT5sY2RfaW5mby5iaXRzX3Blcl9waXhlbCkgeworICAgIGNhc2UgMzI6CisgICAgICAgIGRzdF9pbWctPmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCWF84ODg4OworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBkc3RfaW1nLT5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQl81NjU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGRzdF9pbWctPmJhc2UgICAgID0gd2luLT5hZGRyW3dpbi0+YnVmX2luZGV4XTsKKyAgICBkc3RfaW1nLT5vZmZzZXQgICA9IDA7CisgICAgZHN0X2ltZy0+bWVtX2lkICAgPSAwOworICAgIGRzdF9pbWctPm1lbV90eXBlID0gSFdDX1BIWVNfTUVNX1RZUEU7CisKKyAgICAvL3NldCBkc3QgcmVjdAorICAgIC8vZmltYyBkc3QgaW1hZ2Ugd2lsbCBiZSBzdG9yZWQgZnJvbSBsZWZ0IHRvcCBjb3JuZXIKKyAgICBkc3RfcmVjdC0+eCA9IDA7CisgICAgZHN0X3JlY3QtPnkgPSAwOworICAgIGRzdF9yZWN0LT53ID0gd2luLT5yZWN0X2luZm8udzsKKyAgICBkc3RfcmVjdC0+aCA9IHdpbi0+cmVjdF9pbmZvLmg7CisKKyAgICBBTE9HVigiJXM6OnNyX3ggJWQgc3JfeSAlZCBzcl93ICVkIHNyX2ggJWQgZHJfeCAlZCBkcl95ICVkIGRyX3cgJWQgZHJfaCAlZCAiLAorICAgICAgICAgICAgX19mdW5jX18sIHNyY19yZWN0LT54LCBzcmNfcmVjdC0+eSwgc3JjX3JlY3QtPncsIHNyY19yZWN0LT5oLAorICAgICAgICAgICAgZHN0X3JlY3QtPngsIGRzdF9yZWN0LT55LCBkc3RfcmVjdC0+dywgZHN0X3JlY3QtPmgpOworCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2h3Y19jb21wb3NfZGVjaXNpb24oaHdjX2xheWVyX3QqIGN1cikKK3sKKyAgICBpZihjdXItPmZsYWdzICYgSFdDX1NLSVBfTEFZRVIgfHwgIWN1ci0+aGFuZGxlKSB7CisgICAgICAgIEFMT0dWKCIlczo6aXNfc2tpcF9sYXllciAlZCBjdXItPmhhbmRsZSAleCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGN1ci0+ZmxhZ3MgJiBIV0NfU0tJUF9MQVlFUiwgKHVpbnQzMl90KWN1ci0+aGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIEhXQ19GUkFNRUJVRkZFUjsKKyAgICB9CisKKyAgICBJTUdfbmF0aXZlX2hhbmRsZV90ICpwcmV2X2hhbmRsZSA9IChJTUdfbmF0aXZlX2hhbmRsZV90ICopKGN1ci0+aGFuZGxlKTsKKyAgICBpbnQgY29tcG9zaXRpb25UeXBlID0gSFdDX0ZSQU1FQlVGRkVSOworCisgICAgLyogY2hlY2sgaGVyZS4uLi5pZiB3ZSBoYXZlIGFueSByZXNvbHV0aW9uIGNvbnN0cmFpbnRzICovCisgICAgaWYgKCgoY3VyLT5zb3VyY2VDcm9wLnJpZ2h0IC0gY3VyLT5zb3VyY2VDcm9wLmxlZnQpIDwgMTYpIHx8CisgICAgICAgICgoY3VyLT5zb3VyY2VDcm9wLmJvdHRvbSAtIGN1ci0+c291cmNlQ3JvcC50b3ApIDwgOCkpCisgICAgICAgIHJldHVybiBjb21wb3NpdGlvblR5cGU7CisKKyAgICBpZiAoKGN1ci0+dHJhbnNmb3JtID09IEhBTF9UUkFOU0ZPUk1fUk9UXzkwKSB8fAorICAgICAgICAoY3VyLT50cmFuc2Zvcm0gPT0gSEFMX1RSQU5TRk9STV9ST1RfMjcwKSkgeworICAgICAgICBpZigoKGN1ci0+ZGlzcGxheUZyYW1lLnJpZ2h0IC0gY3VyLT5kaXNwbGF5RnJhbWUubGVmdCkgPCA0KXx8CisgICAgICAgICAgICgoY3VyLT5kaXNwbGF5RnJhbWUuYm90dG9tIC0gY3VyLT5kaXNwbGF5RnJhbWUudG9wKSA8IDgpKQorICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0aW9uVHlwZTsKKyAgICAgICAgfSBlbHNlIGlmICgoKGN1ci0+ZGlzcGxheUZyYW1lLnJpZ2h0IC0gY3VyLT5kaXNwbGF5RnJhbWUubGVmdCkgPCA4KSB8fAorICAgICAgICAgICAgICAgICAgICgoY3VyLT5kaXNwbGF5RnJhbWUuYm90dG9tIC0gY3VyLT5kaXNwbGF5RnJhbWUudG9wKSA8IDQpKQorICAgICAgICAgcmV0dXJuIGNvbXBvc2l0aW9uVHlwZTsKKworICAgIGlmKChwcmV2X2hhbmRsZS0+dXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BIWVNfQ09OVElHKSAmJgorICAgICAgIChjdXItPmJsZW5kaW5nID09IEhXQ19CTEVORElOR19OT05FKSkKKyAgICAgICAgY29tcG9zaXRpb25UeXBlID0gSFdDX09WRVJMQVk7CisgICAgZWxzZQorICAgICAgICBjb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisKKyAgICBBTE9HVigiJXM6OmNvbXBvc2l0aW9uVHlwZSAlZCBicHAgJWQgZm9ybWF0ICV4IHVzYWdlICV4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLGNvbXBvc2l0aW9uVHlwZSwgcHJldl9oYW5kbGUtPnVpQnBwLCBwcmV2X2hhbmRsZS0+aUZvcm1hdCwKKyAgICAgICAgICAgIHByZXZfaGFuZGxlLT51c2FnZSAmIEdSQUxMT0NfVVNBR0VfUEhZU19DT05USUcpOworCisgICAgcmV0dXJuICBjb21wb3NpdGlvblR5cGU7Cit9CisKK3N0YXRpYyBpbnQgYXNzaWduX292ZXJsYXlfd2luZG93KHN0cnVjdCBod2NfY29udGV4dF90ICpjdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod2NfbGF5ZXJfdCAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpbl9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGF5ZXJfaWR4KQoreworICAgIHN0cnVjdCBod2Nfd2luX2luZm9fdCAqd2luOworICAgIHNlY19yZWN0IHJlY3Q7CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZihOVU1fT0ZfV0lOIDw9IHdpbl9pZHgpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIHdpbiA9ICZjdHgtPndpblt3aW5faWR4XTsKKworICAgIHJlY3QueCA9IFNFQ19NQVgoY3VyLT5kaXNwbGF5RnJhbWUubGVmdCwgMCk7CisgICAgcmVjdC55ID0gU0VDX01BWChjdXItPmRpc3BsYXlGcmFtZS50b3AsIDApOworICAgIHJlY3QudyA9IFNFQ19NSU4oY3VyLT5kaXNwbGF5RnJhbWUucmlnaHQgLSByZWN0LngsIHdpbi0+bGNkX2luZm8ueHJlcyAtIHJlY3QueCk7CisgICAgcmVjdC5oID0gU0VDX01JTihjdXItPmRpc3BsYXlGcmFtZS5ib3R0b20gLSByZWN0LnksIHdpbi0+bGNkX2luZm8ueXJlcyAtIHJlY3QueSk7CisgICAgd2luLT5zZXRfd2luX2ZsYWcgPSAwOworCisgICAgaWYoKHJlY3QueCAhPSB3aW4tPnJlY3RfaW5mby54KSB8fCAocmVjdC55ICE9IHdpbi0+cmVjdF9pbmZvLnkpIHx8CisgICAgICAgKHJlY3QudyAhPSB3aW4tPnJlY3RfaW5mby53KSB8fCAocmVjdC5oICE9IHdpbi0+cmVjdF9pbmZvLmgpKXsKKyAgICAgICAgICAgIHdpbi0+cmVjdF9pbmZvLnggPSByZWN0Lng7CisgICAgICAgICAgICB3aW4tPnJlY3RfaW5mby55ID0gcmVjdC55OworICAgICAgICAgICAgd2luLT5yZWN0X2luZm8udyA9IHJlY3QudzsKKyAgICAgICAgICAgIHdpbi0+cmVjdF9pbmZvLmggPSByZWN0Lmg7CisgICAgICAgICAgICB3aW4tPnNldF93aW5fZmxhZyA9IDE7CisgICAgICAgICAgICB3aW4tPmxheWVyX3ByZXZfYnVmID0gMDsKKyAgICB9CisKKyAgICB3aW4tPmxheWVyX2luZGV4ID0gbGF5ZXJfaWR4OworICAgIHdpbi0+c3RhdHVzID0gSFdDX1dJTl9SRVNFUlZFRDsKKworICAgIEFMT0dWKCIlczo6IHdpbl94ICVkIHdpbl95ICVkIHdpbl93ICVkIHdpbl9oICVkIGxheV9pZHggJWQgd2luX2lkeCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgd2luLT5yZWN0X2luZm8ueCwgd2luLT5yZWN0X2luZm8ueSwgd2luLT5yZWN0X2luZm8udywKKyAgICAgICAgICAgIHdpbi0+cmVjdF9pbmZvLmgsIHdpbi0+bGF5ZXJfaW5kZXgsIHdpbl9pZHggKTsKKworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCByZXNldF93aW5fcmVjdF9pbmZvKGh3Y193aW5faW5mb190ICp3aW4pCit7CisgICAgd2luLT5yZWN0X2luZm8ueCA9IDA7CisgICAgd2luLT5yZWN0X2luZm8ueSA9IDA7CisgICAgd2luLT5yZWN0X2luZm8udyA9IDA7CisgICAgd2luLT5yZWN0X2luZm8uaCA9IDA7CisgICAgcmV0dXJuOworfQorCitzdGF0aWMgaW50IGh3Y19wcmVwYXJlKGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAqZGV2LCBod2NfbGF5ZXJfbGlzdF90KiBsaXN0KQoreworCisgICAgc3RydWN0IGh3Y19jb250ZXh0X3QqIGN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCopZGV2OworICAgIGludCBvdmVybGF5X3dpbl9jbnQgPSAwOworICAgIGludCBjb21wb3NpdGlvblR5cGUgPSAwOworICAgIGludCByZXQ7CisKKyAgICAvL2lmIGdlb21ldHJ5IGlzIG5vdCBjaGFuZ2VkLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRvIGFueSB3b3JrIGhlcmUKKyAgICBpZiggIWxpc3QgfHwgKCEobGlzdC0+ZmxhZ3MgJiBIV0NfR0VPTUVUUllfQ0hBTkdFRCkpKQorICAgICAgICByZXR1cm4gMDsKKworICAgIC8vYWxsIHRoZSB3aW5kb3dzIGFyZSBmcmVlIGhlcmUuLi4uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfV0lOOyBpKyspIHsKKyAgICAgICAgY3R4LT53aW5baV0uc3RhdHVzID0gSFdDX1dJTl9GUkVFOworICAgICAgICBjdHgtPndpbltpXS5idWZfaW5kZXggPSAwOworICAgIH0KKyAgICBjdHgtPm51bV9vZl9od2NfbGF5ZXIgPSAwOworICAgIGN0eC0+bnVtX29mX2ZiX2xheWVyID0gMDsKKyAgICBBTE9HVigiJXM6OiBod2NfcHJlcGFyZSBsaXN0LT5udW1Id0xheWVycyAlZCIsIF9fZnVuY19fLCBsaXN0LT5udW1Id0xheWVycyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3QtPm51bUh3TGF5ZXJzIDsgaSsrKSB7CisgICAgICAgIGh3Y19sYXllcl90KiBjdXIgPSAmbGlzdC0+aHdMYXllcnNbaV07CisKKyAgICAgICAgaWYgKG92ZXJsYXlfd2luX2NudCA8IE5VTV9PRl9XSU4pIHsKKyAgICAgICAgICAgIGNvbXBvc2l0aW9uVHlwZSA9IGdldF9od2NfY29tcG9zX2RlY2lzaW9uKGN1cik7CisKKyAgICAgICAgICAgIGlmIChjb21wb3NpdGlvblR5cGUgPT0gSFdDX0ZSQU1FQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgY3VyLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfRlJBTUVCVUZGRVI7CisgICAgICAgICAgICAgICAgY3R4LT5udW1fb2ZfZmJfbGF5ZXIrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gYXNzaWduX292ZXJsYXlfd2luZG93KGN0eCwgY3VyLCBvdmVybGF5X3dpbl9jbnQsIGkpOworICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjdXItPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgY3R4LT5udW1fb2ZfZmJfbGF5ZXIrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY3VyLT5jb21wb3NpdGlvblR5cGUgPSBIV0NfT1ZFUkxBWTsKKyAgICAgICAgICAgICAgICBjdXItPmhpbnRzID0gSFdDX0hJTlRfQ0xFQVJfRkI7CisgICAgICAgICAgICAgICAgb3ZlcmxheV93aW5fY250Kys7CisgICAgICAgICAgICAgICAgY3R4LT5udW1fb2ZfaHdjX2xheWVyKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdXItPmNvbXBvc2l0aW9uVHlwZSA9IEhXQ19GUkFNRUJVRkZFUjsKKyAgICAgICAgICAgIGN0eC0+bnVtX29mX2ZiX2xheWVyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihsaXN0LT5udW1Id0xheWVycyAhPSAoY3R4LT5udW1fb2ZfZmJfbGF5ZXIgKyBjdHgtPm51bV9vZl9od2NfbGF5ZXIpKQorICAgICAgICBBTE9HVigiJXM6OiBudW1Id0xheWVycyAlZCBudW1fb2ZfZmJfbGF5ZXIgJWQgbnVtX29mX2h3Y19sYXllciAlZCAiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBsaXN0LT5udW1Id0xheWVycywgY3R4LT5udW1fb2ZfZmJfbGF5ZXIsCisgICAgICAgICAgICAgICAgY3R4LT5udW1fb2ZfaHdjX2xheWVyKTsKKworICAgIGlmIChvdmVybGF5X3dpbl9jbnQgPCBOVU1fT0ZfV0lOKSB7CisgICAgICAgIC8vdHVybiBvZmYgdGhlIGZyZWUgd2luZG93cworICAgICAgICBmb3IgKGludCBpID0gb3ZlcmxheV93aW5fY250OyBpIDwgTlVNX09GX1dJTjsgaSsrKSB7CisgICAgICAgICAgICB3aW5kb3dfaGlkZSgmY3R4LT53aW5baV0pOworICAgICAgICAgICAgcmVzZXRfd2luX3JlY3RfaW5mbygmY3R4LT53aW5baV0pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGh3Y19zZXQoaHdjX2NvbXBvc2VyX2RldmljZV90ICpkZXYsCisgICAgICAgICAgICAgICAgICAgaHdjX2Rpc3BsYXlfdCBkcHksCisgICAgICAgICAgICAgICAgICAgaHdjX3N1cmZhY2VfdCBzdXIsCisgICAgICAgICAgICAgICAgICAgaHdjX2xheWVyX2xpc3RfdCogbGlzdCkKK3sKKyAgICBzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90ICopZGV2OworICAgIHVuc2lnbmVkIGludCBwaHlBZGRyW01BWF9OVU1fUExBTkVTXTsKKyAgICBpbnQgc2tpcHBlZF93aW5kb3dfbWFzayA9IDA7CisgICAgaHdjX2xheWVyX3QqIGN1cjsKKyAgICBzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbjsKKyAgICBpbnQgcmV0OworICAgIHN0cnVjdCBzZWNfaW1nIHNyY19pbWc7CisgICAgc3RydWN0IHNlY19pbWcgZHN0X2ltZzsKKyAgICBzdHJ1Y3Qgc2VjX3JlY3Qgc3JjX3JlY3Q7CisgICAgc3RydWN0IHNlY19yZWN0IGRzdF9yZWN0OworCisgICAgaWYgKGRweSA9PSBOVUxMICYmIHN1ciA9PSBOVUxMICYmIGxpc3QgPT0gTlVMTCkgeworICAgICAgICAvLyByZWxlYXNlIG91ciByZXNvdXJjZXMsIHRoZSBzY3JlZW4gaXMgdHVybmluZyBvZmYKKyAgICAgICAgLy8gaW4gb3VyIGNhc2UsIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uCisgICAgICAgIGN0eC0+bnVtX29mX2ZiX2xheWVyX3ByZXYgPSAwOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBib29sIG5lZWRfc3dhcF9idWZmZXJzID0gY3R4LT5udW1fb2ZfZmJfbGF5ZXIgPiAwOworCisgICAgLyoKKyAgICAgKiBIL1cgY29tcG9zZXIgZG9jdW1lbnRhdGlvbiBzdGF0ZXM6CisgICAgICogVGhlcmUgaXMgYW4gaW1wbGljaXQgbGF5ZXIgY29udGFpbmluZyBvcGFxdWUgYmxhY2sKKyAgICAgKiBwaXhlbHMgYmVoaW5kIGFsbCB0aGUgbGF5ZXJzIGluIHRoZSBsaXN0LgorICAgICAqIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgaHdjb21wb3NlciBtb2R1bGUgdG8gbWFrZQorICAgICAqIHN1cmUgYmxhY2sgcGl4ZWxzIGFyZSBvdXRwdXQgKG9yIGJsZW5kZWQgZnJvbSkuCisgICAgICoKKyAgICAgKiBTaW5jZSB3ZSdyZSB1c2luZyBhIGJsaXR0ZXIsIHdlIG5lZWQgdG8gZXJhc2UgdGhlIGZyYW1lLWJ1ZmZlciB3aGVuCisgICAgICogc3dpdGNoaW5nIHRvIGFsbC1vdmVybGF5IG1vZGUuCisgICAgICoKKyAgICAgKi8KKyAgICBpZiAoY3R4LT5udW1fb2ZfaHdjX2xheWVyICYmCisgICAgICAgIGN0eC0+bnVtX29mX2ZiX2xheWVyPT0wICYmIGN0eC0+bnVtX29mX2ZiX2xheWVyX3ByZXYpIHsKKyAgICAgICAgLyogd2UncmUgY2xlYXJpbmcgdGhlIHNjcmVlbiB1c2luZyBHTEVTIGhlcmUsIHRoaXMgaXMgdmVyeQorICAgICAgICAgKiBoYWNrLWlzaCwgaWRlYWwgd2Ugd291bGQgdXNlIHRoZSBmaW1jIChpZiBpdCBjYW4gZG8gaXQpICovCisgICAgICAgIGdsRGlzYWJsZShHTF9TQ0lTU09SX1RFU1QpOworICAgICAgICBnbENsZWFyQ29sb3IoMCwgMCwgMCwgMCk7CisgICAgICAgIGdsQ2xlYXIoR0xfQ09MT1JfQlVGRkVSX0JJVCk7CisgICAgICAgIGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCk7CisgICAgICAgIG5lZWRfc3dhcF9idWZmZXJzID0gdHJ1ZTsKKyAgICB9CisKKyAgICBjdHgtPm51bV9vZl9mYl9sYXllcl9wcmV2ID0gY3R4LT5udW1fb2ZfZmJfbGF5ZXI7CisKKyAgICBpZiAobmVlZF9zd2FwX2J1ZmZlcnMgfHwgIWxpc3QpIHsKKyAgICAgICAgRUdMQm9vbGVhbiBzdWNlc3MgPSBlZ2xTd2FwQnVmZmVycygoRUdMRGlzcGxheSlkcHksIChFR0xTdXJmYWNlKXN1cik7CisgICAgICAgIGlmICghc3VjZXNzKSB7CisgICAgICAgICAgICByZXR1cm4gSFdDX0VHTF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghbGlzdCkgeworICAgICAgICAvKiB0dXJuIG9mZiB0aGUgYWxsIHdpbmRvd3MgKi8KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfV0lOOyBpKyspIHsKKyAgICAgICAgICAgIHdpbmRvd19oaWRlKCZjdHgtPndpbltpXSk7CisgICAgICAgICAgICByZXNldF93aW5fcmVjdF9pbmZvKCZjdHgtPndpbltpXSk7CisgICAgICAgICAgICBjdHgtPndpbltpXS5zdGF0dXMgPSBIV0NfV0lOX0ZSRUU7CisgICAgICAgIH0KKyAgICAgICAgY3R4LT5udW1fb2ZfaHdjX2xheWVyID0gMDsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgaWYoY3R4LT5udW1fb2ZfaHdjX2xheWVyID4gTlVNX09GX1dJTikKKyAgICAgICAgY3R4LT5udW1fb2ZfaHdjX2xheWVyID0gTlVNX09GX1dJTjsKKworICAgIC8qIGNvbXBvc2UgaGFyZHdhcmUgbGF5ZXJzIGhlcmUgKi8KKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY3R4LT5udW1fb2ZfaHdjX2xheWVyOyBpKyspIHsKKyAgICAgICAgd2luID0gJmN0eC0+d2luW2ldOworICAgICAgICBpZiAod2luLT5zdGF0dXMgPT0gSFdDX1dJTl9SRVNFUlZFRCkgeworICAgICAgICAgICAgY3VyID0gJmxpc3QtPmh3TGF5ZXJzW3dpbi0+bGF5ZXJfaW5kZXhdOworCisgICAgICAgICAgICBpZiAoY3VyLT5jb21wb3NpdGlvblR5cGUgPT0gSFdDX09WRVJMQVkpIHsKKworICAgICAgICAgICAgICAgIHJldCA9IGdwc0dyYWxsb2NNb2R1bGUtPkdldFBoeUFkZHJzKGdwc0dyYWxsb2NNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjdXItPmhhbmRsZSwgcGh5QWRkcik7CisgICAgICAgICAgICAgICAgaWYgKHJldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6OkdldFBoeUFkZHJzIGZhaWwgOiByZXQ9JWRcbiIsIF9fZnVuY19fLCByZXQpOworICAgICAgICAgICAgICAgICAgICBza2lwcGVkX3dpbmRvd19tYXNrIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBpbml0aWFsaXplIHRoZSBzcmMgJiBkaXN0IGNvbnRleHQgZm9yIGZpbWMgKi8KKyAgICAgICAgICAgICAgICBzZXRfc3JjX2RzdF9pbmZvIChjdXIsIHdpbiwgJnNyY19pbWcsICZkc3RfaW1nLCAmc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAmZHN0X3JlY3QsIGkpOworCisgICAgICAgICAgICAgICAgcmV0ID0gcnVuRmltYyhjdHgsICZzcmNfaW1nLCAmc3JjX3JlY3QsICZkc3RfaW1nLCAmZHN0X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlBZGRyLCBjdXItPnRyYW5zZm9ybSk7CisgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApeworICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczo6cnVuRmltYyBmYWlsIDogcmV0PSVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKyAgICAgICAgICAgICAgICAgICBza2lwcGVkX3dpbmRvd19tYXNrIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3aW4tPnNldF93aW5fZmxhZyA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIHR1cm5vZmYgdGhlIHdpbmRvdyBhbmQgc2V0IHRoZSB3aW5kb3cgcG9zaXRpb24gd2l0aCBuZXcgY29uZi4uLiAqLworICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93X3NldF9wb3Mod2luKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczo6d2luZG93X3NldF9wb3MgaXMgZmFpbGVkIDogJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRfd2luZG93X21hc2sgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3aW4tPnNldF93aW5fZmxhZyA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyogaXMgdGhlIGZyYW1lIGRpZG4ndCBjaGFuZ2UsIGl0IG5lZWRzIHRvIGJlIGNvbXBvc2l0ZWQKKyAgICAgICAgICAgICAgICAgKiBiZWNhdXNlIHNvbWV0aGluZyBlbHNlIGJlbG93IGl0IGNvdWxkIGhhdmUgY2hhbmdlZCwgaG93ZXZlcgorICAgICAgICAgICAgICAgICAqIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBzd2FwcGVkLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICh3aW4tPmxheWVyX3ByZXZfYnVmICE9ICh1aW50MzJfdCljdXItPmhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICB3aW4tPmxheWVyX3ByZXZfYnVmID0gKHVpbnQzMl90KWN1ci0+aGFuZGxlOworICAgICAgICAgICAgICAgICAgICB3aW5kb3dfcGFuX2Rpc3BsYXkod2luKTsKKyAgICAgICAgICAgICAgICAgICAgd2luLT5idWZfaW5kZXggPSAod2luLT5idWZfaW5kZXggKyAxKSAlIE5VTV9PRl9XSU5fQlVGOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmKHdpbi0+cG93ZXJfc3RhdGUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgd2luZG93X3Nob3cod2luKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6OiBlcnJvciA6IGxheWVyICVkIGNvbXBvc2l0aW9uVHlwZSBzaG91bGQgaGF2ZSBiZWVuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEhXQ19PVkVSTEFZIiwgX19mdW5jX18sIHdpbi0+bGF5ZXJfaW5kZXgpOworICAgICAgICAgICAgICAgIHNraXBwZWRfd2luZG93X21hc2sgfD0gKDEgPDwgaSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIEFMT0dFKCIlczo6IGVycm9yIDogd2luZG93IHN0YXR1cyBzaG91bGQgaGF2ZSBiZWVuIEhXQ19XSU5fUkVTRVJWRUQgXAorICAgICAgICAgICAgICAgICAgICAgYnkgbm93Li4uICIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICBza2lwcGVkX3dpbmRvd19tYXNrIHw9ICgxIDw8IGkpOworICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChza2lwcGVkX3dpbmRvd19tYXNrKSB7CisgICAgICAgIC8vdHVybiBvZmYgdGhlIGZyZWUgd2luZG93cworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9PRl9XSU47IGkrKykgeworICAgICAgICAgICAgaWYgKHNraXBwZWRfd2luZG93X21hc2sgJiAoMSA8PCBpKSkKKyAgICAgICAgICAgICAgICB3aW5kb3dfaGlkZSgmY3R4LT53aW5baV0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh3Y19yZWdpc3RlclByb2NzKHN0cnVjdCBod2NfY29tcG9zZXJfZGV2aWNlKiBkZXYsCisgICAgICAgIGh3Y19wcm9jc190IGNvbnN0KiBwcm9jcykKK3sKKyAgICBzdHJ1Y3QgaHdjX2NvbnRleHRfdCogY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90KilkZXY7CisgICAgY3R4LT5wcm9jcyA9IGNvbnN0X2Nhc3Q8aHdjX3Byb2NzX3QgKj4ocHJvY3MpOworfQorCitzdGF0aWMgaW50IGh3Y19xdWVyeShzdHJ1Y3QgaHdjX2NvbXBvc2VyX2RldmljZSogZGV2LAorICAgICAgICBpbnQgd2hhdCwgaW50KiB2YWx1ZSkKK3sKKyAgICBzdHJ1Y3QgaHdjX2NvbnRleHRfdCogY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90KilkZXY7CisKKyAgICBzd2l0Y2ggKHdoYXQpIHsKKyAgICBjYXNlIEhXQ19CQUNLR1JPVU5EX0xBWUVSX1NVUFBPUlRFRDoKKyAgICAgICAgLy8gd2UgZG9uJ3Qgc3VwcG9ydCB0aGUgYmFja2dyb3VuZCBsYXllciB5ZXQKKyAgICAgICAgdmFsdWVbMF0gPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhXQ19WU1lOQ19QRVJJT0Q6CisgICAgICAgIC8vIHZzeW5jIHBlcmlvZCBpbiBuYW5vc2Vjb25kCisgICAgICAgIHZhbHVlWzBdID0gMTAwMDAwMDAwMC4wIC8gZ3BzR3JhbGxvY01vZHVsZS0+cHNGcmFtZUJ1ZmZlckRldmljZS0+YmFzZS5mcHM7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIHVuc3VwcG9ydGVkIHF1ZXJ5CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBod2NfZXZlbnRDb250cm9sKHN0cnVjdCBod2NfY29tcG9zZXJfZGV2aWNlKiBkZXYsCisgICAgICAgIGludCBldmVudCwgaW50IGVuYWJsZWQpCit7CisgICAgc3RydWN0IGh3Y19jb250ZXh0X3QqIGN0eCA9IChzdHJ1Y3QgaHdjX2NvbnRleHRfdCopZGV2OworCisgICAgc3dpdGNoIChldmVudCkgeworICAgIGNhc2UgSFdDX0VWRU5UX1ZTWU5DOgorICAgICAgICBpbnQgdmFsID0gISFlbmFibGVkOworICAgICAgICBpbnQgZXJyID0gaW9jdGwoY3R4LT5nbG9iYWxfbGNkX3dpbi5mZCwgUzNDRkJfU0VUX1ZTWU5DX0lOVCwgJnZhbCk7CisgICAgICAgIGlmIChlcnIgPCAwKQorICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICByZXR1cm4gLUVJTlZBTDsKK30KKwordm9pZCBoYW5kbGVfdnN5bmNfdWV2ZW50KGh3Y19jb250ZXh0X3QgKmN0eCwgY29uc3QgY2hhciAqYnVmZiwgaW50IGxlbikKK3sKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIGNvbnN0IGNoYXIgKnMgPSBidWZmOworCisgICAgaWYoIWN0eC0+cHJvY3MgfHwgIWN0eC0+cHJvY3MtPnZzeW5jKQorICAgICAgIHJldHVybjsKKworICAgIHMgKz0gc3RybGVuKHMpICsgMTsKKworICAgIHdoaWxlKCpzKSB7CisgICAgICAgIGlmICghc3RybmNtcChzLCAiVlNZTkM9Iiwgc3RybGVuKCJWU1lOQz0iKSkpCisgICAgICAgICAgICB0aW1lc3RhbXAgPSBzdHJ0b3VsbChzICsgc3RybGVuKCJWU1lOQz0iKSwgTlVMTCwgMCk7CisKKyAgICAgICAgcyArPSBzdHJsZW4ocykgKyAxOworICAgICAgICBpZiAocyAtIGJ1ZmYgPj0gbGVuKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY3R4LT5wcm9jcy0+dnN5bmMoY3R4LT5wcm9jcywgMCwgdGltZXN0YW1wKTsKK30KKworc3RhdGljIHZvaWQgKmh3Y192c3luY190aHJlYWQodm9pZCAqZGF0YSkKK3sKKyAgICBod2NfY29udGV4dF90ICpjdHggPSAoaHdjX2NvbnRleHRfdCAqKShkYXRhKTsKKyAgICBjaGFyIHVldmVudF9kZXNjWzQwOTZdOworICAgIG1lbXNldCh1ZXZlbnRfZGVzYywgMCwgc2l6ZW9mKHVldmVudF9kZXNjKSk7CisKKyAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIEhBTF9QUklPUklUWV9VUkdFTlRfRElTUExBWSk7CisKKyAgICB1ZXZlbnRfaW5pdCgpOworICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgaW50IGxlbiA9IHVldmVudF9uZXh0X2V2ZW50KHVldmVudF9kZXNjLCBzaXplb2YodWV2ZW50X2Rlc2MpIC0gMik7CisKKyAgICAgICAgYm9vbCB2c3luYyA9ICFzdHJjbXAodWV2ZW50X2Rlc2MsICJjaGFuZ2VAL2RldmljZXMvcGxhdGZvcm0vczNjZmIiKTsKKyAgICAgICAgaWYodnN5bmMpCisgICAgICAgICAgICBoYW5kbGVfdnN5bmNfdWV2ZW50KGN0eCwgdWV2ZW50X2Rlc2MsIGxlbik7CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgaHdjX2RldmljZV9jbG9zZShzdHJ1Y3QgaHdfZGV2aWNlX3QgKmRldikKK3sKKyAgICBzdHJ1Y3QgaHdjX2NvbnRleHRfdCogY3R4ID0gKHN0cnVjdCBod2NfY29udGV4dF90KilkZXY7CisgICAgaW50IHJldCA9IDA7CisgICAgaW50IGk7CisKKyAgICBpZiAoY3R4KSB7CisgICAgICAgIGlmIChkZXN0cm95RmltYygmY3R4LT5maW1jKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczo6ZGVzdHJveUZpbWMgZmFpbCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldCA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdpbmRvd19jbG9zZSgmY3R4LT5nbG9iYWxfbGNkX3dpbikgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6OndpbmRvd19jbG9zZSgpIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fT0ZfV0lOOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh3aW5kb3dfY2xvc2UoJmN0eC0+d2luW2ldKSA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6OndpbmRvd19jbG9zZSgpIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0ID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBzdG9wIHZzeW5jX3RocmVhZAorCisgICAgICAgIGZyZWUoY3R4KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBod2NfbWV0aG9kcyBod2NfbWV0aG9kcyA9IHsKKyAgICBldmVudENvbnRyb2w6IGh3Y19ldmVudENvbnRyb2wKK307CisKK3N0YXRpYyBpbnQgaHdjX2RldmljZV9vcGVuKGNvbnN0IHN0cnVjdCBod19tb2R1bGVfdCogbW9kdWxlLCBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICBzdHJ1Y3QgaHdfZGV2aWNlX3QqKiBkZXZpY2UpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisgICAgaW50IGVycjsKKyAgICBzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbjsKKworICAgIGlmKGh3X2dldF9tb2R1bGUoR1JBTExPQ19IQVJEV0FSRV9NT0RVTEVfSUQsCisgICAgICAgICAgICAgICAgKGNvbnN0IGh3X21vZHVsZV90KiopJmdwc0dyYWxsb2NNb2R1bGUpKQorICAgICAgICByZXR1cm4gLUVJTlZBTDsKKworICAgIGlmKHN0cmNtcChncHNHcmFsbG9jTW9kdWxlLT5iYXNlLmNvbW1vbi5hdXRob3IsICJJbWFnaW5hdGlvbiBUZWNobm9sb2dpZXMiKSkKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisKKyAgICBpZiAoc3RyY21wKG5hbWUsIEhXQ19IQVJEV0FSRV9DT01QT1NFUikpCisgICAgICAgIHJldHVybiAtRUlOVkFMOworCisgICAgc3RydWN0IGh3Y19jb250ZXh0X3QgKmRldjsKKyAgICBkZXYgPSAoaHdjX2NvbnRleHRfdCopbWFsbG9jKHNpemVvZigqZGV2KSk7CisKKyAgICAvKiBpbml0aWFsaXplIG91ciBzdGF0ZSBoZXJlICovCisgICAgbWVtc2V0KGRldiwgMCwgc2l6ZW9mKCpkZXYpKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHByb2NzICovCisgICAgZGV2LT5kZXZpY2UuY29tbW9uLnRhZyA9IEhBUkRXQVJFX0RFVklDRV9UQUc7CisgICAgZGV2LT5kZXZpY2UuY29tbW9uLnZlcnNpb24gPSBIV0NfREVWSUNFX0FQSV9WRVJTSU9OXzBfMzsKKyAgICBkZXYtPmRldmljZS5jb21tb24ubW9kdWxlID0gY29uc3RfY2FzdDxod19tb2R1bGVfdCo+KG1vZHVsZSk7CisgICAgZGV2LT5kZXZpY2UuY29tbW9uLmNsb3NlID0gaHdjX2RldmljZV9jbG9zZTsKKworICAgIGRldi0+ZGV2aWNlLnByZXBhcmUgPSBod2NfcHJlcGFyZTsKKyAgICBkZXYtPmRldmljZS5zZXQgPSBod2Nfc2V0OworICAgIGRldi0+ZGV2aWNlLnJlZ2lzdGVyUHJvY3MgPSBod2NfcmVnaXN0ZXJQcm9jczsKKyAgICBkZXYtPmRldmljZS5xdWVyeSA9IGh3Y19xdWVyeTsKKyAgICBkZXYtPmRldmljZS5tZXRob2RzID0gJmh3Y19tZXRob2RzOworCisgICAgKmRldmljZSA9ICZkZXYtPmRldmljZS5jb21tb247CisKKyAgICAvKiBpbml0aWFsaXppbmcgKi8KKyAgICBtZW1zZXQoJihkZXYtPmZpbWMpLCAwLCBzaXplb2YoczVwX2ZpbWNfdCkpOworICAgIGRldi0+ZmltYy5kZXZfZmQgPSAtMTsKKworICAgIC8qIG9wZW4gV0lOMCAmIFdJTjEgaGVyZSAqLworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX09GX1dJTjsgaSsrKSB7CisgICAgICAgIGlmICh3aW5kb3dfb3BlbigmKGRldi0+d2luW2ldKSwgaSkgPCAwKSB7CisgICAgICAgICAgICAgQUxPR0UoIiVzOjogRmFpbGVkIHRvIG9wZW4gd2luZG93ICVkIGRldmljZSAiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIG9wZW4gd2luZG93IDIsIHVzZWQgdG8gcXVlcnkgZ2xvYmFsIExDRCBpbmZvICovCisgICAgaWYgKHdpbmRvd19vcGVuKCZkZXYtPmdsb2JhbF9sY2Rfd2luLCAyKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOjogRmFpbGVkIHRvIG9wZW4gd2luZG93IDIgZGV2aWNlICIsIF9fZnVuY19fKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgLyogZ2V0IGRlZmF1bHQgd2luZG93IGNvbmZpZyAqLworICAgIGlmICh3aW5kb3dfZ2V0X2dsb2JhbF9sY2RfaW5mbyhkZXYpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6OndpbmRvd19nZXRfZ2xvYmFsX2xjZF9pbmZvIGlzIGZhaWxlZCA6ICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgZGV2LT5sY2RfaW5mby55cmVzX3ZpcnR1YWwgPSBkZXYtPmxjZF9pbmZvLnlyZXMgKiBOVU1fT0ZfV0lOX0JVRjsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIHdpbmRvdyBjb250ZXh0ICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfV0lOOyBpKyspIHsKKyAgICAgICAgd2luID0gJmRldi0+d2luW2ldOworICAgICAgICBtZW1jcHkoJndpbi0+bGNkX2luZm8sICZkZXYtPmxjZF9pbmZvLCBzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSk7CisgICAgICAgIG1lbWNweSgmd2luLT52YXJfaW5mbywgJmRldi0+bGNkX2luZm8sIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKKworICAgICAgICB3aW4tPnJlY3RfaW5mby54ID0gMDsKKyAgICAgICAgd2luLT5yZWN0X2luZm8ueSA9IDA7CisgICAgICAgIHdpbi0+cmVjdF9pbmZvLncgPSB3aW4tPnZhcl9pbmZvLnhyZXM7CisgICAgICAgIHdpbi0+cmVjdF9pbmZvLmggPSB3aW4tPnZhcl9pbmZvLnlyZXM7CisKKyAgICAgICAgaWYgKHdpbmRvd19zZXRfcG9zKHdpbikgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6OndpbmRvd19zZXRfcG9zIGlzIGZhaWxlZCA6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBzdGF0dXMgPSAtRUlOVkFMOworICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKworICAgICAgICBpZiAod2luZG93X2dldF9pbmZvKHdpbikgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6OndpbmRvd19nZXRfaW5mbyBpcyBmYWlsZWQgOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisKKyAgICAgICAgd2luLT5zaXplID0gd2luLT5maXhfaW5mby5saW5lX2xlbmd0aCAqIHdpbi0+dmFyX2luZm8ueXJlczsKKworICAgICAgICBpZiAoIXdpbi0+Zml4X2luZm8uc21lbV9zdGFydCl7CisgICAgICAgICAgICBBTE9HRSgiJXM6OiB3aW4tJWQgZmFpbGVkIHRvIGdldCB0aGUgcmVzZXJ2ZWQgbWVtb3J5IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgc3RhdHVzID0gLUVJTlZBTDsKKyAgICAgICAgICAgIGdvdG8gZXJyOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBOVU1fT0ZfV0lOX0JVRjsgaisrKSB7CisgICAgICAgICAgICB3aW4tPmFkZHJbal0gPSB3aW4tPmZpeF9pbmZvLnNtZW1fc3RhcnQgKyAod2luLT5zaXplICogaik7CisgICAgICAgICAgICBBTE9HSSgiJXM6Ondpbi0lZCBhZGRbJWRdICV4ICIsIF9fZnVuY19fLCBpLCBqLCB3aW4tPmFkZHJbal0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyogb3BlbiBwcCAqLworICAgIGlmIChjcmVhdGVGaW1jKCZkZXYtPmZpbWMpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6OmNyZWF0RmltYygpIGZhaWwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHN0YXR1cyA9IC1FSU5WQUw7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIGVyciA9IHB0aHJlYWRfY3JlYXRlKCZkZXYtPnZzeW5jX3RocmVhZCwgTlVMTCwgaHdjX3ZzeW5jX3RocmVhZCwgZGV2KTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIEFMT0dFKCIlczo6cHRocmVhZF9jcmVhdGUoKSBmYWlsZWQgOiAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgc3RhdHVzID0gLWVycjsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgQUxPR0QoIiVzOjogc3VjY2Vzc1xuIiwgX19mdW5jX18pOworCisgICAgcmV0dXJuIDA7CisKK2VycjoKKyAgICBpZiAoZGVzdHJveUZpbWMoJmRldi0+ZmltYykgPCAwKQorICAgICAgICBBTE9HRSgiJXM6OmRlc3Ryb3lGaW1jKCkgZmFpbCIsIF9fZnVuY19fKTsKKworICAgIGlmICh3aW5kb3dfY2xvc2UoJmRldi0+Z2xvYmFsX2xjZF93aW4pIDwgMCkKKyAgICAgICAgQUxPR0UoIiVzOjp3aW5kb3dfY2xvc2UoKSBmYWlsIiwgX19mdW5jX18pOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fT0ZfV0lOOyBpKyspIHsKKyAgICAgICAgaWYgKHdpbmRvd19jbG9zZSgmZGV2LT53aW5baV0pIDwgMCkKKyAgICAgICAgICAgIEFMT0dFKCIlczo6d2luZG93X2Nsb3NlKCkgZmFpbCIsIF9fZnVuY19fKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL2xpYmh3Y29tcG9zZXIvU2VjSFdDVXRpbHMuY3BwIGIvZXh5bm9zMy9zNXBjMTEwL2xpYmh3Y29tcG9zZXIvU2VjSFdDVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiM2YwOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9TZWNIV0NVdGlscy5jcHAKQEAgLTAsMCArMSw4ODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICoKKyAqIEBhdXRob3IgUmFtYSwgTWVrYSh2Lm1la2FAc2Ftc3VuZy5jb20pCisgICAgICAgICAgIFNhbmd3b28sIFBhcmsoc3c1NzcxLnBhcmtAc2Ftc3VuZy5jb20pCisgICAgICAgICAgIEphbWllIE9oIChqdW5nLW1pbi5vaEBzYW1zdW5nLmNvbSkKKyAqIEBkYXRlICAgMjAxMS0wNy0yOAorICoKKyAqLworCisjaW5jbHVkZSAiU2VjSFdDVXRpbHMuaCIKKworaW50IHdpbmRvd19vcGVuKHN0cnVjdCBod2Nfd2luX2luZm9fdCAqd2luLCBpbnQgaWQpCit7CisgICAgY2hhciBuYW1lWzY0XTsKKworICAgIGNoYXIgY29uc3QgKiBjb25zdCBkZXZpY2VfdGVtcGxhdGUgPSAiL2Rldi9ncmFwaGljcy9mYiV1IjsKKyAgICAvKiB3aW5kb3cgJiBGQiBtYXBpbmcKKyAgICAgICBmYjAgLT4gd2luLWlkIDogMgorICAgICAgIGZiMSAtPiB3aW4taWQgOiAzCisgICAgICAgZmIyIC0+IHdpbi1pZCA6IDQKKyAgICAgICBmYjMgLT4gd2luLWlkIDogMAorICAgICAgIGZiNCAtPiB3aW5faWQgOiAxCisgICAgICAgaXQgaXMgcHJlIGFzc3VtZWQgdGhhdCAuLi53aW4wIG9yIHdpbjEgaXMgdXNlZCBoZXJlLi4KKwkgKi8KKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgY2FzZSAwOgorICAgIGNhc2UgMToKKyAgICBjYXNlIDI6CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCIlczo6aWQoJWQpIGlzIHdlaXJkIiwgX19mdW5jX18sIGlkKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICBzbnByaW50ZihuYW1lLCA2NCwgZGV2aWNlX3RlbXBsYXRlLCAoaWQgKyAzKSU1KTsKKworICAgIHdpbi0+ZmQgPSBvcGVuKG5hbWUsIE9fUkRXUik7CisgICAgaWYgKHdpbi0+ZmQgPCAwKSB7CisJCUFMT0dFKCIlczo6RmFpbGVkIHRvIG9wZW4gd2luZG93IGRldmljZSAoJXMpIDogJXMiLAorCQkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubyksIGRldmljZV90ZW1wbGF0ZSk7CisgICAgICAgIGdvdG8gZXJyb3I7CisgICAgfQorCisgICAgcmV0dXJuIDA7CisKK2Vycm9yOgorICAgIGlmICgwIDw9IHdpbi0+ZmQpCisgICAgICAgIGNsb3NlKHdpbi0+ZmQpOworICAgIHdpbi0+ZmQgPSAtMTsKKworICAgIHJldHVybiAtMTsKK30KKworaW50IHdpbmRvd19jbG9zZShzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbikKK3sKKyAgICBpbnQgcmV0ID0gMDsKKworICAgIGlmICgwIDw9IHdpbi0+ZmQpCisgICAgICAgIHJldCA9IGNsb3NlKHdpbi0+ZmQpOworICAgIHdpbi0+ZmQgPSAtMTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCB3aW5kb3dfc2V0X3BvcyhzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbikKK3sKKyAgICBzdHJ1Y3Qgc2VjZmJfdXNlcl93aW5kb3cgd2luZG93OworCisgICAgLyogYmVmb3JlIGNoYW5naW5nIHRoZSBzY3JlZW4gY29uZmlndXJhdGlvbi4uLnBvd2VyZG93biB0aGUgd2luZG93ICovCisgICAgaWYod2luZG93X2hpZGUod2luKSAhPSAwKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICB3aW4tPnZhcl9pbmZvLnhyZXMgPSB3aW4tPnJlY3RfaW5mby53OworICAgIHdpbi0+dmFyX2luZm8ueXJlcyA9IHdpbi0+cmVjdF9pbmZvLmg7CisKKyAgICB3aW4tPnZhcl9pbmZvLmFjdGl2YXRlICY9IH5GQl9BQ1RJVkFURV9NQVNLOworICAgIHdpbi0+dmFyX2luZm8uYWN0aXZhdGUgfD0gRkJfQUNUSVZBVEVfRk9SQ0U7CisKKyAgICBpZiAoaW9jdGwod2luLT5mZCwgRkJJT1BVVF9WU0NSRUVOSU5GTywgJih3aW4tPnZhcl9pbmZvKSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczo6RkJJT1BVVF9WU0NSRUVOSU5GTyglZCwgJWQpIGZhaWwiLAorICAgICAgICAgIAkJX19mdW5jX18sIHdpbi0+cmVjdF9pbmZvLncsIHdpbi0+cmVjdF9pbmZvLmgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgd2luZG93LnggPSB3aW4tPnJlY3RfaW5mby54OworICAgIHdpbmRvdy55ID0gd2luLT5yZWN0X2luZm8ueTsKKworICAgIGlmIChpb2N0bCh3aW4tPmZkLCBTRUNGQl9XSU5fUE9TSVRJT04sICZ3aW5kb3cpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6OlMzQ0ZCX1dJTl9QT1NJVElPTiglZCwgJWQpIGZhaWwiLAorICAgICAgICAgICAgCV9fZnVuY19fLCB3aW5kb3cueCwgd2luZG93LnkpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgd2luZG93X2dldF9pbmZvKHN0cnVjdCBod2Nfd2luX2luZm9fdCAqd2luKQoreworICAgIGlmIChpb2N0bCh3aW4tPmZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmd2luLT5maXhfaW5mbykgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGQklPR0VUX0ZTQ1JFRU5JTkZPIGZhaWxlZCA6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgZ290byBlcnJvcjsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKKworZXJyb3I6CisgICAgd2luLT5maXhfaW5mby5zbWVtX3N0YXJ0ID0gMDsKKworICAgIHJldHVybiAtMTsKK30KKworaW50IHdpbmRvd19wYW5fZGlzcGxheShzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbikKK3sKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKmxjZF9pbmZvID0gJih3aW4tPmxjZF9pbmZvKTsKKworICAgIGxjZF9pbmZvLT55b2Zmc2V0ID0gbGNkX2luZm8tPnlyZXMgKiB3aW4tPmJ1Zl9pbmRleDsKKworICAgIGlmIChpb2N0bCh3aW4tPmZkLCBGQklPUEFOX0RJU1BMQVksIGxjZF9pbmZvKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOjpGQklPUEFOX0RJU1BMQVkoJWQgLyAlZCAvICVkKSBmYWlsKCVzKSIsCisgICAgICAgICAgICAJX19mdW5jX18sIGxjZF9pbmZvLT55cmVzLCB3aW4tPmJ1Zl9pbmRleCwgbGNkX2luZm8tPnlyZXNfdmlydHVhbCwKKyAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB3aW5kb3dfc2hvdyhzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbikKK3sKKyAgICBpZih3aW4tPnBvd2VyX3N0YXRlID09IDApIHsKKyAgICAgICAgaWYgKGlvY3RsKHdpbi0+ZmQsIEZCSU9CTEFOSywgRkJfQkxBTktfVU5CTEFOSykgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZCSU9CTEFOSyBmYWlsZWQgOiAoJWQ6JXMpIiwgX19mdW5jX18sIHdpbi0+ZmQsCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgd2luLT5wb3dlcl9zdGF0ZSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgd2luZG93X2hpZGUoc3RydWN0IGh3Y193aW5faW5mb190ICp3aW4pCit7CisgICAgaWYgKHdpbi0+cG93ZXJfc3RhdGUgPT0gMSkgeworICAgICAgICBpZiAoaW9jdGwod2luLT5mZCwgRkJJT0JMQU5LLCBGQl9CTEFOS19QT1dFUkRPV04pIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOjpGQklPQkxBTksgZmFpbGVkIDogKCVkOiVzKSIsCisgICAgICAgICAgICAgCQlfX2Z1bmNfXywgd2luLT5mZCwgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB3aW4tPnBvd2VyX3N0YXRlID0gMDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCB3aW5kb3dfZ2V0X2dsb2JhbF9sY2RfaW5mbyhzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4KQoreworICAgIHN0cnVjdCBod2Nfd2luX2luZm9fdCB3aW47CisgICAgaW50IHJldCA9IDA7CisKKyAgICBpZiAoaW9jdGwoY3R4LT5nbG9iYWxfbGNkX3dpbi5mZCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJmN0eC0+bGNkX2luZm8pIDwgMCkgeworICAgICAgICBBTE9HRSgiRkJJT0dFVF9WU0NSRUVOSU5GTyBmYWlsZWQgOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5sY2RfaW5mby54cmVzID09IDApIHsKKyAgICAgICAgY3R4LT5sY2RfaW5mby54cmVzID0gREVGQVVMVF9MQ0RfV0lEVEg7CisgICAgICAgIGN0eC0+bGNkX2luZm8ueHJlc192aXJ0dWFsID0gREVGQVVMVF9MQ0RfV0lEVEg7CisgICAgfQorCisgICAgaWYgKGN0eC0+bGNkX2luZm8ueXJlcyA9PSAwKSB7CisgICAgICAgIGN0eC0+bGNkX2luZm8ueXJlcyA9IERFRkFVTFRfTENEX0hFSUdIVDsKKyAgICAgICAgY3R4LT5sY2RfaW5mby55cmVzX3ZpcnR1YWwgPSBERUZBVUxUX0xDRF9IRUlHSFQgKiBOVU1fT0ZfV0lOX0JVRjsKKyAgICB9CisKKyAgICBpZiAoY3R4LT5sY2RfaW5mby5iaXRzX3Blcl9waXhlbCA9PSAwKQorICAgICAgICBjdHgtPmxjZF9pbmZvLmJpdHNfcGVyX3BpeGVsID0gREVGQVVMVF9MQ0RfQlBQOworCisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBmaW1jX3Y0bDJfc2V0X3NyYyhpbnQgZmQsIHVuc2lnbmVkIGludCBod192ZXIsIHM1cF9maW1jX2ltZ19pbmZvICpzcmMpCit7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0ICBmbXQ7CisgICAgc3RydWN0IHY0bDJfY3JvcGNhcCBjcm9wY2FwOworICAgIHN0cnVjdCB2NGwyX2Nyb3AgICAgY3JvcDsKKyAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7CisKKyAgICAvKgorICAgICAqIFRvIHNldCBzaXplICYgZm9ybWF0IGZvciBzb3VyY2UgaW1hZ2UgKERNQS1JTlBVVCkKKyAgICAgKi8KKyAgICBmbXQudHlwZSAgICAgICAgICAgICAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworICAgIGZtdC5mbXQucGl4LndpZHRoICAgICAgID0gc3JjLT5mdWxsX3dpZHRoOworICAgIGZtdC5mbXQucGl4LmhlaWdodCAgICAgID0gc3JjLT5mdWxsX2hlaWdodDsKKyAgICBmbXQuZm10LnBpeC5waXhlbGZvcm1hdCA9IHNyYy0+Y29sb3Jfc3BhY2U7CisgICAgZm10LmZtdC5waXguZmllbGQgICAgICAgPSBWNEwyX0ZJRUxEX05PTkU7CisKKyAgICBpZiAoaW9jdGwgKGZkLCBWSURJT0NfU19GTVQsICZmbXQpIDwgMCkgeworICAgICAgICBBTE9HRSgiVklESU9DX1NfRk1UIGZhaWxlZCA6IGVycm5vPSVkICglcykgOiBmZD0lZCIsIGVycm5vLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSwgZmQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBjcm9wIGlucHV0IHNpemUKKyAgICAgKi8KKyAgICBjcm9wLnR5cGUgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgICBpZiAoMHg1MCA9PSBod192ZXIpIHsKKyAgICAgICAgY3JvcC5jLmxlZnQgICA9IHNyYy0+c3RhcnRfeDsKKyAgICAgICAgY3JvcC5jLnRvcCAgICA9IHNyYy0+c3RhcnRfeTsKKyAgICB9IGVsc2UgeworICAgICAgICBjcm9wLmMubGVmdCAgID0gMDsKKyAgICAgICAgY3JvcC5jLnRvcCAgICA9IDA7CisgICAgfQorICAgIGNyb3AuYy53aWR0aCAgPSBzcmMtPndpZHRoOworICAgIGNyb3AuYy5oZWlnaHQgPSBzcmMtPmhlaWdodDsKKyAgICBpZiAoaW9jdGwoZmQsIFZJRElPQ19TX0NST1AsICZjcm9wKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHZpZGVvIFZJRElPQ19TX0NST1AgKCVkLCAlZCwgJWQsICVkKSIsCisgICAgICAgICAgICAgICAgY3JvcC5jLmxlZnQsIGNyb3AuYy50b3AsIGNyb3AuYy53aWR0aCwgY3JvcC5jLmhlaWdodCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIGlucHV0IGJ1ZmZlciB0eXBlCisgICAgICovCisgICAgcmVxLmNvdW50ICAgICAgID0gMTsKKyAgICByZXEudHlwZSAgICAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgICByZXEubWVtb3J5ICAgICAgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworCisgICAgaWYgKGlvY3RsIChmZCwgVklESU9DX1JFUUJVRlMsICZyZXEpIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gVklESU9DX1JFUUJVRlMiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmltY192NGwyX3NldF9kc3QoaW50IGZkLAorICAgICAgICAgICAgICAgICAgICAgIHM1cF9maW1jX2ltZ19pbmZvICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFnX2hfZmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ192X2ZsaXAsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFkZHIpCit7CisgICAgc3RydWN0IHY0bDJfZm9ybWF0ICAgICAgc0Zvcm1hdDsKKyAgICBzdHJ1Y3QgdjRsMl9jb250cm9sICAgICB2YzsKKyAgICBzdHJ1Y3QgdjRsMl9mcmFtZWJ1ZmZlciBmYnVmOworCisgICAgLyoKKyAgICAgKiBzZXQgcm90YXRpb24gY29uZmlndXJhdGlvbgorICAgICAqLworICAgIHZjLmlkID0gVjRMMl9DSURfSEZMSVA7CisgICAgdmMudmFsdWUgPSBmbGFnX2hfZmxpcDsKKyAgICBpZiAoaW9jdGwoZmQsIFZJRElPQ19TX0NUUkwsICZ2YykgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiB2aWRlbyBWSURJT0NfU19DVFJMIC0gZmxhZ19oX2ZsaXAgKCVkKSIsIGZsYWdfaF9mbGlwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZjLmlkID0gVjRMMl9DSURfVkZMSVA7CisgICAgdmMudmFsdWUgPSBmbGFnX3ZfZmxpcDsKKyAgICBpZiAoaW9jdGwoZmQsIFZJRElPQ19TX0NUUkwsICZ2YykgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiB2aWRlbyBWSURJT0NfU19DVFJMIC0gZmxhZ192X2ZsaXAgKCVkKSIsIGZsYWdfdl9mbGlwKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHZjLmlkID0gVjRMMl9DSURfUk9UQVRJT047CisgICAgdmMudmFsdWUgPSByb3RhdGlvbjsKKyAgICBpZiAoaW9jdGwoZmQsIFZJRElPQ19TX0NUUkwsICZ2YykgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiB2aWRlbyBWSURJT0NfU19DVFJMIC0gcm90YXRpb24gKCVkKSIsIHJvdGF0aW9uKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qCisgICAgICogc2V0IHNpemUsIGZvcm1hdCAmIGFkZHJlc3MgZm9yIGRlc3RpbmF0aW9uIGltYWdlIChETUEtT1VUUFVUKQorICAgICAqLworICAgIGlmIChpb2N0bCAoZmQsIFZJRElPQ19HX0ZCVUYsICZmYnVmKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHZpZGVvIFZJRElPQ19HX0ZCVUYiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGZidWYuYmFzZSAgICAgICAgICAgID0gKHZvaWQgKilhZGRyOworICAgIGZidWYuZm10LndpZHRoICAgICAgID0gZHN0LT5mdWxsX3dpZHRoOworICAgIGZidWYuZm10LmhlaWdodCAgICAgID0gZHN0LT5mdWxsX2hlaWdodDsKKyAgICBmYnVmLmZtdC5waXhlbGZvcm1hdCA9IGRzdC0+Y29sb3Jfc3BhY2U7CisgICAgaWYgKGlvY3RsIChmZCwgVklESU9DX1NfRkJVRiwgJmZidWYpIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gdmlkZW8gVklESU9DX1NfRkJVRiAweCV4ICVkICVkICVkIiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKWFkZHIsIGRzdC0+ZnVsbF93aWR0aCwgZHN0LT5mdWxsX2hlaWdodCwKKyAgICAgICAgICAgICAgICBkc3QtPmNvbG9yX3NwYWNlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qCisgICAgICogc2V0IGRlc3RpbmF0aW9uIHdpbmRvdworICAgICAqLworICAgIHNGb3JtYXQudHlwZSAgICAgICAgICAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1ZFUkxBWTsKKyAgICBzRm9ybWF0LmZtdC53aW4udy5sZWZ0ICAgPSBkc3QtPnN0YXJ0X3g7CisgICAgc0Zvcm1hdC5mbXQud2luLncudG9wICAgID0gZHN0LT5zdGFydF95OworICAgIHNGb3JtYXQuZm10Lndpbi53LndpZHRoICA9IGRzdC0+d2lkdGg7CisgICAgc0Zvcm1hdC5mbXQud2luLncuaGVpZ2h0ID0gZHN0LT5oZWlnaHQ7CisgICAgaWYgKGlvY3RsKGZkLCBWSURJT0NfU19GTVQsICZzRm9ybWF0KSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIHZpZGVvIFZJRElPQ19TX0ZNVCAlZCAlZCAlZCAlZCIsCisgICAgICAgICAgICAgICAgZHN0LT5zdGFydF94LCBkc3QtPnN0YXJ0X3ksIGRzdC0+d2lkdGgsIGRzdC0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmltY192NGwyX3N0cmVhbV9vbihpbnQgZmQsIGVudW0gdjRsMl9idWZfdHlwZSB0eXBlKQoreworICAgIGlmIChpb2N0bCAoZmQsIFZJRElPQ19TVFJFQU1PTiwgJnR5cGUpIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gVklESU9DX1NUUkVBTU9OIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZpbWNfdjRsMl9xdWV1ZShpbnQgZmQsIHN0cnVjdCBmaW1jX2J1ZiAqZmltY19idWYpCit7CisgICAgc3RydWN0IHY0bDJfYnVmZmVyIGJ1ZjsKKworICAgIGJ1Zi50eXBlICAgICAgICA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworICAgIGJ1Zi5tZW1vcnkgICAgICA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisgICAgYnVmLm0udXNlcnB0ciAgID0gKHVuc2lnbmVkIGxvbmcpZmltY19idWY7CisgICAgYnVmLmxlbmd0aCAgICAgID0gMDsKKyAgICBidWYuaW5kZXggICAgICAgPSAwOworCisgICAgaWYgKGlvY3RsIChmZCwgVklESU9DX1FCVUYsICZidWYpIDwgMCkgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gVklESU9DX1FCVUYiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmltY192NGwyX2RlcXVldWUoaW50IGZkKQoreworICAgIHN0cnVjdCB2NGwyX2J1ZmZlciBidWY7CisKKyAgICBidWYudHlwZSAgICAgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgICBidWYubWVtb3J5ICAgICAgPSBWNEwyX01FTU9SWV9VU0VSUFRSOworCisgICAgaWYgKGlvY3RsIChmZCwgVklESU9DX0RRQlVGLCAmYnVmKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIFZJRElPQ19EUUJVRiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIGJ1Zi5pbmRleDsKK30KKworaW50IGZpbWNfdjRsMl9zdHJlYW1fb2ZmKGludCBmZCkKK3sKKyAgICBlbnVtIHY0bDJfYnVmX3R5cGUgdHlwZTsKKyAgICB0eXBlID0gVjRMMl9CVUZfVFlQRV9WSURFT19PVVRQVVQ7CisKKyAgICBpZiAoaW9jdGwgKGZkLCBWSURJT0NfU1RSRUFNT0ZGLCAmdHlwZSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBWSURJT0NfU1RSRUFNT0ZGIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGZpbWNfdjRsMl9jbHJfYnVmKGludCBmZCkKK3sKKyAgICBzdHJ1Y3QgdjRsMl9yZXF1ZXN0YnVmZmVycyByZXE7CisKKyAgICByZXEuY291bnQgICA9IDA7CisgICAgcmVxLnR5cGUgICAgPSBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVDsKKyAgICByZXEubWVtb3J5ICA9IFY0TDJfTUVNT1JZX1VTRVJQVFI7CisKKyAgICBpZiAoaW9jdGwgKGZkLCBWSURJT0NfUkVRQlVGUywgJnJlcSkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBWSURJT0NfUkVRQlVGUyIpOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCitpbnQgZmltY19oYW5kbGVfb25lc2hvdChpbnQgZmQsIHN0cnVjdCBmaW1jX2J1ZiAqZmltY19idWYpCit7CisgICAgaW50IHJldCA9MDsKKworICAgIGlmIChmaW1jX3Y0bDJfc3RyZWFtX29uKGZkLCBWNEwyX0JVRl9UWVBFX1ZJREVPX09VVFBVVCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsIDogdjRsMl9zdHJlYW1fb24oKSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZpbWNfdjRsMl9xdWV1ZShmZCwgZmltY19idWYpIDwgMCkgeworICAgICAgICBBTE9HRSgiRmFpbCA6IHY0bDJfcXVldWUoKSIpOworICAgICAgICByZXQgPSAtMTsKKyAgICAgICAgZ290byBzdHJlYW1fb2ZmOworICAgIH0KKworICAgIGlmIChmaW1jX3Y0bDJfZGVxdWV1ZShmZCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsIDogdjRsMl9kZXF1ZXVlKCkiKTsKKyAgICAgICAgcmV0ID0gLTE7CisgICAgICAgIGdvdG8gc3RyZWFtX29mZjsKKyAgICB9CisKK3N0cmVhbV9vZmY6CisgICAgaWYgKGZpbWNfdjRsMl9zdHJlYW1fb2ZmKGZkKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgOiB2NGwyX3N0cmVhbV9vZmYoKSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaWYgKGZpbWNfdjRsMl9jbHJfYnVmKGZkKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgOiB2NGwyX2Nscl9idWYoKSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBnZXRfc3JjX3BoeXNfYWRkcihzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfaW1nICpzcmNfaW1nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKnBoeUFkZHIpCit7CisgICAgczVwX2ZpbWNfdCAqZmltYyA9ICZjdHgtPmZpbWM7CisKKyAgIGlmKHNyY19pbWctPm1lbV90eXBlID09IEhXQ19QSFlTX01FTV9UWVBFKSB7CisgICAgICAgIHN3aXRjaChzcmNfaW1nLT5mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUDoKKyAgICAgICAgICAgIGZpbWMtPnBhcmFtcy5zcmMuYnVmX2FkZHJfcGh5X3JnYl95ID0gcGh5QWRkclswXTsKKyAgICAgICAgICAgIGZpbWMtPnBhcmFtcy5zcmMuYnVmX2FkZHJfcGh5X2NiICAgID0gcGh5QWRkclsxXTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzIGZvcm1hdCBlcnJvciAoZm9ybWF0PTB4JXgpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIHNyY19pbWctPmZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXMgbWVtX3R5cGUgZXJyb3IgKG1lbV90eXBlPSVkKSIsIF9fZnVuY19fLCBzcmNfaW1nLT5tZW1fdHlwZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfZHN0X3BoeXNfYWRkcihzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNfaW1nICpkc3RfaW1nKQoreworICAgIHVuc2lnbmVkIGludCBkc3RfcGh5c19hZGRyICA9IDA7CisKKyAgICBpZiAoSFdDX1BIWVNfTUVNX1RZUEUgPT0gZHN0X2ltZy0+bWVtX3R5cGUgJiYgMCAhPSBkc3RfaW1nLT5iYXNlKQorICAgICAgICBkc3RfcGh5c19hZGRyID0gZHN0X2ltZy0+YmFzZTsKKyAgICBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOjpnZXRfZHN0X3BoeXNfYWRkciBmYWlsICIsIF9fZnVuY19fKTsKKyAgICAgICAgZHN0X3BoeXNfYWRkciA9IDA7CisgICAgfQorICAgIHJldHVybiBkc3RfcGh5c19hZGRyOworfQorCitzdGF0aWMgaW5saW5lIGludCByb3RhdGVWYWx1ZUhBTDJQUCh1bnNpZ25lZCBjaGFyIHRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqZmxhZ19oX2ZsaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmZsYWdfdl9mbGlwKQoreworICAgIGludCByb3RhdGVfcmVzdWx0ID0gMDsKKyAgICBpbnQgcm90YXRlX2ZsYWcgPSB0cmFuc2Zvcm0gJiAweDc7CisKKyAgICBzd2l0Y2ggKHJvdGF0ZV9mbGFnKSB7CisgICAgY2FzZSBIQUxfVFJBTlNGT1JNX1JPVF85MDoKKyAgICAgICAgcm90YXRlX3Jlc3VsdCA9IDkwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDoKKyAgICAgICAgcm90YXRlX3Jlc3VsdCA9IDE4MDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBIQUxfVFJBTlNGT1JNX1JPVF8yNzA6CisgICAgICAgIHJvdGF0ZV9yZXN1bHQgPSAyNzA7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocm90YXRlX2ZsYWcpIHsKKyAgICBjYXNlIEhBTF9UUkFOU0ZPUk1fRkxJUF9IOgorICAgICAgICAqZmxhZ19oX2ZsaXAgPSAxOworICAgICAgICAqZmxhZ192X2ZsaXAgPSAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEhBTF9UUkFOU0ZPUk1fRkxJUF9WOgorICAgICAgICAqZmxhZ19oX2ZsaXAgPSAwOworICAgICAgICAqZmxhZ192X2ZsaXAgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAqZmxhZ19oX2ZsaXAgPSAwOworICAgICAgICAqZmxhZ192X2ZsaXAgPSAwOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gcm90YXRlX3Jlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgbXVsdGlwbGVPZk4oaW50IG51bWJlciwgaW50IE4pCit7CisgICAgaW50IHJlc3VsdCA9IG51bWJlcjsKKyAgICBzd2l0Y2ggKE4pIHsKKyAgICBjYXNlIDE6CisgICAgY2FzZSAyOgorICAgIGNhc2UgNDoKKyAgICBjYXNlIDg6CisgICAgY2FzZSAxNjoKKyAgICBjYXNlIDMyOgorICAgIGNhc2UgNjQ6CisgICAgY2FzZSAxMjg6CisgICAgY2FzZSAyNTY6CisgICAgICAgIHJlc3VsdCA9IChudW1iZXIgLSAobnVtYmVyICYgKE4tMSkpKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmVzdWx0ID0gbnVtYmVyIC0gKG51bWJlciAlIE4pOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBpbnQgd2lkdGhPZlBQKHVuc2lnbmVkIGludCB2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBwX2NvbG9yX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKQoreworICAgIGlmICgweDUwID09IHZlcikgeworICAgICAgICBzd2l0Y2gocHBfY29sb3JfZm9ybWF0KSB7CisgICAgICAgIC8qIDQyMiAxLzIvMyBwbGFuZSAqLworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjYxOgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjE2OgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjJQOgorCisgICAgICAgIC8qIDQyMCAyLzMgcGxhbmUgKi8KKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMlQ6CisgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKyAgICAgICAgICAgIHJldHVybiBtdWx0aXBsZU9mTihudW1iZXIsIDIpOworCisgICAgICAgIGRlZmF1bHQgOgorICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaChwcF9jb2xvcl9mb3JtYXQpIHsKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCNTY1OgorICAgICAgICAgICAgcmV0dXJuIG11bHRpcGxlT2ZOKG51bWJlciwgOCk7CisKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfUkdCMzI6CisgICAgICAgICAgICByZXR1cm4gbXVsdGlwbGVPZk4obnVtYmVyLCA0KTsKKworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVlWOgorICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9VWVZZOgorICAgICAgICAgICAgcmV0dXJuIG11bHRpcGxlT2ZOKG51bWJlciwgNCk7CisKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlY2MToKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxNjoKKyAgICAgICAgICAgIHJldHVybiBtdWx0aXBsZU9mTihudW1iZXIsIDgpOworCisgICAgICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMlA6CisgICAgICAgICAgICByZXR1cm4gbXVsdGlwbGVPZk4obnVtYmVyLCAxNik7CisKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMjoKKyAgICAgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYxMlQ6CisgICAgICAgICAgICByZXR1cm4gbXVsdGlwbGVPZk4obnVtYmVyLCA4KTsKKworICAgICAgICBjYXNlIFY0TDJfUElYX0ZNVF9ZVVY0MjA6CisgICAgICAgICAgICByZXR1cm4gbXVsdGlwbGVPZk4obnVtYmVyLCAxNik7CisKKyAgICAgICAgZGVmYXVsdCA6CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudW1iZXI7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGhlaWdodE9mUFAoaW50IHBwX2NvbG9yX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikKK3sKKyAgICBzd2l0Y2gocHBfY29sb3JfZm9ybWF0KSB7CisgICAgY2FzZSBWNEwyX1BJWF9GTVRfTlYyMToKKyAgICBjYXNlIFY0TDJfUElYX0ZNVF9OVjEyOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX05WMTJUOgorICAgIGNhc2UgVjRMMl9QSVhfRk1UX1lVVjQyMDoKKyAgICAgICAgcmV0dXJuIG11bHRpcGxlT2ZOKG51bWJlciwgMik7CisKKyAgICBkZWZhdWx0IDoKKyAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICB9CisgICAgcmV0dXJuIG51bWJlcjsKK30KKworc3RhdGljIGludCBydW5jRmltY0NvcmUoc3RydWN0IGh3Y19jb250ZXh0X3QgKmN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY19pbWcgKnNyY19pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWNfcmVjdCAqc3JjX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzcmNfY29sb3Jfc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHN0X3BoeXNfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY19pbWcgKmRzdF9pbWcsCisgICAgICAgICAgICAgICAgICAgICAgICBzZWNfcmVjdCAqZHN0X3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc3RfY29sb3Jfc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHJhbnNmb3JtKQoreworICAgIHM1cF9maW1jX3QgICAgICAgICogZmltYyA9ICZjdHgtPmZpbWM7CisgICAgczVwX2ZpbWNfcGFyYW1zX3QgKiBwYXJhbXMgPSAmKGZpbWMtPnBhcmFtcyk7CisKKyAgICB1bnNpZ25lZCBpbnQgICAgZnJhbWVfc2l6ZSA9IDA7CisgICAgc3RydWN0IGZpbWNfYnVmIGZpbWNfc3JjX2J1ZjsKKworICAgIGludCBzcmNfYnBwLCBzcmNfcGxhbmVzOworICAgIGludCBmbGFnX2hfZmxpcCA9IDA7CisgICAgaW50IGZsYWdfdl9mbGlwID0gMDsKKyAgICBpbnQgcm90YXRlX3ZhbHVlID0gcm90YXRlVmFsdWVIQUwyUFAodHJhbnNmb3JtLCAmZmxhZ19oX2ZsaXAsICZmbGFnX3ZfZmxpcCk7CisKKyAgICAvKiBzZXQgcG9zdCBwcm9jZXNzb3IgY29uZmlndXJhdGlvbiAqLworICAgIHBhcmFtcy0+c3JjLmZ1bGxfd2lkdGggID0gc3JjX2ltZy0+dzsKKyAgICBwYXJhbXMtPnNyYy5mdWxsX2hlaWdodCA9IHNyY19pbWctPmg7CisgICAgcGFyYW1zLT5zcmMuc3RhcnRfeCAgICAgPSBzcmNfcmVjdC0+eDsKKyAgICBwYXJhbXMtPnNyYy5zdGFydF95ICAgICA9IHNyY19yZWN0LT55OworICAgIHBhcmFtcy0+c3JjLndpZHRoICAgICAgID0gd2lkdGhPZlBQKGZpbWMtPmh3X3Zlciwgc3JjX2NvbG9yX3NwYWNlLCBzcmNfcmVjdC0+dyk7CisgICAgcGFyYW1zLT5zcmMuaGVpZ2h0ICAgICAgPSBoZWlnaHRPZlBQKHNyY19jb2xvcl9zcGFjZSwgc3JjX3JlY3QtPmgpOworICAgIHBhcmFtcy0+c3JjLmNvbG9yX3NwYWNlID0gc3JjX2NvbG9yX3NwYWNlOworCisKKyAgICAvKiBjaGVjayBtaW5pbXVtICovCisgICAgaWYgKHNyY19yZWN0LT53IDwgMTYgfHwgc3JjX3JlY3QtPmggPCA4KSB7CisgICAgICAgIEFMT0dFKCIlcyBzcmMgc2l6ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGZpbWMgOiBmX3c9JWQgZl9oPSVkIHg9JWQgeT0lZCBcCisgICAgICAgICAgICAJdz0lZCBoPSVkIChvdz0lZCBvaD0lZCkgZm9ybWF0PTB4JXgiLCBfX2Z1bmNfXywKKwkJCQlwYXJhbXMtPnNyYy5mdWxsX3dpZHRoLCBwYXJhbXMtPnNyYy5mdWxsX2hlaWdodCwKKwkJCQlwYXJhbXMtPnNyYy5zdGFydF94LCBwYXJhbXMtPnNyYy5zdGFydF95LCBwYXJhbXMtPnNyYy53aWR0aCwKKwkJCQlwYXJhbXMtPnNyYy5oZWlnaHQsIHNyY19yZWN0LT53LCBzcmNfcmVjdC0+aCwKKwkJCQlwYXJhbXMtPnNyYy5jb2xvcl9zcGFjZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKK3N3aXRjaCAocm90YXRlX3ZhbHVlKSB7CisgICAgY2FzZSAwOgorICAgICAgICBwYXJhbXMtPmRzdC5mdWxsX3dpZHRoICA9IGRzdF9pbWctPnc7CisgICAgICAgIHBhcmFtcy0+ZHN0LmZ1bGxfaGVpZ2h0ID0gZHN0X2ltZy0+aDsKKworICAgICAgICBwYXJhbXMtPmRzdC5zdGFydF94ICAgICA9IGRzdF9yZWN0LT54OworICAgICAgICBwYXJhbXMtPmRzdC5zdGFydF95ICAgICA9IGRzdF9yZWN0LT55OworCisgICAgICAgIHBhcmFtcy0+ZHN0LndpZHRoICAgICAgID0KKyAgICAgICAgICAgIHdpZHRoT2ZQUChmaW1jLT5od192ZXIsIGRzdF9jb2xvcl9zcGFjZSwgZHN0X3JlY3QtPncpOworICAgICAgICBwYXJhbXMtPmRzdC5oZWlnaHQgICAgICA9IGhlaWdodE9mUFAoZHN0X2NvbG9yX3NwYWNlLCBkc3RfcmVjdC0+aCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgOTA6CisgICAgICAgIHBhcmFtcy0+ZHN0LmZ1bGxfd2lkdGggID0gZHN0X2ltZy0+aDsKKyAgICAgICAgcGFyYW1zLT5kc3QuZnVsbF9oZWlnaHQgPSBkc3RfaW1nLT53OworCisgICAgICAgIHBhcmFtcy0+ZHN0LnN0YXJ0X3ggICAgID0gZHN0X3JlY3QtPnk7CisgICAgICAgIHBhcmFtcy0+ZHN0LnN0YXJ0X3kgICAgID0gZHN0X2ltZy0+dyAtIChkc3RfcmVjdC0+eCArIGRzdF9yZWN0LT53KTsKKworICAgICAgICBwYXJhbXMtPmRzdC53aWR0aCAgICAgICA9CisgICAgICAgICAgICB3aWR0aE9mUFAoZmltYy0+aHdfdmVyLCBkc3RfY29sb3Jfc3BhY2UsIGRzdF9yZWN0LT5oKTsKKyAgICAgICAgcGFyYW1zLT5kc3QuaGVpZ2h0ICAgICAgPQorICAgICAgICAgICAgd2lkdGhPZlBQKGZpbWMtPmh3X3ZlciwgZHN0X2NvbG9yX3NwYWNlLCBkc3RfcmVjdC0+dyk7CisKKyAgICAgICAgaWYgKDB4NTAgPiBmaW1jLT5od192ZXIpCisgICAgICAgICAgICBwYXJhbXMtPmRzdC5zdGFydF95ICs9IChkc3RfcmVjdC0+dyAtIHBhcmFtcy0+ZHN0LmhlaWdodCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMTgwOgorICAgICAgICBwYXJhbXMtPmRzdC5mdWxsX3dpZHRoICA9IGRzdF9pbWctPnc7CisgICAgICAgIHBhcmFtcy0+ZHN0LmZ1bGxfaGVpZ2h0ID0gZHN0X2ltZy0+aDsKKworICAgICAgICBwYXJhbXMtPmRzdC5zdGFydF94ICAgICA9IGRzdF9pbWctPncgLSAoZHN0X3JlY3QtPnggKyBkc3RfcmVjdC0+dyk7CisgICAgICAgIHBhcmFtcy0+ZHN0LnN0YXJ0X3kgICAgID0gZHN0X2ltZy0+aCAtIChkc3RfcmVjdC0+eSArIGRzdF9yZWN0LT5oKTsKKworICAgICAgICBwYXJhbXMtPmRzdC53aWR0aCAgICAgICA9CisgICAgICAgICAgICB3aWR0aE9mUFAoZmltYy0+aHdfdmVyLCBkc3RfY29sb3Jfc3BhY2UsIGRzdF9yZWN0LT53KTsKKyAgICAgICAgcGFyYW1zLT5kc3QuaGVpZ2h0ICAgICAgPSBoZWlnaHRPZlBQKGRzdF9jb2xvcl9zcGFjZSwgZHN0X3JlY3QtPmgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI3MDoKKyAgICAgICAgcGFyYW1zLT5kc3QuZnVsbF93aWR0aCAgPSBkc3RfaW1nLT5oOworICAgICAgICBwYXJhbXMtPmRzdC5mdWxsX2hlaWdodCA9IGRzdF9pbWctPnc7CisKKyAgICAgICAgcGFyYW1zLT5kc3Quc3RhcnRfeCAgICAgPSBkc3RfaW1nLT5oIC0gKGRzdF9yZWN0LT55ICsgZHN0X3JlY3QtPmgpOworICAgICAgICBwYXJhbXMtPmRzdC5zdGFydF95ICAgICA9IGRzdF9yZWN0LT54OworCisgICAgICAgIHBhcmFtcy0+ZHN0LndpZHRoICAgICAgID0KKyAgICAgICAgICAgIHdpZHRoT2ZQUChmaW1jLT5od192ZXIsIGRzdF9jb2xvcl9zcGFjZSwgZHN0X3JlY3QtPmgpOworICAgICAgICBwYXJhbXMtPmRzdC5oZWlnaHQgICAgICA9CisgICAgICAgICAgICB3aWR0aE9mUFAoZmltYy0+aHdfdmVyLCBkc3RfY29sb3Jfc3BhY2UsIGRzdF9yZWN0LT53KTsKKworICAgICAgICBpZiAoMHg1MCA+IGZpbWMtPmh3X3ZlcikKKyAgICAgICAgICAgIHBhcmFtcy0+ZHN0LnN0YXJ0X3kgKz0gKGRzdF9yZWN0LT53IC0gcGFyYW1zLT5kc3QuaGVpZ2h0KTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisKKyAgICBwYXJhbXMtPmRzdC5jb2xvcl9zcGFjZSA9IGRzdF9jb2xvcl9zcGFjZTsKKworICAgIC8qIGNoZWNrIG1pbmltdW0gKi8KKyAgICBpZiAoZHN0X3JlY3QtPncgIDwgOCB8fCBkc3RfcmVjdC0+aCA8IDQpIHsKKyAgICAgICAgQUxPR0UoIiVzIGRzdCBzaXplIGlzIG5vdCBzdXBwb3J0ZWQgYnkgZmltYyA6IFwKKwkJCQlmX3c9JWQgZl9oPSVkIHg9JWQgeT0lZCB3PSVkIGg9JWQgKG93PSVkIG9oPSVkKSBmb3JtYXQ9MHgleCIsCisJCQkJX19mdW5jX18sIHBhcmFtcy0+ZHN0LmZ1bGxfd2lkdGgsIHBhcmFtcy0+ZHN0LmZ1bGxfaGVpZ2h0LAorCQkJCXBhcmFtcy0+ZHN0LnN0YXJ0X3gsIHBhcmFtcy0+ZHN0LnN0YXJ0X3ksIHBhcmFtcy0+ZHN0LndpZHRoLAorCQkJCXBhcmFtcy0+ZHN0LmhlaWdodCwgZHN0X3JlY3QtPncsIGRzdF9yZWN0LT5oLAorCQkJCXBhcmFtcy0+ZHN0LmNvbG9yX3NwYWNlKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIGNoZWNrIHNjYWxpbmcgbGltaXQKKyAgICAgKiB0aGUgc2NhbGluZyBsaW1pZSBtdXN0IG5vdCBiZSBtb3JlIHRoYW4gTUFYX1JFU0laSU5HX1JBVElPX0xJTUlUCisgICAgICovCisgICAgaWYgKCgoc3JjX3JlY3QtPncgPiBkc3RfcmVjdC0+dykgJiYKKyAgICAgICAgKChzcmNfcmVjdC0+dyAvIGRzdF9yZWN0LT53KSA+IE1BWF9SRVNJWklOR19SQVRJT19MSU1JVCkpIHx8CisgICAgICAgICgoZHN0X3JlY3QtPncgPiBzcmNfcmVjdC0+dykgJiYKKyAgICAgICAgKChkc3RfcmVjdC0+dyAvIHNyY19yZWN0LT53KSA+IE1BWF9SRVNJWklOR19SQVRJT19MSU1JVCkpKSB7CisgICAgICAgIEFMT0dFKCIlcyBvdmVyIHNjYWxpbmcgbGltaXQgOiBzcmMudz0lZCBkc3Qudz0lZCAobGltaXQ9JWQpIiwKKyAgICAgICAgICAgIAlfX2Z1bmNfXywgc3JjX3JlY3QtPncsIGRzdF9yZWN0LT53LCBNQVhfUkVTSVpJTkdfUkFUSU9fTElNSVQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisKKyAgICAvKiBzZXQgY29uZmlndXJhdGlvbiByZWxhdGVkIHRvIGRlc3RpbmF0aW9uIChETUEtT1VUKQorICAgICAqICAgLSBzZXQgaW5wdXQgZm9ybWF0ICYgc2l6ZQorICAgICAqICAgLSBjcm9wIGlucHV0IHNpemUKKyAgICAgKiAgIC0gc2V0IGlucHV0IGJ1ZmZlcgorICAgICAqICAgLSBzZXQgYnVmZmVyIHR5cGUgKFY0TDJfTUVNT1JZX1VTRVJQVFIpCisgICAgICovCisgICAgaWYgKGZpbWNfdjRsMl9zZXRfZHN0KGZpbWMtPmRldl9mZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcy0+ZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdfaF9mbGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnX3ZfZmxpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X3BoeXNfYWRkcikgPCAwKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzZXQgY29uZmlndXJhdGlvbiByZWxhdGVkIHRvIHNvdXJjZSAoRE1BLUlOUFVUKQorICAgICAqICAgLSBzZXQgaW5wdXQgZm9ybWF0ICYgc2l6ZQorICAgICAqICAgLSBjcm9wIGlucHV0IHNpemUKKyAgICAgKiAgIC0gc2V0IGlucHV0IGJ1ZmZlcgorICAgICAqICAgLSBzZXQgYnVmZmVyIHR5cGUgKFY0TDJfTUVNT1JZX1VTRVJQVFIpCisgICAgICovCisgICAgaWYgKGZpbWNfdjRsMl9zZXRfc3JjKGZpbWMtPmRldl9mZCwgZmltYy0+aHdfdmVyLCAmcGFyYW1zLT5zcmMpIDwgMCkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgLyogc2V0IGlucHV0IGRtYSBhZGRyZXNzIChZL1JHQiwgQ2IsIENyKSAqLworICAgIHN3aXRjaCAoc3JjX2ltZy0+Zm9ybWF0KSB7CisgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lDYkNyXzQyMF9TUDoKKyAgICAgICAgLyogZm9yIHZpZGVvIGRpc3BsYXkgemVybyBjb3B5IGNhc2UgKi8KKyAgICAgICAgZmltY19zcmNfYnVmLmJhc2VbMF0gPSBwYXJhbXMtPnNyYy5idWZfYWRkcl9waHlfcmdiX3k7CisgICAgICAgIGZpbWNfc3JjX2J1Zi5iYXNlWzFdID0gcGFyYW1zLT5zcmMuYnVmX2FkZHJfcGh5X2NiOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIC8qIHNldCBzb3VyY2UgaW1hZ2UgKi8KKyAgICAgICAgZmltY19zcmNfYnVmLmJhc2VbMF0gPSBwYXJhbXMtPnNyYy5idWZfYWRkcl9waHlfcmdiX3k7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChmaW1jX2hhbmRsZV9vbmVzaG90KGZpbWMtPmRldl9mZCwgJmZpbWNfc3JjX2J1ZikgPCAwKSB7CisgICAgICAgIGZpbWNfdjRsMl9jbHJfYnVmKGZpbWMtPmRldl9mZCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworaW50IGNyZWF0ZUZpbWMoczVwX2ZpbWNfdCAqZmltYykKK3sKKyAgICBzdHJ1Y3QgdjRsMl9jYXBhYmlsaXR5IGNhcDsKKyAgICBzdHJ1Y3QgdjRsMl9mb3JtYXQgZm10OworICAgIHN0cnVjdCB2NGwyX2NvbnRyb2wgdmM7CisKKyAgICAjZGVmaW5lICBQUF9ERVZJQ0VfREVWX05BTUUgICIvZGV2L3ZpZGVvMSIKKworICAgIC8qIG9wZW4gZGV2aWNlIGZpbGUgKi8KKyAgICBpZihmaW1jLT5kZXZfZmQgPCAwKSB7CisgICAgICAgIGZpbWMtPmRldl9mZCA9IG9wZW4oUFBfREVWSUNFX0RFVl9OQU1FLCBPX1JEV1IpOworCisgICAgICAgIGlmIChmaW1jLT5kZXZfZmQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6OlBvc3QgcHJvY2Vzc29yIG9wZW4gZXJyb3IgKCVkKSIsIF9fZnVuY19fLCBlcnJubyk7CisgICAgICAgICAgICBnb3RvIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGNoZWNrIGNhcGFiaWxpdHkgKi8KKyAgICBpZiAoaW9jdGwoZmltYy0+ZGV2X2ZkLCBWSURJT0NfUVVFUllDQVAsICZjYXApIDwgMCkgeworICAgICAgICBBTE9HRSgiVklESU9DX1FVRVJZQ0FQIGZhaWxlZCIpOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICBpZiAoIShjYXAuY2FwYWJpbGl0aWVzICYgVjRMMl9DQVBfU1RSRUFNSU5HKSkgeworICAgICAgICBBTE9HRSgiJWQgaGFzIG5vIHN0cmVhbWluZyBzdXBwb3J0IiwgZmltYy0+ZGV2X2ZkKTsKKyAgICAgICAgZ290byBlcnI7CisgICAgfQorCisgICAgaWYgKCEoY2FwLmNhcGFiaWxpdGllcyAmIFY0TDJfQ0FQX1ZJREVPX09VVFBVVCkpIHsKKyAgICAgICAgQUxPR0UoIiVkIGlzIG5vIHZpZGVvIG91dHB1dCIsIGZpbWMtPmRldl9mZCk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKworICAgIC8qCisgICAgICogbWFsbG9jIGZpbWNfb3V0aW5mbyBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBmbXQudHlwZSA9IFY0TDJfQlVGX1RZUEVfVklERU9fT1VUUFVUOworICAgIGlmIChpb2N0bChmaW1jLT5kZXZfZmQsIFZJRElPQ19HX0ZNVCwgJmZtdCkgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczo6RXJyb3IgaW4gdmlkZW8gVklESU9DX0dfRk1UIiwgX19mdW5jX18pOworICAgICAgICBnb3RvIGVycjsKKyAgICB9CisKKyAgICB2Yy5pZCA9IFY0TDJfQ0lEX0ZJTUNfVkVSU0lPTjsKKyAgICB2Yy52YWx1ZSA9IDA7CisKKyAgICBpZiAoaW9jdGwoZmltYy0+ZGV2X2ZkLCBWSURJT0NfR19DVFJMLCAmdmMpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6OkVycm9yIGluIHZpZGVvIFZJRElPQ19HX0NUUkwiLCBfX2Z1bmNfXyk7CisgICAgICAgIGdvdG8gZXJyOworICAgIH0KKyAgICBmaW1jLT5od192ZXIgPSB2Yy52YWx1ZTsKKworICAgIHJldHVybiAwOworCitlcnI6CisgICAgaWYgKDAgPD0gZmltYy0+ZGV2X2ZkKQorICAgICAgICBjbG9zZShmaW1jLT5kZXZfZmQpOworICAgIGZpbWMtPmRldl9mZCA9IC0xOworCisgICAgcmV0dXJuIC0xOworfQorCitpbnQgZGVzdHJveUZpbWMoczVwX2ZpbWNfdCAqZmltYykKK3sKKyAgICBpZiAoZmltYy0+b3V0X2J1Zi52aXJ0X2FkZHIgIT0gTlVMTCkgeworICAgICAgICBmaW1jLT5vdXRfYnVmLnZpcnRfYWRkciA9IE5VTEw7CisgICAgICAgIGZpbWMtPm91dF9idWYubGVuZ3RoID0gMDsKKyAgICB9CisKKyAgICAvKiBjbG9zZSAqLworICAgIGlmICgwIDw9IGZpbWMtPmRldl9mZCkKKyAgICAgICAgY2xvc2UoZmltYy0+ZGV2X2ZkKTsKKyAgICBmaW1jLT5kZXZfZmQgPSAtMTsKKworICAgIHJldHVybiAwOworfQorCitpbnQgcnVuRmltYyhzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4LAorICAgICAgICAgICAgc3RydWN0IHNlY19pbWcgKnNyY19pbWcsCisgICAgICAgICAgICBzdHJ1Y3Qgc2VjX3JlY3QgKnNyY19yZWN0LAorICAgICAgICAgICAgc3RydWN0IHNlY19pbWcgKmRzdF9pbWcsCisgICAgICAgICAgICBzdHJ1Y3Qgc2VjX3JlY3QgKmRzdF9yZWN0LAorICAgICAgICAgICAgdW5zaWduZWQgaW50ICpwaHlBZGRyLAorICAgICAgICAgICAgdWludDMyX3QgdHJhbnNmb3JtKQoreworICAgIHM1cF9maW1jX3QgKmZpbWMgPSAmY3R4LT5maW1jOworICAgIHVuc2lnbmVkIGludCBkc3RfcGh5c19hZGRyID0gMDsKKyAgICBpbnQzMl90ICAgICAgc3JjX2NvbG9yX3NwYWNlOworICAgIGludDMyX3QgICAgICBkc3RfY29sb3Jfc3BhY2U7CisKKyAgICAvKiAxIDogc291cmNlIGFkZHJlc3MgYW5kIHNpemUgKi8KKworICAgIGlmKDAgPiBnZXRfc3JjX3BoeXNfYWRkcihjdHgsIHNyY19pbWcsIHBoeUFkZHIpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAvKiAyIDogZGVzdGluYXRpb24gYWRkcmVzcyBhbmQgc2l6ZSAqLworICAgIGlmKDAgPT0gKGRzdF9waHlzX2FkZHIgPSBnZXRfZHN0X3BoeXNfYWRkcihjdHgsIGRzdF9pbWcpKSkKKyAgICAgICAgcmV0dXJuIC0yOworCisgICAgLyogY2hlY2sgd2hldGhlciBmaW1jIHN1cHBvcnRzIHRoZSBzcmMgZm9ybWF0ICovCisgICAgaWYgKDAgPiAoc3JjX2NvbG9yX3NwYWNlID0gSEFMX1BJWEVMX0ZPUk1BVF8yX1Y0TDJfUElYKHNyY19pbWctPmZvcm1hdCkpKQorICAgICAgICByZXR1cm4gLTM7CisKKyAgIGlmICgwID4gKGRzdF9jb2xvcl9zcGFjZSA9IEhBTF9QSVhFTF9GT1JNQVRfMl9WNEwyX1BJWChkc3RfaW1nLT5mb3JtYXQpKSkKKyAgICAgICAgcmV0dXJuIC00OworCisgICBpZihydW5jRmltY0NvcmUoY3R4LCBzcmNfaW1nLCBzcmNfcmVjdCwgKHVpbnQzMl90KXNyY19jb2xvcl9zcGFjZSwKKyAgICAgICAgIGRzdF9waHlzX2FkZHIsIGRzdF9pbWcsIGRzdF9yZWN0LCAodWludDMyX3QpZHN0X2NvbG9yX3NwYWNlLCB0cmFuc2Zvcm0pIDwgMCkKKyAgICAgICAgcmV0dXJuIC01OworCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvbGliaHdjb21wb3Nlci9TZWNIV0NVdGlscy5oIGIvZXh5bm9zMy9zNXBjMTEwL2xpYmh3Y29tcG9zZXIvU2VjSFdDVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTljMTIwCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2xpYmh3Y29tcG9zZXIvU2VjSFdDVXRpbHMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKgorICogQGF1dGhvciBSYW1hLCBNZWthKHYubWVrYUBzYW1zdW5nLmNvbSkKKyAgICAgICAgICAgU2FuZ3dvbywgUGFyayhzdzU3NzEucGFya0BzYW1zdW5nLmNvbSkKKyAgICAgICAgICAgSmFtaWUsIE9oIChqdW5nLW1pbi5vaEBzYW1zdW5nLmNvbSkKKyAqIEBkYXRlICAgMjAxMS0wNy0yOAorICoKKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VDX0hXQ19VVElMU19IXworI2RlZmluZSBBTkRST0lEX1NFQ19IV0NfVVRJTFNfSF8KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSAibGludXgvZmIuaCIKKyNpbmNsdWRlIDxsaW51eC92aWRlb2Rldi5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2hhcmR3YXJlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaHdjb21wb3Nlci5oPgorCisjaW5jbHVkZSAiczVwX2ZpbWMuaCIKKyNpbmNsdWRlICJzZWNfbGNkLmgiCisjaW5jbHVkZSAic2VjX2Zvcm1hdC5oIgorI2luY2x1ZGUgInNlY191dGlscy5oIgorI2luY2x1ZGUgImhhbF9wdWJsaWMuaCIKKworI2RlZmluZSBHUkFMTE9DX1VTQUdFX1BIWVNfQ09OVElHIEdSQUxMT0NfVVNBR0VfUFJJVkFURV8xCisKKyNkZWZpbmUgTlVNX09GX1dJTiAgICAgICAgICAoMSkKKyNkZWZpbmUgTlVNX09GX1dJTl9CVUYgICAgICAoMykKKyNkZWZpbmUgTlVNX09GX01FTV9PQkogICAgICAoMSkKKyNkZWZpbmUgTUFYX05VTV9QTEFORVMgICAgICAoMykKKworI2RlZmluZSBNQVhfUkVTSVpJTkdfUkFUSU9fTElNSVQgICg2MykKKworc3RydWN0IHNlY19yZWN0IHsKKyAgICB1aW50MzJfdCB4OworICAgIHVpbnQzMl90IHk7CisgICAgdWludDMyX3QgdzsKKyAgICB1aW50MzJfdCBoOworfTsKKworc3RydWN0IHNlY19pbWcgeworICAgIHVpbnQzMl90IHc7CisgICAgdWludDMyX3QgaDsKKyAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgdWludDMyX3QgYmFzZTsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgaW50ICAgICAgbWVtX2lkOworICAgIGludCAgICAgIG1lbV90eXBlOworfTsKKworaW5saW5lIGludCBTRUNfTUlOKGludCB4LCBpbnQgeSkgeworICAgIHJldHVybiAoKHggPCB5KSA/IHggOiB5KTsKK30KKworaW5saW5lIGludCBTRUNfTUFYKGludCB4LCBpbnQgeSkgeworICAgIHJldHVybiAoKHggPiB5KSA/IHggOiB5KTsKK30KKworc3RydWN0IGh3Y193aW5faW5mb190IHsKKyAgICBpbnQgICAgICAgIGZkOworICAgIGludCAgICAgICAgc2l6ZTsKKyAgICBzZWNfcmVjdCAgIHJlY3RfaW5mbzsKKyAgICB1aW50MzJfdCAgIGFkZHJbTlVNX09GX1dJTl9CVUZdOworICAgIGludCAgICAgICAgYnVmX2luZGV4OworICAgIGludCAgICAgICAgcG93ZXJfc3RhdGU7CisgICAgaW50ICAgICAgICBibGVuZGluZzsKKyAgICBpbnQgICAgICAgIGxheWVyX2luZGV4OworICAgIHVpbnQzMl90ICAgbGF5ZXJfcHJldl9idWY7CisgICAgaW50ICAgICAgICBzZXRfd2luX2ZsYWc7CisgICAgaW50ICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICB2c3luYzsKKworICAgIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBmaXhfaW5mbzsKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyX2luZm87CisgICAgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGxjZF9pbmZvOworfTsKKworZW51bSB7CisgICAgSFdDX1dJTl9GUkVFID0gMCwKKyAgICBIV0NfV0lOX1JFU0VSVkVELAorfTsKKworZW51bSB7CisgICAgSFdDX1VOS05PV05fTUVNX1RZUEUgPSAwLAorICAgIEhXQ19QSFlTX01FTV9UWVBFLAorICAgIEhXQ19WSVJUX01FTV9UWVBFLAorfTsKKworc3RydWN0IGh3Y19jb250ZXh0X3QgeworICAgIGh3Y19jb21wb3Nlcl9kZXZpY2VfdCAgICAgZGV2aWNlOworCisgICAgLyogb3VyIHByaXZhdGUgc3RhdGUgZ29lcyBiZWxvdyBoZXJlICovCisgICAgc3RydWN0IGh3Y193aW5faW5mb190ICAgICB3aW5bTlVNX09GX1dJTl07CisgICAgc3RydWN0IGh3Y193aW5faW5mb190ICAgICBnbG9iYWxfbGNkX3dpbjsKKyAgICBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gIGxjZF9pbmZvOworICAgIHM1cF9maW1jX3QgICAgICAgICAgICAgICAgZmltYzsKKyAgICBod2NfcHJvY3NfdCAgICAgICAgICAgICAgICpwcm9jczsKKyAgICBwdGhyZWFkX3QgICAgICAgICAgICAgICAgIHZzeW5jX3RocmVhZDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIG51bV9vZl9mYl9sYXllcjsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgICAgICAgIG51bV9vZl9od2NfbGF5ZXI7CisgICAgdW5zaWduZWQgaW50ICAgICAgICAgICAgICBudW1fb2ZfZmJfbGF5ZXJfcHJldjsKK307CisKK2ludCB3aW5kb3dfb3BlbihzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbiwgaW50IGlkKTsKK2ludCB3aW5kb3dfY2xvc2Uoc3RydWN0IGh3Y193aW5faW5mb190ICp3aW4pOworaW50IHdpbmRvd19zZXRfcG9zKHN0cnVjdCBod2Nfd2luX2luZm9fdCAqd2luKTsKK2ludCB3aW5kb3dfZ2V0X2luZm8oc3RydWN0IGh3Y193aW5faW5mb190ICp3aW4pOworaW50IHdpbmRvd19wYW5fZGlzcGxheShzdHJ1Y3QgaHdjX3dpbl9pbmZvX3QgKndpbik7CitpbnQgd2luZG93X3Nob3coc3RydWN0IGh3Y193aW5faW5mb190ICp3aW4pOworaW50IHdpbmRvd19oaWRlKHN0cnVjdCBod2Nfd2luX2luZm9fdCAqd2luKTsKK2ludCB3aW5kb3dfZ2V0X2dsb2JhbF9sY2RfaW5mbyhzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4KTsKKworaW50IGNyZWF0ZUZpbWMoczVwX2ZpbWNfdCAqZmltYyk7CitpbnQgZGVzdHJveUZpbWMoczVwX2ZpbWNfdCAqZmltYyk7CitpbnQgcnVuRmltYyhzdHJ1Y3QgaHdjX2NvbnRleHRfdCAqY3R4LAorICAgICAgICAgICAgc3RydWN0IHNlY19pbWcgKnNyY19pbWcsIHN0cnVjdCBzZWNfcmVjdCAqc3JjX3JlY3QsCisgICAgICAgICAgICBzdHJ1Y3Qgc2VjX2ltZyAqZHN0X2ltZywgc3RydWN0IHNlY19yZWN0ICpkc3RfcmVjdCwKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCAqcGh5QWRkciwKKyAgICAgICAgICAgIHVpbnQzMl90IHRyYW5zZm9ybSk7CisjZW5kaWYgLyogQU5EUk9JRF9TRUNfSFdDX1VUSUxTX0hfKi8KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL2xpYnMzY2pwZWcvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxNWU5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoTE9DQUxfUEFUSCkvLi4vaW5jbHVkZQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisJSnBlZ0VuY29kZXIuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVM6PSBsaWJsb2cKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMrPSBsaWJkbAorCitMT0NBTF9NT0RVTEU6PSBsaWJzM2NqcGVnCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0V4aWYuaCBiL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0V4aWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmUxMWRkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2xpYnMzY2pwZWcvRXhpZi5oCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLExURC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FWElGX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FWElGX0gKKworI2luY2x1ZGUgPG1hdGguaD4KKworI2RlZmluZSBFWElGX0xPRzIoeCkgICAgICAgICAgICAgICAgICAgIChsb2coKGRvdWJsZSkoeCkpIC8gbG9nKDIuMCkpCisjZGVmaW5lIEFQRVhfRk5VTV9UT19BUEVSVFVSRSh4KSAgICAgICAgKChpbnQpKEVYSUZfTE9HMigoZG91YmxlKSh4KSkgKiAyICsgMC41KSkKKyNkZWZpbmUgQVBFWF9FWFBPU1VSRV9UT19TSFVUVEVSKHgpICAgICAoKHgpID49IDEgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgtKEVYSUZfTE9HMigoZG91YmxlKSh4KSkgKyAwLjUpKSA6ICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSgtKEVYSUZfTE9HMigoZG91YmxlKSh4KSkgLSAwLjUpKSkKKyNkZWZpbmUgQVBFWF9JU09fVE9fRklMTVNFTlNJVElWSVRZKHgpICAoKGludCkoRVhJRl9MT0cyKCh4KSAvIDMuMTI1KSArIDAuNSkpCisKKyNkZWZpbmUgTlVNX1NJWkUgICAgICAgICAgICAgICAgICAgIDIKKyNkZWZpbmUgSUZEX1NJWkUgICAgICAgICAgICAgICAgICAgIDEyCisjZGVmaW5lIE9GRlNFVF9TSVpFICAgICAgICAgICAgICAgICA0CisKKyNkZWZpbmUgTlVNXzBUSF9JRkRfVElGRiAgICAgICAgICAgIDEwCisjZGVmaW5lIE5VTV8wVEhfSUZEX0VYSUYgICAgICAgICAgICAyMgorI2RlZmluZSBOVU1fMFRIX0lGRF9HUFMgICAgICAgICAgICAgMTAKKyNkZWZpbmUgTlVNXzFUSF9JRkRfVElGRiAgICAgICAgICAgIDkKKworLyogVHlwZSAqLworI2RlZmluZSBFWElGX1RZUEVfQllURSAgICAgICAgICAgICAgMQorI2RlZmluZSBFWElGX1RZUEVfQVNDSUkgICAgICAgICAgICAgMgorI2RlZmluZSBFWElGX1RZUEVfU0hPUlQgICAgICAgICAgICAgMworI2RlZmluZSBFWElGX1RZUEVfTE9ORyAgICAgICAgICAgICAgNAorI2RlZmluZSBFWElGX1RZUEVfUkFUSU9OQUwgICAgICAgICAgNQorI2RlZmluZSBFWElGX1RZUEVfVU5ERUZJTkVEICAgICAgICAgNworI2RlZmluZSBFWElGX1RZUEVfU0xPTkcgICAgICAgICAgICAgOQorI2RlZmluZSBFWElGX1RZUEVfU1JBVElPTkFMICAgICAgICAgMTAKKworI2RlZmluZSBFWElGX0ZJTEVfU0laRSAgICAgICAgICAgICAgMjg4MDAKKworLyogMHRoIElGRCBUSUZGIFRhZ3MgKi8KKyNkZWZpbmUgRVhJRl9UQUdfSU1BR0VfV0lEVEggICAgICAgICAgICAgICAgICAgIDB4MDEwMAorI2RlZmluZSBFWElGX1RBR19JTUFHRV9IRUlHSFQgICAgICAgICAgICAgICAgICAgMHgwMTAxCisjZGVmaW5lIEVYSUZfVEFHX01BS0UgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAxMGYKKyNkZWZpbmUgRVhJRl9UQUdfTU9ERUwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDExMAorI2RlZmluZSBFWElGX1RBR19PUklFTlRBVElPTiAgICAgICAgICAgICAgICAgICAgMHgwMTEyCisjZGVmaW5lIEVYSUZfVEFHX1NPRlRXQVJFICAgICAgICAgICAgICAgICAgICAgICAweDAxMzEKKyNkZWZpbmUgRVhJRl9UQUdfREFURV9USU1FICAgICAgICAgICAgICAgICAgICAgIDB4MDEzMgorI2RlZmluZSBFWElGX1RBR19ZQ0JDUl9QT1NJVElPTklORyAgICAgICAgICAgICAgMHgwMjEzCisjZGVmaW5lIEVYSUZfVEFHX0VYSUZfSUZEX1BPSU5URVIgICAgICAgICAgICAgICAweDg3NjkKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0lGRF9QT0lOVEVSICAgICAgICAgICAgICAgIDB4ODgyNQorCisvKiAwdGggSUZEIEV4aWYgUHJpdmF0ZSBUYWdzICovCisjZGVmaW5lIEVYSUZfVEFHX0VYUE9TVVJFX1RJTUUgICAgICAgICAgICAgICAgICAweDgyOUEKKyNkZWZpbmUgRVhJRl9UQUdfRk5VTUJFUiAgICAgICAgICAgICAgICAgICAgICAgIDB4ODI5RAorI2RlZmluZSBFWElGX1RBR19FWFBPU1VSRV9QUk9HUkFNICAgICAgICAgICAgICAgMHg4ODIyCisjZGVmaW5lIEVYSUZfVEFHX0lTT19TUEVFRF9SQVRJTkcgICAgICAgICAgICAgICAweDg4MjcKKyNkZWZpbmUgRVhJRl9UQUdfRVhJRl9WRVJTSU9OICAgICAgICAgICAgICAgICAgIDB4OTAwMAorI2RlZmluZSBFWElGX1RBR19EQVRFX1RJTUVfT1JHICAgICAgICAgICAgICAgICAgMHg5MDAzCisjZGVmaW5lIEVYSUZfVEFHX0RBVEVfVElNRV9ESUdJVElaRSAgICAgICAgICAgICAweDkwMDQKKyNkZWZpbmUgRVhJRl9UQUdfU0hVVFRFUl9TUEVFRCAgICAgICAgICAgICAgICAgIDB4OTIwMQorI2RlZmluZSBFWElGX1RBR19BUEVSVFVSRSAgICAgICAgICAgICAgICAgICAgICAgMHg5MjAyCisjZGVmaW5lIEVYSUZfVEFHX0JSSUdIVE5FU1MgICAgICAgICAgICAgICAgICAgICAweDkyMDMKKyNkZWZpbmUgRVhJRl9UQUdfRVhQT1NVUkVfQklBUyAgICAgICAgICAgICAgICAgIDB4OTIwNAorI2RlZmluZSBFWElGX1RBR19NQVhfQVBFUlRVUkUgICAgICAgICAgICAgICAgICAgMHg5MjA1CisjZGVmaW5lIEVYSUZfVEFHX01FVEVSSU5HX01PREUgICAgICAgICAgICAgICAgICAweDkyMDcKKyNkZWZpbmUgRVhJRl9UQUdfRkxBU0ggICAgICAgICAgICAgICAgICAgICAgICAgIDB4OTIwOQorI2RlZmluZSBFWElGX1RBR19GT0NBTF9MRU5HVEggICAgICAgICAgICAgICAgICAgMHg5MjBBCisjZGVmaW5lIEVYSUZfVEFHX1VTRVJfQ09NTUVOVCAgICAgICAgICAgICAgICAgICAweDkyODYKKyNkZWZpbmUgRVhJRl9UQUdfQ09MT1JfU1BBQ0UgICAgICAgICAgICAgICAgICAgIDB4QTAwMQorI2RlZmluZSBFWElGX1RBR19QSVhFTF9YX0RJTUVOU0lPTiAgICAgICAgICAgICAgMHhBMDAyCisjZGVmaW5lIEVYSUZfVEFHX1BJWEVMX1lfRElNRU5TSU9OICAgICAgICAgICAgICAweEEwMDMKKyNkZWZpbmUgRVhJRl9UQUdfRVhQT1NVUkVfTU9ERSAgICAgICAgICAgICAgICAgIDB4QTQwMgorI2RlZmluZSBFWElGX1RBR19XSElURV9CQUxBTkNFICAgICAgICAgICAgICAgICAgMHhBNDAzCisjZGVmaW5lIEVYSUZfVEFHX1NDRU5DRV9DQVBUVVJFX1RZUEUgICAgICAgICAgICAweEE0MDYKKworLyogMHRoIElGRCBHUFMgSW5mbyBUYWdzICovCisjZGVmaW5lIEVYSUZfVEFHX0dQU19WRVJTSU9OX0lEICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0xBVElUVURFX1JFRiAgICAgICAgICAgICAgIDB4MDAwMQorI2RlZmluZSBFWElGX1RBR19HUFNfTEFUSVRVREUgICAgICAgICAgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIEVYSUZfVEFHX0dQU19MT05HSVRVREVfUkVGICAgICAgICAgICAgICAweDAwMDMKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX0xPTkdJVFVERSAgICAgICAgICAgICAgICAgIDB4MDAwNAorI2RlZmluZSBFWElGX1RBR19HUFNfQUxUSVRVREVfUkVGICAgICAgICAgICAgICAgMHgwMDA1CisjZGVmaW5lIEVYSUZfVEFHX0dQU19BTFRJVFVERSAgICAgICAgICAgICAgICAgICAweDAwMDYKKyNkZWZpbmUgRVhJRl9UQUdfR1BTX1RJTUVTVEFNUCAgICAgICAgICAgICAgICAgIDB4MDAwNworI2RlZmluZSBFWElGX1RBR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QgICAgICAgICAgMHgwMDFCCisjZGVmaW5lIEVYSUZfVEFHX0dQU19EQVRFU1RBTVAgICAgICAgICAgICAgICAgICAweDAwMUQKKworLyogMXRoIElGRCBUSUZGIFRhZ3MgKi8KKyNkZWZpbmUgRVhJRl9UQUdfQ09NUFJFU1NJT05fU0NIRU1FICAgICAgICAgICAgIDB4MDEwMworI2RlZmluZSBFWElGX1RBR19YX1JFU09MVVRJT04gICAgICAgICAgICAgICAgICAgMHgwMTFBCisjZGVmaW5lIEVYSUZfVEFHX1lfUkVTT0xVVElPTiAgICAgICAgICAgICAgICAgICAweDAxMUIKKyNkZWZpbmUgRVhJRl9UQUdfUkVTT0xVVElPTl9VTklUICAgICAgICAgICAgICAgIDB4MDEyOAorI2RlZmluZSBFWElGX1RBR19KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVCAgICAgICAgMHgwMjAxCisjZGVmaW5lIEVYSUZfVEFHX0pQRUdfSU5URVJDSEFOR0VfRk9STUFUX0xFTiAgICAweDAyMDIKKworCit0eXBlZGVmIGVudW0geworICAgIEVYSUZfT1JJRU5UQVRJT05fVVAgICAgID0gMSwKKyAgICBFWElGX09SSUVOVEFUSU9OXzkwICAgICA9IDYsCisgICAgRVhJRl9PUklFTlRBVElPTl8xODAgICAgPSAzLAorICAgIEVYSUZfT1JJRU5UQVRJT05fMjcwICAgID0gOCwKK30gRXhpZk9yaWVudGF0aW9uVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFWElGX1NDRU5FX1NUQU5EQVJELAorICAgIEVYSUZfU0NFTkVfTEFORFNDQVBFLAorICAgIEVYSUZfU0NFTkVfUE9SVFJBSVQsCisgICAgRVhJRl9TQ0VORV9OSUdIVCwKK30gQ2FtRXhpZlNjZW5lQ2FwdHVyZVR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRVhJRl9NRVRFUklOR19VTktOT1dOLAorICAgIEVYSUZfTUVURVJJTkdfQVZFUkFHRSwKKyAgICBFWElGX01FVEVSSU5HX0NFTlRFUiwKKyAgICBFWElGX01FVEVSSU5HX1NQT1QsCisgICAgRVhJRl9NRVRFUklOR19NVUxUSVNQT1QsCisgICAgRVhJRl9NRVRFUklOR19QQVRURVJOLAorICAgIEVYSUZfTUVURVJJTkdfUEFSVElBTCwKKyAgICBFWElGX01FVEVSSU5HX09USEVSICAgICA9IDI1NSwKK30gQ2FtRXhpZk1ldGVyaW5nTW9kZVR5cGU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgRVhJRl9FWFBPU1VSRV9BVVRPLAorICAgIEVYSUZfRVhQT1NVUkVfTUFOVUFMLAorICAgIEVYSUZfRVhQT1NVUkVfQVVUT19CUkFDS0VULAorfSBDYW1FeGlmRXhwb3N1cmVNb2RlVHlwZTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBFWElGX1dCX0FVVE8sCisgICAgRVhJRl9XQl9NQU5VQUwsCit9IENhbUV4aWZXaGl0ZUJhbGFuY2VUeXBlOworCisvKiBWYWx1ZXMgKi8KKyNkZWZpbmUgRVhJRl9ERUZfTUFLRVIgICAgICAgICAgIlNBTVNVTkciCisjZGVmaW5lIEVYSUZfREVGX01PREVMICAgICAgICAgICJHVC1JOTAyMCIKKyNkZWZpbmUgRVhJRl9ERUZfU09GVFdBUkUgICAgICAgIkNSRVNQT0pIMiIKKyNkZWZpbmUgRVhJRl9ERUZfRVhJRl9WRVJTSU9OICAgIjAyMjAiCisjZGVmaW5lIEVYSUZfREVGX1VTRVJDT01NRU5UUyAgICJVc2VyIGNvbW1lbnRzIgorCisjZGVmaW5lIEVYSUZfREVGX1lDQkNSX1BPU0lUSU9OSU5HICAxICAgLyogY2VudGVyZWQgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk5VTUJFUl9OVU0gICAgICAgIDI2ICAvKiAyLjYgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk5VTUJFUl9ERU4gICAgICAgIDEwCisjZGVmaW5lIEVYSUZfREVGX0VYUE9TVVJFX1BST0dSQU0gICAzICAgLyogYXBlcnR1cmUgcHJpb3JpdHkgKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk9DQUxfTEVOX05VTSAgICAgIDI3OCAvKiAyLjc4bW0gKi8KKyNkZWZpbmUgRVhJRl9ERUZfRk9DQUxfTEVOX0RFTiAgICAgIDEwMAorI2RlZmluZSBFWElGX0RFRl9GTEFTSCAgICAgICAgICAgICAgMCAgIC8qIE86IG9mZiwgMTogb24qLworI2RlZmluZSBFWElGX0RFRl9DT0xPUl9TUEFDRSAgICAgICAgMQorI2RlZmluZSBFWElGX0RFRl9FWFBPU1VSRV9NT0RFICAgICAgRVhJRl9FWFBPU1VSRV9BVVRPCisjZGVmaW5lIEVYSUZfREVGX0FQRVhfREVOICAgICAgICAgICAxMAorCisjZGVmaW5lIEVYSUZfREVGX0NPTVBSRVNTSU9OICAgICAgICA2CisjZGVmaW5lIEVYSUZfREVGX1JFU09MVVRJT05fTlVNICAgICA3MgorI2RlZmluZSBFWElGX0RFRl9SRVNPTFVUSU9OX0RFTiAgICAgMQorI2RlZmluZSBFWElGX0RFRl9SRVNPTFVUSU9OX1VOSVQgICAgMiAgIC8qIGluY2hlcyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdWludDMyX3QgbnVtOworICAgIHVpbnQzMl90IGRlbjsKK30gcmF0aW9uYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludDMyX3QgbnVtOworICAgIGludDMyX3QgZGVuOworfSBzcmF0aW9uYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGJvb2wgZW5hYmxlR3BzOworICAgIGJvb2wgZW5hYmxlVGh1bWI7CisKKyAgICB1bnNpZ25lZCBjaGFyIG1ha2VyWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIG1vZGVsWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIHNvZnR3YXJlWzMyXTsKKyAgICB1bnNpZ25lZCBjaGFyIGV4aWZfdmVyc2lvbls0XTsKKyAgICB1bnNpZ25lZCBjaGFyIGRhdGVfdGltZVsyMF07CisgICAgdW5zaWduZWQgY2hhciB1c2VyX2NvbW1lbnRbMTUwXTsKKworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50MzJfdCB3aWR0aFRodW1iOworICAgIHVpbnQzMl90IGhlaWdodFRodW1iOworCisgICAgdWludDE2X3Qgb3JpZW50YXRpb247CisgICAgdWludDE2X3QgeWNiY3JfcG9zaXRpb25pbmc7CisgICAgdWludDE2X3QgZXhwb3N1cmVfcHJvZ3JhbTsKKyAgICB1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5nOworICAgIHVpbnQxNl90IG1ldGVyaW5nX21vZGU7CisgICAgdWludDE2X3QgZmxhc2g7CisgICAgdWludDE2X3QgY29sb3Jfc3BhY2U7CisgICAgdWludDE2X3QgZXhwb3N1cmVfbW9kZTsKKyAgICB1aW50MTZfdCB3aGl0ZV9iYWxhbmNlOworICAgIHVpbnQxNl90IHNjZW5lX2NhcHR1cmVfdHlwZTsKKworICAgIHJhdGlvbmFsX3QgZXhwb3N1cmVfdGltZTsKKyAgICByYXRpb25hbF90IGZudW1iZXI7CisgICAgcmF0aW9uYWxfdCBhcGVydHVyZTsKKyAgICByYXRpb25hbF90IG1heF9hcGVydHVyZTsKKyAgICByYXRpb25hbF90IGZvY2FsX2xlbmd0aDsKKworICAgIHNyYXRpb25hbF90IHNodXR0ZXJfc3BlZWQ7CisgICAgc3JhdGlvbmFsX3QgYnJpZ2h0bmVzczsKKyAgICBzcmF0aW9uYWxfdCBleHBvc3VyZV9iaWFzOworCisgICAgdW5zaWduZWQgY2hhciBncHNfbGF0aXR1ZGVfcmVmWzJdOworICAgIHVuc2lnbmVkIGNoYXIgZ3BzX2xvbmdpdHVkZV9yZWZbMl07CisKKyAgICB1aW50OF90IGdwc192ZXJzaW9uX2lkWzRdOworICAgIHVpbnQ4X3QgZ3BzX2FsdGl0dWRlX3JlZjsKKworICAgIHJhdGlvbmFsX3QgZ3BzX2xhdGl0dWRlWzNdOworICAgIHJhdGlvbmFsX3QgZ3BzX2xvbmdpdHVkZVszXTsKKyAgICByYXRpb25hbF90IGdwc19hbHRpdHVkZTsKKyAgICByYXRpb25hbF90IGdwc190aW1lc3RhbXBbM107CisgICAgdW5zaWduZWQgY2hhciBncHNfZGF0ZXN0YW1wWzExXTsKKyAgICB1bnNpZ25lZCBjaGFyIGdwc19wcm9jZXNzaW5nX21ldGhvZFsxMDBdOworCisgICAgcmF0aW9uYWxfdCB4X3Jlc29sdXRpb247CisgICAgcmF0aW9uYWxfdCB5X3Jlc29sdXRpb247CisgICAgdWludDE2X3QgcmVzb2x1dGlvbl91bml0OworICAgIHVpbnQxNl90IGNvbXByZXNzaW9uX3NjaGVtZTsKK30gZXhpZl9hdHRyaWJ1dGVfdDsKKworCisjZW5kaWYgLyogQU5EUk9JRF9IQVJEV0FSRV9FWElGX0ggKi8KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0pwZWdFbmNvZGVyLmNwcCBiL2V4eW5vczMvczVwYzExMC9saWJzM2NqcGVnL0pwZWdFbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmI2YTZmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2xpYnMzY2pwZWcvSnBlZ0VuY29kZXIuY3BwCkBAIC0wLDAgKzEsNzk2IEBACisvKgorICogQ29weXJpZ2h0IFNhbXN1bmcgRWxlY3Ryb25pY3MgQ28uLExURC4KKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogSlBFRyBEUklWRVIgTU9EVUxFIChKcGVnRW5jb2Rlci5jcHApCisgKiBBdXRob3IgIDogZ2UubGVlICAgICAgIC0tIGluaXRpYWwgdmVyc2lvbgorICogRGF0ZSAgICA6IDAzIEp1bmUgMjAxMAorICogUHVycG9zZSA6IFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBKUEVHIGVuY29kZXIgQVBJcyBhcyBuZWVkZWQgYnkgQ2FtZXJhIEhBTAorICovCisjZGVmaW5lIExPR19UQUcgIkpwZWdFbmNvZGVyIgorI2RlZmluZSBNQUlOX0RVTVAgIDAKKyNkZWZpbmUgVEhVTUJfRFVNUCAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJKcGVnRW5jb2Rlci5oIgorCitzdGF0aWMgY29uc3QgY2hhciBFeGlmQXNjaWlQcmVmaXhbXSA9IHsgMHg0MSwgMHg1MywgMHg0MywgMHg0OSwgMHg0OSwgMHgwLCAweDAsIDB4MCB9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CitKcGVnRW5jb2Rlcjo6SnBlZ0VuY29kZXIoKSA6IGF2YWlsYWJsZShmYWxzZSkKK3sKKyAgICBtQXJncy5tbWFwcGVkX2FkZHIgPSAoY2hhciAqKU1BUF9GQUlMRUQ7CisgICAgbUFyZ3MuZW5jX3BhcmFtICAgICAgID0gTlVMTDsKKyAgICBtQXJncy50aHVtYl9lbmNfcGFyYW0gPSBOVUxMOworCisgICAgbURldkZkID0gb3BlbihKUEdfRFJJVkVSX05BTUUsIE9fUkRXUik7CisgICAgaWYgKG1EZXZGZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvcGVuIHRoZSBkZXZpY2UiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1BcmdzLm1tYXBwZWRfYWRkciA9IChjaGFyICopbW1hcCgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEdfVE9UQUxfQlVGX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZGZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisKKyAgICBpZiAobUFyZ3MubW1hcHBlZF9hZGRyID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtbWFwIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQXJncy5lbmNfcGFyYW0gPSBuZXcganBnX2VuY19wcm9jX3BhcmFtOworICAgIGlmIChtQXJncy5lbmNfcGFyYW0gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBtZW1vcnkgZm9yIGVuY19wYXJhbSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbXNldChtQXJncy5lbmNfcGFyYW0sIDAsIHNpemVvZihqcGdfZW5jX3Byb2NfcGFyYW0pKTsKKworICAgIG1BcmdzLnRodW1iX2VuY19wYXJhbSA9IG5ldyBqcGdfZW5jX3Byb2NfcGFyYW07CisgICAgaWYgKG1BcmdzLnRodW1iX2VuY19wYXJhbSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3IgdGh1bWJfZW5jX3BhcmFtIik7CisgICAgZGVsZXRlIG1BcmdzLmVuY19wYXJhbTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1zZXQobUFyZ3MudGh1bWJfZW5jX3BhcmFtLCAwLCBzaXplb2YoanBnX2VuY19wcm9jX3BhcmFtKSk7CisKKyAgICBtQXJncy5lbmNfcGFyYW0tPnNhbXBsZV9tb2RlID0gSlBHXzQyMDsKKyAgICBtQXJncy5lbmNfcGFyYW0tPmVuY190eXBlID0gSlBHX01BSU47CisgICAgbUFyZ3MudGh1bWJfZW5jX3BhcmFtLT5zYW1wbGVfbW9kZSA9IEpQR180MjA7CisgICAgbUFyZ3MudGh1bWJfZW5jX3BhcmFtLT5lbmNfdHlwZSA9IEpQR19USFVNQk5BSUw7CisKKyAgICBhdmFpbGFibGUgPSB0cnVlOworfQorCitKcGVnRW5jb2Rlcjo6fkpwZWdFbmNvZGVyKCkKK3sKKyAgICBpZiAobUFyZ3MubW1hcHBlZF9hZGRyICE9IChjaGFyKilNQVBfRkFJTEVEKQorICAgICAgICBtdW5tYXAobUFyZ3MubW1hcHBlZF9hZGRyLCBKUEdfVE9UQUxfQlVGX1NJWkUpOworCisgICAgZGVsZXRlIG1BcmdzLmVuY19wYXJhbTsKKworICAgIGRlbGV0ZSBtQXJncy50aHVtYl9lbmNfcGFyYW07CisKKyAgICBpZiAobURldkZkID4gMCkKKyAgICAgICAgY2xvc2UobURldkZkKTsKK30KKworanBnX3JldHVybl9zdGF0dXMgSnBlZ0VuY29kZXI6OnNldENvbmZpZyhqcGVnX2NvbmYgdHlwZSwgaW50MzJfdCB2YWx1ZSkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworCisgICAganBnX3JldHVybl9zdGF0dXMgcmV0ID0gSlBHX1NVQ0NFU1M7CisKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEpQRUdfU0VUX0VOQ09ERV9XSURUSDoKKyAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IE1BWF9KUEdfV0lEVEgpCisgICAgICAgICAgICByZXQgPSBKUEdfRkFJTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbUFyZ3MuZW5jX3BhcmFtLT53aWR0aCA9IHZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSlBFR19TRVRfRU5DT0RFX0hFSUdIVDoKKyAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IE1BWF9KUEdfSEVJR0hUKQorICAgICAgICAgICAgcmV0ID0gSlBHX0ZBSUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1BcmdzLmVuY19wYXJhbS0+aGVpZ2h0ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBKUEVHX1NFVF9FTkNPREVfUVVBTElUWToKKyAgICAgICAgaWYgKHZhbHVlIDwgSlBHX1FVQUxJVFlfTEVWRUxfMSB8fCB2YWx1ZSA+IEpQR19RVUFMSVRZX0xFVkVMXzQpCisgICAgICAgICAgICByZXQgPSBKUEdfRkFJTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbUFyZ3MuZW5jX3BhcmFtLT5xdWFsaXR5ID0gKGltYWdlX3F1YWxpdHlfdHlwZV90KXZhbHVlOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSlBFR19TRVRfRU5DT0RFX0lOX0ZPUk1BVDoKKyAgICAgICAgaWYgKHZhbHVlICE9IEpQR19NT0RFU0VMX1lDQkNSICYmIHZhbHVlICE9IEpQR19NT0RFU0VMX1JHQikgeworICAgICAgICAgICAgcmV0ID0gSlBHX0ZBSUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXJncy5lbmNfcGFyYW0tPmluX2Zvcm1hdCA9IChpbl9tb2RlX3QpdmFsdWU7CisgICAgICAgICAgICBtQXJncy50aHVtYl9lbmNfcGFyYW0tPmluX2Zvcm1hdCA9IChpbl9tb2RlX3QpdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpQRUdfU0VUX1NBTVBJTkdfTU9ERToKKyAgICAgICAgaWYgKHZhbHVlICE9IEpQR180MjAgJiYgdmFsdWUgIT0gSlBHXzQyMikgeworICAgICAgICAgICAgcmV0ID0gSlBHX0ZBSUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQXJncy5lbmNfcGFyYW0tPnNhbXBsZV9tb2RlID0gKHNhbXBsZV9tb2RlX3QpdmFsdWU7CisgICAgICAgICAgICBtQXJncy50aHVtYl9lbmNfcGFyYW0tPnNhbXBsZV9tb2RlID0gKHNhbXBsZV9tb2RlX3QpdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpQRUdfU0VUX1RIVU1CTkFJTF9XSURUSDoKKyAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IE1BWF9KUEdfVEhVTUJOQUlMX1dJRFRIKQorICAgICAgICAgICAgcmV0ID0gSlBHX0ZBSUw7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIG1BcmdzLnRodW1iX2VuY19wYXJhbS0+d2lkdGggPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEpQRUdfU0VUX1RIVU1CTkFJTF9IRUlHSFQ6CisgICAgICAgIGlmICh2YWx1ZSA8IDAgfHwgdmFsdWUgPiBNQVhfSlBHX1RIVU1CTkFJTF9IRUlHSFQpCisgICAgICAgICAgICByZXQgPSBKUEdfRkFJTDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbUFyZ3MudGh1bWJfZW5jX3BhcmFtLT5oZWlnaHQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiSW52YWxpZCBDb25maWcgdHlwZSIpOworICAgICAgICByZXQgPSBFUlJfVU5LTk9XTjsKKyAgICB9CisKKyAgICBpZiAocmV0ID09IEpQR19GQUlMKQorICAgICAgICBBTE9HRSgiSW52YWxpZCB2YWx1ZSglZCkgZm9yICVkIHR5cGUiLCB2YWx1ZSwgdHlwZSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkKiBKcGVnRW5jb2Rlcjo6Z2V0SW5CdWYodWludDY0X3Qgc2l6ZSkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAoc2l6ZSA+IEpQR19GUkFNRV9CVUZfU0laRSkgeworICAgICAgICBBTE9HRSgiVGhlIGJ1ZmZlciBzaXplIHJlcXVlc3RlZCBpcyB0b28gbGFyZ2UiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BcmdzLmluX2J1ZiA9IChjaGFyICopaW9jdGwobURldkZkLCBJT0NUTF9KUEdfR0VUX0ZSTUJVRiwgbUFyZ3MubW1hcHBlZF9hZGRyKTsKKyAgICByZXR1cm4gKHZvaWQgKikobUFyZ3MuaW5fYnVmKTsKK30KKwordm9pZCogSnBlZ0VuY29kZXI6OmdldE91dEJ1Zih1aW50NjRfdCAqc2l6ZSkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobUFyZ3MuZW5jX3BhcmFtLT5maWxlX3NpemUgPD0gMCkgeworICAgICAgICBBTE9HRSgiVGhlIGJ1ZmZlciByZXF1ZXN0ZWQgZG9lc24ndCBoYXZlIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BcmdzLm91dF9idWYgPSAoY2hhciAqKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0dFVF9TVFJCVUYsIG1BcmdzLm1tYXBwZWRfYWRkcik7CisgICAgKnNpemUgPSBtQXJncy5lbmNfcGFyYW0tPmZpbGVfc2l6ZTsKKyAgICByZXR1cm4gKHZvaWQgKikobUFyZ3Mub3V0X2J1Zik7Cit9CisKK3ZvaWQqIEpwZWdFbmNvZGVyOjpnZXRUaHVtYkluQnVmKHVpbnQ2NF90IHNpemUpCit7CisgICAgaWYgKCFhdmFpbGFibGUpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgaWYgKHNpemUgPiBKUEdfRlJBTUVfVEhVTUJfQlVGX1NJWkUpIHsKKyAgICAgICAgQUxPR0UoIlRoZSBidWZmZXIgc2l6ZSByZXF1ZXN0ZWQgaXMgdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBtQXJncy5pbl90aHVtYl9idWYgPSAoY2hhciAqKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0dFVF9USFVNQl9GUk1CVUYsIG1BcmdzLm1tYXBwZWRfYWRkcik7CisgICAgcmV0dXJuICh2b2lkICopKG1BcmdzLmluX3RodW1iX2J1Zik7Cit9CisKK3ZvaWQqIEpwZWdFbmNvZGVyOjpnZXRUaHVtYk91dEJ1Zih1aW50NjRfdCAqc2l6ZSkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBpZiAobUFyZ3MudGh1bWJfZW5jX3BhcmFtLT5maWxlX3NpemUgPD0gMCkgeworICAgICAgICBBTE9HRSgiVGhlIGJ1ZmZlciByZXF1ZXN0ZWQgZG9lc24ndCBoYXZlIGRhdGEiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BcmdzLm91dF90aHVtYl9idWYgPSAoY2hhciAqKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0dFVF9USFVNQl9TVFJCVUYsIG1BcmdzLm1tYXBwZWRfYWRkcik7CisgICAgKnNpemUgPSBtQXJncy50aHVtYl9lbmNfcGFyYW0tPmZpbGVfc2l6ZTsKKyAgICByZXR1cm4gKHZvaWQgKikobUFyZ3Mub3V0X3RodW1iX2J1Zik7Cit9CisKK2pwZ19yZXR1cm5fc3RhdHVzIEpwZWdFbmNvZGVyOjplbmNvZGUodW5zaWduZWQgaW50ICpzaXplLCBleGlmX2F0dHJpYnV0ZV90ICpleGlmSW5mbykKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworCisgICAgQUxPR0QoImVuY29kZSBFIik7CisKKyAgICBqcGdfcmV0dXJuX3N0YXR1cyByZXQgPSBKUEdfRkFJTDsKKyAgICB1bnNpZ25lZCBjaGFyICpleGlmT3V0ID0gTlVMTDsKKyAgICBqcGdfZW5jX3Byb2NfcGFyYW0gKnBhcmFtID0gbUFyZ3MuZW5jX3BhcmFtOworCisgICAgcmV0ID0gY2hlY2tNY3UocGFyYW0tPnNhbXBsZV9tb2RlLCBwYXJhbS0+d2lkdGgsIHBhcmFtLT5oZWlnaHQsIGZhbHNlKTsKKyAgICBpZiAocmV0ICE9IEpQR19TVUNDRVNTKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcGFyYW0tPmVuY190eXBlID0gSlBHX01BSU47CisgICAgcmV0ID0gKGpwZ19yZXR1cm5fc3RhdHVzKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0VOQ09ERSwgJm1BcmdzKTsKKyAgICBpZiAocmV0ICE9IEpQR19TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIG1haW4gaW1hZ2UiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtQXJncy5vdXRfYnVmID0gKGNoYXIgKilpb2N0bChtRGV2RmQsIElPQ1RMX0pQR19HRVRfU1RSQlVGLCBtQXJncy5tbWFwcGVkX2FkZHIpOworCisgICAgaWYgKGV4aWZJbmZvKSB7CisgICAgICAgIHVuc2lnbmVkIGludCB0aHVtYkxlbiwgZXhpZkxlbjsKKworICAgICAgICB1aW50X3QgYnVmU2l6ZSA9IDA7CisgICAgICAgIGlmIChleGlmSW5mby0+ZW5hYmxlVGh1bWIpIHsKKyAgICAgICAgICAgIHJldCA9IGVuY29kZVRodW1iSW1nKCZ0aHVtYkxlbik7CisgICAgICAgICAgICBpZiAocmV0ICE9IEpQR19TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBlbmNvZGUgZm9yIHRodW1ibmFpbCBpbWFnZSIpOworICAgICAgICAgICAgICAgIGJ1ZlNpemUgPSBFWElGX0ZJTEVfU0laRTsKKyAgICAgICAgICAgICAgICBleGlmSW5mby0+ZW5hYmxlVGh1bWIgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnVmU2l6ZSA9IEVYSUZfRklMRV9TSVpFICsgdGh1bWJMZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZTaXplID0gRVhJRl9GSUxFX1NJWkU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUFyZ3MuZW5jX3BhcmFtLT5maWxlX3NpemUgKyBidWZTaXplID4gSlBHX1RPVEFMX0JVRl9TSVpFKQorICAgICAgICAgICAgcmV0dXJuIHJldDsKKworICAgICAgICBleGlmT3V0ID0gbmV3IHVuc2lnbmVkIGNoYXJbYnVmU2l6ZV07CisgICAgICAgIGlmIChleGlmT3V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgZm9yIGV4aWZPdXQiKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGV4aWZPdXQsIDAsIGJ1ZlNpemUpOworCisgICAgICAgIHJldCA9IG1ha2VFeGlmIChleGlmT3V0LCBleGlmSW5mbywgJmV4aWZMZW4pOworICAgICAgICBpZiAocmV0ICE9IEpQR19TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgRVhJRiIpOworICAgICAgICAgICAgZGVsZXRlW10gZXhpZk91dDsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBtZW1tb3ZlKCZtQXJncy5vdXRfYnVmW2V4aWZMZW4gKyAyXSwgJm1BcmdzLm91dF9idWZbMl0sIHBhcmFtLT5maWxlX3NpemUgLSAyKTsKKyAgICAgICAgbWVtY3B5KCZtQXJncy5vdXRfYnVmWzJdLCBleGlmT3V0LCBleGlmTGVuKTsKKyAgICAgICAgcGFyYW0tPmZpbGVfc2l6ZSArPSBleGlmTGVuOworICAgIH0KKworICAgIGRlbGV0ZVtdIGV4aWZPdXQ7CisKKyAgICAqc2l6ZSA9IHBhcmFtLT5maWxlX3NpemU7CisKKyNpZiBNQUlOX0RVTVAKKyAgICBGSUxFICpmb3V0ID0gTlVMTDsKKyAgICBjaGFyIGZpbGVfbmFtZVs1MF0gPSAiL2RhdGEvbWFpbi5qcGciOworICAgIGZvdXQgPSBmb3BlbihmaWxlX25hbWUsICJ3YiIpOworICAgIGlmICghZm91dCkKKyAgICAgICAgcGVycm9yKCZmaWxlX25hbWVbMF0pOworICAgIHNpemVfdCBud3JpdGUgPSBmd3JpdGUobUFyZ3Mub3V0X2J1Ziwgc2l6ZW9mKGNoYXIpLCBwYXJhbS0+ZmlsZV9zaXplLCBmb3V0KTsKKyAgICBmY2xvc2UoZm91dCk7CisjZW5kaWYKKworICAgIEFMT0dEKCJlbmNvZGUgWCIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworanBnX3JldHVybl9zdGF0dXMgSnBlZ0VuY29kZXI6OmVuY29kZVRodW1iSW1nKHVuc2lnbmVkIGludCAqc2l6ZSwgYm9vbCB1c2VNYWluKQoreworICAgIGlmICghYXZhaWxhYmxlKQorICAgICAgICByZXR1cm4gSlBHX0ZBSUw7CisKKyAgICBBTE9HRCgiZW5jb2RlVGh1bWJJbWcgRSIpOworCisgICAganBnX3JldHVybl9zdGF0dXMgcmV0ID0gSlBHX0ZBSUw7CisgICAganBnX2VuY19wcm9jX3BhcmFtICpwYXJhbSA9IG1BcmdzLnRodW1iX2VuY19wYXJhbTsKKworICAgIGlmICh1c2VNYWluKSB7CisgICAgICAgIG1BcmdzLmluX3RodW1iX2J1ZiA9IChjaGFyICopZ2V0VGh1bWJJbkJ1ZihwYXJhbS0+d2lkdGgqcGFyYW0tPmhlaWdodCoyKTsKKyAgICAgICAgaWYgKG1BcmdzLmluX3RodW1iX2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCB0aGUgYnVmZmVyIGZvciB0aHVtYm5haWwiKTsKKyAgICAgICAgICAgIHJldHVybiBKUEdfRkFJTDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IChqcGdfcmV0dXJuX3N0YXR1cylzY2FsZURvd25ZdXY0MjIobUFyZ3MuaW5fYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BcmdzLmVuY19wYXJhbS0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFyZ3MuZW5jX3BhcmFtLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFyZ3MuaW5fdGh1bWJfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+aGVpZ2h0KTsKKyAgICAgICAgaWYgKHJldCAhPSBKUEdfU1VDQ0VTUykKKyAgICAgICAgICAgIHJldHVybiBKUEdfRkFJTDsKKyAgICB9CisKKyAgICByZXQgPSBjaGVja01jdShwYXJhbS0+c2FtcGxlX21vZGUsIHBhcmFtLT53aWR0aCwgcGFyYW0tPmhlaWdodCwgdHJ1ZSk7CisgICAgaWYgKHJldCAhPSBKUEdfU1VDQ0VTUykKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworCisgICAgbUFyZ3MuZW5jX3BhcmFtLT5lbmNfdHlwZSA9IEpQR19USFVNQk5BSUw7CisgICAgcmV0ID0gKGpwZ19yZXR1cm5fc3RhdHVzKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0VOQ09ERSwgJm1BcmdzKTsKKyAgICBpZiAocmV0ICE9IEpQR19TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZW5jb2RlIGZvciB0aHVtYm5haWwiKTsKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworICAgIH0KKworICAgIG1BcmdzLm91dF90aHVtYl9idWYgPSAoY2hhciAqKWlvY3RsKG1EZXZGZCwgSU9DVExfSlBHX0dFVF9USFVNQl9TVFJCVUYsIG1BcmdzLm1tYXBwZWRfYWRkcik7CisKKyNpZiBUSFVNQl9EVU1QCisgICAgRklMRSAqZm91dCA9IE5VTEw7CisgICAgY2hhciBmaWxlX25hbWVbNTBdID0gIi9kYXRhL3RodW1iLmpwZyI7CisgICAgZm91dCA9IGZvcGVuKGZpbGVfbmFtZSwgIndiIik7CisgICAgaWYgKCFmb3V0KQorICAgICAgICBwZXJyb3IoJmZpbGVfbmFtZVswXSk7CisgICAgc2l6ZV90IG53cml0ZSA9IGZ3cml0ZShtQXJncy5vdXRfdGh1bWJfYnVmLCBzaXplb2YoY2hhciksIHBhcmFtLT5maWxlX3NpemUsIGZvdXQpOworICAgIGZjbG9zZShmb3V0KTsKKyNlbmRpZgorCisgICAgQUxPR0QoImVuY29kZVRodW1iSW1nIFgiKTsKKworICAgIHJldHVybiBKUEdfU1VDQ0VTUzsKK30KKworanBnX3JldHVybl9zdGF0dXMgSnBlZ0VuY29kZXI6Om1ha2VFeGlmICh1bnNpZ25lZCBjaGFyICpleGlmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aWZfYXR0cmlidXRlX3QgKmV4aWZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZU1haW5idWZGb3JUaHVtYikKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworCisgICAgQUxPR0QoIm1ha2VFeGlmIEUiKTsKKworICAgIHVuc2lnbmVkIGNoYXIgKnBDdXIsICpwQXBwMVN0YXJ0LCAqcElmZFN0YXJ0LCAqcEdwc0lmZFB0ciwgKnBOZXh0SWZkT2Zmc2V0OworICAgIHVuc2lnbmVkIGludCB0bXAsIExvbmdlclRhZ09mZmVzdCA9IDA7CisgICAgcEFwcDFTdGFydCA9IHBDdXIgPSBleGlmT3V0OworCisgICAgLy8yIEV4aWYgSWRlbnRpZmllciBDb2RlICYgVElGRiBIZWFkZXIKKyAgICBwQ3VyICs9IDQ7ICAvLyBTa2lwIDQgQnl0ZSBmb3IgQVBQMSBtYXJrZXIgYW5kIGxlbmd0aAorICAgIHVuc2lnbmVkIGNoYXIgRXhpZklkZW50aWZpZXJDb2RlWzZdID0geyAweDQ1LCAweDc4LCAweDY5LCAweDY2LCAweDAwLCAweDAwIH07CisgICAgbWVtY3B5KHBDdXIsIEV4aWZJZGVudGlmaWVyQ29kZSwgNik7CisgICAgcEN1ciArPSA2OworCisgICAgLyogQnl0ZSBPcmRlciAtIGxpdHRsZSBlbmRpYW4sIE9mZnNldCBvZiBJRkQgLSAweDAwMDAwMDA4LkggKi8KKyAgICB1bnNpZ25lZCBjaGFyIFRpZmZIZWFkZXJbOF0gPSB7IDB4NDksIDB4NDksIDB4MkEsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAgfTsKKyAgICBtZW1jcHkocEN1ciwgVGlmZkhlYWRlciwgOCk7CisgICAgcElmZFN0YXJ0ID0gcEN1cjsKKyAgICBwQ3VyICs9IDg7CisKKyAgICAvLzIgMHRoIElGRCBUSUZGIFRhZ3MKKyAgICBpZiAoZXhpZkluZm8tPmVuYWJsZUdwcykKKyAgICAgICAgdG1wID0gTlVNXzBUSF9JRkRfVElGRjsKKyAgICBlbHNlCisgICAgICAgIHRtcCA9IE5VTV8wVEhfSUZEX1RJRkYgLSAxOworCisgICAgbWVtY3B5KHBDdXIsICZ0bXAsIE5VTV9TSVpFKTsKKyAgICBwQ3VyICs9IE5VTV9TSVpFOworCisgICAgTG9uZ2VyVGFnT2ZmZXN0ICs9IDggKyBOVU1fU0laRSArIHRtcCpJRkRfU0laRSArIE9GRlNFVF9TSVpFOworCisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19JTUFHRV9XSURUSCwgRVhJRl9UWVBFX0xPTkcsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT53aWR0aCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19JTUFHRV9IRUlHSFQsIEVYSUZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAxLCBleGlmSW5mby0+aGVpZ2h0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX01BS0UsIEVYSUZfVFlQRV9BU0NJSSwKKyAgICAgICAgICAgICAgICAgc3RybGVuKChjaGFyICopZXhpZkluZm8tPm1ha2VyKSArIDEsIGV4aWZJbmZvLT5tYWtlciwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX01PREVMLCBFWElGX1RZUEVfQVNDSUksCisgICAgICAgICAgICAgICAgIHN0cmxlbigoY2hhciAqKWV4aWZJbmZvLT5tb2RlbCkgKyAxLCBleGlmSW5mby0+bW9kZWwsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19PUklFTlRBVElPTiwgRVhJRl9UWVBFX1NIT1JULAorICAgICAgICAgICAgICAgICAxLCBleGlmSW5mby0+b3JpZW50YXRpb24pOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfU09GVFdBUkUsIEVYSUZfVFlQRV9BU0NJSSwKKyAgICAgICAgICAgICAgICAgc3RybGVuKChjaGFyICopZXhpZkluZm8tPnNvZnR3YXJlKSArIDEsIGV4aWZJbmZvLT5zb2Z0d2FyZSwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0RBVEVfVElNRSwgRVhJRl9UWVBFX0FTQ0lJLAorICAgICAgICAgICAgICAgICAyMCwgZXhpZkluZm8tPmRhdGVfdGltZSwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX1lDQkNSX1BPU0lUSU9OSU5HLCBFWElGX1RZUEVfU0hPUlQsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT55Y2Jjcl9wb3NpdGlvbmluZyk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19FWElGX0lGRF9QT0lOVEVSLCBFWElGX1RZUEVfTE9ORywKKyAgICAgICAgICAgICAgICAgMSwgTG9uZ2VyVGFnT2ZmZXN0KTsKKyAgICBpZiAoZXhpZkluZm8tPmVuYWJsZUdwcykgeworICAgICAgICBwR3BzSWZkUHRyID0gcEN1cjsKKyAgICAgICAgcEN1ciArPSBJRkRfU0laRTsgICAvLyBTa2lwIGEgaWZkIHNpemUgZm9yIGdwcyBJRkQgcG9pbnRlcgorICAgIH0KKworICAgIHBOZXh0SWZkT2Zmc2V0ID0gcEN1cjsgIC8vIFNraXAgYSBvZmZzZXQgc2l6ZSBmb3IgbmV4dCBJRkQgb2Zmc2V0CisgICAgcEN1ciArPSBPRkZTRVRfU0laRTsKKworICAgIC8vMiAwdGggSUZEIEV4aWYgUHJpdmF0ZSBUYWdzCisgICAgcEN1ciA9IHBJZmRTdGFydCArIExvbmdlclRhZ09mZmVzdDsKKworICAgIHRtcCA9IE5VTV8wVEhfSUZEX0VYSUY7CisgICAgbWVtY3B5KHBDdXIsICZ0bXAgLCBOVU1fU0laRSk7CisgICAgcEN1ciArPSBOVU1fU0laRTsKKworICAgIExvbmdlclRhZ09mZmVzdCArPSBOVU1fU0laRSArIE5VTV8wVEhfSUZEX0VYSUYqSUZEX1NJWkUgKyBPRkZTRVRfU0laRTsKKworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfRVhQT1NVUkVfVElNRSwgRVhJRl9UWVBFX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAxLCAmZXhpZkluZm8tPmV4cG9zdXJlX3RpbWUsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19GTlVNQkVSLCBFWElGX1RZUEVfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgIDEsICZleGlmSW5mby0+Zm51bWJlciwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0VYUE9TVVJFX1BST0dSQU0sIEVYSUZfVFlQRV9TSE9SVCwKKyAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPmV4cG9zdXJlX3Byb2dyYW0pOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfSVNPX1NQRUVEX1JBVElORywgRVhJRl9UWVBFX1NIT1JULAorICAgICAgICAgICAgICAgICAxLCBleGlmSW5mby0+aXNvX3NwZWVkX3JhdGluZyk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19FWElGX1ZFUlNJT04sIEVYSUZfVFlQRV9VTkRFRklORUQsCisgICAgICAgICAgICAgICAgIDQsIGV4aWZJbmZvLT5leGlmX3ZlcnNpb24pOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfREFURV9USU1FX09SRywgRVhJRl9UWVBFX0FTQ0lJLAorICAgICAgICAgICAgICAgICAyMCwgZXhpZkluZm8tPmRhdGVfdGltZSwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0RBVEVfVElNRV9ESUdJVElaRSwgRVhJRl9UWVBFX0FTQ0lJLAorICAgICAgICAgICAgICAgICAyMCwgZXhpZkluZm8tPmRhdGVfdGltZSwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX1NIVVRURVJfU1BFRUQsIEVYSUZfVFlQRV9TUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgIDEsIChyYXRpb25hbF90ICopJmV4aWZJbmZvLT5zaHV0dGVyX3NwZWVkLCAmTG9uZ2VyVGFnT2ZmZXN0LCBwSWZkU3RhcnQpOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfQVBFUlRVUkUsIEVYSUZfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgMSwgJmV4aWZJbmZvLT5hcGVydHVyZSwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0JSSUdIVE5FU1MsIEVYSUZfVFlQRV9TUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgIDEsIChyYXRpb25hbF90ICopJmV4aWZJbmZvLT5icmlnaHRuZXNzLCAmTG9uZ2VyVGFnT2ZmZXN0LCBwSWZkU3RhcnQpOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfRVhQT1NVUkVfQklBUywgRVhJRl9UWVBFX1NSQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgMSwgKHJhdGlvbmFsX3QgKikmZXhpZkluZm8tPmV4cG9zdXJlX2JpYXMsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19NQVhfQVBFUlRVUkUsIEVYSUZfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgMSwgJmV4aWZJbmZvLT5tYXhfYXBlcnR1cmUsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19NRVRFUklOR19NT0RFLCBFWElGX1RZUEVfU0hPUlQsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5tZXRlcmluZ19tb2RlKTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0ZMQVNILCBFWElGX1RZUEVfU0hPUlQsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5mbGFzaCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19GT0NBTF9MRU5HVEgsIEVYSUZfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgMSwgJmV4aWZJbmZvLT5mb2NhbF9sZW5ndGgsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgY2hhciBjb2RlWzhdID0geyAweDAwLCAweDAwLCAweDAwLCAweDQ5LCAweDQ5LCAweDQzLCAweDUzLCAweDQxIH07CisgICAgaW50IGNvbW1lbnRzTGVuID0gc3RybGVuKChjaGFyICopZXhpZkluZm8tPnVzZXJfY29tbWVudCkgKyAxOworICAgIG1lbW1vdmUoZXhpZkluZm8tPnVzZXJfY29tbWVudCArIHNpemVvZihjb2RlKSwgZXhpZkluZm8tPnVzZXJfY29tbWVudCwgY29tbWVudHNMZW4pOworICAgIG1lbWNweShleGlmSW5mby0+dXNlcl9jb21tZW50LCBjb2RlLCBzaXplb2YoY29kZSkpOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfVVNFUl9DT01NRU5ULCBFWElGX1RZUEVfVU5ERUZJTkVELAorICAgICAgICAgICAgICAgICBjb21tZW50c0xlbiArIHNpemVvZihjb2RlKSwgZXhpZkluZm8tPnVzZXJfY29tbWVudCwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0NPTE9SX1NQQUNFLCBFWElGX1RZUEVfU0hPUlQsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5jb2xvcl9zcGFjZSk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19QSVhFTF9YX0RJTUVOU0lPTiwgRVhJRl9UWVBFX0xPTkcsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT53aWR0aCk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19QSVhFTF9ZX0RJTUVOU0lPTiwgRVhJRl9UWVBFX0xPTkcsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5oZWlnaHQpOworICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfRVhQT1NVUkVfTU9ERSwgRVhJRl9UWVBFX0xPTkcsCisgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5leHBvc3VyZV9tb2RlKTsKKyAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX1dISVRFX0JBTEFOQ0UsIEVYSUZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAxLCBleGlmSW5mby0+d2hpdGVfYmFsYW5jZSk7CisgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19TQ0VOQ0VfQ0FQVFVSRV9UWVBFLCBFWElGX1RZUEVfTE9ORywKKyAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPnNjZW5lX2NhcHR1cmVfdHlwZSk7CisgICAgdG1wID0gMDsKKyAgICBtZW1jcHkocEN1ciwgJnRtcCwgT0ZGU0VUX1NJWkUpOyAvLyBuZXh0IElGRCBvZmZzZXQKKyAgICBwQ3VyICs9IE9GRlNFVF9TSVpFOworCisgICAgLy8yIDB0aCBJRkQgR1BTIEluZm8gVGFncworICAgIGlmIChleGlmSW5mby0+ZW5hYmxlR3BzKSB7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEdwc0lmZFB0ciwgRVhJRl9UQUdfR1BTX0lGRF9QT0lOVEVSLCBFWElGX1RZUEVfTE9ORywKKyAgICAgICAgICAgICAgICAgICAgIDEsIExvbmdlclRhZ09mZmVzdCk7IC8vIEdQUyBJRkQgcG9pbnRlciBza2lwcGVkIG9uIDB0aCBJRkQKKworICAgICAgICBwQ3VyID0gcElmZFN0YXJ0ICsgTG9uZ2VyVGFnT2ZmZXN0OworCisgICAgICAgIGlmIChleGlmSW5mby0+Z3BzX3Byb2Nlc3NpbmdfbWV0aG9kWzBdID09IDApIHsKKyAgICAgICAgICAgIC8vIGRvbid0IGNyZWF0ZSBHUFNfUFJPQ0VTU0lOR19NRVRIT0QgdGFnIGlmIHRoZXJlIGlzbid0IGFueQorICAgICAgICAgICAgdG1wID0gTlVNXzBUSF9JRkRfR1BTIC0gMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRtcCA9IE5VTV8wVEhfSUZEX0dQUzsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkocEN1ciwgJnRtcCwgTlVNX1NJWkUpOworICAgICAgICBwQ3VyICs9IE5VTV9TSVpFOworCisgICAgICAgIExvbmdlclRhZ09mZmVzdCArPSBOVU1fU0laRSArIHRtcCpJRkRfU0laRSArIE9GRlNFVF9TSVpFOworCisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfR1BTX1ZFUlNJT05fSUQsIEVYSUZfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgNCwgZXhpZkluZm8tPmdwc192ZXJzaW9uX2lkKTsKKyAgICAgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19HUFNfTEFUSVRVREVfUkVGLCBFWElGX1RZUEVfQVNDSUksCisgICAgICAgICAgICAgICAgICAgICAyLCBleGlmSW5mby0+Z3BzX2xhdGl0dWRlX3JlZik7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfR1BTX0xBVElUVURFLCBFWElGX1RZUEVfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAzLCBleGlmSW5mby0+Z3BzX2xhdGl0dWRlLCAmTG9uZ2VyVGFnT2ZmZXN0LCBwSWZkU3RhcnQpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0dQU19MT05HSVRVREVfUkVGLCBFWElGX1RZUEVfQVNDSUksCisgICAgICAgICAgICAgICAgICAgICAyLCBleGlmSW5mby0+Z3BzX2xvbmdpdHVkZV9yZWYpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0dQU19MT05HSVRVREUsIEVYSUZfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgIDMsIGV4aWZJbmZvLT5ncHNfbG9uZ2l0dWRlLCAmTG9uZ2VyVGFnT2ZmZXN0LCBwSWZkU3RhcnQpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0dQU19BTFRJVFVERV9SRUYsIEVYSUZfVFlQRV9CWVRFLAorICAgICAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPmdwc19hbHRpdHVkZV9yZWYpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0dQU19BTFRJVFVERSwgRVhJRl9UWVBFX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgMSwgJmV4aWZJbmZvLT5ncHNfYWx0aXR1ZGUsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfR1BTX1RJTUVTVEFNUCwgRVhJRl9UWVBFX1JBVElPTkFMLAorICAgICAgICAgICAgICAgICAgICAgMywgZXhpZkluZm8tPmdwc190aW1lc3RhbXAsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgICAgIHRtcCA9IHN0cmxlbigoY2hhciopZXhpZkluZm8tPmdwc19wcm9jZXNzaW5nX21ldGhvZCk7CisJaWYgKHRtcCA+IDApIHsKKyAgICAgICAgICAgIGlmICh0bXAgPiAxMDApIHsKKyAgICAgICAgICAgICAgICB0bXAgPSAxMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHRtcF9idWZbMTAwK3NpemVvZihFeGlmQXNjaWlQcmVmaXgpXTsKKyAgICAgICAgICAgIG1lbWNweSh0bXBfYnVmLCBFeGlmQXNjaWlQcmVmaXgsIHNpemVvZihFeGlmQXNjaWlQcmVmaXgpKTsKKyAgICAgICAgICAgIG1lbWNweSgmdG1wX2J1ZltzaXplb2YoRXhpZkFzY2lpUHJlZml4KV0sIGV4aWZJbmZvLT5ncHNfcHJvY2Vzc2luZ19tZXRob2QsIHRtcCk7CisgICAgICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0dQU19QUk9DRVNTSU5HX01FVEhPRCwgRVhJRl9UWVBFX1VOREVGSU5FRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0bXArc2l6ZW9mKEV4aWZBc2NpaVByZWZpeCksIHRtcF9idWYsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgICAgIH0KKyAgICAgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19HUFNfREFURVNUQU1QLCBFWElGX1RZUEVfQVNDSUksCisgICAgICAgICAgICAgICAgICAgICAxMSwgZXhpZkluZm8tPmdwc19kYXRlc3RhbXAsICZMb25nZXJUYWdPZmZlc3QsIHBJZmRTdGFydCk7CisgICAgICAgIHRtcCA9IDA7CisgICAgICAgIG1lbWNweShwQ3VyLCAmdG1wLCBPRkZTRVRfU0laRSk7IC8vIG5leHQgSUZEIG9mZnNldAorICAgICAgICBwQ3VyICs9IE9GRlNFVF9TSVpFOworICAgIH0KKworICAgIC8vMiAxdGggSUZEIFRJRkYgVGFncworICAgIGNoYXIgKnRodW1iQnVmOworICAgIGludCB0aHVtYlNpemU7CisKKyAgICBpZiAodXNlTWFpbmJ1ZkZvclRodW1iKSB7CisgICAgICAgIHRodW1iQnVmID0gbUFyZ3Mub3V0X2J1ZjsKKyAgICAgICAgdGh1bWJTaXplID0gbUFyZ3MuZW5jX3BhcmFtLT5maWxlX3NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGh1bWJCdWYgPSBtQXJncy5vdXRfdGh1bWJfYnVmOworICAgICAgICB0aHVtYlNpemUgPSBtQXJncy50aHVtYl9lbmNfcGFyYW0tPmZpbGVfc2l6ZTsKKyAgICB9CisKKyAgICBpZiAoZXhpZkluZm8tPmVuYWJsZVRodW1iICYmICh0aHVtYkJ1ZiAhPSBOVUxMKSAmJiAodGh1bWJTaXplID4gMCkpIHsKKyAgICAgICAgdG1wID0gTG9uZ2VyVGFnT2ZmZXN0OworICAgICAgICBtZW1jcHkocE5leHRJZmRPZmZzZXQsICZ0bXAsIE9GRlNFVF9TSVpFKTsgIC8vIE5FWFQgSUZEIG9mZnNldCBza2lwcGVkIG9uIDB0aCBJRkQKKworICAgICAgICBwQ3VyID0gcElmZFN0YXJ0ICsgTG9uZ2VyVGFnT2ZmZXN0OworCisgICAgICAgIHRtcCA9IE5VTV8xVEhfSUZEX1RJRkY7CisgICAgICAgIG1lbWNweShwQ3VyLCAmdG1wLCBOVU1fU0laRSk7CisgICAgICAgIHBDdXIgKz0gTlVNX1NJWkU7CisKKyAgICAgICAgTG9uZ2VyVGFnT2ZmZXN0ICs9IE5VTV9TSVpFICsgTlVNXzFUSF9JRkRfVElGRipJRkRfU0laRSArIE9GRlNFVF9TSVpFOworCisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfSU1BR0VfV0lEVEgsIEVYSUZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPndpZHRoVGh1bWIpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0lNQUdFX0hFSUdIVCwgRVhJRl9UWVBFX0xPTkcsCisgICAgICAgICAgICAgICAgICAgICAxLCBleGlmSW5mby0+aGVpZ2h0VGh1bWIpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX0NPTVBSRVNTSU9OX1NDSEVNRSwgRVhJRl9UWVBFX1NIT1JULAorICAgICAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPmNvbXByZXNzaW9uX3NjaGVtZSk7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfT1JJRU5UQVRJT04sIEVYSUZfVFlQRV9TSE9SVCwKKyAgICAgICAgICAgICAgICAgICAgIDEsIGV4aWZJbmZvLT5vcmllbnRhdGlvbik7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfWF9SRVNPTFVUSU9OLCBFWElGX1RZUEVfUkFUSU9OQUwsCisgICAgICAgICAgICAgICAgICAgICAxLCAmZXhpZkluZm8tPnhfcmVzb2x1dGlvbiwgJkxvbmdlclRhZ09mZmVzdCwgcElmZFN0YXJ0KTsKKyAgICAgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19ZX1JFU09MVVRJT04sIEVYSUZfVFlQRV9SQVRJT05BTCwKKyAgICAgICAgICAgICAgICAgICAgIDEsICZleGlmSW5mby0+eV9yZXNvbHV0aW9uLCAmTG9uZ2VyVGFnT2ZmZXN0LCBwSWZkU3RhcnQpOworICAgICAgICB3cml0ZUV4aWZJZmQoJnBDdXIsIEVYSUZfVEFHX1JFU09MVVRJT05fVU5JVCwgRVhJRl9UWVBFX1NIT1JULAorICAgICAgICAgICAgICAgICAgICAgMSwgZXhpZkluZm8tPnJlc29sdXRpb25fdW5pdCk7CisgICAgICAgIHdyaXRlRXhpZklmZCgmcEN1ciwgRVhJRl9UQUdfSlBFR19JTlRFUkNIQU5HRV9GT1JNQVQsIEVYSUZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAgICAgMSwgTG9uZ2VyVGFnT2ZmZXN0KTsKKyAgICAgICAgd3JpdGVFeGlmSWZkKCZwQ3VyLCBFWElGX1RBR19KUEVHX0lOVEVSQ0hBTkdFX0ZPUk1BVF9MRU4sIEVYSUZfVFlQRV9MT05HLAorICAgICAgICAgICAgICAgICAgICAgMSwgdGh1bWJTaXplKTsKKworICAgICAgICB0bXAgPSAwOworICAgICAgICBtZW1jcHkocEN1ciwgJnRtcCwgT0ZGU0VUX1NJWkUpOyAvLyBuZXh0IElGRCBvZmZzZXQKKyAgICAgICAgcEN1ciArPSBPRkZTRVRfU0laRTsKKworICAgICAgICBtZW1jcHkocElmZFN0YXJ0ICsgTG9uZ2VyVGFnT2ZmZXN0LAorICAgICAgICAgICAgICAgdGh1bWJCdWYsIHRodW1iU2l6ZSk7CisgICAgICAgIExvbmdlclRhZ09mZmVzdCArPSB0aHVtYlNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdG1wID0gMDsKKyAgICAgICAgbWVtY3B5KHBOZXh0SWZkT2Zmc2V0LCAmdG1wLCBPRkZTRVRfU0laRSk7ICAvLyBORVhUIElGRCBvZmZzZXQgc2tpcHBlZCBvbiAwdGggSUZECisgICAgfQorCisgICAgdW5zaWduZWQgY2hhciBBcHAxTWFya2VyWzJdID0geyAweGZmLCAweGUxIH07CisgICAgbWVtY3B5KHBBcHAxU3RhcnQsIEFwcDFNYXJrZXIsIDIpOworICAgIHBBcHAxU3RhcnQgKz0gMjsKKworICAgICpzaXplID0gMTAgKyBMb25nZXJUYWdPZmZlc3Q7CisgICAgdG1wID0gKnNpemUgLSAyOyAgICAvLyBBUFAxIE1ha2VyIGlzbid0IGNvdW50ZWQKKyAgICB1bnNpZ25lZCBjaGFyIHNpemVfbW1bMl0gPSB7KHRtcCA+PiA4KSAmIDB4RkYsIHRtcCAmIDB4RkZ9OworICAgIG1lbWNweShwQXBwMVN0YXJ0LCBzaXplX21tLCAyKTsKKworICAgIEFMT0dEKCJtYWtlRXhpZiBYIik7CisKKyAgICByZXR1cm4gSlBHX1NVQ0NFU1M7Cit9CisKK2pwZ19yZXR1cm5fc3RhdHVzIEpwZWdFbmNvZGVyOjpjaGVja01jdShzYW1wbGVfbW9kZV90IHNhbXBsZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgYm9vbCBpc1RodW1iKQoreworICAgIGlmICghYXZhaWxhYmxlKQorICAgICAgICByZXR1cm4gSlBHX0ZBSUw7CisKKyAgICB1aW50MzJfdCBleHBlY3RlZFdpZHRoID0gd2lkdGg7CisgICAgdWludDMyX3QgZXhwZWN0ZWRIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICBzd2l0Y2ggKHNhbXBsZU1vZGUpeworICAgIGNhc2UgSlBHXzQyMjoKKyAgICAgICAgaWYgKHdpZHRoICUgMTYgIT0gMCkKKyAgICAgICAgICAgIGV4cGVjdGVkV2lkdGggPSB3aWR0aCArIDE2IC0gKHdpZHRoICUgMTYpOworICAgICAgICBpZiAoaGVpZ2h0ICUgOCAhPSAwKQorICAgICAgICAgICAgZXhwZWN0ZWRIZWlnaHQgPSBoZWlnaHQgKyA4IC0gKGhlaWdodCAlIDgpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSlBHXzQyMDoKKyAgICAgICAgaWYgKHdpZHRoICUgMTYgIT0gMCkKKyAgICAgICAgICAgIGV4cGVjdGVkV2lkdGggPSB3aWR0aCArIDE2IC0gKHdpZHRoICUgMTYpOworICAgICAgICBpZiAoaGVpZ2h0ICUgMTYgIT0gMCkKKyAgICAgICAgICAgIGV4cGVjdGVkSGVpZ2h0ID0gaGVpZ2h0ICsgMTYgLSAoaGVpZ2h0ICUgMTYpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJJbnZhaWxkIHNhbXBsZSBtb2RlIik7CisgICAgICAgIHJldHVybiBKUEdfRkFJTDsKKyAgICB9CisKKyAgICBpZiAoZXhwZWN0ZWRXaWR0aCA9PSB3aWR0aCAmJiBleHBlY3RlZEhlaWdodCA9PSBoZWlnaHQpCisgICAgICAgIHJldHVybiBKUEdfU1VDQ0VTUzsKKworICAgIEFMT0dXKCJUaGUgaW1hZ2UgaXMgbm90IG1hdGNoZWQgZm9yIE1DVSIpOworCisgICAgdWludDMyX3Qgc2l6ZSA9IHdpZHRoKmhlaWdodCAqIDI7CisgICAgY2hhciAqc3JjQnVmLCAqZHN0QnVmOworCisgICAgaWYgKChzcmNCdWYgPSBuZXcgY2hhcltzaXplXSkgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGZvciBzcmNCdWYiKTsKKyAgICAgICAgcmV0dXJuIEpQR19GQUlMOworICAgIH0KKworICAgIGlmICghaXNUaHVtYikKKyAgICAgICAgZHN0QnVmID0gbUFyZ3MuaW5fYnVmOworICAgIGVsc2UKKyAgICAgICAgZHN0QnVmID0gbUFyZ3MuaW5fdGh1bWJfYnVmOworCisgICAgbWVtY3B5KHNyY0J1ZiwgZHN0QnVmLCBzaXplKTsKKyAgICBib29sIHJldCA9IHBhZChzcmNCdWYsIHdpZHRoLCBoZWlnaHQsIGRzdEJ1ZiwgZXhwZWN0ZWRXaWR0aCwgZXhwZWN0ZWRIZWlnaHQpOworCisgICAgZGVsZXRlW10gc3JjQnVmOworCisgICAgcmV0dXJuIEpQR19TVUNDRVNTOworfQorCitib29sIEpwZWdFbmNvZGVyOjpwYWQoY2hhciAqc3JjQnVmLCB1aW50MzJfdCBzcmNXaWR0aCwgdWludDMyX3Qgc3JjSGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3RCdWYsIHVpbnQzMl90IGRzdFdpZHRoLCB1aW50MzJfdCBkc3RIaWdodCkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKHNyY0J1ZiA9PSBOVUxMIHx8IGRzdEJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJzcmNCdWYgb3IgZHN0QnVmIGlzIE5VTEwiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludCBwYWRXID0gZHN0V2lkdGggLSBzcmNXaWR0aDsKKyAgICBpbnQgcGFkSCA9IGRzdEhpZ2h0IC0gc3JjSGlnaHQ7CisKKyAgICBpZiAoKGludCkoZHN0V2lkdGggLSBzcmNXaWR0aCkgPCAwIHx8CisgICAgICAgICAgICAoaW50KShkc3RIaWdodCAtIHNyY0hpZ2h0KSA8IDApIHsKKyAgICAgICAgQUxPR0UoImRzdFNpemUgaXMgc21hbGxlciB0aGFuIHNyY1NpemUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1zZXQoZHN0QnVmLCAwLCBkc3RXaWR0aCpkc3RIaWdodCAqIDIpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHNyY0hpZ2h0OyBpKyspCisgICAgICAgIG1lbWNweShkc3RCdWYgKyBpICogZHN0V2lkdGggKiAyLCBzcmNCdWYgKyBpICogc3JjV2lkdGggKiAyLCBzcmNXaWR0aCAqIDIpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSnBlZ0VuY29kZXI6OnNjYWxlRG93bll1djQyMihjaGFyICpzcmNCdWYsIHVpbnQzMl90IHNyY1dpZHRoLCB1aW50MzJfdCBzcmNIaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3RCdWYsIHVpbnQzMl90IGRzdFdpZHRoLCB1aW50MzJfdCBkc3RIaWdodCkKK3sKKyAgICBpZiAoIWF2YWlsYWJsZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaW50MzJfdCBzdGVwX3gsIHN0ZXBfeTsKKyAgICBpbnQzMl90IGlYc3JjLCBpWGRzdDsKKyAgICBpbnQzMl90IHgsIHksIHNyY195X3N0YXJ0X3BvcywgZHN0X3Bvcywgc3JjX3BvczsKKworICAgIGlmIChkc3RXaWR0aCAlIDIgIT0gMCB8fCBkc3RIaWdodCAlIDIgIT0gMCl7CisgICAgICAgIEFMT0dFKCJzY2FsZV9kb3duX3l1djQyMjogaW52YWxpZCB3aWR0aCwgaGVpZ2h0IGZvciBzY2FsaW5nIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGVwX3ggPSBzcmNXaWR0aCAvIGRzdFdpZHRoOworICAgIHN0ZXBfeSA9IHNyY0hpZ2h0IC8gZHN0SGlnaHQ7CisKKyAgICBkc3RfcG9zID0gMDsKKyAgICBmb3IgKHVpbnQzMl90IHkgPSAwOyB5IDwgZHN0SGlnaHQ7IHkrKykgeworICAgICAgICBzcmNfeV9zdGFydF9wb3MgPSAoeSAqIHN0ZXBfeSAqIChzcmNXaWR0aCAqIDIpKTsKKworICAgICAgICBmb3IgKHVpbnQzMl90IHggPSAwOyB4IDwgZHN0V2lkdGg7IHggKz0gMikgeworICAgICAgICAgICAgc3JjX3BvcyA9IHNyY195X3N0YXJ0X3BvcyArICh4ICogKHN0ZXBfeCAqIDIpKTsKKworICAgICAgICAgICAgZHN0QnVmW2RzdF9wb3MrK10gPSBzcmNCdWZbc3JjX3BvcyAgICBdOworICAgICAgICAgICAgZHN0QnVmW2RzdF9wb3MrK10gPSBzcmNCdWZbc3JjX3BvcyArIDFdOworICAgICAgICAgICAgZHN0QnVmW2RzdF9wb3MrK10gPSBzcmNCdWZbc3JjX3BvcyArIDJdOworICAgICAgICAgICAgZHN0QnVmW2RzdF9wb3MrK10gPSBzcmNCdWZbc3JjX3BvcyArIDNdOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2lubGluZSB2b2lkIEpwZWdFbmNvZGVyOjp3cml0ZUV4aWZJZmQodW5zaWduZWQgY2hhciAqKnBDdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkKK3sKKyAgICBtZW1jcHkoKnBDdXIsICZ0YWcsIDIpOworICAgICpwQ3VyICs9IDI7CisgICAgbWVtY3B5KCpwQ3VyLCAmdHlwZSwgMik7CisgICAgKnBDdXIgKz0gMjsKKyAgICBtZW1jcHkoKnBDdXIsICZjb3VudCwgNCk7CisgICAgKnBDdXIgKz0gNDsKKyAgICBtZW1jcHkoKnBDdXIsICZ2YWx1ZSwgNCk7CisgICAgKnBDdXIgKz0gNDsKK30KKworaW5saW5lIHZvaWQgSnBlZ0VuY29kZXI6OndyaXRlRXhpZklmZCh1bnNpZ25lZCBjaGFyICoqcEN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSkKK3sKKyAgICBjaGFyIGJ1Zls0XSA9IHsgMCx9OworCisgICAgbWVtY3B5KGJ1ZiwgcFZhbHVlLCBjb3VudCk7CisgICAgbWVtY3B5KCpwQ3VyLCAmdGFnLCAyKTsKKyAgICAqcEN1ciArPSAyOworICAgIG1lbWNweSgqcEN1ciwgJnR5cGUsIDIpOworICAgICpwQ3VyICs9IDI7CisgICAgbWVtY3B5KCpwQ3VyLCAmY291bnQsIDQpOworICAgICpwQ3VyICs9IDQ7CisgICAgbWVtY3B5KCpwQ3VyLCBidWYsIDQpOworICAgICpwQ3VyICs9IDQ7Cit9CisKKworaW5saW5lIHZvaWQgSnBlZ0VuY29kZXI6OndyaXRlRXhpZklmZCh1bnNpZ25lZCBjaGFyICoqcEN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnN0YXJ0KQoreworICAgIG1lbWNweSgqcEN1ciwgJnRhZywgMik7CisgICAgKnBDdXIgKz0gMjsKKyAgICBtZW1jcHkoKnBDdXIsICZ0eXBlLCAyKTsKKyAgICAqcEN1ciArPSAyOworICAgIG1lbWNweSgqcEN1ciwgJmNvdW50LCA0KTsKKyAgICAqcEN1ciArPSA0OworICAgIG1lbWNweSgqcEN1ciwgb2Zmc2V0LCA0KTsKKyAgICAqcEN1ciArPSA0OworICAgIG1lbWNweShzdGFydCArICpvZmZzZXQsIHBWYWx1ZSwgY291bnQpOworICAgICpvZmZzZXQgKz0gY291bnQ7Cit9CisKK2lubGluZSB2b2lkIEpwZWdFbmNvZGVyOjp3cml0ZUV4aWZJZmQodW5zaWduZWQgY2hhciAqKnBDdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRpb25hbF90ICpwVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzdGFydCkKK3sKKyAgICBtZW1jcHkoKnBDdXIsICZ0YWcsIDIpOworICAgICpwQ3VyICs9IDI7CisgICAgbWVtY3B5KCpwQ3VyLCAmdHlwZSwgMik7CisgICAgKnBDdXIgKz0gMjsKKyAgICBtZW1jcHkoKnBDdXIsICZjb3VudCwgNCk7CisgICAgKnBDdXIgKz0gNDsKKyAgICBtZW1jcHkoKnBDdXIsIG9mZnNldCwgNCk7CisgICAgKnBDdXIgKz0gNDsKKyAgICBtZW1jcHkoc3RhcnQgKyAqb2Zmc2V0LCBwVmFsdWUsIDggKiBjb3VudCk7CisgICAgKm9mZnNldCArPSA4ICogY291bnQ7Cit9CisKK307CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvbGliczNjanBlZy9KcGVnRW5jb2Rlci5oIGIvZXh5bm9zMy9zNXBjMTEwL2xpYnMzY2pwZWcvSnBlZ0VuY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTViMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2xpYnMzY2pwZWcvSnBlZ0VuY29kZXIuaApAQCAtMCwwICsxLDI0MCBAQAorLyoKKyAqIENvcHlyaWdodCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLixMVEQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqIEpQRUcgRFJJVkVSIE1PRFVMRSAoSnBlZ0VuY29kZXIuaCkKKyAqIEF1dGhvciAgOiBnZS5sZWUgICAgICAgLS0gaW5pdGlhbCB2ZXJzaW9uCisgKiBEYXRlICAgIDogMDMgSnVuZSAyMDEwCisgKiBQdXJwb3NlIDogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEpQRUcgZW5jb2RlciBBUElzIGFzIG5lZWRlZCBieSBDYW1lcmEgSEFMCisgKi8KKyNpZm5kZWYgX19KUEdfQVBJX0hfXworI2RlZmluZSBfX0pQR19BUElfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKworI2luY2x1ZGUgIkV4aWYuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworI2RlZmluZSBNQVhfSlBHX1dJRFRIICAgICAgICAgICAgICAgICAgIDgwMAorI2RlZmluZSBNQVhfSlBHX0hFSUdIVCAgICAgICAgICAgICAgICAgIDQ4MAorI2RlZmluZSBNQVhfSlBHX1JFU09MVVRJT04gICAgICAgICAgICAgIChNQVhfSlBHX1dJRFRIICogTUFYX0pQR19IRUlHSFQpCisKKyNkZWZpbmUgTUFYX0pQR19USFVNQk5BSUxfV0lEVEggICAgICAgICAzMjAKKyNkZWZpbmUgTUFYX0pQR19USFVNQk5BSUxfSEVJR0hUICAgICAgICAyNDAKKyNkZWZpbmUgTUFYX0pQR19USFVNQk5BSUxfUkVTT0xVVElPTiAgICAoTUFYX0pQR19USFVNQk5BSUxfV0lEVEggKiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSlBHX1RIVU1CTkFJTF9IRUlHSFQpCisKKyNkZWZpbmUgTUFYX1JHQl9XSURUSCAgICAgICAgICAgICAgICAgICA4MDAKKyNkZWZpbmUgTUFYX1JHQl9IRUlHSFQgICAgICAgICAgICAgICAgICA0ODAKKyNkZWZpbmUgTUFYX1JHQl9SRVNPTFVUSU9OICAgICAgICAgICAgICAoTUFYX1JHQl9XSURUSCAqIE1BWF9SR0JfSEVJR0hUKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIGRlZmluZSBKUEcgJiBpbWFnZSBtZW1vcnkgKi8KKy8qIG1lbW9yeSBhcmVhIGlzIDRrKFBBR0VfU0laRSkgYWxpZ25lZCBiZWNhdXNlIG9mIFZpcnR1YWxDb3B5RXgoKSAqLworI2RlZmluZSBKUEdfU1RSRUFNX0JVRl9TSVpFICAgICBcCisgICAgICAgIChNQVhfSlBHX1JFU09MVVRJT04gLyBQQUdFX1NJWkUgKyAxKSAqIFBBR0VfU0laRQorI2RlZmluZSBKUEdfU1RSRUFNX1RIVU1CX0JVRl9TSVpFICAgXAorICAgICAgICAoTUFYX0pQR19USFVNQk5BSUxfUkVTT0xVVElPTiAvIFBBR0VfU0laRSArIDEpICogUEFHRV9TSVpFCisjZGVmaW5lIEpQR19GUkFNRV9CVUZfU0laRSAgXAorICAgICAgICAoKE1BWF9KUEdfUkVTT0xVVElPTiAqIDMpIC8gUEFHRV9TSVpFICsgMSkgKiBQQUdFX1NJWkUKKyNkZWZpbmUgSlBHX0ZSQU1FX1RIVU1CX0JVRl9TSVpFICAgIFwKKyAgICAgICAgKChNQVhfSlBHX1RIVU1CTkFJTF9SRVNPTFVUSU9OICogMykgLyBQQUdFX1NJWkUgKyAxKSAqIFBBR0VfU0laRQorI2RlZmluZSBKUEdfUkdCX0JVRl9TSVpFICAgIFwKKyAgICAgICAgKChNQVhfUkdCX1JFU09MVVRJT04gKiA0KSAvIFBBR0VfU0laRSArIDEpICogUEFHRV9TSVpFCisKKyNkZWZpbmUgSlBHX1RPVEFMX0JVRl9TSVpFICAoSlBHX1NUUkVBTV9CVUZfU0laRSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBHX1NUUkVBTV9USFVNQl9CVUZfU0laRSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlBHX0ZSQU1FX0JVRl9TSVpFICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUEdfRlJBTUVfVEhVTUJfQlVGX1NJWkUgKyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpQR19SR0JfQlVGX1NJWkUpCisKKyNkZWZpbmUgSlBHX01BSU5fU1RBUlQgICAgICAweDAwCisjZGVmaW5lIEpQR19USFVNQl9TVEFSVCAgICAgSlBHX1NUUkVBTV9CVUZfU0laRQorI2RlZmluZSBJTUdfTUFJTl9TVEFSVCAgICAgIChKUEdfU1RSRUFNX0JVRl9TSVpFICsgSlBHX1NUUkVBTV9USFVNQl9CVUZfU0laRSkKKyNkZWZpbmUgSU1HX1RIVU1CX1NUQVJUICAgICAoSU1HX01BSU5fU1RBUlQgKyBKUEdfRlJBTUVfQlVGX1NJWkUpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBKUEdfRFJJVkVSX05BTUUgICAgICIvZGV2L3MzYy1qcGciCisKKyNkZWZpbmUgSlBFR19JT0NUTF9NQUdJQyAgICAgICAgICAgICAgICAnSicKKyNkZWZpbmUgSU9DVExfSlBHX0RFQ09ERSAgICAgICAgICAgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgMSkKKyNkZWZpbmUgSU9DVExfSlBHX0VOQ09ERSAgICAgICAgICAgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgMikKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9TVFJCVUYgICAgICAgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgMykKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9GUk1CVUYgICAgICAgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgNCkKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9USFVNQl9TVFJCVUYgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgNSkKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9USFVNQl9GUk1CVUYgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgNikKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9QSFlfRlJNQlVGICAgICAgICBfSU8oSlBFR19JT0NUTF9NQUdJQywgNykKKyNkZWZpbmUgSU9DVExfSlBHX0dFVF9QSFlfVEhVTUJfRlJNQlVGICBfSU8oSlBFR19JT0NUTF9NQUdJQywgOCkKKwordHlwZWRlZiBlbnVtIHsKKyAgICBKUEVHX1NFVF9FTkNPREVfV0lEVEgsCisgICAgSlBFR19TRVRfRU5DT0RFX0hFSUdIVCwKKyAgICBKUEVHX1NFVF9FTkNPREVfUVVBTElUWSwKKyAgICBKUEVHX1NFVF9FTkNPREVfSU5fRk9STUFULAorICAgIEpQRUdfU0VUX1NBTVBJTkdfTU9ERSwKKyAgICBKUEVHX1NFVF9USFVNQk5BSUxfV0lEVEgsCisgICAgSlBFR19TRVRfVEhVTUJOQUlMX0hFSUdIVAorfSBqcGVnX2NvbmY7CisKK3R5cGVkZWYgZW51bSB7CisgICAgSlBHX0ZBSUwsCisgICAgSlBHX1NVQ0NFU1MsCisgICAgT0tfSERfUEFSU0lORywKKyAgICBFUlJfSERfUEFSU0lORywKKyAgICBPS19FTkNfT1JfREVDLAorICAgIEVSUl9FTkNfT1JfREVDLAorICAgIEVSUl9VTktOT1dOCit9IGpwZ19yZXR1cm5fc3RhdHVzOworCit0eXBlZGVmIGVudW0geworICAgIEpQR19SR0IxNiwKKyAgICBKUEdfWUNCWUNSLAorICAgIEpQR19UWVBFX1VOS05PV04KK30gaW1hZ2VfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIEpQR180NDQsCisgICAgSlBHXzQyMiwKKyAgICBKUEdfNDIwLAorICAgIEpQR180MDAsCisgICAgUkVTRVJWRUQxLAorICAgIFJFU0VSVkVEMiwKKyAgICBKUEdfNDExLAorICAgIEpQR19TQU1QTEVfVU5LTk9XTgorfSBzYW1wbGVfbW9kZV90OworCit0eXBlZGVmIGVudW0geworICAgIFlDQkNSXzQyMiwKKyAgICBZQ0JDUl80MjAsCisgICAgWUNCQ1JfU0FNUExFX1VOS05PV04KK30gb3V0X21vZGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBKUEdfTU9ERVNFTF9ZQ0JDUiA9IDEsCisgICAgSlBHX01PREVTRUxfUkdCLAorICAgIEpQR19NT0RFU0VMX1VOS05PV04KK30gaW5fbW9kZV90OworCit0eXBlZGVmIGVudW0geworICAgIEpQR19NQUlOLAorICAgIEpQR19USFVNQk5BSUwKK30gZW5jb2RlX3R5cGVfdDsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBKUEdfUVVBTElUWV9MRVZFTF8xLCAgICAgICAgLyogaGlnaCAqLworICAgIEpQR19RVUFMSVRZX0xFVkVMXzIsCisgICAgSlBHX1FVQUxJVFlfTEVWRUxfMywKKyAgICBKUEdfUVVBTElUWV9MRVZFTF80ICAgICAgICAgLyogbG93ICovCit9IGltYWdlX3F1YWxpdHlfdHlwZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgc2FtcGxlX21vZGVfdCAgIHNhbXBsZV9tb2RlOworICAgIGVuY29kZV90eXBlX3QgICBkZWNfdHlwZTsKKyAgICBvdXRfbW9kZV90ICAgICAgb3V0X2Zvcm1hdDsKKyAgICB1aW50MzJfdCAgICAgICAgd2lkdGg7CisgICAgdWludDMyX3QgICAgICAgIGhlaWdodDsKKyAgICB1aW50MzJfdCAgICAgICAgZGF0YV9zaXplOworICAgIHVpbnQzMl90ICAgICAgICBmaWxlX3NpemU7Cit9IGpwZ19kZWNfcHJvY19wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHNhbXBsZV9tb2RlX3QgICAgICAgc2FtcGxlX21vZGU7CisgICAgZW5jb2RlX3R5cGVfdCAgICAgICBlbmNfdHlwZTsKKyAgICBpbl9tb2RlX3QgICAgICAgICAgIGluX2Zvcm1hdDsKKyAgICBpbWFnZV9xdWFsaXR5X3R5cGVfdCBxdWFsaXR5OworICAgIHVpbnQzMl90ICAgICAgICAgICAgd2lkdGg7CisgICAgdWludDMyX3QgICAgICAgICAgICBoZWlnaHQ7CisgICAgdWludDMyX3QgICAgICAgICAgICBkYXRhX3NpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICBmaWxlX3NpemU7CisgICAgdWludDMyX3QgICAgICAgICAgICBzZXRfZnJhbWVidWY7Cit9IGpwZ19lbmNfcHJvY19wYXJhbTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGNoYXIgICAgKmluX2J1ZjsKKyAgICBjaGFyICAgICpwaHlfaW5fYnVmOworICAgIGludCAgICAgaW5fYnVmX3NpemU7CisgICAgY2hhciAgICAqb3V0X2J1ZjsKKyAgICBjaGFyICAgICpwaHlfb3V0X2J1ZjsKKyAgICBpbnQgICAgIG91dF9idWZfc2l6ZTsKKyAgICBjaGFyICAgICppbl90aHVtYl9idWY7CisgICAgY2hhciAgICAqcGh5X2luX3RodW1iX2J1ZjsKKyAgICBpbnQgICAgIGluX3RodW1iX2J1Zl9zaXplOworICAgIGNoYXIgICAgKm91dF90aHVtYl9idWY7CisgICAgY2hhciAgICAqcGh5X291dF90aHVtYl9idWY7CisgICAgaW50ICAgICBvdXRfdGh1bWJfYnVmX3NpemU7CisgICAgY2hhciAgICAqbW1hcHBlZF9hZGRyOworICAgIGpwZ19kZWNfcHJvY19wYXJhbSAgKmRlY19wYXJhbTsKKyAgICBqcGdfZW5jX3Byb2NfcGFyYW0gICplbmNfcGFyYW07CisgICAganBnX2VuY19wcm9jX3BhcmFtICAqdGh1bWJfZW5jX3BhcmFtOworfSBqcGdfYXJnczsKKworY2xhc3MgSnBlZ0VuY29kZXIgeworcHVibGljOgorICAgIEpwZWdFbmNvZGVyKCk7CisgICAgdmlydHVhbCB+SnBlZ0VuY29kZXIoKTsKKworICAgIGludCBvcGVuSGFyZHdhcmUoKTsKKyAgICBqcGdfcmV0dXJuX3N0YXR1cyBzZXRDb25maWcoanBlZ19jb25mIHR5cGUsIGludDMyX3QgdmFsdWUpOworICAgIHZvaWQgKmdldEluQnVmKHVpbnQ2NF90IHNpemUpOworICAgIHZvaWQgKmdldE91dEJ1Zih1aW50NjRfdCAqc2l6ZSk7CisgICAgdm9pZCAqZ2V0VGh1bWJJbkJ1Zih1aW50NjRfdCBzaXplKTsKKyAgICB2b2lkICpnZXRUaHVtYk91dEJ1Zih1aW50NjRfdCAqc2l6ZSk7CisgICAganBnX3JldHVybl9zdGF0dXMgZW5jb2RlKHVuc2lnbmVkIGludCAqc2l6ZSwgZXhpZl9hdHRyaWJ1dGVfdCAqZXhpZkluZm8pOworICAgIGpwZ19yZXR1cm5fc3RhdHVzIGVuY29kZVRodW1iSW1nKHVuc2lnbmVkIGludCAqc2l6ZSwgYm9vbCB1c2VNYWluID0gdHJ1ZSk7CisgICAganBnX3JldHVybl9zdGF0dXMgbWFrZUV4aWYodW5zaWduZWQgY2hhciAqZXhpZk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlmX2F0dHJpYnV0ZV90ICpleGlmSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlTWFpbmJ1ZkZvclRodW1iID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIGpwZ19yZXR1cm5fc3RhdHVzIGNoZWNrTWN1KHNhbXBsZV9tb2RlX3Qgc2FtcGxlTW9kZSwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgYm9vbCBpc1RodW1iKTsKKyAgICBib29sIHBhZChjaGFyICpzcmNCdWYsIHVpbnQzMl90IHNyY1dpZHRoLCB1aW50MzJfdCBzcmNIaWdodCwKKyAgICAgICAgICAgICBjaGFyICpkc3RCdWYsIHVpbnQzMl90IGRzdFdpZHRoLCB1aW50MzJfdCBkc3RIaWdodCk7CisgICAgYm9vbCBzY2FsZURvd25ZdXY0MjIoY2hhciAqc3JjQnVmLCB1aW50MzJfdCBzcmNXaWR0aCwgdWludDMyX3Qgc3JjSGlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZHN0QnVmLCB1aW50MzJfdCBkc3RXaWR0aCwgdWludDMyX3QgZHN0SGlnaHQpOworCisgICAgaW5saW5lIHZvaWQgd3JpdGVFeGlmSWZkKHVuc2lnbmVkIGNoYXIgKipwQ3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKTsKKyAgICBpbmxpbmUgdm9pZCB3cml0ZUV4aWZJZmQodW5zaWduZWQgY2hhciAqKnBDdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqcFZhbHVlKTsKKyAgICBpbmxpbmUgdm9pZCB3cml0ZUV4aWZJZmQodW5zaWduZWQgY2hhciAqKnBDdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW9uYWxfdCAqcFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICpzdGFydCk7CisgICAgaW5saW5lIHZvaWQgd3JpdGVFeGlmSWZkKHVuc2lnbmVkIGNoYXIgKipwQ3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqc3RhcnQpOworICAgIGludCBtRGV2RmQ7CisgICAganBnX2FyZ3MgbUFyZ3M7CisKKyAgICBib29sIGF2YWlsYWJsZTsKKworfTsKK307CisjZW5kaWYgLyogX19KUEdfQVBJX0hfXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL2xpYnN0YWdlZnJpZ2h0aHcvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUyOTlhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisgICAgU0VDX09NWF9QbHVnaW4uY3BwCisKK0xPQ0FMX0NGTEFHUyArPSAkKFBWX0NGTEFHU19NSU5VU19WSVNJQklMSVRZKQorCitMT0NBTF9DX0lOQ0xVREVTOj0gXAorICAgICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCisgICAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSBcCisgICAgICAkKExPQ0FMX1BBVEgpLy4uL2luY2x1ZGUgXAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9ICAgIFwKKyAgICAgICAgbGliYmluZGVyICAgICAgICAgICAgXAorICAgICAgICBsaWJ1dGlscyAgICAgICAgICAgICBcCisgICAgICAgIGxpYmN1dGlscyAgICAgICAgICAgIFwKKyAgICAgICAgbGlidWkgICAgICAgICAgICAgICAgXAorICAgICAgICBsaWJkbCAgICAgICAgICAgICAgICBcCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzdGFnZWZyaWdodGh3CisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L1NFQ19PTVhfUGx1Z2luLmNwcCBiL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L1NFQ19PTVhfUGx1Z2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQ3YzYzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL2xpYnN0YWdlZnJpZ2h0aHcvU0VDX09NWF9QbHVnaW4uY3BwCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlNFQ19PTVhfUGx1Z2luLmgiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitPTVhQbHVnaW5CYXNlICpjcmVhdGVPTVhQbHVnaW4oKSB7CisgICAgcmV0dXJuIG5ldyBTRUNPTVhQbHVnaW47Cit9CisKK1NFQ09NWFBsdWdpbjo6U0VDT01YUGx1Z2luKCkKKyAgICA6IG1MaWJIYW5kbGUoZGxvcGVuKCJsaWJTRUNfT01YX0NvcmUuc28iLCBSVExEX05PVykpLAorICAgICAgbUluaXQoTlVMTCksCisgICAgICBtRGVpbml0KE5VTEwpLAorICAgICAgbUNvbXBvbmVudE5hbWVFbnVtKE5VTEwpLAorICAgICAgbUdldEhhbmRsZShOVUxMKSwKKyAgICAgIG1GcmVlSGFuZGxlKE5VTEwpLAorICAgICAgbUdldFJvbGVzT2ZDb21wb25lbnRIYW5kbGUoTlVMTCkgeworICAgIGlmIChtTGliSGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgbUluaXQgPSAoSW5pdEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIlNFQ19PTVhfSW5pdCIpOworICAgICAgICBtRGVpbml0ID0gKERlaW5pdEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIlNFQ19PTVhfRGVpbml0Iik7CisKKyAgICAgICAgbUNvbXBvbmVudE5hbWVFbnVtID0KKyAgICAgICAgICAgIChDb21wb25lbnROYW1lRW51bUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIlNFQ19PTVhfQ29tcG9uZW50TmFtZUVudW0iKTsKKworICAgICAgICBtR2V0SGFuZGxlID0gKEdldEhhbmRsZUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIlNFQ19PTVhfR2V0SGFuZGxlIik7CisgICAgICAgIG1GcmVlSGFuZGxlID0gKEZyZWVIYW5kbGVGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJTRUNfT01YX0ZyZWVIYW5kbGUiKTsKKworICAgICAgICBtR2V0Um9sZXNPZkNvbXBvbmVudEhhbmRsZSA9CisgICAgICAgICAgICAoR2V0Um9sZXNPZkNvbXBvbmVudEZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgICAgIG1MaWJIYW5kbGUsICJTRUNfT01YX0dldFJvbGVzT2ZDb21wb25lbnQiKTsKKworICAgICAgICAoKm1Jbml0KSgpOworCisgICAgfQorfQorCitTRUNPTVhQbHVnaW46On5TRUNPTVhQbHVnaW4oKSB7CisgICAgaWYgKG1MaWJIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICAoKm1EZWluaXQpKCk7CisKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICAgICAgbUxpYkhhbmRsZSA9IE5VTEw7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNFQ09NWFBsdWdpbjo6bWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCisgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKipjb21wb25lbnQpIHsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuICgqbUdldEhhbmRsZSkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PE9NWF9IQU5ETEVUWVBFICo+KGNvbXBvbmVudCksCisgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4obmFtZSksCisgICAgICAgICAgICBhcHBEYXRhLCBjb25zdF9jYXN0PE9NWF9DQUxMQkFDS1RZUEUgKj4oY2FsbGJhY2tzKSk7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDT01YUGx1Z2luOjpkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpjb21wb25lbnQpIHsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCisgICAgcmV0dXJuICgqbUZyZWVIYW5kbGUpKHJlaW50ZXJwcmV0X2Nhc3Q8T01YX0hBTkRMRVRZUEUgKj4oY29tcG9uZW50KSk7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDT01YUGx1Z2luOjplbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICBPTVhfU1RSSU5HIG5hbWUsCisgICAgICAgIHNpemVfdCBzaXplLAorICAgICAgICBPTVhfVTMyIGluZGV4KSB7CisgICAgaWYgKG1MaWJIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKworICAgIHJldHVybiAoKm1Db21wb25lbnROYW1lRW51bSkobmFtZSwgc2l6ZSwgaW5kZXgpOworfQorCitPTVhfRVJST1JUWVBFIFNFQ09NWFBsdWdpbjo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgVmVjdG9yPFN0cmluZzg+ICpyb2xlcykgeworICAgIHJvbGVzLT5jbGVhcigpOworCisgICAgaWYgKG1MaWJIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgIH0KKworICAgIE9NWF9VMzIgbnVtUm9sZXM7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSAoKm1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlKSgKKyAgICAgICAgICAgIGNvbnN0X2Nhc3Q8T01YX1NUUklORz4obmFtZSksICZudW1Sb2xlcywgTlVMTCk7CisKKyAgICBpZiAoZXJyICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAobnVtUm9sZXMgPiAwKSB7CisgICAgICAgIE9NWF9VOCAqKmFycmF5ID0gbmV3IE9NWF9VOCAqW251bVJvbGVzXTsKKyAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgbnVtUm9sZXM7ICsraSkgeworICAgICAgICAgICAgYXJyYXlbaV0gPSBuZXcgT01YX1U4W09NWF9NQVhfU1RSSU5HTkFNRV9TSVpFXTsKKyAgICAgICAgfQorCisgICAgICAgIE9NWF9VMzIgbnVtUm9sZXMyOworICAgICAgICBlcnIgPSAoKm1HZXRSb2xlc09mQ29tcG9uZW50SGFuZGxlKSgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KG5hbWUpLCAmbnVtUm9sZXMyLCBhcnJheSk7CisKKyAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lICYmIG51bVJvbGVzICE9IG51bVJvbGVzMikgeworICAgICAgICAgICAgZXJyID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgbnVtUm9sZXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGVyciA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBzKChjb25zdCBjaGFyICopYXJyYXlbaV0pOworICAgICAgICAgICAgICAgIHJvbGVzLT5wdXNoKHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkZWxldGVbXSBhcnJheVtpXTsKKyAgICAgICAgICAgIGFycmF5W2ldID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGRlbGV0ZVtdIGFycmF5OworICAgICAgICBhcnJheSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL2xpYnN0YWdlZnJpZ2h0aHcvU0VDX09NWF9QbHVnaW4uaCBiL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L1NFQ19PTVhfUGx1Z2luLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q2NDBkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9saWJzdGFnZWZyaWdodGh3L1NFQ19PTVhfUGx1Z2luLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0VDX09NWF9QTFVHSU4KKworI2RlZmluZSBTRUNfT01YX1BMVUdJTgorCisjaW5jbHVkZSA8T01YUGx1Z2luQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBTRUNPTVhQbHVnaW4gOiBwdWJsaWMgT01YUGx1Z2luQmFzZSB7CisgICAgU0VDT01YUGx1Z2luKCk7CisgICAgdmlydHVhbCB+U0VDT01YUGx1Z2luKCk7CisKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgbWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKKyAgICAgICAgICAgIE9NWF9QVFIgYXBwRGF0YSwKKyAgICAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICoqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBkZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgICAgICBPTVhfQ09NUE9ORU5UVFlQRSAqY29tcG9uZW50KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBlbnVtZXJhdGVDb21wb25lbnRzKAorICAgICAgICAgICAgT01YX1NUUklORyBuYW1lLAorICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBPTVhfVTMyIGluZGV4KTsKKworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBnZXRSb2xlc09mQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpOworCitwcml2YXRlOgorICAgIHZvaWQgKm1MaWJIYW5kbGU7CisKKyAgICB0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCpJbml0RnVuYykoKTsKKyAgICB0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCpEZWluaXRGdW5jKSgpOworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudE5hbWVFbnVtRnVuYykoCisgICAgICAgICAgICBPTVhfU1RSSU5HLCBPTVhfVTMyLCBPTVhfVTMyKTsKKworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkdldEhhbmRsZUZ1bmMpKAorICAgICAgICAgICAgT01YX0hBTkRMRVRZUEUgKiwgT01YX1NUUklORywgT01YX1BUUiwgT01YX0NBTExCQUNLVFlQRSAqKTsKKworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkZyZWVIYW5kbGVGdW5jKShPTVhfSEFORExFVFlQRSAqKTsKKworICAgIHR5cGVkZWYgT01YX0VSUk9SVFlQRSAoKkdldFJvbGVzT2ZDb21wb25lbnRGdW5jKSgKKyAgICAgICAgICAgIE9NWF9TVFJJTkcsIE9NWF9VMzIgKiwgT01YX1U4ICoqKTsKKworICAgIEluaXRGdW5jIG1Jbml0OworICAgIERlaW5pdEZ1bmMgbURlaW5pdDsKKyAgICBDb21wb25lbnROYW1lRW51bUZ1bmMgbUNvbXBvbmVudE5hbWVFbnVtOworICAgIEdldEhhbmRsZUZ1bmMgbUdldEhhbmRsZTsKKyAgICBGcmVlSGFuZGxlRnVuYyBtRnJlZUhhbmRsZTsKKyAgICBHZXRSb2xlc09mQ29tcG9uZW50RnVuYyBtR2V0Um9sZXNPZkNvbXBvbmVudEhhbmRsZTsKKworICAgIFNFQ09NWFBsdWdpbihjb25zdCBTRUNPTVhQbHVnaW4gJik7CisgICAgU0VDT01YUGx1Z2luICZvcGVyYXRvcj0oY29uc3QgU0VDT01YUGx1Z2luICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBTRUNfT01YX1BMVUdJTgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9BbmRyb2lkLm1rIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Mjk4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL0FuZHJvaWQubWsKQEAgLTAsMCArMSw1IEBACitXSVRIX1NFQ19PTVggOj0gdHJ1ZQorCitpZmVxICgkKFdJVEhfU0VDX09NWCksIHRydWUpCisgIGluY2x1ZGUgJChhbGwtc3ViZGlyLW1ha2VmaWxlcykKK2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWU0MjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIyIEBACisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK1NFQ19PTVhfVE9QIDo9ICQoTE9DQUxfUEFUSCkKK1NFQ19DT0RFQ1MgOj0gJChTRUNfT01YX1RPUCkvc2VjX2NvZGVjcy8KKworU0VDX09NWF9JTkMgOj0gJChTRUNfT01YX1RPUCkvc2VjX29teF9pbmNsdWRlLworU0VDX09NWF9DT01QT05FTlQgOj0gJChTRUNfT01YX1RPUCkvc2VjX29teF9jb21wb25lbnQKKworaW5jbHVkZSAkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbC9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9UT1ApL3NlY19vbXhfY29yZS9BbmRyb2lkLm1rCisKK2luY2x1ZGUgJChTRUNfQ09ERUNTKS9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbi9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYy9BbmRyb2lkLm1rCitpbmNsdWRlICQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYy9oMjY0ZGVjL0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjL21wZWc0ZGVjL0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZW5jL0FuZHJvaWQubWsKK2luY2x1ZGUgJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZW5jL2gyNjRlbmMvQW5kcm9pZC5taworaW5jbHVkZSAkKFNFQ19PTVhfQ09NUE9ORU5UKS92aWRlby9lbmMvbXBlZzRlbmMvQW5kcm9pZC5tawpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxNjNhNAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL0FuZHJvaWQubWsKQEAgLTAsMCArMSw3IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitpbmNsdWRlICAgJChTRUNfQ09ERUNTKS92aWRlby9tZmNfYzExMC9kZWMvQW5kcm9pZC5taworaW5jbHVkZSAgICQoU0VDX0NPREVDUykvdmlkZW8vbWZjX2MxMTAvZW5jL0FuZHJvaWQubWsKK2luY2x1ZGUgICAkKFNFQ19DT0RFQ1MpL3ZpZGVvL21mY19jMTEwL2NzYy9BbmRyb2lkLm1rClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL0FuZHJvaWQubWsgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTA2YTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzNiBAQAorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworaWZlcSAoJChBUkNIX0FSTV9IQVZFX05FT04pLHRydWUpCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCWNzY195dXY0MjBfbnYxMnRfeV9uZW9uLnMgXAorCWNzY195dXY0MjBfbnYxMnRfdXZfbmVvbi5zIFwKKwljc2NfbnYxMnRfeXV2NDIwX3lfbmVvbi5zIFwKKwljc2NfbnYxMnRfeXV2NDIwX3V2X25lb24ucyBcCisJY3NjX2ludGVybGVhdmVfbWVtY3B5LnMgXAorCWNzY19kZWludGVybGVhdmVfbWVtY3B5LnMKKworZWxzZQorTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwljb2xvcl9zcGFjZV9jb252ZXJ0b3IuYworCitlbmRpZgorCitMT0NBTF9NT0RVTEUgOj0gbGlic2VjY3NjCisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZworCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKwkkKFNFQ19DT0RFQ1MpL3ZpZGVvL21mY19jMTEwL2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY29sb3Jfc3BhY2VfY29udmVydG9yLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY29sb3Jfc3BhY2VfY29udmVydG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhYzYzOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jb2xvcl9zcGFjZV9jb252ZXJ0b3IuYwpAQCAtMCwwICsxLDEwOTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBjb2xvcl9zcGFjZV9jb252ZXJ0b3IuYworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS43LjAxIDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgInN0ZGxpYi5oIgorI2luY2x1ZGUgImNvbG9yX3NwYWNlX2NvbnZlcnRvci5oIgorCisjZGVmaW5lIFRJTEVEX1NJWkUgIDY0KjMyCisKKy8qCisgKiBEZS1pbnRlcmxlYXZlcyBzcmMgdG8gZGVzdDEsIGRlc3QyCisgKgorICogQHBhcmFtIGRlc3QxCisgKiAgIEFkZHJlc3Mgb2YgZGUtaW50ZXJsZWF2ZWQgZGF0YVtvdXRdCisgKgorICogQHBhcmFtIGRlc3QyCisgKiAgIEFkZHJlc3Mgb2YgZGUtaW50ZXJsZWF2ZWQgZGF0YVtvdXRdCisgKgorICogQHBhcmFtIHNyYworICogICBBZGRyZXNzIG9mIGludGVybGVhdmVkIGRhdGFbaW5dCisgKgorICogQHBhcmFtIHNyY19zaXplCisgKiAgIFNpemUgb2YgaW50ZXJsZWF2ZWQgZGF0YVtpbl0KKyAqLwordm9pZCBjc2NfZGVpbnRlcmxlYXZlX21lbWNweShjaGFyICpkZXN0MSwgY2hhciAqZGVzdDIsIGNoYXIgKnNyYywgaW50IHNyY19zaXplKQoreworICAgIGludCBpID0gMDsKKyAgICBmb3IoaT0wOyBpPHNyY19zaXplLzI7IGkrKykgeworICAgICAgICBkZXN0MVtpXSA9IHNyY1tpKjJdOworICAgICAgICBkZXN0MltpXSA9IHNyY1tpKjIrMV07CisgICAgfQorfQorCisvKgorICogSW50ZXJsZWF2ZXMgc3JjMSwgc3JjMiB0byBkZXN0CisgKgorICogQHBhcmFtIGRlc3QKKyAqICAgQWRkcmVzcyBvZiBpbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gc3JjMQorICogICBBZGRyZXNzIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKgorICogQHBhcmFtIHNyYzIKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW2luXQorICoKKyAqIEBwYXJhbSBzcmNfc2l6ZQorICogICBTaXplIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKi8KK3ZvaWQgY3NjX2ludGVybGVhdmVfbWVtY3B5KGNoYXIgKmRlc3QsIGNoYXIgKnNyYzEsIGNoYXIgKnNyYzIsIGludCBzcmNfc2l6ZSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yKGk9MDsgaTxzcmNfc2l6ZTsgaSsrKSB7CisgICAgICAgIGRlc3RbaSoyXSA9IHNyYzFbaV07CisgICAgICAgIGRlc3RbaSoyKzFdID0gc3JjMltpXTsKKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhci4KKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICogMy4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB5dXY0MjBfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCit2b2lkIGNzY190aWxlZF90b19saW5lYXIoY2hhciAqeXV2NDIwX2Rlc3QsIGNoYXIgKm52MTJ0X3NyYywgaW50IHl1djQyMF93aWR0aCwgaW50IHl1djQyMF9oZWlnaHQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisgICAgdW5zaWduZWQgaW50IHRpbGVkX3hfaW5kZXggPSAwLCB0aWxlZF95X2luZGV4ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgYWxpZ25lZF94X3NpemUgPSAwOworICAgIHVuc2lnbmVkIGludCB0aWxlZF9vZmZzZXQgPSAwLCB0aWxlZF9vZmZzZXQxID0gMCwgdGlsZWRfb2Zmc2V0MiA9IDAsIHRpbGVkX29mZnNldDMgPSAwOworICAgIHVuc2lnbmVkIGludCB0ZW1wMSA9IDAsIHRlbXAyID0gMDsKKworICAgIGlmICh5dXY0MjBfd2lkdGggPj0gMTAyNCkgeworICAgICAgICBmb3IgKGk9MDsgaTx5dXY0MjBfaGVpZ2h0OyBpPWkrMSkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3lfaW5kZXggPSBpPj41OworICAgICAgICAgICAgaWYgKHRpbGVkX3lfaW5kZXggJiAweDEpIHsKKyAgICAgICAgICAgICAgICAvKiBvZGQgZm9tdWxhOiAyK3hfYmxvY2tfbnVtKih5LTEpICovCisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzI7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0KzIwNDgqMzsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgLyogZXZlbiBmb211bGE6IHhfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldCsyMDQ4KjE7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDIgPSB0aWxlZF9vZmZzZXQrMjA0OCo2OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0KzIwNDgqNzsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDIgPSA4OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4KjM7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjEsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjIsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQyKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjMsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSt0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldDIrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQzK3RlbXAyKjIwNDg7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QreXV2NDIwX3dpZHRoKihpKSs2NCo0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjUsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjYsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQyKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjcsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSt0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldDIrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQzK3RlbXAyKjIwNDg7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QreXV2NDIwX3dpZHRoKihpKSs2NCo4LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjEwLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0Mis2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QreXV2NDIwX3dpZHRoKihpKSs2NCoxMSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworCisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0Mit0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldDMrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjEyLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCt5dXY0MjBfd2lkdGgqKGkpKzY0KjEzLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QreXV2NDIwX3dpZHRoKihpKSs2NCoxNCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K3l1djQyMF93aWR0aCooaSkrNjQqMTUsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IDEwMjQ7CisgICAgfQorCisgICAgaWYgKCh5dXY0MjBfd2lkdGgtYWxpZ25lZF94X3NpemUpID49IDUxMikgeworICAgICAgICBmb3IgKGk9MDsgaTx5dXY0MjBfaGVpZ2h0OyBpPWkrMSkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3lfaW5kZXggPSBpPj41OworICAgICAgICAgICAgaWYgKHRpbGVkX3lfaW5kZXggJiAweDEpIHsKKyAgICAgICAgICAgICAgICAvKiBvZGQgZm9tdWxhOiAyK3hfYmxvY2tfbnVtKih5LTEpICovCisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzI7CisgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0KzIwNDgqMzsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9IDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgLyogZXZlbiBmb211bGE6IHhfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldCsyMDQ4KjY7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCo3OworICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IDg7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldCsyMDQ4KjI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCozOworICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCoxLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCoyLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0Mis2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCozLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0Mys2NCoodGVtcDEpLCA2NCk7CisKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldDErdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDIgPSB0aWxlZF9vZmZzZXQyK3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0Myt0ZW1wMioyMDQ4OworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSkrNjQqNCwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCo1LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCo2LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0Mis2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKSs2NCo3LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0Mys2NCoodGVtcDEpLCA2NCk7CisgICAgICAgIH0KKyAgICAgICAgYWxpZ25lZF94X3NpemUgPSBhbGlnbmVkX3hfc2l6ZSs1MTI7CisgICAgfQorCisgICAgaWYgKCh5dXY0MjBfd2lkdGgtYWxpZ25lZF94X3NpemUpID49IDI1NikgeworICAgICAgICBmb3IgKGk9MDsgaTx5dXY0MjBfaGVpZ2h0OyBpPWkrMSkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3lfaW5kZXggPSBpPj41OworICAgICAgICAgICAgaWYgKHRpbGVkX3lfaW5kZXggJiAweDEpIHsKKyAgICAgICAgICAgICAgICAvKiBvZGQgZm9tdWxhOiAyK3hfYmxvY2tfbnVtKih5LTEpICovCisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xOworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzI7CisgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0KzIwNDgqMzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKHl1djQyMF9oZWlnaHQrMzEpPj41KTw8NTsKKyAgICAgICAgICAgICAgICAvKiBldmVuIGZvbXVsYTogeF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrKHRlbXAxPDwxMSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqNjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4Kjc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldCsyMDQ4KjI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCozOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXAxID0gaSYweDFGOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSkrNjQqMSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDErNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSkrNjQqMiwgbnYxMnRfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSkrNjQqMywgbnYxMnRfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICB9CisgICAgICAgIGFsaWduZWRfeF9zaXplID0gYWxpZ25lZF94X3NpemUrMjU2OworICAgIH0KKworICAgIGlmICgoeXV2NDIwX3dpZHRoLWFsaWduZWRfeF9zaXplKSA+PSAxMjgpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8eXV2NDIwX2hlaWdodDsgaT1pKzIpIHsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IDA7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gYWxpZ25lZF94X3NpemU+PjU7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAxOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldCsyMDQ4KjE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgLyogZXZlbiBmb211bGE6IHhfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj42OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrKHRlbXAxPDwxMSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRlbXAxID0gaSYweDFGOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSkrNjQsIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCthbGlnbmVkX3hfc2l6ZSt5dXY0MjBfd2lkdGgqKGkrMSksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKzEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKzEpKzY0LCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDErMSksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IGFsaWduZWRfeF9zaXplKzEyODsKKyAgICB9CisKKyAgICBpZiAoKHl1djQyMF93aWR0aC1hbGlnbmVkX3hfc2l6ZSkgPj0gNjQpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8eXV2NDIwX2hlaWdodDsgaT1pKzQpIHsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IDA7CisgICAgICAgICAgICB0aWxlZF94X2luZGV4ID0gYWxpZ25lZF94X3NpemU+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIHRlbXAyID0gYWxpZ25lZF94X3NpemUmMHgzRjsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCthbGlnbmVkX3hfc2l6ZSt5dXY0MjBfd2lkdGgqKGkpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCthbGlnbmVkX3hfc2l6ZSt5dXY0MjBfd2lkdGgqKGkrMSksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDIrNjQqKHRlbXAxKzEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkoeXV2NDIwX2Rlc3QrYWxpZ25lZF94X3NpemUreXV2NDIwX3dpZHRoKihpKzIpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSsyKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2FsaWduZWRfeF9zaXplK3l1djQyMF93aWR0aCooaSszKSwgbnYxMnRfc3JjK3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDErMyksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IGFsaWduZWRfeF9zaXplKzY0OworICAgIH0KKworICAgIGlmICh5dXY0MjBfd2lkdGggIT0gYWxpZ25lZF94X3NpemUpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8eXV2NDIwX2hlaWdodDsgaT1pKzQpIHsKKyAgICAgICAgICAgIGZvciAoaj1hbGlnbmVkX3hfc2l6ZTsgajx5dXY0MjBfd2lkdGg7IGo9ais0KSB7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICB0aWxlZF94X2luZGV4ID0gaj4+NjsKKyAgICAgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgICAgICAvKiBvZGQgZm9tdWxhOiAyK3grKHg+PjIpPDwyK3hfYmxvY2tfbnVtKih5LTEpICovCisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGlsZWRfeF9pbmRleD4+Mik8PDI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBldmVuMSBmb211bGE6IHgrKCh4KzIpPj4yKTw8Mit4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAxPj4yKTw8MjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3hfaW5kZXgrdGVtcDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBldmVuMiBmb211bGE6IHgreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRlbXAxID0gaSYweDFGOworICAgICAgICAgICAgICAgIHRlbXAyID0gaiYweDNGOworICAgICAgICAgICAgICAgIG1lbWNweSh5dXY0MjBfZGVzdCtqK3l1djQyMF93aWR0aCooaSksIG52MTJ0X3NyYyt0aWxlZF9vZmZzZXQrdGVtcDIrNjQqKHRlbXAxKSwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2oreXV2NDIwX3dpZHRoKihpKzEpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSsxKSwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2oreXV2NDIwX3dpZHRoKihpKzIpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSsyKSwgNCk7CisgICAgICAgICAgICAgICAgbWVtY3B5KHl1djQyMF9kZXN0K2oreXV2NDIwX3dpZHRoKihpKzMpLCBudjEydF9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSszKSwgNCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qCisgKiBDb252ZXJ0cyBhbmQgRGVpbnRlcmxlYXZlcyB0aWxlZCBkYXRhIHRvIGxpbmVhcgorICogMS4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUAorICoKKyAqIEBwYXJhbSB5dXY0MjBfdV9kZXN0CisgKiAgIFUgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3ZfZGVzdAorICogICBWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIG52MTJ0X3NyYworICogICBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfdXZfaGVpZ2h0CisgKiAgIEhlaWdodC8yIG9mIFlVVjQyMFtpbl0KKyAqLwordm9pZCBjc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZShjaGFyICp5dXY0MjBfdV9kZXN0LCBjaGFyICp5dXY0MjBfdl9kZXN0LCBjaGFyICpudjEydF91dl9zcmMsIGludCB5dXY0MjBfd2lkdGgsIGludCB5dXY0MjBfdXZfaGVpZ2h0KQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGludCB0aWxlZF94X2luZGV4ID0gMCwgdGlsZWRfeV9pbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IGFsaWduZWRfeF9zaXplID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGlsZWRfb2Zmc2V0ID0gMCwgdGlsZWRfb2Zmc2V0MSA9IDAsIHRpbGVkX29mZnNldDIgPSAwLCB0aWxlZF9vZmZzZXQzID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGVtcDEgPSAwLCB0ZW1wMiA9IDA7CisKKyAgICBpZiAoeXV2NDIwX3dpZHRoID49IDEwMjQpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8eXV2NDIwX3V2X2hlaWdodDsgaT1pKzEpIHsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IDA7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldCsyMDQ4KjE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldCsyMDQ4KjI7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4KjM7CisgICAgICAgICAgICAgICAgdGVtcDIgPSA4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIC8qIGV2ZW4gZm9tdWxhOiB4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqNjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4Kjc7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldCsyMDQ4KjI7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCozOworICAgICAgICAgICAgICAgICAgICB0ZW1wMiA9IDQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K3l1djQyMF93aWR0aC8yKihpKSwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSksIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMSwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMSwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDErNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMiwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMiwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMywgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMywgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworCisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0Mit0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldDMrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjQsIHl1djQyMF92X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjQsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNSwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNSwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDErNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNiwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNiwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNywgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqNywgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworCisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0Mit0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldDMrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjgsIHl1djQyMF92X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjgsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqOSwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqOSwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDErNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMTAsIHl1djQyMF92X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjEwLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0Mis2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K3l1djQyMF93aWR0aC8yKihpKSszMioxMSwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMTEsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0MSt0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MiA9IHRpbGVkX29mZnNldDIrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQzK3RlbXAyKjIwNDg7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K3l1djQyMF93aWR0aC8yKihpKSszMioxMiwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMTIsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMTMsIHl1djQyMF92X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjEzLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K3l1djQyMF93aWR0aC8yKihpKSszMioxNCwgeXV2NDIwX3ZfZGVzdCt5dXY0MjBfd2lkdGgvMiooaSkrMzIqMTQsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQyKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjE1LCB5dXY0MjBfdl9kZXN0K3l1djQyMF93aWR0aC8yKihpKSszMioxNSwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICB9CisgICAgICAgIGFsaWduZWRfeF9zaXplID0gMTAyNDsKKyAgICB9CisKKyAgICBpZiAoKHl1djQyMF93aWR0aC1hbGlnbmVkX3hfc2l6ZSkgPj0gNTEyKSB7CisgICAgICAgIGZvciAoaT0wOyBpPHl1djQyMF91dl9oZWlnaHQ7IGk9aSsxKSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDIgPSB0aWxlZF9vZmZzZXQrMjA0OCoyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCozOworICAgICAgICAgICAgICAgIHRlbXAyID0gODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKHl1djQyMF91dl9oZWlnaHQrMzEpPj41KTw8NTsKKyAgICAgICAgICAgICAgICAvKiBldmVuIGZvbXVsYTogeF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgaWYgKChpKzMyKTx0ZW1wMikgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrKHRlbXAxPDwxMSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqNjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4Kjc7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gODsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj42OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrKHRlbXAxPDwxMSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4KjM7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSksIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSksIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMioxLCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjEsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqMiwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMioyLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0Mis2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjMsIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqMywgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDMrNjQqKHRlbXAxKSwgNjQpOworCisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQxK3RlbXAyKjIwNDg7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0Mit0ZW1wMioyMDQ4OworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldDMrdGVtcDIqMjA0ODsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqNCwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMio0LCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqNSwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMio1LCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjYsIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqNiwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMio3LCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjcsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IGFsaWduZWRfeF9zaXplKzUxMjsKKyAgICB9CisKKyAgICBpZiAoKHl1djQyMF93aWR0aC1hbGlnbmVkX3hfc2l6ZSkgPj0gMjU2KSB7CisgICAgICAgIGZvciAoaT0wOyBpPHl1djQyMF91dl9oZWlnaHQ7IGk9aSsxKSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDIgPSB0aWxlZF9vZmZzZXQrMjA0OCoyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDMgPSB0aWxlZF9vZmZzZXQrMjA0OCozOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIC8qIGV2ZW4gZm9tdWxhOiB4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gYWxpZ25lZF94X3NpemU+PjU7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsodGVtcDE8PDExKTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldCsyMDQ4KjE7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDIgPSB0aWxlZF9vZmZzZXQrMjA0OCo2OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQzID0gdGlsZWRfb2Zmc2V0KzIwNDgqNzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj42OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrKHRlbXAxPDwxMSk7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQyID0gdGlsZWRfb2Zmc2V0KzIwNDgqMjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MyA9IHRpbGVkX29mZnNldCsyMDQ4KjM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpLCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqMSwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMioxLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDEpLCA2NCk7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjIsIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSkrMzIqMiwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldDIrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMiozLCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjMsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQzKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IGFsaWduZWRfeF9zaXplKzI1NjsKKyAgICB9CisKKyAgICBpZiAoKHl1djQyMF93aWR0aC1hbGlnbmVkX3hfc2l6ZSkgPj0gMTI4KSB7CisgICAgICAgIGZvciAoaT0wOyBpPHl1djQyMF91dl9oZWlnaHQ7IGk9aSsyKSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldDEgPSB0aWxlZF9vZmZzZXQrMjA0OCoxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIC8qIGV2ZW4gZm9tdWxhOiB4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gYWxpZ25lZF94X3NpemU+PjU7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsodGVtcDE8PDExKTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0MSA9IHRpbGVkX29mZnNldCsyMDQ4KjE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQxID0gdGlsZWRfb2Zmc2V0KzIwNDgqMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSksIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSksIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKSszMioxLCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpKzMyKjEsIG52MTJ0X3V2X3NyYyt0aWxlZF9vZmZzZXQxKzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKzEpLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSsxKSwgNjQpOworICAgICAgICAgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkoeXV2NDIwX3VfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKzEpKzMyKjEsIHl1djQyMF92X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSsxKSszMioxLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0MSs2NCoodGVtcDErMSksIDY0KTsKKyAgICAgICAgfQorICAgICAgICBhbGlnbmVkX3hfc2l6ZSA9IGFsaWduZWRfeF9zaXplKzEyODsKKyAgICB9CisKKyAgICBpZiAoKHl1djQyMF93aWR0aC1hbGlnbmVkX3hfc2l6ZSkgPj0gNjQpIHsKKyAgICAgICAgZm9yIChpPTA7IGk8eXV2NDIwX3V2X2hlaWdodDsgaT1pKzIpIHsKKyAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IDA7CisgICAgICAgICAgICB0aWxlZF94X2luZGV4ID0gYWxpZ25lZF94X3NpemU+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICB0ZW1wMiA9IGFsaWduZWRfeF9zaXplJjB4M0Y7CisgICAgICAgICAgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSh5dXY0MjBfdV9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpLCB5dXY0MjBfdl9kZXN0K2FsaWduZWRfeF9zaXplLzIreXV2NDIwX3dpZHRoLzIqKGkpLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSksIDY0KTsKKyAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3QrYWxpZ25lZF94X3NpemUvMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgeXV2NDIwX3ZfZGVzdCthbGlnbmVkX3hfc2l6ZS8yK3l1djQyMF93aWR0aC8yKihpKzEpLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSsxKSwgNjQpOworICAgICAgICB9CisgICAgICAgIGFsaWduZWRfeF9zaXplID0gYWxpZ25lZF94X3NpemUrNjQ7CisgICAgfQorCisgICAgaWYgKHl1djQyMF93aWR0aCAhPSBhbGlnbmVkX3hfc2l6ZSkgeworICAgICAgICBmb3IgKGk9MDsgaTx5dXY0MjBfdXZfaGVpZ2h0OyBpPWkrMikgeworICAgICAgICAgICAgZm9yIChqPWFsaWduZWRfeF9zaXplOyBqPHl1djQyMF93aWR0aDsgaj1qKzQpIHsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgICAgIHRpbGVkX3hfaW5kZXggPSBqPj42OworICAgICAgICAgICAgICAgIHRpbGVkX3lfaW5kZXggPSBpPj41OworICAgICAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXAyID0gKCh5dXY0MjBfdXZfaGVpZ2h0KzMxKT4+NSk8PDU7CisgICAgICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4xIGZvbXVsYTogeCsoKHgrMik+PjIpPDwyK3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gdGlsZWRfeF9pbmRleCsyOworICAgICAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeF9pbmRleCt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlbXAxID0gaSYweDFGOworICAgICAgICAgICAgICAgIHRlbXAyID0gaiYweDNGOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3Qrai8yK3l1djQyMF93aWR0aC8yKihpKSwgeXV2NDIwX3ZfZGVzdCtqLzIreXV2NDIwX3dpZHRoLzIqKGkpLCBudjEydF91dl9zcmMrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSksIDQpOworICAgICAgICAgICAgICAgIGNzY19kZWludGVybGVhdmVfbWVtY3B5KHl1djQyMF91X2Rlc3Qrai8yK3l1djQyMF93aWR0aC8yKihpKzEpLCB5dXY0MjBfdl9kZXN0K2ovMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgbnYxMnRfdXZfc3JjK3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDErMSksIDQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvKgorICogQ29udmVydHMgbGluZWFyIGRhdGEgdG8gdGlsZWQuCisgKiAxLiBZIG9mIFlVVjQyMFAgdG8gWSBvZiBOVjEyVAorICogMi4gWSBvZiBZVVY0MjBTIHRvIFkgb2YgTlYxMlQKKyAqIDMuIFVWIG9mIFlVVjQyMFMgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQKFMpW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIFk6IEhlaWdodCBvZiBZVVY0MjAsIFVWOiBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZChjaGFyICpudjEydF9kZXN0LCBjaGFyICp5dXY0MjBfc3JjLCBpbnQgeXV2NDIwX3dpZHRoLCBpbnQgeXV2NDIwX2hlaWdodCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICB1bnNpZ25lZCBpbnQgdGlsZWRfeF9pbmRleCA9IDAsIHRpbGVkX3lfaW5kZXggPSAwOworICAgIHVuc2lnbmVkIGludCBhbGlnbmVkX3hfc2l6ZSA9IDAsIGFsaWduZWRfeV9zaXplID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICB1bnNpZ25lZCBpbnQgdGVtcDEgPSAwLCB0ZW1wMiA9IDA7CisKKyAgICBhbGlnbmVkX3lfc2l6ZSA9ICh5dXY0MjBfaGVpZ2h0Pj41KTw8NTsKKyAgICBhbGlnbmVkX3hfc2l6ZSA9ICh5dXY0MjBfd2lkdGg+PjYpPDw2OworCisgICAgZm9yIChpPTA7IGk8YWxpZ25lZF95X3NpemU7IGk9aSszMikgeworICAgICAgICBmb3IgKGo9MDsgajxhbGlnbmVkX3hfc2l6ZTsgaj1qKzY0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMSwgeXV2NDIwX3NyYytqK3l1djQyMF93aWR0aCooaSsxKSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjIsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMiksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCozLCB5dXY0MjBfc3JjK2oreXV2NDIwX3dpZHRoKihpKzMpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqNCwgeXV2NDIwX3NyYytqK3l1djQyMF93aWR0aCooaSs0KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjUsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrNSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCo2LCB5dXY0MjBfc3JjK2oreXV2NDIwX3dpZHRoKihpKzYpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqNywgeXV2NDIwX3NyYytqK3l1djQyMF93aWR0aCooaSs3KSwgNjQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0KjgsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrOCksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCo5LCB5dXY0MjBfc3JjK2oreXV2NDIwX3dpZHRoKihpKzkpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTAsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTApLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTEsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTIsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTIpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTMsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTMpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTQsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTQpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTUsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTUpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTYsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTYpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTcsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTcpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTgsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTgpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMTksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMTkpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjAsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjApLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjEsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjEpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjIsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjIpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjMsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjMpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjQsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjQpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjUsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjUpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjYsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjYpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjcsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjcpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjgsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjgpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMjksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMjkpLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMzAsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMzApLCA2NCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqMzEsIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMzEpLCA2NCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGk9YWxpZ25lZF95X3NpemU7IGk8eXV2NDIwX2hlaWdodDsgaT1pKzQpIHsKKyAgICAgICAgZm9yIChqPTA7IGo8YWxpZ25lZF94X3NpemU7IGo9ais2NCkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3hfaW5kZXggPSBqPj42OworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKHl1djQyMF9oZWlnaHQrMzEpPj41KTw8NTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4xIGZvbXVsYTogeCsoKHgrMik+PjIpPDwyK3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSB0aWxlZF94X2luZGV4KzI7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAxPj4yKTw8MjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeF9pbmRleCt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMiBmb211bGE6IHgreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgeXV2NDIwX3NyYytqK3l1djQyMF93aWR0aCooaSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDErMSksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMSksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDErMiksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMiksIDY0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDErMyksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMyksIDY0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT0wOyBpPHl1djQyMF9oZWlnaHQ7IGk9aSs0KSB7CisgICAgICAgIGZvciAoaj1hbGlnbmVkX3hfc2l6ZTsgajx5dXY0MjBfd2lkdGg7IGo9ais0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0ZW1wMSA9IGkmMHgxRjsKKyAgICAgICAgICAgIHRlbXAyID0gaiYweDNGOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkpLCA0KTsKKyAgICAgICAgICAgIG1lbWNweShudjEydF9kZXN0K3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDErMSksIHl1djQyMF9zcmMrait5dXY0MjBfd2lkdGgqKGkrMSksIDQpOworICAgICAgICAgICAgbWVtY3B5KG52MTJ0X2Rlc3QrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSsyKSwgeXV2NDIwX3NyYytqK3l1djQyMF93aWR0aCooaSsyKSwgNCk7CisgICAgICAgICAgICBtZW1jcHkobnYxMnRfZGVzdCt0aWxlZF9vZmZzZXQrdGVtcDIrNjQqKHRlbXAxKzMpLCB5dXY0MjBfc3JjK2oreXV2NDIwX3dpZHRoKihpKzMpLCA0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoKKyAqIENvbnZlcnRzIGFuZCBJbnRlcmxlYXZlcyBsaW5lYXIgdG8gdGlsZWQKKyAqIDEuIFVWIG9mIFlVVjQyMFAgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfdXZfZGVzdAorICogICBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF91X3NyYworICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF92X3NyYworICogICBWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3V2X2hlaWdodAorICogICBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlKGNoYXIgKm52MTJ0X3V2X2Rlc3QsIGNoYXIgKnl1djQyMHBfdV9zcmMsIGNoYXIgKnl1djQyMHBfdl9zcmMsIGludCB5dXY0MjBfd2lkdGgsIGludCB5dXY0MjBfdXZfaGVpZ2h0KQoreworICAgIHVuc2lnbmVkIGludCBpLCBqOworICAgIHVuc2lnbmVkIGludCB0aWxlZF94X2luZGV4ID0gMCwgdGlsZWRfeV9pbmRleCA9IDA7CisgICAgdW5zaWduZWQgaW50IGFsaWduZWRfeF9zaXplID0gMCwgYWxpZ25lZF95X3NpemUgPSAwOworICAgIHVuc2lnbmVkIGludCB0aWxlZF9vZmZzZXQgPSAwOworICAgIHVuc2lnbmVkIGludCB0ZW1wMSA9IDAsIHRlbXAyID0gMDsKKworICAgIGFsaWduZWRfeV9zaXplID0gKHl1djQyMF91dl9oZWlnaHQ+PjUpPDw1OworICAgIGFsaWduZWRfeF9zaXplID0gKCh5dXY0MjBfd2lkdGgpPj42KTw8NjsKKworICAgIGZvciAoaT0wOyBpPGFsaWduZWRfeV9zaXplOyBpPWkrMzIpIHsKKyAgICAgICAgZm9yIChqPTA7IGo8YWxpZ25lZF94X3NpemU7IGo9ais2NCkgeworICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIHRpbGVkX3hfaW5kZXggPSBqPj42OworICAgICAgICAgICAgdGlsZWRfeV9pbmRleCA9IGk+PjU7CisgICAgICAgICAgICBpZiAodGlsZWRfeV9pbmRleCAmIDB4MSkgeworICAgICAgICAgICAgICAgIC8qIG9kZCBmb211bGE6IDIreCsoeD4+Mik8PDIreF9ibG9ja19udW0qKHktMSkgKi8KKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTE7CisgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeF9pbmRleDsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMjsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICh0aWxlZF94X2luZGV4Pj4yKTw8MjsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDE7CisgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGVtcDIgPSAoKHl1djQyMF91dl9oZWlnaHQrMzEpPj41KTw8NTsKKyAgICAgICAgICAgICAgICBpZiAoKGkrMzIpPHRlbXAyKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4xIGZvbXVsYTogeCsoKHgrMik+PjIpPDwyK3hfYmxvY2tfbnVtKnkgKi8KKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSB0aWxlZF94X2luZGV4KzI7CisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKHRlbXAxPj4yKTw8MjsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeF9pbmRleCt0ZW1wMTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAoKHl1djQyMF93aWR0aCsxMjcpPj43KTw8NzsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvKiBldmVuMiBmb211bGE6IHgreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+Nik7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyKSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCozLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSszKSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo0LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs0KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrNCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo1LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs1KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrNSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo2LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs2KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrNiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo3LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs3KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrNyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo4LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs4KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrOCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCo5LCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSs5KSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrOSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTApLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxMCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTEpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxMSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMiwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTIpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxMiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxMywgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTMpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxMyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxNCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTQpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxNCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxNSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTUpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxNSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxNiwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTYpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxNiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxNywgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTcpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxNyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxOCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTgpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxOCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoxOSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMTkpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxOSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyMCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjApLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyMCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyMSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjEpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyMSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyMiwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjIpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyMiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyMywgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjMpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyMyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyNCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjQpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyNCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyNSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjUpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyNSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyNiwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjYpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyNiksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyNywgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjcpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyNyksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyOCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjgpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyOCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoyOSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMjkpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsyOSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCozMCwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMzApLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSszMCksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCozMSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMzEpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSszMSksIDMyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT1hbGlnbmVkX3lfc2l6ZTsgaTx5dXY0MjBfdXZfaGVpZ2h0OyBpPWkrNCkgeworICAgICAgICBmb3IgKGo9MDsgajxhbGlnbmVkX3hfc2l6ZTsgaj1qKzY0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSksIDMyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCs2NCoodGVtcDErMSksIHl1djQyMHBfdV9zcmMrai8yK3l1djQyMF93aWR0aC8yKihpKzEpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgMzIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0KzY0Kih0ZW1wMSsyKSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMiksIHl1djQyMHBfdl9zcmMrai8yK3l1djQyMF93aWR0aC8yKihpKzIpLCAzMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrNjQqKHRlbXAxKzMpLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSszKSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMyksIDMyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaT0wOyBpPHl1djQyMF91dl9oZWlnaHQ7IGk9aSs0KSB7CisgICAgICAgIGZvciAoaj1hbGlnbmVkX3hfc2l6ZTsgajx5dXY0MjBfd2lkdGg7IGo9ais0KSB7CisgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSAwOworICAgICAgICAgICAgdGlsZWRfeF9pbmRleCA9IGo+PjY7CisgICAgICAgICAgICB0aWxlZF95X2luZGV4ID0gaT4+NTsKKyAgICAgICAgICAgIGlmICh0aWxlZF95X2luZGV4ICYgMHgxKSB7CisgICAgICAgICAgICAgICAgLyogb2RkIGZvbXVsYTogMit4Kyh4Pj4yKTw8Mit4X2Jsb2NrX251bSooeS0xKSAqLworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgtMTsKKyAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0aWxlZF94X2luZGV4OworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyOworICAgICAgICAgICAgICAgIHRlbXAxID0gKHRpbGVkX3hfaW5kZXg+PjIpPDwyOworICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMTsKKyAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0ZW1wMiA9ICgoeXV2NDIwX3V2X2hlaWdodCszMSk+PjUpPDw1OworICAgICAgICAgICAgICAgIGlmICgoaSszMik8dGVtcDIpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogZXZlbjEgZm9tdWxhOiB4KygoeCsyKT4+Mik8PDIreF9ibG9ja19udW0qeSAqLworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9IHRpbGVkX3hfaW5kZXgrMjsKKyAgICAgICAgICAgICAgICAgICAgdGVtcDEgPSAodGVtcDE+PjIpPDwyOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF94X2luZGV4K3RlbXAxOworICAgICAgICAgICAgICAgICAgICB0ZW1wMSA9ICgoeXV2NDIwX3dpZHRoKzEyNyk+PjcpPDw3OworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpOworICAgICAgICAgICAgICAgICAgICB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGV2ZW4yIGZvbXVsYTogeCt4X2Jsb2NrX251bSp5ICovCisgICAgICAgICAgICAgICAgICAgIHRlbXAxID0gKCh5dXY0MjBfd2lkdGgrMTI3KT4+Nyk8PDc7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KTsKKyAgICAgICAgICAgICAgICAgICAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RpbGVkX3hfaW5kZXg7CisgICAgICAgICAgICAgICAgICAgIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGVtcDEgPSBpJjB4MUY7CisgICAgICAgICAgICB0ZW1wMiA9IGomMHgzRjsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDEpLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSksIHl1djQyMHBfdl9zcmMrai8yK3l1djQyMF93aWR0aC8yKihpKSwgMik7CisgICAgICAgICAgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHkobnYxMnRfdXZfZGVzdCt0aWxlZF9vZmZzZXQrdGVtcDIrNjQqKHRlbXAxKzEpLCB5dXY0MjBwX3Vfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSsxKSwgeXV2NDIwcF92X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMSksIDIpOworICAgICAgICAgICAgY3NjX2ludGVybGVhdmVfbWVtY3B5KG52MTJ0X3V2X2Rlc3QrdGlsZWRfb2Zmc2V0K3RlbXAyKzY0Kih0ZW1wMSsyKSwgeXV2NDIwcF91X3NyYytqLzIreXV2NDIwX3dpZHRoLzIqKGkrMiksIHl1djQyMHBfdl9zcmMrai8yK3l1djQyMF93aWR0aC8yKihpKzIpLCAyKTsKKyAgICAgICAgICAgIGNzY19pbnRlcmxlYXZlX21lbWNweShudjEydF91dl9kZXN0K3RpbGVkX29mZnNldCt0ZW1wMis2NCoodGVtcDErMyksIHl1djQyMHBfdV9zcmMrai8yK3l1djQyMF93aWR0aC8yKihpKzMpLCB5dXY0MjBwX3Zfc3JjK2ovMit5dXY0MjBfd2lkdGgvMiooaSszKSwgMik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfZGVpbnRlcmxlYXZlX21lbWNweS5zIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL2NzY19kZWludGVybGVhdmVfbWVtY3B5LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1NTA4MAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfZGVpbnRlcmxlYXZlX21lbWNweS5zCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX2RlaW50ZXJsZWF2ZV9tZW1jcHkucworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS43LjAxIDogQ3JlYXRlCisgKi8KKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY19kZWludGVybGVhdmVfbWVtY3B5CisgICAgLnR5cGUgICBjc2NfZGVpbnRlcmxlYXZlX21lbWNweSwgJWZ1bmN0aW9uCitjc2NfZGVpbnRlcmxlYXZlX21lbWNweToKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICBkZXN0MQorICAgIEByMSAgICAgZGVzdDIKKyAgICBAcjIgICAgIHNyYworICAgIEByMyAgICAgc3JjX3NpemUKKyAgICBAcjQgICAgIGkKKyAgICBAcjUgICAgIHRlbXAxCisgICAgQHI2ICAgICB0ZW1wMgorICAgIEByNyAgICAgdGVtcDMKKworICAgIHN0bWZkICAgICAgIHNwISwge3I0LXIxMixyMTR9ICAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworCisgICAgbW92ICAgICAgICAgcjQsICMwCisgICAgY21wICAgICAgICAgcjMsICMyNTYKKyAgICBibHQgICAgICAgICBMSU5FQVJfU0laRV8xMjgKKworICAgIGJpYyAgICAgICAgIHI1LCByMywgIzB4RkYKK0xJTkVBUl9TSVpFXzI1Nl9MT09QOgorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjJdIQorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjJdIQorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjJdIQorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjJdIQorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxOCwgcTl9LCBbcjJdIQorICAgIHBsZCAgICAgICAgIFtyMiwgIzY0XQorICAgIHZsZDIuOCAgICAgIHtxMTAsIHExMX0sIFtyMl0hCisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IyXSEKKyAgICB2bGQyLjggICAgICB7cTE0LCBxMTV9LCBbcjJdIQorCisgICAgdnN0MS44ICAgICAge3EwfSwgW3IwXSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjBdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyMF0hCisgICAgdnN0MS44ICAgICAge3E2fSwgW3IwXSEKKyAgICB2c3QxLjggICAgICB7cTh9LCBbcjBdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjBdIQorICAgIHZzdDEuOCAgICAgIHtxMTJ9LCBbcjBdIQorICAgIHZzdDEuOCAgICAgIHtxMTR9LCBbcjBdIQorCisgICAgdnN0MS44ICAgICAge3ExfSwgW3IxXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMV0hCisgICAgdnN0MS44ICAgICAge3E3fSwgW3IxXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgIHtxMTF9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgIHtxMTN9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjFdIQorCisgICAgYWRkICAgICAgICAgcjQsICMyNTYKKyAgICBjbXAgICAgICAgICByNCwgcjUKKyAgICBibHQgICAgICAgICBMSU5FQVJfU0laRV8yNTZfTE9PUAorCitMSU5FQVJfU0laRV8xMjg6CisgICAgc3ViICAgICAgICAgcjUsIHIzLCByNAorICAgIGNtcCAgICAgICAgIHI1LCAjNjQKKyAgICBibHQgICAgICAgICBMSU5FQVJfU0laRV80CisgICAgcGxkICAgICAgICAgW3IyLCAjNjRdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyMl0hCisgICAgcGxkICAgICAgICAgW3IyLCAjNjRdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyMl0hCisgICAgdmxkMi44ICAgICAge3E0LCBxNX0sIFtyMl0hCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMl0hCisKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjBdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyMF0hCisgICAgdnN0MS44ICAgICAge3EyfSwgW3IwXSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjBdIQorCisgICAgdnN0MS44ICAgICAge3ExfSwgW3IxXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjFdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMV0hCisgICAgdnN0MS44ICAgICAge3E3fSwgW3IxXSEKKworICAgIGFkZCAgICAgICAgIHI0LCAjMTI4CisKK0xJTkVBUl9TSVpFXzQ6CisgICAgbGRyYiAgICAgICAgcjYsIFtyMl0sICMxCisgICAgbGRyYiAgICAgICAgcjcsIFtyMl0sICMxCisgICAgbGRyYiAgICAgICAgcjgsIFtyMl0sICMxCisgICAgbGRyYiAgICAgICAgcjksIFtyMl0sICMxCisKKyAgICBzdHJiICAgICAgICByNiwgW3IwXSwgIzEKKyAgICBzdHJiICAgICAgICByOCwgW3IwXSwgIzEKKyAgICBzdHJiICAgICAgICByNywgW3IxXSwgIzEKKyAgICBzdHJiICAgICAgICByOSwgW3IxXSwgIzEKKworICAgIGFkZCAgICAgICAgIHI0LCAjNAorICAgIGNtcCAgICAgICAgIHI0LCByMworICAgIGJsdCAgICAgICAgIExJTkVBUl9TSVpFXzQKKworUkVTVE9SRV9SRUc6CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNX0gICAgICAgQCByZXN0b3JlIHJlZ2lzdGVycworICAgIC5mbmVuZAorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY3NjX2ludGVybGVhdmVfbWVtY3B5LnMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY3NjX2ludGVybGVhdmVfbWVtY3B5LnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmNDQzNgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfaW50ZXJsZWF2ZV9tZW1jcHkucwpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIGNzY19pbnRlcmxlYXZlX21lbWNweS5zCisgKiBAYnJpZWYgICBTRUNfT01YIHNwZWNpZmljIGRlZmluZQorICogQGF1dGhvciAgU2hpbldvbiBMZWUgKHNoaW53b24ubGVlQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gMS4wCisgKiBAaGlzdG9yeQorICogICAyMDExLjcuMDEgOiBDcmVhdGUKKyAqLworICAgIC5hcmNoIGFybXY3LWEKKyAgICAudGV4dAorICAgIC5nbG9iYWwgY3NjX2ludGVybGVhdmVfbWVtY3B5CisgICAgLnR5cGUgICBjc2NfaW50ZXJsZWF2ZV9tZW1jcHksICVmdW5jdGlvbgorY3NjX2ludGVybGVhdmVfbWVtY3B5OgorICAgIC5mbnN0YXJ0CisKKyAgICBAcjAgICAgIGRlc3QKKyAgICBAcjEgICAgIHNyYzEKKyAgICBAcjIgICAgIHNyYzIKKyAgICBAcjMgICAgIHNyY19zaXplCisgICAgQHI0ICAgICBpCisgICAgQHI1ICAgICB0ZW1wMQorICAgIEByNiAgICAgdGVtcDIKKyAgICBAcjcgICAgIHRlbXAzCisgICAgQHI4ICAgICB0ZW1wMgorICAgIEByOSAgICAgdGVtcDMKKworICAgIHN0bWZkICAgICAgIHNwISwge3I0LXIxMixyMTR9ICAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworCisgICAgbW92ICAgICAgICAgcjQsICMwCisgICAgY21wICAgICAgICAgcjMsICMxMjgKKyAgICBibHQgICAgICAgICBMSU5FQVJfU0laRV82NAorCisgICAgYmljICAgICAgICAgcjUsIHIzLCAjMHgyRgorTElORUFSX1NJWkVfMTI4X0xPT1A6CisgICAgcGxkICAgICAgICAgW3IxLCAjNjRdCisgICAgdmxkMS44ICAgICAge3EwfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjFdIQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyMV0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3IxXSEKKyAgICBwbGQgICAgICAgICBbcjJdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTEyfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTE0fSwgW3IxXSEKKyAgICBwbGQgICAgICAgICBbcjIsICM2NF0KKyAgICB2bGQxLjggICAgICB7cTF9LCBbcjJdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMl0hCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IyXSEKKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjJdIQorICAgIHZsZDEuOCAgICAgIHtxOX0sIFtyMl0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMl0hCisgICAgdmxkMS44ICAgICAge3ExM30sIFtyMl0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMl0hCisKKyAgICB2c3QyLjggICAgICB7cTAsIHExfSwgW3IwXSEKKyAgICB2c3QyLjggICAgICB7cTIsIHEzfSwgW3IwXSEKKyAgICB2c3QyLjggICAgICB7cTQsIHE1fSwgW3IwXSEKKyAgICB2c3QyLjggICAgICB7cTYsIHE3fSwgW3IwXSEKKyAgICB2c3QyLjggICAgICB7cTgsIHE5fSwgW3IwXSEKKyAgICB2c3QyLjggICAgICB7cTEwLCBxMTF9LCBbcjBdIQorICAgIHBsZCAgICAgICAgIFtyMV0KKyAgICB2c3QyLjggICAgICB7cTEyLCBxMTN9LCBbcjBdIQorICAgIHZzdDIuOCAgICAgIHtxMTQsIHExNX0sIFtyMF0hCisKKyAgICBhZGQgICAgICAgICByNCwgIzEyOAorICAgIGNtcCAgICAgICAgIHI0LCByNQorICAgIGJsdCAgICAgICAgIExJTkVBUl9TSVpFXzEyOF9MT09QCisKK0xJTkVBUl9TSVpFXzY0OgorICAgIHN1YiAgICAgICAgIHI1LCByMywgcjQKKyAgICBjbXAgICAgICAgICByNSwgIzY0CisgICAgYmx0ICAgICAgICAgTElORUFSX1NJWkVfMgorTElORUFSX1NJWkVfNjRfTE9PUDoKKyAgICBwbGQgICAgICAgICBbcjJdCisgICAgdmxkMS44ICAgICAge3EwfSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTJ9LCBbcjFdIQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyMV0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3IxXSEKKyAgICB2bGQxLjggICAgICB7cTF9LCBbcjJdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMl0hCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IyXSEKKyAgICB2bGQxLjggICAgICB7cTd9LCBbcjJdIQorCisgICAgdnN0Mi44ICAgICAge3EwLCBxMX0sIFtyMF0hCisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyMF0hCisgICAgcGxkICAgICAgICAgW3IxXQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjBdIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjBdIQorCisgICAgYWRkICAgICAgICAgcjQsICM2NAorICAgIGNtcCAgICAgICAgIHI0LCByMworICAgIGJsdCAgICAgICAgIExJTkVBUl9TSVpFXzY0X0xPT1AKKworTElORUFSX1NJWkVfMjoKKyAgICBzdWIgICAgICAgICByNSwgcjMsIHI0CisgICAgY21wICAgICAgICAgcjUsICMyCisgICAgYmx0ICAgICAgICAgUkVTVE9SRV9SRUcKK0xJTkVBUl9TSVpFXzJfTE9PUDoKKyAgICBsZHJiICAgICAgICByNiwgW3IxXSwgIzEKKyAgICBsZHJiICAgICAgICByNywgW3IyXSwgIzEKKyAgICBsZHJiICAgICAgICByOCwgW3IxXSwgIzEKKyAgICBsZHJiICAgICAgICByOSwgW3IyXSwgIzEKKworICAgIHN0cmIgICAgICAgIHI2LCBbcjBdLCAjMQorICAgIHN0cmIgICAgICAgIHI3LCBbcjBdLCAjMQorICAgIHN0cmIgICAgICAgIHI4LCBbcjBdLCAjMQorICAgIHN0cmIgICAgICAgIHI5LCBbcjBdLCAjMQorCisgICAgYWRkICAgICAgICAgcjQsICMyCisgICAgY21wICAgICAgICAgcjQsIHIzCisgICAgYmx0ICAgICAgICAgTElORUFSX1NJWkVfMl9MT09QCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKyAgICAuZm5lbmQKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL2NzY19udjEydF95dXY0MjBfdXZfbmVvbi5zIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL2NzY19udjEydF95dXY0MjBfdXZfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZTM1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY3NjX252MTJ0X3l1djQyMF91dl9uZW9uLnMKQEAgLTAsMCArMSw3NjggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTEgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBjc2NfbnYxMnRfeXV2NDIwX3V2X25lb24ucworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS43LjAxIDogQ3JlYXRlCisgKi8KKworLyoKKyAqIENvbnZlcnRzIGFuZCBEZWludGVybGVhdmVzIHRpbGVkIGRhdGEgdG8gbGluZWFyCisgKiAxLiBVViBvZiBOVjEyVCB0byBVViBvZiBZVVY0MjBQCisgKgorICogQHBhcmFtIHl1djQyMF91X2Rlc3QKKyAqICAgVSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBfdl9kZXN0CisgKiAgIFYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF91dl9oZWlnaHQKKyAqICAgSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCisKKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY190aWxlZF90b19saW5lYXJfZGVpbnRlcmxlYXZlCisgICAgLnR5cGUgICBjc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZSwgJWZ1bmN0aW9uCitjc2NfdGlsZWRfdG9fbGluZWFyX2RlaW50ZXJsZWF2ZToKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICAgICAgbGluZWFyX3VfZGVzdAorICAgIEByMSAgICAgICAgIGxpbmVhcl92X2Rlc3QKKyAgICBAcjIgICAgICAgICB0aWxlZF91dl9zcmMKKyAgICBAcjMgICAgICAgICBsaW5lYXJfeF9zaXplCisgICAgQHI0ICAgICAgICAgbGluZWFyX3lfc2l6ZQorICAgIEByNSAgICAgICAgIGoKKyAgICBAcjYgICAgICAgICBpCisgICAgQHI3ICAgICAgICAgdGlsZWRfYWRkcgorICAgIEByOCAgICAgICAgIGxpbmVhcl9hZGRyCisgICAgQHI5ICAgICAgICAgYWxpZ25lZF94X3NpemUKKyAgICBAcjEwICAgICAgICB0ZW1wMQorICAgIEByMTEgICAgICAgIHRlbXAyCisgICAgQHIxMiAgICAgICAgdGVtcDMKKyAgICBAcjE0ICAgICAgICB0ZW1wNAorCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNH0gICAgICAgICAgICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKworICAgIGxkciAgICAgICAgIHI0LCBbc3AsICM0MF0gICAgICAgICAgIEAgbG9hZCBsaW5lYXJfeV9zaXplIHRvIHI0CisKKyAgICBtb3YgICAgICAgICByOSwgIzAKKworTElORUFSX1hfU0laRV8xMDI0OgorICAgIGNtcCAgICAgICAgIHIzLCAjMTAyNAorICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfNTEyCisKKyAgICBtb3YgICAgICAgICByNiwgIzAKK0xJTkVBUl9YX1NJWkVfMTAyNF9MT09QOgorICAgIG1vdiAgICAgICAgIHI3LCAjMCAgICAgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gMEAKKyAgICBtb3YgICAgICAgICByNSwgcjYsIGFzciAjNSAgICAgICAgICBAIHRpbGVkX3lfaW5kZXggPSBpPj41QAorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDEKKyAgICBjbXAgICAgICAgICByMTAsICMweDEKKyAgICBibmUgICAgICAgICBMSU5FQVJfWF9TSVpFXzEwMjRfTE9PUF9FVkVOCitMSU5FQVJfWF9TSVpFXzEwMjRfTE9PUF9PREQ6CisgICAgc3ViICAgICAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTFACisgICAgYWRkICAgICAgICAgcjEwLCByMywgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgobGluZWFyX3hfc2l6ZSsxMjcpPj43KTw8N0AKKyAgICBiaWMgICAgICAgICByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNywgcjcsIHIxMAorICAgIG1vdiAgICAgICAgIHI1LCAjOAorICAgIG1vdiAgICAgICAgIHI1LCByNSwgbHNsICMxMQorICAgIHN1YiAgICAgICAgIHI1LCByNSwgIzMyCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMkAKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTFACisgICAgYWRkICAgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBhZGQgICAgICAgICByMTIsIHI3LCAjNDA5NgorICAgIGFkZCAgICAgICAgIHIxNCwgcjcsICM2MTQ0CisgICAgYiAgICAgICAgICAgTElORUFSX1hfU0laRV8xMDI0X0xPT1BfTUVNQ1BZCisKK0xJTkVBUl9YX1NJWkVfMTAyNF9MT09QX0VWRU46CisgICAgYWRkICAgICAgICAgcjExLCByNCwgIzMxICAgICAgICAgICAgQCB0ZW1wMiA9ICgobGluZWFyX3lfc2l6ZSszMSk+PjUpPDw1QAorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgxRgorICAgIGFkZCAgICAgICAgIHIxMCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpQAorICAgIG11bCAgICAgICAgIHI3LCByNSwgcjEwCisgICAgYWRkICAgICAgICAgcjEyLCByNiwgIzMyCisgICAgY21wICAgICAgICAgcjEyLCByMTEKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTFACisgICAgYWRkICAgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBtb3ZsdCAgICAgICByNSwgIzgKKyAgICBhZGRsdCAgICAgICByMTIsIHI3LCAjMTIyODgKKyAgICBhZGRsdCAgICAgICByMTQsIHI3LCAjMTQzMzYKKyAgICBtb3ZnZSAgICAgICByNSwgIzQKKyAgICBhZGRnZSAgICAgICByMTIsIHI3LCAjMjA0OAorICAgIGFkZGdlICAgICAgIHIxNCwgcjcsICMyMDQ4CisgICAgbW92ICAgICAgICAgcjUsIHI1LCBsc2wgIzExCisgICAgc3ViICAgICAgICAgcjUsIHI1LCAjMzIKKworTElORUFSX1hfU0laRV8xMDI0X0xPT1BfTUVNQ1BZOgorICAgIGFuZCAgICAgICAgIHIxMCwgcjYsICMweDFGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzbCAjNgorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsIHIxMAorCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjEwICAgICAgICAgICBAIHRpbGVkX2FkZHIxID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgcjEwICAgICAgICAgICBAIHRpbGVkX2FkZHIyID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICB2bGQyLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjUKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgYWRkICAgICAgICAgcjE0LCByMTQsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMyA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMTFdLCByNQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMi44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICBtb3YgICAgICAgICByMTAsIHIzLCBhc3IgIzEKKyAgICB2bGQyLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXSwgcjUKKyAgICBtdWwgICAgICAgICByMTAsIHIxMCwgcjYKKyAgICB2bGQyLjggICAgICB7cTEyLCBxMTN9LCBbcjE0XSEKKyAgICB2bGQyLjggICAgICB7cTE0LCBxMTV9LCBbcjE0XSwgcjUKKworICAgIGFkZCAgICAgICAgIHI4LCByMCwgcjEwCisgICAgdnN0MS44ICAgICAge3EwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E2fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTh9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMTR9LCBbcjhdIQorCisgICAgYWRkICAgICAgICAgcjEwLCByMSwgcjEwCisgICAgdnN0MS44ICAgICAge3ExfSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3EzfSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3E1fSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3E3fSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3E5fSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3ExMX0sIFtyMTBdIQorICAgIHBsZCAgICAgICAgIFtyN10KKyAgICB2c3QxLjggICAgICB7cTEzfSwgW3IxMF0hCisgICAgcGxkICAgICAgICAgW3I3LCAjMzJdCisgICAgdnN0MS44ICAgICAge3ExNX0sIFtyMTBdIQorCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyN10sIHI1CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjExXSwgcjUKKyAgICBwbGQgICAgICAgICBbcjE0XQorICAgIHZsZDIuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICBwbGQgICAgICAgICBbcjE0LCAjMzJdCisgICAgdmxkMi44ICAgICAge3ExMCwgcTExfSwgW3IxMl0sIHI1CisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IxNF0hCisgICAgdmxkMi44ICAgICAge3ExNCwgcTE1fSwgW3IxNF0sIHI1CisKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E0fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExNH0sIFtyOF0hCisKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTV9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTd9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMF0hCisgICAgcGxkICAgICAgICAgW3I3XQorICAgIHZzdDEuOCAgICAgIHtxMTN9LCBbcjEwXSEKKyAgICBwbGQgICAgICAgICBbcjcsICMzMl0KKyAgICB2c3QxLjggICAgICB7cTE1fSwgW3IxMF0hCisKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjUKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMTFdLCByNQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMi44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXSwgcjUKKyAgICB2bGQyLjggICAgICB7cTEyLCBxMTN9LCBbcjE0XSEKKyAgICB2bGQyLjggICAgICB7cTE0LCBxMTV9LCBbcjE0XSwgcjUKKworICAgIHZzdDEuOCAgICAgIHtxMH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3EyfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTR9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxNn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTEwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTEyfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTE0fSwgW3I4XSEKKworICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxOX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxMTF9LCBbcjEwXSEKKyAgICBwbGQgICAgICAgICBbcjddCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIHBsZCAgICAgICAgIFtyNywgIzMyXQorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKworICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjddCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjExXQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMi44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDIuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdCisKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E0fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExNH0sIFtyOF0hCisKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTV9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTd9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMF0hCisgICAgYWRkICAgICAgICAgcjYsICMxCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMTAyNF9MT09QCisKKyAgICBtb3YgICAgICAgICByOSwgIzEwMjQKKworTElORUFSX1hfU0laRV81MTI6CisgICAgc3ViICAgICAgICAgcjEwLCByMywgcjkKKyAgICBjbXAgICAgICAgICByMTAsICM1MTIKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzI1NgorCisgICAgbW92ICAgICAgICAgcjYsICMwCitMSU5FQVJfWF9TSVpFXzUxMl9MT09QOgorICAgIG1vdiAgICAgICAgIHI3LCAjMCAgICAgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gMEAKKyAgICBtb3YgICAgICAgICByNSwgcjYsIGFzciAjNSAgICAgICAgICBAIHRpbGVkX3lfaW5kZXggPSBpPj41QAorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDEKKyAgICBjbXAgICAgICAgICByMTAsICMweDEKKyAgICBibmUgICAgICAgICBMSU5FQVJfWF9TSVpFXzUxMl9MT09QX0VWRU4KK0xJTkVBUl9YX1NJWkVfNTEyX0xPT1BfT0REOgorICAgIHN1YiAgICAgICAgIHI3LCByNSwgIzEgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xQAorICAgIGFkZCAgICAgICAgIHIxMCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NilACisgICAgbXVsICAgICAgICAgcjcsIHI3LCByMTAKKyAgICBtb3YgICAgICAgICByNSwgIzgKKyAgICBtb3YgICAgICAgICByNSwgcjUsIGxzbCAjMTEKKyAgICBhZGQgICAgICAgICByNywgcjcsICMyICAgICAgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyQAorICAgIG1vdiAgICAgICAgIHIxMCwgcjksIGFzciAjNQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMSwgcjcsICMyMDQ4CisgICAgYWRkICAgICAgICAgcjEyLCByNywgIzQwOTYKKyAgICBhZGQgICAgICAgICByMTQsIHI3LCAjNjE0NAorICAgIHN1YiAgICAgICAgIHI1LCByNSwgIzMyCisgICAgYiAgICAgICAgICAgTElORUFSX1hfU0laRV81MTJfTE9PUF9NRU1DUFkKKworTElORUFSX1hfU0laRV81MTJfTE9PUF9FVkVOOgorICAgIGFkZCAgICAgICAgIHIxMSwgcjQsICMzMSAgICAgICAgICAgIEAgdGVtcDIgPSAoKGxpbmVhcl95X3NpemUrMzEpPj41KTw8NUAKKyAgICBiaWMgICAgICAgICByMTEsIHIxMSwgIzB4MUYKKyAgICBhZGQgICAgICAgICByMTAsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAxID0gKChsaW5lYXJfeF9zaXplKzEyNyk+PjcpPDw3QAorICAgIGJpYyAgICAgICAgIHIxMCwgIzB4N0YKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgYXNyICM2ICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNywgcjUsIHIxMAorICAgIGFkZCAgICAgICAgIHIxMiwgcjYsICMzMgorICAgIGNtcCAgICAgICAgIHIxMiwgcjExCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIG1vdmx0ICAgICAgIHI1LCAjOAorICAgIG1vdmx0ICAgICAgIHIxMCwgcjksIGFzciAjNQorICAgIG1vdmdlICAgICAgIHIxMCwgcjksIGFzciAjNgorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwLCBsc2wgIzExCisgICAgYWRkICAgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBhZGRsdCAgICAgICByMTIsIHI3LCAjMTIyODgKKyAgICBhZGRsdCAgICAgICByMTQsIHI3LCAjMTQzMzYKKyAgICBtb3ZnZSAgICAgICByNSwgIzQKKyAgICBhZGRnZSAgICAgICByMTIsIHI3LCAjNDA5NgorICAgIGFkZGdlICAgICAgIHIxNCwgcjcsICM2MTQ0CisgICAgbW92ICAgICAgICAgcjUsIHI1LCBsc2wgIzExCisgICAgc3ViICAgICAgICAgcjUsIHI1LCAjMzIKKworTElORUFSX1hfU0laRV81MTJfTE9PUF9NRU1DUFk6CisgICAgYW5kICAgICAgICAgcjEwLCByNiwgIzB4MUYKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNsICM2CisgICAgYWRkICAgICAgICAgcjEwLCByMiwgcjEwCisKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjEgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjIgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByNQorICAgIHBsZCAgICAgICAgIFtyMTJdCisgICAgdmxkMi44ICAgICAge3E0LCBxNX0sIFtyMTFdIQorICAgIHBsZCAgICAgICAgIFtyMTIsICMzMl0KKyAgICBhZGQgICAgICAgICByMTQsIHIxNCwgcjEwICAgICAgICAgICBAIHRpbGVkX2FkZHIzID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICB2bGQyLjggICAgICB7cTYsIHE3fSwgW3IxMV0sIHI1CisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICBtb3YgICAgICAgICByMTAsIHIzLCBhc3IgIzEKKyAgICB2bGQyLjggICAgICB7cTgsIHE5fSwgW3IxMl0hCisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIG11bCAgICAgICAgIHIxMCwgcjEwLCByNgorICAgIHZsZDIuOCAgICAgIHtxMTAsIHExMX0sIFtyMTJdLCByNQorICAgIGFkZCAgICAgICAgIHI4LCByMCwgcjEwCisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IxNF0hCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByOSwgYXNyICMxCisgICAgdmxkMi44ICAgICAge3ExNCwgcTE1fSwgW3IxNF0sIHI1CisKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E0fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMn0sIFtyOF0hCisgICAgYWRkICAgICAgICAgcjEwLCByMSwgcjEwCisgICAgdnN0MS44ICAgICAge3ExNH0sIFtyOF0hCisKKyAgICBhZGQgICAgICAgICByMTAsIHIxMCwgcjksIGFzciAjMQorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxOX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxMTF9LCBbcjEwXSEKKyAgICBwbGQgICAgICAgICBbcjddCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIHBsZCAgICAgICAgIFtyNywgIzMyXQorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKworICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxMiwgcTN9LCBbcjddCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQyLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDIuOCAgICAgIHtxNiwgcTd9LCBbcjExXQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMi44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDIuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdCisKKyAgICB2c3QxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E0fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTZ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxOH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExMn0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3ExNH0sIFtyOF0hCisKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTV9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTd9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMF0hCisgICAgYWRkICAgICAgICAgcjYsICMxCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfNTEyX0xPT1AKKworICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzUxMgorCitMSU5FQVJfWF9TSVpFXzI1NjoKKyAgICBzdWIgICAgICAgICByMTAsIHIzLCByOQorICAgIGNtcCAgICAgICAgIHIxMCwgIzI1NgorICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMTI4CisKKyAgICBtb3YgICAgICAgICByNiwgIzAKK0xJTkVBUl9YX1NJWkVfMjU2X0xPT1A6CisgICAgbW92ICAgICAgICAgcjcsICMwICAgICAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSAwQAorICAgIG1vdiAgICAgICAgIHI1LCByNiwgYXNyICM1ICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IGk+PjVACisgICAgYW5kICAgICAgICAgcjEwLCByNSwgIzB4MQorICAgIGNtcCAgICAgICAgIHIxMCwgIzB4MQorICAgIGJuZSAgICAgICAgIExJTkVBUl9YX1NJWkVfMjU2X0xPT1BfRVZFTgorTElORUFSX1hfU0laRV8yNTZfTE9PUF9PREQ6CisgICAgc3ViICAgICAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTFACisgICAgYWRkICAgICAgICAgcjEwLCByMywgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgobGluZWFyX3hfc2l6ZSsxMjcpPj43KTw8N0AKKyAgICBiaWMgICAgICAgICByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNywgcjcsIHIxMAorICAgIGFkZCAgICAgICAgIHI3LCByNywgIzIgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzJACisgICAgbW92ICAgICAgICAgcjEwLCByOSwgYXNyICM1CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTFACisgICAgYWRkICAgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBhZGQgICAgICAgICByMTIsIHI3LCAjNDA5NgorICAgIGFkZCAgICAgICAgIHIxNCwgcjcsICM2MTQ0CisgICAgYiAgICAgICAgICAgTElORUFSX1hfU0laRV8yNTZfTE9PUF9NRU1DUFkKKworTElORUFSX1hfU0laRV8yNTZfTE9PUF9FVkVOOgorICAgIGFkZCAgICAgICAgIHIxMSwgcjQsICMzMSAgICAgICAgICAgIEAgdGVtcDIgPSAoKGxpbmVhcl95X3NpemUrMzEpPj41KTw8NUAKKyAgICBiaWMgICAgICAgICByMTEsIHIxMSwgIzB4MUYKKyAgICBhZGQgICAgICAgICByMTAsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAxID0gKChsaW5lYXJfeF9zaXplKzEyNyk+PjcpPDw3QAorICAgIGJpYyAgICAgICAgIHIxMCwgIzB4N0YKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgYXNyICM2ICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNywgcjUsIHIxMAorICAgIG1vdiAgICAgICAgIHI3LCByNywgbHNsICMxMSAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMUAKKyAgICBhZGQgICAgICAgICByMTIsIHI2LCAjMzIKKyAgICBjbXAgICAgICAgICByMTIsIHIxMQorICAgIG1vdmx0ICAgICAgIHIxMCwgcjksIGFzciAjNQorICAgIGFkZGx0ICAgICAgIHI3LCByNywgcjEwLCBsc2wgIzExCisgICAgYWRkbHQgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBhZGRsdCAgICAgICByMTIsIHI3LCAjMTIyODgKKyAgICBhZGRsdCAgICAgICByMTQsIHI3LCAjMTQzMzYKKyAgICBtb3ZnZSAgICAgICByMTAsIHI5LCBhc3IgIzYKKyAgICBhZGRnZSAgICAgICByNywgcjcsIHIxMCwgbHNsICMxMQorICAgIGFkZGdlICAgICAgIHIxMSwgcjcsICMyMDQ4CisgICAgYWRkZ2UgICAgICAgcjEyLCByNywgIzQwOTYKKyAgICBhZGRnZSAgICAgICByMTQsIHI3LCAjNjE0NAorCitMSU5FQVJfWF9TSVpFXzI1Nl9MT09QX01FTUNQWToKKyAgICBhbmQgICAgICAgICByMTAsIHI2LCAjMHgxRgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc2wgIzYKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByMTAKKworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMSA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgYWRkICAgICAgICAgcjEyLCByMTIsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMiA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyN10KKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgYWRkICAgICAgICAgcjE0LCByMTQsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMyA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgdmxkMi44ICAgICAge3E2LCBxN30sIFtyMTFdCisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICB2bGQyLjggICAgICB7cTgsIHE5fSwgW3IxMl0hCisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIG1vdiAgICAgICAgIHIxMCwgcjMsIGFzciAjMQorICAgIHZsZDIuOCAgICAgIHtxMTAsIHExMX0sIFtyMTJdCisgICAgbXVsICAgICAgICAgcjEwLCByMTAsIHI2CisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IxNF0hCisgICAgYWRkICAgICAgICAgcjgsIHIwLCByMTAKKyAgICB2bGQyLjggICAgICB7cTE0LCBxMTV9LCBbcjE0XQorCisgICAgYWRkICAgICAgICAgcjgsIHI4LCByOSwgYXNyICMxCisgICAgdnN0MS44ICAgICAge3EwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E2fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTh9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMTB9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIGFkZCAgICAgICAgIHIxMCwgcjEsIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMTR9LCBbcjhdIQorCisgICAgYWRkICAgICAgICAgcjEwLCByMTAsIHI5LCBhc3IgIzEKKyAgICB2c3QxLjggICAgICB7cTF9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTN9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTV9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTd9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMF0hCisgICAgYWRkICAgICAgICAgcjYsICMxCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzI1Nl9MT09QCisKKyAgICBhZGQgICAgICAgICByOSwgcjksICMyNTYKKworTElORUFSX1hfU0laRV8xMjg6CisgICAgc3ViICAgICAgICAgcjEwLCByMywgcjkKKyAgICBjbXAgICAgICAgICByMTAsICMxMjgKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzY0CisKKyAgICBtb3YgICAgICAgICByNiwgIzAKK0xJTkVBUl9YX1NJWkVfMTI4X0xPT1A6CisgICAgbW92ICAgICAgICAgcjcsICMwICAgICAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSAwQAorICAgIG1vdiAgICAgICAgIHI1LCByNiwgYXNyICM1ICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IGk+PjVACisgICAgYW5kICAgICAgICAgcjEwLCByNSwgIzB4MQorICAgIGNtcCAgICAgICAgIHIxMCwgIzB4MQorICAgIGJuZSAgICAgICAgIExJTkVBUl9YX1NJWkVfMTI4X0xPT1BfRVZFTgorTElORUFSX1hfU0laRV8xMjhfTE9PUF9PREQ6CisgICAgc3ViICAgICAgICAgcjcsIHI1LCAjMSAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4LTFACisgICAgYWRkICAgICAgICAgcjEwLCByMywgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgobGluZWFyX3hfc2l6ZSsxMjcpPj43KTw8N0AKKyAgICBiaWMgICAgICAgICByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNywgcjcsIHIxMAorICAgIGFkZCAgICAgICAgIHI3LCByNywgIzIgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzJACisgICAgbW92ICAgICAgICAgcjEwLCByOSwgYXNyICM1CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldDw8MTFACisgICAgYWRkICAgICAgICAgcjExLCByNywgIzIwNDgKKyAgICBiICAgICAgICAgICBMSU5FQVJfWF9TSVpFXzEyOF9MT09QX01FTUNQWQorCitMSU5FQVJfWF9TSVpFXzEyOF9MT09QX0VWRU46CisgICAgYWRkICAgICAgICAgcjExLCByNCwgIzMxICAgICAgICAgICAgQCB0ZW1wMiA9ICgobGluZWFyX3lfc2l6ZSszMSk+PjUpPDw1QAorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgxRgorICAgIGFkZCAgICAgICAgIHIxMCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpQAorICAgIG11bCAgICAgICAgIHI3LCByNSwgcjEwCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMiwgcjYsICMzMgorICAgIGNtcCAgICAgICAgIHIxMiwgcjExCisgICAgbW92bHQgICAgICAgcjEwLCByOSwgYXNyICM1CisgICAgbW92Z2UgICAgICAgcjEwLCByOSwgYXNyICM2CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAsIGxzbCAjMTEKKyAgICBhZGQgICAgICAgICByMTEsIHI3LCAjMjA0OAorCitMSU5FQVJfWF9TSVpFXzEyOF9MT09QX01FTUNQWToKKyAgICBhbmQgICAgICAgICByMTAsIHI2LCAjMHgxRgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc2wgIzYKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByMTAKKworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMSA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQyLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3XQorICAgIHZsZDIuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBtb3YgICAgICAgICByMTAsIHIzLCBhc3IgIzEKKyAgICBwbGQgICAgICAgICBbcjcsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTYsIHE3fSwgW3IxMV0hCisgICAgbXVsICAgICAgICAgcjEwLCByMTAsIHI2CisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQyLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICBhZGQgICAgICAgICByMTAsIHIxMCwgcjksIGFzciAjMQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQyLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIGFkZCAgICAgICAgIHI4LCByMCwgcjEwCisgICAgdmxkMi44ICAgICAge3ExMiwgcTEzfSwgW3IxMV0hCisgICAgbW92ICAgICAgICAgcjE0LCByMywgYXNyICMxCisgICAgdmxkMi44ICAgICAge3ExNCwgcTE1fSwgW3IxMV0hCisKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgIzQ4CisgICAgdnN0MS44ICAgICAge3EwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdnN0MS44ICAgICAge3E2fSwgW3I4XSwgcjE0CisgICAgdnN0MS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTEwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTEyfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTE0fSwgW3I4XSEKKworICAgIGFkZCAgICAgICAgIHIxMCwgcjEsIHIxMAorICAgIHZzdDEuOCAgICAgIHtxMX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxM30sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTBdIQorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTBdLCByMTQKKyAgICB2c3QxLjggICAgICB7cTl9LCBbcjEwXSEKKyAgICB2c3QxLjggICAgICB7cTExfSwgW3IxMF0hCisgICAgYWRkICAgICAgICAgcjYsICMyCisgICAgdnN0MS44ICAgICAge3ExM30sIFtyMTBdIQorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIHZzdDEuOCAgICAgIHtxMTV9LCBbcjEwXSEKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMTI4X0xPT1AKKworICAgIGFkZCAgICAgICAgIHI5LCByOSwgIzEyOAorCitMSU5FQVJfWF9TSVpFXzY0OgorICAgIHN1YiAgICAgICAgIHIxMCwgcjMsIHI5CisgICAgY21wICAgICAgICAgcjEwLCAjNjQKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzQKKworICAgIG1vdiAgICAgICAgIHI1LCByOQorICAgIG1vdiAgICAgICAgIHI2LCAjMAorCitMSU5FQVJfWF9TSVpFXzY0X0xPT1A6CisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCitMSU5FQVJfWF9TSVpFXzY0X0xPT1BfTUVNQ1BZOgorICAgIGFuZCAgICAgICAgIHIxMCwgcjYsICMweDFGCisgICAgbW92ICAgICAgICAgcjE0LCByMywgYXNyICMxCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzbCAjNgorICAgIHN1YiAgICAgICAgIHIxNCwgcjE0LCAjMTYKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCByMTAKKworICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgcGxkICAgICAgICAgW3I3LCAjNjRdCisgICAgdmxkMi44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgbW92ICAgICAgICAgcjEwLCByMywgYXNyICMxCisgICAgcGxkICAgICAgICAgW3I3LCAjNjRdCisgICAgdmxkMi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgbXVsICAgICAgICAgcjEwLCByMTAsIHI2CisgICAgdmxkMi44ICAgICAge3E0LCBxNX0sIFtyN10hCisgICAgYWRkICAgICAgICAgcjEwLCByMTAsIHI5LCBhc3IgIzEKKyAgICB2bGQyLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICBhZGQgICAgICAgICByOCwgcjAsIHIxMAorCisgICAgdnN0MS44ICAgICAge3EwfSwgW3I4XSEKKyAgICB2c3QxLjggICAgICB7cTJ9LCBbcjhdLCByMTQKKyAgICB2c3QxLjggICAgICB7cTR9LCBbcjhdIQorICAgIHZzdDEuOCAgICAgIHtxNn0sIFtyOF0sIHIxNAorCisgICAgYWRkICAgICAgICAgcjEwLCByMSwgcjEwCisgICAgdnN0MS44ICAgICAge3ExfSwgW3IxMF0hCisgICAgdnN0MS44ICAgICAge3EzfSwgW3IxMF0sIHIxNAorICAgIGFkZCAgICAgICAgIHI2LCAjMgorICAgIHZzdDEuOCAgICAgIHtxNX0sIFtyMTBdIQorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIHZzdDEuOCAgICAgIHtxN30sIFtyMTBdLCByMTQKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfNjRfTE9PUAorCisgICAgYWRkICAgICAgICAgcjksIHI5LCAjNjQKKworTElORUFSX1hfU0laRV80OgorICAgIGNtcCAgICAgICAgIHI5LCByMworICAgIGJlcSAgICAgICAgIFJFU1RPUkVfUkVHCisKKyAgICBtb3YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICBAIGkgPSAwCitMSU5FQVJfWV9TSVpFXzRfTE9PUDoKKworICAgIG1vdiAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgaiA9IGFsaWduZWRfeF9zaXplCitMSU5FQVJfWF9TSVpFXzRfTE9PUDoKKworICAgIGJsICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVQKKworICAgIG1vdiAgICAgICAgIHIxMSwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfeF9zaXplLzIKKyAgICBtdWwgICAgICAgICByMTEsIHIxMSwgcjYgICAgICAgICAgICBAIHRlbXAxID0gdGVtcDEqKGkpCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHI1LCBhc3IgIzEgICAgQCB0ZW1wMSA9IHRlbXAxK2ovMgorICAgIG1vdiAgICAgICAgIHIxMiwgcjMsIGFzciAjMSAgICAgICAgIEAgdGVtcDIgPSBsaW5lYXJfeF9zaXplLzIKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgIzEgICAgICAgICAgICBAIHRlbXAyID0gbGluZWFyX3hfc2l6ZS0xCisKKyAgICBhZGQgICAgICAgICByOCwgcjAsIHIxMSAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2Rlc3RfdSt0ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjEsIHIxMSAgICAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfZGVzdF92K3RlbXAxCisgICAgYWRkICAgICAgICAgcjcsIHIyLCByNyAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfc3JjK3RpbGVkX2FkZHIKKyAgICBhbmQgICAgICAgICByMTQsIHI2LCAjMHgxRiAgICAgICAgICBAIHRlbXAzID0gaSYweDFGQAorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc2wgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMyo2NAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKyAgICBhbmQgICAgICAgICByMTQsIHI1LCAjMHgzRiAgICAgICAgICBAIHRlbXAzID0gaiYweDNGCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworCisgICAgbGRyaCAgICAgICAgcjEwLCBbcjddLCAjMgorICAgIGxkcmggICAgICAgIHIxNCwgW3I3XSwgIzYyCisgICAgc3RyYiAgICAgICAgcjEwLCBbcjhdLCAjMQorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzgKKyAgICBzdHJiICAgICAgICByMTAsIFtyMTFdLCAjMQorICAgIHN0cmIgICAgICAgIHIxNCwgW3I4XSwgcjEyCisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGFzciAjOAorICAgIHN0cmIgICAgICAgIHIxNCwgW3IxMV0sIHIxMgorCisgICAgbGRyaCAgICAgICAgcjEwLCBbcjddLCAjMgorICAgIGxkcmggICAgICAgIHIxNCwgW3I3XSwgIzYyCisgICAgc3RyYiAgICAgICAgcjEwLCBbcjhdLCAjMQorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzgKKyAgICBzdHJiICAgICAgICByMTAsIFtyMTFdLCAjMQorICAgIHN0cmIgICAgICAgIHIxNCwgW3I4XSwgcjEyCisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGFzciAjOAorICAgIHN0cmIgICAgICAgIHIxNCwgW3IxMV0sIHIxMgorCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjNCAgICAgICAgICAgICAgQCBqID0gais0CisgICAgY21wICAgICAgICAgcjUsIHIzICAgICAgICAgICAgICAgICAgQCBqPGxpbmVhcl94X3NpemUKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzRfTE9PUAorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjMiAgICAgICAgICAgICAgQCBpID0gaSs0CisgICAgY21wICAgICAgICAgcjYsIHI0ICAgICAgICAgICAgICAgICAgQCBpPGxpbmVhcl95X3NpemUKKyAgICBibHQgICAgICAgICBMSU5FQVJfWV9TSVpFXzRfTE9PUAorCitSRVNUT1JFX1JFRzoKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyNC1yMTIscjE1fSAgICAgICAgICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworR0VUX1RJTEVEX09GRlNFVDoKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMTR9CisKKyAgICBtb3YgICAgICAgICByMTIsIHI2LCBhc3IgIzUgICAgICAgICBAIHRlbXAyID0gaT4+NQorICAgIG1vdiAgICAgICAgIHIxMSwgcjUsIGFzciAjNiAgICAgICAgIEAgdGVtcDEgPSBqPj42CisKKyAgICBhbmQgICAgICAgICByMTQsIHIxMiwgIzB4MSAgICAgICAgICBAIGlmICh0ZW1wMiAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTQsICMweDEKKyAgICBibmUgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xCisKK0dFVF9USUxFRF9PRkZTRVRfT0REX0ZPUk1VTEE6CisgICAgc3ViICAgICAgICAgcjcsIHIxMiwgIzEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDItMQorICAgIGFkZCAgICAgICAgIHIxNCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeF9zaXplKzEyNworICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDMgPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIqdGVtcDMKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAxCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcisyCisgICAgYmljICAgICAgICAgcjE0LCByMTEsICMweDMgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMT4+Mik8PDIKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcjw8MTEKKyAgICBiICAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX1JFVFVSTgorCitHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xOgorICAgIGFkZCAgICAgICAgIHIxNCwgcjQsICMzMSAgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeV9zaXplKzMxCisgICAgYmljICAgICAgICAgcjE0LCByMTQsICMweDFGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+NSk8PDUKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgIzMyICAgICAgICAgICBAIHRlbXAzID0gdGVtcDMgLSAzMgorICAgIGNtcCAgICAgICAgIHI2LCByMTQgICAgICAgICAgICAgICAgIEAgaWYgKGk8KHRlbXAzLTMyKSkgeworICAgIGJnZSAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzIKKyAgICBhZGQgICAgICAgICByMTQsIHIxMSwgIzIgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDErMgorICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMyAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjcsIHIxMSwgcjE0ICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDErdGVtcDMKKyAgICBhZGQgICAgICAgICByMTQsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTQsIHIxNCwgIzB4N0YgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHIxMiwgcjEyLCByMTQgICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IHRpbGVkX3lfaW5kZXgqdGVtcDMKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RpbGVkX3lfaW5kZXgKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBACisgICAgYiAgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVF9SRVRVUk4KKworR0VUX1RJTEVEX09GRlNFVF9FVkVOX0ZPUk1VTEFfMjoKKyAgICBhZGQgICAgICAgICByMTQsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTQsIHIxNCwgIzB4N0YgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHI3LCByMTIsIHIxNCAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAyKnRlbXAzCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworICAgIG1vdiAgICAgICAgIHI3LCByNywgbHNsICMxMSAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHI8PDExQAorCitHRVRfVElMRURfT0ZGU0VUX1JFVFVSTjoKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyMTV9ICAgICAgICAgICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgLmZuZW5kCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY3NjX252MTJ0X3l1djQyMF95X25lb24ucyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfbnYxMnRfeXV2NDIwX3lfbmVvbi5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWVlMTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9jc2MvY3NjX252MTJ0X3l1djQyMF95X25lb24ucwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIGNzY19udjEydF95dXY0MjBfeV9uZW9uLnMKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKiBAYXV0aG9yICBTaGluV29uIExlZSAoc2hpbndvbi5sZWVAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuNy4wMSA6IENyZWF0ZQorICovCisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhci4KKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICogMy4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB5dXY0MjBfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCisKKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY190aWxlZF90b19saW5lYXIKKyAgICAudHlwZSAgIGNzY190aWxlZF90b19saW5lYXIsICVmdW5jdGlvbgorY3NjX3RpbGVkX3RvX2xpbmVhcjoKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICAgICAgbGluZWFyX2Rlc3QKKyAgICBAcjEgICAgICAgICB0aWxlZF9zcmMKKyAgICBAcjIgICAgICAgICBsaW5lYXJfeF9zaXplCisgICAgQHIzICAgICAgICAgbGluZWFyX3lfc2l6ZQorICAgIEByNCAgICAgICAgIGoKKyAgICBAcjUgICAgICAgICBpCisgICAgQHI2ICAgICAgICAgdGlsZWRfYWRkcgorICAgIEByNyAgICAgICAgIGxpbmVhcl9hZGRyCisgICAgQHI4ICAgICAgICAgYWxpZ25lZF94X3NpemUKKyAgICBAcjkgICAgICAgICBhbGlnbmVkX3lfc2l6ZQorICAgIEByMTAgICAgICAgIHRlbXAxCisgICAgQHIxMSAgICAgICAgdGVtcDIKKyAgICBAcjEyICAgICAgICB0ZW1wMworICAgIEByMTQgICAgICAgIHRlbXA0CisKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyNC1yMTIscjE0fSAgICAgICAgICAgICAgIEAgYmFja3VwIHJlZ2lzdGVycworCisgICAgbW92ICAgICAgICAgcjgsICMwCisgICAgY21wICAgICAgICAgcjIsICMxMDI0CisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV81MTIKKworTElORUFSX1hfU0laRV8xMDI0OgorCisgICAgbW92ICAgICAgICAgcjUsICMwCitMSU5FQVJfWF9TSVpFXzEwMjRfTE9PUDoKKyAgICBtb3YgICAgICAgICByNiwgIzAgICAgICAgICAgICAgICAgICBAIHRpbGVkX29mZnNldCA9IDBACisgICAgbW92ICAgICAgICAgcjQsIHI1LCBhc3IgIzUgICAgICAgICAgQCB0aWxlZF95X2luZGV4ID0gaT4+NUAKKyAgICBhbmQgICAgICAgICByMTAsIHI0LCAjMHgxCisgICAgY21wICAgICAgICAgcjEwLCAjMHgxCisgICAgYm5lICAgICAgICAgTElORUFSX1hfU0laRV8xMDI0X0xPT1BfRVZFTgorTElORUFSX1hfU0laRV8xMDI0X0xPT1BfT0REOgorICAgIHN1YiAgICAgICAgIHI2LCByNCwgIzEgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleC0xQAorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NilACisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTAKKyAgICBtb3YgICAgICAgICByNCwgIzgKKyAgICBtb3YgICAgICAgICByNCwgcjQsIGxzbCAjMTEKKyAgICBzdWIgICAgICAgICByNCwgcjQsICMzMgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzIgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzJACisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICMyMDQ4CisgICAgYWRkICAgICAgICAgcjEyLCByNiwgIzQwOTYKKyAgICBhZGQgICAgICAgICByMTQsIHI2LCAjNjE0NAorICAgIGIgICAgICAgICAgIExJTkVBUl9YX1NJWkVfMTAyNF9MT09QX01FTUNQWQorCitMSU5FQVJfWF9TSVpFXzEwMjRfTE9PUF9FVkVOOgorICAgIGFkZCAgICAgICAgIHIxMSwgcjMsICMzMSAgICAgICAgICAgIEAgdGVtcDIgPSAoKGxpbmVhcl95X3NpemUrMzEpPj41KTw8NUAKKyAgICBiaWMgICAgICAgICByMTEsIHIxMSwgIzB4MUYKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCAjMTI3ICAgICAgICAgICBAIHRlbXAxID0gKChsaW5lYXJfeF9zaXplKzEyNyk+PjcpPDw3QAorICAgIGJpYyAgICAgICAgIHIxMCwgIzB4N0YKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgYXNyICM2ICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX3lfaW5kZXgqKHRlbXAxPj42KUAKKyAgICBtdWwgICAgICAgICByNiwgcjQsIHIxMAorICAgIGFkZCAgICAgICAgIHIxMiwgcjUsICMzMgorICAgIGNtcCAgICAgICAgIHIxMiwgcjExCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICMyMDQ4CisgICAgbW92bHQgICAgICAgcjQsICM4CisgICAgYWRkbHQgICAgICAgcjEyLCByNiwgIzEyMjg4CisgICAgYWRkbHQgICAgICAgcjE0LCByNiwgIzE0MzM2CisgICAgbW92Z2UgICAgICAgcjQsICM0CisgICAgYWRkZ2UgICAgICAgcjEyLCByNiwgIzQwOTYKKyAgICBhZGRnZSAgICAgICByMTQsIHI2LCAjNjE0NAorICAgIG1vdiAgICAgICAgIHI0LCByNCwgbHNsICMxMQorICAgIHN1YiAgICAgICAgIHI0LCByNCwgIzMyCisKK0xJTkVBUl9YX1NJWkVfMTAyNF9MT09QX01FTUNQWToKKyAgICBhbmQgICAgICAgICByMTAsIHI1LCAjMHgxRgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc2wgIzYKKyAgICBhZGQgICAgICAgICByMTAsIHIxLCByMTAKKworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMSA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgcGxkICAgICAgICAgW3IxMV0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I2XSEKKyAgICBwbGQgICAgICAgICBbcjExLCAjMzJdCisgICAgYWRkICAgICAgICAgcjEyLCByMTIsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMiA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyNl0sIHI0CisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIGFkZCAgICAgICAgIHIxNCwgcjE0LCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjMgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjExXSwgcjQKKyAgICBwbGQgICAgICAgICBbcjE0XQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICBwbGQgICAgICAgICBbcjE0LCAjMzJdCisgICAgbXVsICAgICAgICAgcjcsIHIyLCByNQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTJdLCByNAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjAKKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjE0XSEKKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjE0XSwgcjQKKworICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2XQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2LCAjMzJdCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdLCByNAorCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjExXSwgcjQKKyAgICBwbGQgICAgICAgICBbcjE0XQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICBwbGQgICAgICAgICBbcjE0LCAjMzJdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3IxMl0sIHI0CisgICAgdmxkMS44ICAgICAge3ExMiwgcTEzfSwgW3IxNF0hCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3IxNF0sIHI0CisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNl0KKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNiwgIzMyXQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10hCisKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdIQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I2XSwgcjQKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyMTFdLCByNAorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXSwgcjQKKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjE0XSEKKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjE0XSwgcjQKKworICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2XQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2LCAjMzJdCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjExXQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIGFkZCAgICAgICAgIHI1LCAjMQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgY21wICAgICAgICAgcjUsIHIzCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMTAyNF9MT09QCisKKyAgICBtb3YgICAgICAgICByOCwgIzEwMjQKKworTElORUFSX1hfU0laRV81MTI6CisKKyAgICBzdWIgICAgICAgICByMTQsIHIyLCByOAorICAgIGNtcCAgICAgICAgIHIxNCwgIzUxMgorICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMjU2CisKKyAgICBtb3YgICAgICAgICByNSwgIzAKK0xJTkVBUl9YX1NJWkVfNTEyX0xPT1A6CisgICAgbW92ICAgICAgICAgcjYsICMwCisgICAgbW92ICAgICAgICAgcjQsIHI1LCBhc3IgIzUgICAgICAgICAgQCB0aWxlZF95X2luZGV4ID0gaT4+NQorICAgIGFuZCAgICAgICAgIHIxMCwgcjQsICMweDEKKyAgICBjbXAgICAgICAgICByMTAsICMweDEKKyAgICBibmUgICAgICAgICBMSU5FQVJfWF9TSVpFXzUxMl9MT09QX0VWRU4KKworTElORUFSX1hfU0laRV81MTJfTE9PUF9PREQ6CisgICAgc3ViICAgICAgICAgcjYsIHI0LCAjMQorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NilACisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTAKKyAgICBtb3YgICAgICAgICByNCwgIzgKKyAgICBtb3YgICAgICAgICByNCwgcjQsIGxzbCAjMTEKKyAgICBzdWIgICAgICAgICByNCwgcjQsICMzMgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzIgICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0KzJACisgICAgbW92ICAgICAgICAgcjEwLCByOCwgYXNyICM1ICAgICAgICAgQCB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41QAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwICAgICAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0K3RlbXAxQAorICAgIG1vdiAgICAgICAgIHI2LCByNiwgbHNsICMxMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICMyMDQ4CisgICAgYWRkICAgICAgICAgcjEyLCByNiwgIzQwOTYKKyAgICBhZGQgICAgICAgICByMTQsIHI2LCAjNjE0NAorICAgIGIgICAgICAgICAgIExJTkVBUl9YX1NJWkVfNTEyX0xPT1BfTUVNQ1BZCisKK0xJTkVBUl9YX1NJWkVfNTEyX0xPT1BfRVZFTjoKKyAgICBhZGQgICAgICAgICByMTEsIHIzLCAjMzEgICAgICAgICAgICBAIHRlbXAyID0gKChsaW5lYXJfeV9zaXplKzMxKT4+NSk8PDVACisgICAgYmljICAgICAgICAgcjExLCByMTEsICMweDFGCisgICAgYWRkICAgICAgICAgcjEwLCByMiwgIzEyNyAgICAgICAgICAgQCB0ZW1wMSA9ICgobGluZWFyX3hfc2l6ZSsxMjcpPj43KTw8N0AKKyAgICBiaWMgICAgICAgICByMTAsICMweDdGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGFzciAjNiAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF95X2luZGV4Kih0ZW1wMT4+NilACisgICAgbXVsICAgICAgICAgcjYsIHI0LCByMTAKKyAgICBhZGQgICAgICAgICByMTIsIHI1LCAjMzIKKyAgICBjbXAgICAgICAgICByMTIsIHIxMQorICAgIG1vdiAgICAgICAgIHI2LCByNiwgbHNsICMxMSAgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0PDwxMUAKKyAgICBtb3ZsdCAgICAgICByNCwgIzgKKyAgICBtb3ZsdCAgICAgICByMTAsIHI4LCBhc3IgIzUgICAgICAgICBAIHRlbXAxID0gYWxpZ25lZF94X3NpemU+PjVACisgICAgbW92Z2UgICAgICAgcjEwLCByOCwgYXNyICM2ICAgICAgICAgQCB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj42QAorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwLCBsc2wgIzExICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kyh0ZW1wMTw8MTEpQAorICAgIGFkZCAgICAgICAgIHIxMSwgcjYsICMyMDQ4CisgICAgYWRkbHQgICAgICAgcjEyLCByNiwgIzEyMjg4CisgICAgYWRkbHQgICAgICAgcjE0LCByNiwgIzE0MzM2CisgICAgbW92Z2UgICAgICAgcjQsICM0CisgICAgYWRkZ2UgICAgICAgcjEyLCByNiwgIzQwOTYKKyAgICBhZGRnZSAgICAgICByMTQsIHI2LCAjNjE0NAorICAgIG1vdiAgICAgICAgIHI0LCByNCwgbHNsICMxMQorICAgIHN1YiAgICAgICAgIHI0LCByNCwgIzMyCisKK0xJTkVBUl9YX1NJWkVfNTEyX0xPT1BfTUVNQ1BZOgorICAgIGFuZCAgICAgICAgIHIxMCwgcjUsICMweDFGCisgICAgbW92ICAgICAgICAgcjEwLCByMTAsIGxzbCAjNgorICAgIGFkZCAgICAgICAgIHIxMCwgcjEsIHIxMAorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjEwICAgICAgICAgICBAIHRpbGVkX2FkZHIxID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICBwbGQgICAgICAgICBbcjExXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdIQorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICBhZGQgICAgICAgICByMTIsIHIxMiwgcjEwICAgICAgICAgICBAIHRpbGVkX2FkZHIyID0gdGlsZWRfc3JjKzY0Kih0ZW1wMSkKKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I2XSwgcjQKKyAgICBwbGQgICAgICAgICBbcjEyXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjExXSEKKyAgICBwbGQgICAgICAgICBbcjEyLCAjMzJdCisgICAgYWRkICAgICAgICAgcjE0LCByMTQsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMyA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyMTFdLCByNAorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyMTJdIQorICAgIHBsZCAgICAgICAgIFtyMTQsICMzMl0KKyAgICBtdWwgICAgICAgICByNywgcjIsIHI1CisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3IxMl0sIHI0CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOAorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdLCByNAorCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMAorICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2XQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I2LCAjMzJdCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdLCByNAorICAgIHBsZCAgICAgICAgIFtyMTJdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyMTFdIQorICAgIHBsZCAgICAgICAgIFtyMTIsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3IxMV0sIHI0CisgICAgcGxkICAgICAgICAgW3IxNF0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3IxMl0hCisgICAgcGxkICAgICAgICAgW3IxNCwgIzMyXQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTJdLCByNAorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdLCByNAorCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyN10hCisgICAgdnN0MS44ICAgICAge3E4LCBxOX0sIFtyN10hCisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I3XSEKKyAgICBhZGQgICAgICAgICByNSwgIzEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjddIQorICAgIGNtcCAgICAgICAgIHI1LCByMworICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10hCisKKyAgICBibHQgICAgICAgICBMSU5FQVJfWF9TSVpFXzUxMl9MT09QCisKKyAgICBhZGQgICAgICAgICByOCwgcjgsICM1MTIKKworTElORUFSX1hfU0laRV8yNTY6CisKKyAgICBzdWIgICAgICAgICByMTQsIHIyLCByOAorICAgIGNtcCAgICAgICAgIHIxNCwgIzI1NgorICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMTI4CisKKyAgICBtb3YgICAgICAgICByNSwgIzAKK0xJTkVBUl9YX1NJWkVfMjU2X0xPT1A6CisgICAgbW92ICAgICAgICAgcjYsICMwCisgICAgbW92ICAgICAgICAgcjQsIHI1LCBhc3IgIzUgICAgICAgICAgQCB0aWxlZF95X2luZGV4ID0gaT4+NQorICAgIGFuZCAgICAgICAgIHIxMCwgcjQsICMweDEKKyAgICBjbXAgICAgICAgICByMTAsICMweDEKKyAgICBibmUgICAgICAgICBMSU5FQVJfWF9TSVpFXzI1Nl9MT09QX0VWRU4KKworTElORUFSX1hfU0laRV8yNTZfTE9PUF9PREQ6CisgICAgc3ViICAgICAgICAgcjYsIHI0LCAjMQorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfb2Zmc2V0Kih0ZW1wMT4+NilACisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTAKKyAgICBhZGQgICAgICAgICByNiwgcjYsICMyICAgICAgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsyQAorICAgIG1vdiAgICAgICAgIHIxMCwgcjgsIGFzciAjNSAgICAgICAgIEAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NUAKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCt0ZW1wMUAKKyAgICBtb3YgICAgICAgICByNiwgcjYsIGxzbCAjMTEKKyAgICBhZGQgICAgICAgICByMTEsIHI2LCAjMjA0OAorICAgIGFkZCAgICAgICAgIHIxMiwgcjYsICM0MDk2CisgICAgYWRkICAgICAgICAgcjE0LCByNiwgIzYxNDQKKyAgICBiICAgICAgICAgICBMSU5FQVJfWF9TSVpFXzI1Nl9MT09QX01FTUNQWQorCitMSU5FQVJfWF9TSVpFXzI1Nl9MT09QX0VWRU46CisgICAgYWRkICAgICAgICAgcjExLCByMywgIzMxICAgICAgICAgICAgQCB0ZW1wMiA9ICgobGluZWFyX3lfc2l6ZSszMSk+PjUpPDw1QAorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgxRgorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpQAorICAgIG11bCAgICAgICAgIHI2LCByNCwgcjEwCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMiwgcjUsICMzMgorICAgIGNtcCAgICAgICAgIHIxMiwgcjExCisgICAgbW92bHQgICAgICAgcjEwLCByOCwgYXNyICM1ICAgICAgICAgQCB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41QAorICAgIG1vdmdlICAgICAgIHIxMCwgcjgsIGFzciAjNiAgICAgICAgIEAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NkAKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCwgbHNsICMxMSAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsodGVtcDE8PDExKUAKKyAgICBhZGQgICAgICAgICByMTEsIHI2LCAjMjA0OAorICAgIGFkZGx0ICAgICAgIHIxMiwgcjYsICMxMjI4OAorICAgIGFkZGx0ICAgICAgIHIxNCwgcjYsICMxNDMzNgorICAgIGFkZGdlICAgICAgIHIxMiwgcjYsICM0MDk2CisgICAgYWRkZ2UgICAgICAgcjE0LCByNiwgIzYxNDQKKworTElORUFSX1hfU0laRV8yNTZfTE9PUF9NRU1DUFk6CisgICAgYW5kICAgICAgICAgcjEwLCByNSwgIzB4MUYKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgbHNsICM2CisgICAgYWRkICAgICAgICAgcjEwLCByMSwgcjEwCisKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjEgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3IxMSwgIzMyXQorICAgIGFkZCAgICAgICAgIHIxMiwgcjEyLCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjIgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdCisgICAgcGxkICAgICAgICAgW3IxMl0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3IxMV0hCisgICAgcGxkICAgICAgICAgW3IxMiwgIzMyXQorICAgIGFkZCAgICAgICAgIHIxNCwgcjE0LCByMTAgICAgICAgICAgIEAgdGlsZWRfYWRkcjMgPSB0aWxlZF9zcmMrNjQqKHRlbXAxKQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjExXQorICAgIHBsZCAgICAgICAgIFtyMTRdCisgICAgbXVsICAgICAgICAgcjcsIHIyLCByNQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjEyXSEKKyAgICBwbGQgICAgICAgICBbcjE0LCAjMzJdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOAorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyMTJdCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMAorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyMTRdIQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyMTRdCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIGFkZCAgICAgICAgIHI1LCAjMQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgY21wICAgICAgICAgcjUsIHIzCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSEKKworICAgIGJsdCAgICAgICAgIExJTkVBUl9YX1NJWkVfMjU2X0xPT1AKKworICAgIGFkZCAgICAgICAgIHI4LCByOCwgIzI1NgorCitMSU5FQVJfWF9TSVpFXzEyODoKKworICAgIHN1YiAgICAgICAgIHIxNCwgcjIsIHI4CisgICAgY21wICAgICAgICAgcjE0LCAjMTI4CisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV82NAorCisgICAgbW92ICAgICAgICAgcjUsICMwCitMSU5FQVJfWF9TSVpFXzEyOF9MT09QOgorICAgIG1vdiAgICAgICAgIHI2LCAjMAorICAgIG1vdiAgICAgICAgIHI0LCByNSwgYXNyICM1ICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IGk+PjUKKyAgICBhbmQgICAgICAgICByMTAsIHI0LCAjMHgxCisgICAgY21wICAgICAgICAgcjEwLCAjMHgxCisgICAgYm5lICAgICAgICAgTElORUFSX1hfU0laRV8xMjhfTE9PUF9FVkVOCisKK0xJTkVBUl9YX1NJWkVfMTI4X0xPT1BfT0REOgorICAgIHN1YiAgICAgICAgIHI2LCByNCwgIzEKKyAgICBhZGQgICAgICAgICByMTAsIHIyLCAjMTI3ICAgICAgICAgICBAIHRlbXAxID0gKChsaW5lYXJfeF9zaXplKzEyNyk+PjcpPDw3QAorICAgIGJpYyAgICAgICAgIHIxMCwgIzB4N0YKKyAgICBtb3YgICAgICAgICByMTAsIHIxMCwgYXNyICM2ICAgICAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCoodGVtcDE+PjYpQAorICAgIG11bCAgICAgICAgIHI2LCByNiwgcjEwCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrMkAKKyAgICBtb3YgICAgICAgICByMTAsIHI4LCBhc3IgIzUgICAgICAgICBAIHRlbXAxID0gYWxpZ25lZF94X3NpemU+PjVACisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQrdGVtcDFACisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExCisgICAgYWRkICAgICAgICAgcjExLCByNiwgIzIwNDgKKyAgICBiICAgICAgICAgICBMSU5FQVJfWF9TSVpFXzEyOF9MT09QX01FTUNQWQorCitMSU5FQVJfWF9TSVpFXzEyOF9MT09QX0VWRU46CisgICAgYWRkICAgICAgICAgcjExLCByMywgIzMxICAgICAgICAgICAgQCB0ZW1wMiA9ICgobGluZWFyX3lfc2l6ZSszMSk+PjUpPDw1QAorICAgIGJpYyAgICAgICAgIHIxMSwgcjExLCAjMHgxRgorICAgIGFkZCAgICAgICAgIHIxMCwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDEgPSAoKGxpbmVhcl94X3NpemUrMTI3KT4+Nyk8PDdACisgICAgYmljICAgICAgICAgcjEwLCAjMHg3RgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBhc3IgIzYgICAgICAgIEAgdGlsZWRfb2Zmc2V0ID0gdGlsZWRfeV9pbmRleCoodGVtcDE+PjYpQAorICAgIG11bCAgICAgICAgIHI2LCByNCwgcjEwCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9vZmZzZXQgPSB0aWxlZF9vZmZzZXQ8PDExQAorICAgIGFkZCAgICAgICAgIHIxMiwgcjUsICMzMgorICAgIGNtcCAgICAgICAgIHIxMiwgcjExCisgICAgbW92bHQgICAgICAgcjEwLCByOCwgYXNyICM1ICAgICAgICAgQCB0ZW1wMSA9IGFsaWduZWRfeF9zaXplPj41QAorICAgIG1vdmdlICAgICAgIHIxMCwgcjgsIGFzciAjNiAgICAgICAgIEAgdGVtcDEgPSBhbGlnbmVkX3hfc2l6ZT4+NkAKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCwgbHNsICMxMSAgICBAIHRpbGVkX29mZnNldCA9IHRpbGVkX29mZnNldCsodGVtcDE8PDExKUAKKyAgICBhZGQgICAgICAgICByMTEsIHI2LCAjMjA0OAorCitMSU5FQVJfWF9TSVpFXzEyOF9MT09QX01FTUNQWToKKyAgICBhbmQgICAgICAgICByMTAsIHI1LCAjMHgxRgorICAgIG1vdiAgICAgICAgIHIxMCwgcjEwLCBsc2wgIzYKKyAgICBhZGQgICAgICAgICByMTAsIHIxLCByMTAKKworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgYWRkICAgICAgICAgcjExLCByMTEsIHIxMCAgICAgICAgICAgQCB0aWxlZF9hZGRyMSA9IHRpbGVkX3NyYys2NCoodGVtcDEpCisgICAgcGxkICAgICAgICAgW3I2LCAjNjRdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3I2LCAjNjRdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgbXVsICAgICAgICAgcjcsIHIyLCByNQorICAgIHBsZCAgICAgICAgIFtyMTFdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyNl0hCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByOAorICAgIHBsZCAgICAgICAgIFtyMTEsICMzMl0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I2XQorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjAKKyAgICBwbGQgICAgICAgICBbcjExLCAjNjRdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyMTFdIQorICAgIHBsZCAgICAgICAgIFtyMTEsICM2NF0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjExXSEKKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjExXSEKKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjExXQorCisgICAgc3ViICAgICAgICAgcjksIHIyLCAjOTYKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByOQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIGFkZCAgICAgICAgIHI1LCAjMgorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgY21wICAgICAgICAgcjUsIHIzCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I3XQorCisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV8xMjhfTE9PUAorCisgICAgYWRkICAgICAgICAgcjgsIHI4LCAjMTI4CisKK0xJTkVBUl9YX1NJWkVfNjQ6CisKKyAgICBzdWIgICAgICAgICByMTQsIHIyLCByOAorICAgIGNtcCAgICAgICAgIHIxNCwgIzY0CisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV80CisKKyAgICBtb3YgICAgICAgICByNSwgIzAKKyAgICBtb3YgICAgICAgICByNCwgcjgKKworTElORUFSX1hfU0laRV82NF9MT09QOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgYWRkICAgICAgICAgcjYsIHIxLCByNiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfc3JjK3RpbGVkX2FkZHIKKyAgICBhbmQgICAgICAgICByMTEsIHI1LCAjMHgxRiAgICAgICAgICBAIHRlbXAyID0gaSYweDFGCisgICAgbW92ICAgICAgICAgcjExLCByMTEsIGxzbCAjNiAgICAgICAgQCB0ZW1wMiA9IDY0KnRlbXAyCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMgorCisgICAgcGxkICAgICAgICAgW3I2LCAjNjRdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcn0KKyAgICBtdWwgICAgICAgICByMTAsIHIyLCByNSAgICAgICAgICAgICBAIHRlbXAxID0gbGluZWFyX3hfc2l6ZSooaSkKKyAgICBwbGQgICAgICAgICBbcjYsICM2NF0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICBwbGQgICAgICAgICBbcjYsICM2NF0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I2XSEgICAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjF9CisgICAgcGxkICAgICAgICAgW3I2LCAjNjRdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyNl0hCisgICAgcGxkICAgICAgICAgW3I2LCAjNjRdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyNl0hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoyfQorICAgIHBsZCAgICAgICAgIFtyNiwgIzY0XQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgYWRkICAgICAgICAgcjcsIHIwLCByNCAgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9kZXN0K2oKKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdISAgICAgICBAIHN0b3JlIHt0aWxlZF9hZGRyKzY0KjN9CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTAgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9hZGRyK3RlbXAxCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKyAgICBzdWIgICAgICAgICByMTAsIHIyLCAjMzIgICAgICAgICAgICBAIHRlbXAxID0gbGluZWFyX3hfc2l6ZS0zMgorCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyN10hICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjLCA2NH0KKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBsb2FkIHtsaW5lYXJfc3JjK2xpbmVhcl94X3NpemUqMSwgNjR9CisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjIsIDY0fQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10sIHIxMAorICAgIGFkZCAgICAgICAgIHI1LCAjNAorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgbG9hZCB7bGluZWFyX3NyYytsaW5lYXJfeF9zaXplKjMsIDY0fQorICAgIGNtcCAgICAgICAgIHI1LCByMworICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorCisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV82NF9MT09QCisKKyAgICBhZGQgICAgICAgICByOCwgcjgsICM2NAorCitMSU5FQVJfWF9TSVpFXzQ6CisgICAgY21wICAgICAgICAgcjgsIHIyCisgICAgYmVxICAgICAgICAgUkVTVE9SRV9SRUcKKworICAgIG1vdiAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgIEAgaSA9IDAKK0xJTkVBUl9ZX1NJWkVfNF9MT09QOgorCisgICAgbW92ICAgICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgQCBqID0gYWxpZ25lZF94X3NpemUKK0xJTkVBUl9YX1NJWkVfNF9MT09QOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgYW5kICAgICAgICAgcjEwLCByNSwgIzB4MUYgICAgICAgICAgIEAgdGVtcDEgPSBpJjB4MUYKKyAgICBhbmQgICAgICAgICByMTEsIHI0LCAjMHgzRiAgICAgICAgICAgQCB0ZW1wMiA9IGomMHgzRgorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMQorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjExCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTAsIGxzbCAjNgorCisgICAgbGRyICAgICAgICAgcjEwLCBbcjZdLCAjNjQKKyAgICBhZGQgICAgICAgICByNywgcjAsIHI0CisgICAgbGRyICAgICAgICAgcjExLCBbcjZdLCAjNjQKKyAgICBtdWwgICAgICAgICByOSwgcjIsIHI1CisgICAgbGRyICAgICAgICAgcjEyLCBbcjZdLCAjNjQKKyAgICBhZGQgICAgICAgICByNywgcjcsIHI5CisgICAgbGRyICAgICAgICAgcjE0LCBbcjZdLCAjNjQKKworICAgIHN0ciAgICAgICAgIHIxMCwgW3I3XSwgcjIKKyAgICBzdHIgICAgICAgICByMTEsIFtyN10sIHIyCisgICAgc3RyICAgICAgICAgcjEyLCBbcjddLCByMgorICAgIHN0ciAgICAgICAgIHIxNCwgW3I3XSwgcjIKKworICAgIGFkZCAgICAgICAgIHI0LCByNCwgIzQgICAgICAgICAgICAgIEAgaiA9IGorNAorICAgIGNtcCAgICAgICAgIHI0LCByMiAgICAgICAgICAgICAgICAgIEAgajxsaW5lYXJfeF9zaXplCisgICAgYmx0ICAgICAgICAgTElORUFSX1hfU0laRV80X0xPT1AKKworICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzQgICAgICAgICAgICAgIEAgaSA9IGkrNAorICAgIGNtcCAgICAgICAgIHI1LCByMyAgICAgICAgICAgICAgICAgIEAgaTxsaW5lYXJfeV9zaXplCisgICAgYmx0ICAgICAgICAgTElORUFSX1lfU0laRV80X0xPT1AKKworUkVTVE9SRV9SRUc6CisgICAgbGRtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNX0gICAgICAgICAgICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisKK0dFVF9USUxFRF9PRkZTRVQ6CisKKyAgICBtb3YgICAgICAgICByMTEsIHI1LCBhc3IgIzUgICAgICAgICAgICAgICAgIEAgdGVtcDIgPSBpPj41CisgICAgbW92ICAgICAgICAgcjEwLCByNCwgYXNyICM2ICAgICAgICAgICAgICAgICBAIHRlbXAxID0gaj4+NgorCisgICAgYW5kICAgICAgICAgcjEyLCByMTEsICMweDEgICAgICAgICAgICAgICAgICBAIGlmICh0ZW1wMiAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTIsICMweDEKKyAgICBibmUgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xCisKK0dFVF9USUxFRF9PRkZTRVRfT0REX0ZPUk1VTEE6CisgICAgc3ViICAgICAgICAgcjYsIHIxMSwgIzEgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0ZW1wMi0xCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgIzEyNyAgICAgICAgICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzB4N0YgICAgICAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDMgPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxMiwgcjEyLCBhc3IgIzYgICAgICAgICAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyKnRlbXAzCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAxCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjMiAgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyKzIKKyAgICBiaWMgICAgICAgICByMTIsIHIxMCwgIzB4MyAgICAgICAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDE+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyPDwxMQorICAgIGIgICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfUkVUVVJOCisKK0dFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzE6CisgICAgYWRkICAgICAgICAgcjEyLCByMywgIzMxICAgICAgICAgICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3lfc2l6ZSszMQorICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHgxRiAgICAgICAgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+NSk8PDUKKyAgICBzdWIgICAgICAgICByMTIsIHIxMiwgIzMyICAgICAgICAgICAgICAgICAgIEAgdGVtcDMgPSB0ZW1wMyAtIDMyCisgICAgY21wICAgICAgICAgcjUsIHIxMiAgICAgICAgICAgICAgICAgICAgICAgICBAIGlmIChpPCh0ZW1wMy0zMikpIHsKKyAgICBiZ2UgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8yCisgICAgYWRkICAgICAgICAgcjEyLCByMTAsICMyICAgICAgICAgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDErMgorICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMyAgICAgICAgICAgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+Mik8PDIKKyAgICBhZGQgICAgICAgICByNiwgcjEwLCByMTIgICAgICAgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAxK3RlbXAzCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgIzEyNyAgICAgICAgICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzB4N0YgICAgICAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDM+PjYKKyAgICBtdWwgICAgICAgICByMTEsIHIxMSwgcjEyICAgICAgICAgICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IHRpbGVkX3lfaW5kZXgqdGVtcDMKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMSAgICAgICAgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGlsZWRfeV9pbmRleAorICAgIG1vdiAgICAgICAgIHI2LCByNiwgbHNsICMxMSAgICAgICAgICAgICAgICAgQAorICAgIGIgICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfUkVUVVJOCisKK0dFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzI6CisgICAgYWRkICAgICAgICAgcjEyLCByMiwgIzEyNyAgICAgICAgICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzB4N0YgICAgICAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDM+PjYKKyAgICBtdWwgICAgICAgICByNiwgcjExLCByMTIgICAgICAgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAyKnRlbXAzCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTAgICAgICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyPDwxMUAKKworR0VUX1RJTEVEX09GRlNFVF9SRVRVUk46CisgICAgbW92ICAgICAgICAgcGMsIGxyCisgICAgLmZuZW5kCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfeXV2NDIwX252MTJ0X3V2X25lb24ucyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfeXV2NDIwX252MTJ0X3V2X25lb24ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDJjODc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL2NzY195dXY0MjBfbnYxMnRfdXZfbmVvbi5zCkBAIC0wLDAgKzEsNTczIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX3l1djQyMF9udjEydF91dl9uZW9uLnMKKyAqIEBicmllZiAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKiBAYXV0aG9yICBTaGluV29uIExlZSAoc2hpbndvbi5sZWVAc2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTEuNy4wMSA6IENyZWF0ZQorICovCisKKy8qCisgKiBDb252ZXJ0cyBhbmQgSW50ZXJsZWF2ZXMgbGluZWFyIHRvIHRpbGVkCisgKiAxLiBVViBvZiBZVVY0MjBQIHRvIFVWIG9mIE5WMTJUCisgKgorICogQHBhcmFtIG52MTJ0X3V2X2Rlc3QKKyAqICAgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtvdXRdCisgKgorICogQHBhcmFtIHl1djQyMHBfdV9zcmMKKyAqICAgVSBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMHBfdl9zcmMKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF93aWR0aAorICogICBXaWR0aCBvZiBZVVY0MjBbaW5dCisgKgorICogQHBhcmFtIHl1djQyMF91dl9oZWlnaHQKKyAqICAgSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCisKKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZQorICAgIC50eXBlICAgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlLCAlZnVuY3Rpb24KK2NzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZToKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICB0aWxlZF9kZXN0CisgICAgQHIxICAgICBsaW5lYXJfc3JjX3UKKyAgICBAcjIgICAgIGxpbmVhcl9zcmNfdgorICAgIEByMyAgICAgbGluZWFyX3hfc2l6ZQorICAgIEByNCAgICAgbGluZWFyX3lfc2l6ZQorICAgIEByNSAgICAgagorICAgIEByNiAgICAgaQorICAgIEByNyAgICAgdGlsZWRfYWRkcgorICAgIEByOCAgICAgbGluZWFyX2FkZHIKKyAgICBAcjkgICAgIGFsaWduZWRfeF9zaXplCisgICAgQHIxMCAgICBhbGlnbmVkX3lfc2l6ZQorICAgIEByMTEgICAgdGVtcDEKKyAgICBAcjEyICAgIHRlbXAyCisgICAgQHIxNCAgICB0ZW1wMworCisgICAgc3RtZmQgICAgICAgc3AhLCB7cjQtcjEyLHIxNH0gICAgICAgQCBiYWNrdXAgcmVnaXN0ZXJzCisKKyAgICBsZHIgICAgICAgICByNCwgW3NwLCAjNDBdICAgICAgICAgICBAIGxvYWQgbGluZWFyX3lfc2l6ZSB0byByNAorCisgICAgYmljICAgICAgICAgcjEwLCByNCwgIzB4MUYgICAgICAgICAgQCBhbGlnbmVkX3lfc2l6ZSA9IChsaW5lYXJfeV9zaXplPj41KTw8NQorICAgIGJpYyAgICAgICAgIHI5LCByMywgIzB4M0YgICAgICAgICAgIEAgYWxpZ25lZF94X3NpemUgPSAobGluZWFyX3hfc2l6ZT4+Nik8PDYKKworICAgIG1vdiAgICAgICAgIHI2LCAjMCAgICAgICAgICAgICAgICAgIEAgaSA9IDAKK0xPT1BfQUxJR05FRF9ZX1NJWkU6CisKKyAgICBtb3YgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICBAIGogPSAwCitMT09QX0FMSUdORURfWF9TSVpFOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbW92ICAgICAgICAgcjExLCByMywgYXNyICMxICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl94X3NpemUvMgorICAgIG11bCAgICAgICAgIHIxMSwgcjExLCByNiAgICAgICAgICAgIEAgdGVtcDEgPSB0ZW1wMSooaSkKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjUsIGFzciAjMSAgICBAIHRlbXAxID0gdGVtcDErai8yCisgICAgbW92ICAgICAgICAgcjEyLCByMywgYXNyICMxICAgICAgICAgQCB0ZW1wMiA9IGxpbmVhcl94X3NpemUvMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCAjMTYgICAgICAgICAgIEAgdGVtcDIgPSBsaW5lYXJfeF9zaXplLTE2CisKKyAgICBhZGQgICAgICAgICByOCwgcjEsIHIxMSAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX3NyY191K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjExICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl9zcmNfdit0ZW1wMQorICAgIGFkZCAgICAgICAgIHI3LCByMCwgcjcgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMiwgcTN9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTAsIHExMX0sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjNjQgICAgICAgICAgICAgQCBqID0gais2NAorICAgIGNtcCAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgajxhbGlnbmVkX3hfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfQUxJR05FRF9YX1NJWkUKKworICAgIGFkZCAgICAgICAgIHI2LCByNiwgIzMyICAgICAgICAgICAgIEAgaSA9IGkrMzIKKyAgICBjbXAgICAgICAgICByNiwgcjEwICAgICAgICAgICAgICAgICBAIGk8YWxpZ25lZF95X3NpemUKKyAgICBibHQgICAgICAgICBMT09QX0FMSUdORURfWV9TSVpFCisKKyAgICBsZHIgICAgICAgICByNCwgW3NwLCAjNDBdICAgICAgICAgICBAIGxvYWQgbGluZWFyX3lfc2l6ZSB0byByNAorICAgIGNtcCAgICAgICAgIHI2LCByNAorICAgIGJlcSAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yX1NUQVJUCisKK0xPT1BfTElORUFSX1lfU0laRV8xOgorCisgICAgbW92ICAgICAgICAgcjUsICMwICAgICAgICAgICAgICAgICAgQCBqID0gMAorTE9PUF9BTElHTkVEX1hfU0laRV8xOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbW92ICAgICAgICAgcjExLCByMywgYXNyICMxICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl94X3NpemUvMgorICAgIG11bCAgICAgICAgIHIxMSwgcjExLCByNiAgICAgICAgICAgIEAgdGVtcDEgPSB0ZW1wMSooaSkKKyAgICBhZGQgICAgICAgICByMTEsIHIxMSwgcjUsIGFzciAjMSAgICBAIHRlbXAxID0gdGVtcDErai8yCisgICAgbW92ICAgICAgICAgcjEyLCByMywgYXNyICMxICAgICAgICAgQCB0ZW1wMiA9IGxpbmVhcl94X3NpemUvMgorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCAjMTYgICAgICAgICAgIEAgdGVtcDIgPSBsaW5lYXJfeF9zaXplLTE2CisKKyAgICBhZGQgICAgICAgICByOCwgcjEsIHIxMSAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX3NyY191K3RlbXAxCisgICAgYWRkICAgICAgICAgcjExLCByMiwgcjExICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl9zcmNfdit0ZW1wMQorICAgIGFkZCAgICAgICAgIHI3LCByMCwgcjcgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorICAgIGFuZCAgICAgICAgIHIxNCwgcjYsICMweDFGICAgICAgICAgIEAgdGVtcDMgPSBpJjB4MUZACisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGxzbCAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzKjY0CisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworCisgICAgcGxkICAgICAgICAgW3I4LCByM10KKyAgICB2bGQxLjggICAgICB7cTB9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMn0sIFtyOF0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyMTEsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMX0sIFtyMTFdIQorICAgIHZsZDEuOCAgICAgIHtxM30sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxNH0sIFtyOF0hCisgICAgdmxkMS44ICAgICAge3E2fSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E1fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3E3fSwgW3IxMV0sIHIxMgorICAgIHBsZCAgICAgICAgIFtyOCwgcjNdCisgICAgdmxkMS44ICAgICAge3E4fSwgW3I4XSEKKyAgICB2bGQxLjggICAgICB7cTEwfSwgW3I4XSwgcjEyCisgICAgcGxkICAgICAgICAgW3IxMSwgcjNdCisgICAgdmxkMS44ICAgICAge3E5fSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExMX0sIFtyMTFdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjgsIHIzXQorICAgIHZsZDEuOCAgICAgIHtxMTJ9LCBbcjhdIQorICAgIHZsZDEuOCAgICAgIHtxMTR9LCBbcjhdLCByMTIKKyAgICBwbGQgICAgICAgICBbcjExLCByM10KKyAgICB2bGQxLjggICAgICB7cTEzfSwgW3IxMV0hCisgICAgdmxkMS44ICAgICAge3ExNX0sIFtyMTFdLCByMTIKKworICAgIHZzdDIuOCAgICAgIHtxMCwgcTF9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHJ9CisgICAgdnN0Mi44ICAgICAge3EyLCBxM30sIFtyN10hCisgICAgdnN0Mi44ICAgICAge3E0LCBxNX0sIFtyN10hICAgICAgICAgQCBzdG9yZSB7dGlsZWRfYWRkcis2NCoxfQorICAgIHZzdDIuOCAgICAgIHtxNiwgcTd9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxOCwgcTl9LCBbcjddISAgICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqMn0KKyAgICB2c3QyLjggICAgICB7cTEwLCBxMTF9LCBbcjddIQorICAgIHZzdDIuOCAgICAgIHtxMTIsIHExM30sIFtyN10hICAgICAgIEAgc3RvcmUge3RpbGVkX2FkZHIrNjQqM30KKyAgICB2c3QyLjggICAgICB7cTE0LCBxMTV9LCBbcjddIQorCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjNjQgICAgICAgICAgICAgQCBqID0gais2NAorICAgIGNtcCAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgajxhbGlnbmVkX3hfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfQUxJR05FRF9YX1NJWkVfMQorCisgICAgYWRkICAgICAgICAgcjYsIHI2LCAjNCAgICAgICAgICAgICAgQCBpID0gaSs0CisgICAgY21wICAgICAgICAgcjYsIHI0ICAgICAgICAgICAgICAgICAgQCBpPGxpbmVhcl95X3NpemUKKyAgICBibHQgICAgICAgICBMT09QX0xJTkVBUl9ZX1NJWkVfMQorCitMT09QX0xJTkVBUl9ZX1NJWkVfMl9TVEFSVDoKKyAgICBjbXAgICAgICAgICByNSwgcjMKKyAgICBiZXEgICAgICAgICBSRVNUT1JFX1JFRworCisgICAgbW92ICAgICAgICAgcjYsICMwICAgICAgICAgICAgICAgICAgQCBpID0gMAorTE9PUF9MSU5FQVJfWV9TSVpFXzI6CisKKyAgICBtb3YgICAgICAgICByNSwgcjkgICAgICAgICAgICAgICAgICBAIGogPSBhbGlnbmVkX3hfc2l6ZQorTE9PUF9MSU5FQVJfWF9TSVpFXzI6CisKKyAgICBibCAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUCisKKyAgICBtb3YgICAgICAgICByMTEsIHIzLCBhc3IgIzEgICAgICAgICBAIHRlbXAxID0gbGluZWFyX3hfc2l6ZS8yCisgICAgbXVsICAgICAgICAgcjExLCByMTEsIHI2ICAgICAgICAgICAgQCB0ZW1wMSA9IHRlbXAxKihpKQorICAgIGFkZCAgICAgICAgIHIxMSwgcjExLCByNSwgYXNyICMxICAgIEAgdGVtcDEgPSB0ZW1wMStqLzIKKyAgICBtb3YgICAgICAgICByMTIsIHIzLCBhc3IgIzEgICAgICAgICBAIHRlbXAyID0gbGluZWFyX3hfc2l6ZS8yCisgICAgc3ViICAgICAgICAgcjEyLCByMTIsICMxICAgICAgICAgICAgQCB0ZW1wMiA9IGxpbmVhcl94X3NpemUtMQorCisgICAgYWRkICAgICAgICAgcjgsIHIxLCByMTEgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9zcmNfdSt0ZW1wMQorICAgIGFkZCAgICAgICAgIHIxMSwgcjIsIHIxMSAgICAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfc3JjX3YrdGVtcDEKKyAgICBhZGQgICAgICAgICByNywgcjAsIHI3ICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9kZXN0K3RpbGVkX2FkZHIKKyAgICBhbmQgICAgICAgICByMTQsIHI2LCAjMHgxRiAgICAgICAgICBAIHRlbXAzID0gaSYweDFGQAorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc2wgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMyo2NAorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKyAgICBhbmQgICAgICAgICByMTQsIHI1LCAjMHgzRiAgICAgICAgICBAIHRlbXAzID0gaiYweDNGCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTQgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworCisgICAgbGRyYiAgICAgICAgcjEwLCBbcjhdLCAjMQorICAgIGxkcmIgICAgICAgIHIxNCwgW3IxMV0sICMxCisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGxzbCAjOAorICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByMTQKKyAgICBzdHJoICAgICAgICByMTAsIFtyN10sICMyCisgICAgbGRyYiAgICAgICAgcjEwLCBbcjhdLCByMTIKKyAgICBsZHJiICAgICAgICByMTQsIFtyMTFdLCByMTIKKyAgICBtb3YgICAgICAgICByMTQsIHIxNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjEwLCByMTAsIHIxNAorICAgIHN0cmggICAgICAgIHIxMCwgW3I3XSwgIzYyCisKKyAgICBsZHJiICAgICAgICByMTAsIFtyOF0sICMxCisgICAgbGRyYiAgICAgICAgcjE0LCBbcjExXSwgIzEKKyAgICBtb3YgICAgICAgICByMTQsIHIxNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjEwLCByMTAsIHIxNAorICAgIHN0cmggICAgICAgIHIxMCwgW3I3XSwgIzIKKyAgICBsZHJiICAgICAgICByMTAsIFtyOF0sIHIxMgorICAgIGxkcmIgICAgICAgIHIxNCwgW3IxMV0sIHIxMgorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc2wgIzgKKyAgICBvcnIgICAgICAgICByMTAsIHIxMCwgcjE0CisgICAgc3RyaCAgICAgICAgcjEwLCBbcjddLCAjNjIKKworICAgIGxkcmIgICAgICAgIHIxMCwgW3I4XSwgIzEKKyAgICBsZHJiICAgICAgICByMTQsIFtyMTFdLCAjMQorICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBsc2wgIzgKKyAgICBvcnIgICAgICAgICByMTAsIHIxMCwgcjE0CisgICAgc3RyaCAgICAgICAgcjEwLCBbcjddLCAjMgorICAgIGxkcmIgICAgICAgIHIxMCwgW3I4XSwgcjEyCisgICAgbGRyYiAgICAgICAgcjE0LCBbcjExXSwgcjEyCisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGxzbCAjOAorICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByMTQKKyAgICBzdHJoICAgICAgICByMTAsIFtyN10sICM2MgorCisgICAgbGRyYiAgICAgICAgcjEwLCBbcjhdLCAjMQorICAgIGxkcmIgICAgICAgIHIxNCwgW3IxMV0sICMxCisgICAgbW92ICAgICAgICAgcjE0LCByMTQsIGxzbCAjOAorICAgIG9yciAgICAgICAgIHIxMCwgcjEwLCByMTQKKyAgICBzdHJoICAgICAgICByMTAsIFtyN10sICMyCisgICAgbGRyYiAgICAgICAgcjEwLCBbcjhdLCByMTIKKyAgICBsZHJiICAgICAgICByMTQsIFtyMTFdLCByMTIKKyAgICBtb3YgICAgICAgICByMTQsIHIxNCwgbHNsICM4CisgICAgb3JyICAgICAgICAgcjEwLCByMTAsIHIxNAorICAgIHN0cmggICAgICAgIHIxMCwgW3I3XSwgIzYyCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsICM0ICAgICAgICAgICAgICBAIGogPSBqKzQKKyAgICBjbXAgICAgICAgICByNSwgcjMgICAgICAgICAgICAgICAgICBAIGo8bGluZWFyX3hfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1hfU0laRV8yCisKKyAgICBhZGQgICAgICAgICByNiwgcjYsICM0ICAgICAgICAgICAgICBAIGkgPSBpKzQKKyAgICBjbXAgICAgICAgICByNiwgcjQgICAgICAgICAgICAgICAgICBAIGk8bGluZWFyX3lfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworR0VUX1RJTEVEX09GRlNFVDoKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyMTR9CisKKyAgICBtb3YgICAgICAgICByMTIsIHI2LCBhc3IgIzUgICAgICAgICBAIHRlbXAyID0gaT4+NQorICAgIG1vdiAgICAgICAgIHIxMSwgcjUsIGFzciAjNiAgICAgICAgIEAgdGVtcDEgPSBqPj42CisKKyAgICBhbmQgICAgICAgICByMTQsIHIxMiwgIzB4MSAgICAgICAgICBAIGlmICh0ZW1wMiAmIDB4MSkKKyAgICBjbXAgICAgICAgICByMTQsICMweDEKKyAgICBibmUgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xCisKK0dFVF9USUxFRF9PRkZTRVRfT0REX0ZPUk1VTEE6CisgICAgc3ViICAgICAgICAgcjcsIHIxMiwgIzEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDItMQorICAgIGFkZCAgICAgICAgIHIxNCwgcjMsICMxMjcgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeF9zaXplKzEyNworICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDMgPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHI3LCByNywgcjE0ICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIqdGVtcDMKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAxCisgICAgYWRkICAgICAgICAgcjcsIHI3LCAjMiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcisyCisgICAgYmljICAgICAgICAgcjE0LCByMTEsICMweDMgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMT4+Mik8PDIKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxNCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjcsIHI3LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcjw8MTEKKyAgICBiICAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX1JFVFVSTgorCitHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8xOgorICAgIGFkZCAgICAgICAgIHIxNCwgcjQsICMzMSAgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeV9zaXplKzMxCisgICAgYmljICAgICAgICAgcjE0LCByMTQsICMweDFGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+NSk8PDUKKyAgICBzdWIgICAgICAgICByMTQsIHIxNCwgIzMyICAgICAgICAgICBAIHRlbXAzID0gdGVtcDMgLSAzMgorICAgIGNtcCAgICAgICAgIHI2LCByMTQgICAgICAgICAgICAgICAgIEAgaWYgKGk8KHRlbXAzLTMyKSkgeworICAgIGJnZSAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzIKKyAgICBhZGQgICAgICAgICByMTQsIHIxMSwgIzIgICAgICAgICAgICBAIHRlbXAzID0gdGVtcDErMgorICAgIGJpYyAgICAgICAgIHIxNCwgcjE0LCAjMyAgICAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjIpPDwyCisgICAgYWRkICAgICAgICAgcjcsIHIxMSwgcjE0ICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDErdGVtcDMKKyAgICBhZGQgICAgICAgICByMTQsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTQsIHIxNCwgIzB4N0YgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHIxMiwgcjEyLCByMTQgICAgICAgICAgIEAgdGlsZWRfeV9pbmRleCA9IHRpbGVkX3lfaW5kZXgqdGVtcDMKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMiAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RpbGVkX3lfaW5kZXgKKyAgICBtb3YgICAgICAgICByNywgcjcsIGxzbCAjMTEgICAgICAgICBACisgICAgYiAgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVF9SRVRVUk4KKworR0VUX1RJTEVEX09GRlNFVF9FVkVOX0ZPUk1VTEFfMjoKKyAgICBhZGQgICAgICAgICByMTQsIHIzLCAjMTI3ICAgICAgICAgICBAIHRlbXAzID0gbGluZWFyX3hfc2l6ZSsxMjcKKyAgICBiaWMgICAgICAgICByMTQsIHIxNCwgIzB4N0YgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj43KTw8NworICAgIG1vdiAgICAgICAgIHIxNCwgcjE0LCBhc3IgIzYgICAgICAgIEAgdGVtcDMgPSB0ZW1wMz4+NgorICAgIG11bCAgICAgICAgIHI3LCByMTIsIHIxNCAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRlbXAyKnRlbXAzCisgICAgYWRkICAgICAgICAgcjcsIHI3LCByMTEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMworICAgIG1vdiAgICAgICAgIHI3LCByNywgbHNsICMxMSAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHI8PDExQAorCitHRVRfVElMRURfT0ZGU0VUX1JFVFVSTjoKKyAgICBsZG1mZCAgICAgICBzcCEsIHtyMTV9ICAgICAgICAgICAgICBAIHJlc3RvcmUgcmVnaXN0ZXJzCisgICAgLmZuZW5kCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfeXV2NDIwX252MTJ0X3lfbmVvbi5zIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvY3NjL2NzY195dXY0MjBfbnYxMnRfeV9uZW9uLnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y4OTMyYQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2NzYy9jc2NfeXV2NDIwX252MTJ0X3lfbmVvbi5zCkBAIC0wLDAgKzEsNDUxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDExIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgY3NjX3l1djQyMF9udjEydF95X25lb24ucworICogQGJyaWVmICAgU0VDX09NWCBzcGVjaWZpYyBkZWZpbmUKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS43LjAxIDogQ3JlYXRlCisgKi8KKworLyoKKyAqIENvbnZlcnRzIGxpbmVhciBkYXRhIHRvIHRpbGVkLgorICogMS4gWSBvZiBZVVY0MjBQIHRvIFkgb2YgTlYxMlQKKyAqIDIuIFkgb2YgWVVWNDIwUyB0byBZIG9mIE5WMTJUCisgKiAzLiBVViBvZiBZVVY0MjBTIHRvIFVWIG9mIE5WMTJUCisgKgorICogQHBhcmFtIG52MTJ0X2Rlc3QKKyAqICAgWSBvciBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3NyYworICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUChTKVtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCisKKyAgICAuYXJjaCBhcm12Ny1hCisgICAgLnRleHQKKyAgICAuZ2xvYmFsIGNzY19saW5lYXJfdG9fdGlsZWQKKyAgICAudHlwZSAgIGNzY19saW5lYXJfdG9fdGlsZWQsICVmdW5jdGlvbgorY3NjX2xpbmVhcl90b190aWxlZDoKKyAgICAuZm5zdGFydAorCisgICAgQHIwICAgICB0aWxlZF9kZXN0CisgICAgQHIxICAgICBsaW5lYXJfc3JjCisgICAgQHIyICAgICBsaW5lYXJfeF9zaXplCisgICAgQHIzICAgICBsaW5lYXJfeV9zaXplCisgICAgQHI0ICAgICBqCisgICAgQHI1ICAgICBpCisgICAgQHI2ICAgICBubih0aWxlZF9hZGRyKQorICAgIEByNyAgICAgbW0obGluZWFyX2FkZHIpCisgICAgQHI4ICAgICBhbGlnbmVkX3hfc2l6ZQorICAgIEByOSAgICAgYWxpZ25lZF95X3NpemUKKyAgICBAcjEwICAgIHRlbXAxCisgICAgQHIxMSAgICB0ZW1wMgorICAgIEByMTIgICAgdGVtcDMKKyAgICBAcjE0ICAgIHRlbXA0CisKKyAgICBzdG1mZCAgICAgICBzcCEsIHtyNC1yMTIscjE0fSAgICAgICBAIGJhY2t1cCByZWdpc3RlcnMKKworICAgIGJpYyAgICAgICAgIHI5LCByMywgIzB4MUYgICAgICAgICAgIEAgYWxpZ25lZF95X3NpemUgPSAobGluZWFyX3lfc2l6ZT4+NSk8PDUKKyAgICBiaWMgICAgICAgICByOCwgcjIsICMweDNGICAgICAgICAgICBAIGFsaWduZWRfeF9zaXplID0gKGxpbmVhcl94X3NpemU+PjYpPDw2CisKKyAgICBtb3YgICAgICAgICByNSwgIzAgICAgICAgICAgICAgICAgICBAIGkgPSAwCitMT09QX0FMSUdORURfWV9TSVpFOgorCisgICAgbW92ICAgICAgICAgcjQsICMwICAgICAgICAgICAgICAgICAgQCBqID0gMAorTE9PUF9BTElHTkVEX1hfU0laRToKKworICAgIGJsICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVQKKworICAgIG11bCAgICAgICAgIHIxMCwgcjIsIHI1ICAgICAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfeF9zaXplKihpKQorICAgIGFkZCAgICAgICAgIHI3LCByMSwgcjQgICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfc3JjK2oKKyAgICBhZGQgICAgICAgICByNywgcjcsIHIxMCAgICAgICAgICAgICBAIGxpbmVhcl9hZGRyID0gbGluZWFyX2FkZHIrdGVtcDEKKyAgICBzdWIgICAgICAgICByMTAsIHIyLCAjMzIKKworICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorCisgICAgYWRkICAgICAgICAgcjYsIHIwLCByNiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfZGVzdCt0aWxlZF9hZGRyCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKworICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E4LCBxOX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyNl0hCisKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjddLCByMTAKKworICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSwgcjEwCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKworICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E4LCBxOX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyNl0hCisKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjddLCByMTAKKworICAgIHZzdDEuOCAgICAgIHtxMCwgcTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMiwgcTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNCwgcTV9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxNiwgcTd9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxOCwgcTl9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTAsIHExMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMiwgcTEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTE0LCBxMTV9LCBbcjZdIQorCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMCwgcTF9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTIsIHEzfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxNCwgcTV9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTYsIHE3fSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxOCwgcTl9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTEwLCBxMTF9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMiwgcTEzfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExNCwgcTE1fSwgW3I3XSwgcjEwCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKworICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTAsIHExfSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EyLCBxM30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTQsIHE1fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E2LCBxN30sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTgsIHE5fSwgW3I3XSEKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3ExMCwgcTExfSwgW3I3XSwgcjEwCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTIsIHExM30sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTQsIHExNX0sIFtyN10sIHIxMAorCisgICAgdnN0MS44ICAgICAge3EwLCBxMX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3EyLCBxM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E0LCBxNX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E2LCBxN30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3E4LCBxOX0sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExMCwgcTExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEyLCBxMTN9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTQsIHExNX0sIFtyNl0hCisKKyAgICBhZGQgICAgICAgICByNCwgcjQsICM2NCAgICAgICAgICAgICBAIGogPSBqKzY0CisgICAgY21wICAgICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgQCBqPGFsaWduZWRfeF9zaXplCisgICAgYmx0ICAgICAgICAgTE9PUF9BTElHTkVEX1hfU0laRQorCisgICAgYWRkICAgICAgICAgcjUsIHI1LCAjMzIgICAgICAgICAgICAgQCBpID0gaSszMgorICAgIGNtcCAgICAgICAgIHI1LCByOSAgICAgICAgICAgICAgICAgIEAgaTxhbGlnbmVkX3lfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfQUxJR05FRF9ZX1NJWkUKKworICAgIGNtcCAgICAgICAgIHI1LCByMworICAgIGJlcSAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yX1NUQVJUCisKK0xPT1BfTElORUFSX1lfU0laRV8xOgorCisgICAgbW92ICAgICAgICAgcjQsICMwICAgICAgICAgICAgICAgICAgQCBqID0gMAorTE9PUF9BTElHTkVEX1hfU0laRV8xOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbXVsICAgICAgICAgcjEwLCByMiwgcjUgICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl94X3NpemUqKGkpCisgICAgYWRkICAgICAgICAgcjcsIHIxLCByNCAgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9zcmMragorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfYWRkcit0ZW1wMQorICAgIHN1YiAgICAgICAgIHIxMCwgcjIsICMzMiAgICAgICAgICAgIEAgdGVtcDEgPSBsaW5lYXJfeF9zaXplLTMyCisKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3EwLCBxMX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMiwgcTN9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E0LCBxNX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxNiwgcTd9LCBbcjddLCByMTAKKyAgICBwbGQgICAgICAgICBbcjcsIHIyLCBsc2wgIzFdCisgICAgdmxkMS44ICAgICAge3E4LCBxOX0sIFtyN10hCisgICAgcGxkICAgICAgICAgW3I3LCByMiwgbHNsICMxXQorICAgIHZsZDEuOCAgICAgIHtxMTAsIHExMX0sIFtyN10sIHIxMAorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTEyLCBxMTN9LCBbcjddIQorICAgIHBsZCAgICAgICAgIFtyNywgcjIsIGxzbCAjMV0KKyAgICB2bGQxLjggICAgICB7cTE0LCBxMTV9LCBbcjddLCByMTAKKworICAgIGFkZCAgICAgICAgIHI2LCByMCwgcjYgICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2Rlc3QrdGlsZWRfYWRkcgorICAgIGFuZCAgICAgICAgIHIxMSwgcjUsICMweDFGICAgICAgICAgIEAgdGVtcDIgPSBpJjB4MUYKKyAgICBtb3YgICAgICAgICByMTEsIHIxMSwgbHNsICM2ICAgICAgICBAIHRlbXAyID0gNjQqdGVtcDIKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAyCisKKyAgICB2c3QxLjggICAgICB7cTAsIHExfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTIsIHEzfSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTQsIHE1fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTYsIHE3fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTgsIHE5fSwgW3I2XSEKKyAgICB2c3QxLjggICAgICB7cTEwLCBxMTF9LCBbcjZdIQorICAgIHZzdDEuOCAgICAgIHtxMTIsIHExM30sIFtyNl0hCisgICAgdnN0MS44ICAgICAge3ExNCwgcTE1fSwgW3I2XSEKKworICAgIGFkZCAgICAgICAgIHI0LCByNCwgIzY0ICAgICAgICAgICAgIEAgaiA9IGorNjQKKyAgICBjbXAgICAgICAgICByNCwgcjggICAgICAgICAgICAgICAgICBAIGo8YWxpZ25lZF94X3NpemUKKyAgICBibHQgICAgICAgICBMT09QX0FMSUdORURfWF9TSVpFXzEKKworICAgIGFkZCAgICAgICAgIHI1LCByNSwgIzQgICAgICAgICAgICAgIEAgaSA9IGkrNAorICAgIGNtcCAgICAgICAgIHI1LCByMyAgICAgICAgICAgICAgICAgIEAgaTxsaW5lYXJfeV9zaXplCisgICAgYmx0ICAgICAgICAgTE9PUF9MSU5FQVJfWV9TSVpFXzEKKworTE9PUF9MSU5FQVJfWV9TSVpFXzJfU1RBUlQ6CisgICAgY21wICAgICAgICAgcjQsIHIyCisgICAgYmVxICAgICAgICAgUkVTVE9SRV9SRUcKKworICAgIG1vdiAgICAgICAgIHI1LCAjMCAgICAgICAgICAgICAgICAgIEAgaSA9IDAKK0xPT1BfTElORUFSX1lfU0laRV8yOgorCisgICAgbW92ICAgICAgICAgcjQsIHI4ICAgICAgICAgICAgICAgICAgQCBqID0gYWxpZ25lZF94X3NpemUKK0xPT1BfTElORUFSX1hfU0laRV8yOgorCisgICAgYmwgICAgICAgICAgR0VUX1RJTEVEX09GRlNFVAorCisgICAgbXVsICAgICAgICAgcjEwLCByMiwgcjUgICAgICAgICAgICAgQCB0ZW1wMSA9IGxpbmVhcl94X3NpemUqKGkpCisgICAgYWRkICAgICAgICAgcjcsIHIxLCByNCAgICAgICAgICAgICAgQCBsaW5lYXJfYWRkciA9IGxpbmVhcl9zcmMragorICAgIGFkZCAgICAgICAgIHI3LCByNywgcjEwICAgICAgICAgICAgIEAgbGluZWFyX2FkZHIgPSBsaW5lYXJfYWRkcit0ZW1wMQorCisgICAgYWRkICAgICAgICAgcjYsIHIwLCByNiAgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfZGVzdCt0aWxlZF9hZGRyCisgICAgYW5kICAgICAgICAgcjExLCByNSwgIzB4MUYgICAgICAgICAgQCB0ZW1wMiA9IGkmMHgxRgorICAgIG1vdiAgICAgICAgIHIxMSwgcjExLCBsc2wgIzYgICAgICAgIEAgdGVtcDIgPSA2NCp0ZW1wMgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjExICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDIKKyAgICBhbmQgICAgICAgICByMTEsIHI0LCAjMHgzRiAgICAgICAgICBAIHRlbXAyID0gaiYweDNGCisgICAgYWRkICAgICAgICAgcjYsIHI2LCByMTEgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcit0ZW1wMgorCisgICAgbGRyICAgICAgICAgcjEwLCBbcjddLCByMgorICAgIGxkciAgICAgICAgIHIxMSwgW3I3XSwgcjIKKyAgICBsZHIgICAgICAgICByMTIsIFtyN10sIHIyCisgICAgbGRyICAgICAgICAgcjE0LCBbcjddLCByMgorICAgIHN0ciAgICAgICAgIHIxMCwgW3I2XSwgIzY0CisgICAgc3RyICAgICAgICAgcjExLCBbcjZdLCAjNjQKKyAgICBzdHIgICAgICAgICByMTIsIFtyNl0sICM2NAorICAgIHN0ciAgICAgICAgIHIxNCwgW3I2XSwgIzY0CisKKyAgICBhZGQgICAgICAgICByNCwgcjQsICM0ICAgICAgICAgICAgICBAIGogPSBqKzQKKyAgICBjbXAgICAgICAgICByNCwgcjIgICAgICAgICAgICAgICAgICBAIGo8bGluZWFyX3hfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1hfU0laRV8yCisKKyAgICBhZGQgICAgICAgICByNSwgcjUsICM0ICAgICAgICAgICAgICBAIGkgPSBpKzQKKyAgICBjbXAgICAgICAgICByNSwgcjMgICAgICAgICAgICAgICAgICBAIGk8bGluZWFyX3lfc2l6ZQorICAgIGJsdCAgICAgICAgIExPT1BfTElORUFSX1lfU0laRV8yCisKK1JFU1RPUkVfUkVHOgorICAgIGxkbWZkICAgICAgIHNwISwge3I0LXIxMixyMTV9ICAgICAgIEAgcmVzdG9yZSByZWdpc3RlcnMKKworR0VUX1RJTEVEX09GRlNFVDoKKworICAgIG1vdiAgICAgICAgIHIxMSwgcjUsIGFzciAjNSAgICAgICAgIEAgdGVtcDIgPSBpPj41CisgICAgbW92ICAgICAgICAgcjEwLCByNCwgYXNyICM2ICAgICAgICAgQCB0ZW1wMSA9IGo+PjYKKworICAgIGFuZCAgICAgICAgIHIxMiwgcjExLCAjMHgxICAgICAgICAgIEAgaWYgKHRlbXAyICYgMHgxKQorICAgIGNtcCAgICAgICAgIHIxMiwgIzB4MQorICAgIGJuZSAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzEKKworR0VUX1RJTEVEX09GRlNFVF9PRERfRk9STVVMQToKKyAgICBzdWIgICAgICAgICByNiwgcjExLCAjMSAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0ZW1wMi0xCisgICAgYWRkICAgICAgICAgcjEyLCByMiwgIzEyNyAgICAgICAgICAgQCB0ZW1wMyA9IGxpbmVhcl94X3NpemUrMTI3CisgICAgYmljICAgICAgICAgcjEyLCByMTIsICMweDdGICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMyA+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjYsIHI2LCByMTIgICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcip0ZW1wMworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEwICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDEKKyAgICBhZGQgICAgICAgICByNiwgcjYsICMyICAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyKzIKKyAgICBiaWMgICAgICAgICByMTIsIHIxMCwgIzB4MyAgICAgICAgICBAIHRlbXAzID0gKHRlbXAxPj4yKTw8MgorICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjEyICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGVtcDMKKyAgICBtb3YgICAgICAgICByNiwgcjYsIGxzbCAjMTEgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyPDwxMQorICAgIGIgICAgICAgICAgIEdFVF9USUxFRF9PRkZTRVRfUkVUVVJOCisKK0dFVF9USUxFRF9PRkZTRVRfRVZFTl9GT1JNVUxBXzE6CisgICAgYWRkICAgICAgICAgcjEyLCByMywgIzMxICAgICAgICAgICAgQCB0ZW1wMyA9IGxpbmVhcl95X3NpemUrMzEKKyAgICBiaWMgICAgICAgICByMTIsIHIxMiwgIzB4MUYgICAgICAgICBAIHRlbXAzID0gKHRlbXAzPj41KTw8NQorICAgIHN1YiAgICAgICAgIHIxMiwgcjEyLCAjMzIgICAgICAgICAgIEAgdGVtcDMgPSB0ZW1wMyAtIDMyCisgICAgY21wICAgICAgICAgcjUsIHIxMiAgICAgICAgICAgICAgICAgQCBpZiAoaTwodGVtcDMtMzIpKSB7CisgICAgYmdlICAgICAgICAgR0VUX1RJTEVEX09GRlNFVF9FVkVOX0ZPUk1VTEFfMgorICAgIGFkZCAgICAgICAgIHIxMiwgcjEwLCAjMiAgICAgICAgICAgIEAgdGVtcDMgPSB0ZW1wMSsyCisgICAgYmljICAgICAgICAgcjEyLCByMTIsICMzICAgICAgICAgICAgQCB0ZW1wMyA9ICh0ZW1wMz4+Mik8PDIKKyAgICBhZGQgICAgICAgICByNiwgcjEwLCByMTIgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0ZW1wMSt0ZW1wMworICAgIGFkZCAgICAgICAgIHIxMiwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeF9zaXplKzEyNworICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjExLCByMTEsIHIxMiAgICAgICAgICAgQCB0aWxlZF95X2luZGV4ID0gdGlsZWRfeV9pbmRleCp0ZW1wMworICAgIGFkZCAgICAgICAgIHI2LCByNiwgcjExICAgICAgICAgICAgIEAgdGlsZWRfYWRkciA9IHRpbGVkX2FkZHIrdGlsZWRfeV9pbmRleAorICAgIG1vdiAgICAgICAgIHI2LCByNiwgbHNsICMxMSAgICAgICAgIEAKKyAgICBiICAgICAgICAgICBHRVRfVElMRURfT0ZGU0VUX1JFVFVSTgorCitHRVRfVElMRURfT0ZGU0VUX0VWRU5fRk9STVVMQV8yOgorICAgIGFkZCAgICAgICAgIHIxMiwgcjIsICMxMjcgICAgICAgICAgIEAgdGVtcDMgPSBsaW5lYXJfeF9zaXplKzEyNworICAgIGJpYyAgICAgICAgIHIxMiwgcjEyLCAjMHg3RiAgICAgICAgIEAgdGVtcDMgPSAodGVtcDM+PjcpPDw3CisgICAgbW92ICAgICAgICAgcjEyLCByMTIsIGFzciAjNiAgICAgICAgQCB0ZW1wMyA9IHRlbXAzPj42CisgICAgbXVsICAgICAgICAgcjYsIHIxMSwgcjEyICAgICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGVtcDIqdGVtcDMKKyAgICBhZGQgICAgICAgICByNiwgcjYsIHIxMCAgICAgICAgICAgICBAIHRpbGVkX2FkZHIgPSB0aWxlZF9hZGRyK3RlbXAzCisgICAgbW92ICAgICAgICAgcjYsIHI2LCBsc2wgIzExICAgICAgICAgQCB0aWxlZF9hZGRyID0gdGlsZWRfYWRkcjw8MTFACisKK0dFVF9USUxFRF9PRkZTRVRfUkVUVVJOOgorICAgIG1vdiAgICAgICAgIHBjLCBscgorICAgIC5mbmVuZAorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9kZWMvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2RlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNWNkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9kZWMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI2IEBACisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCXNyYy9Tc2JTaXBNZmNEZWNBUEkuYworCitMT0NBTF9NT0RVTEUgOj0gbGlic2VjbWZjZGVjYXBpCisKKworCitMT0NBTF9DRkxBR1MgOj0KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0KKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJsb2cKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisJJChTRUNfQ09ERUNTKS92aWRlby9tZmNfYzExMC9pbmNsdWRlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvZGVjL3NyYy9Tc2JTaXBNZmNEZWNBUEkuYyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NGVmOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2RlYy9zcmMvU3NiU2lwTWZjRGVjQVBJLmMKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJtZmNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiU3NiU2lwTWZjQXBpLmgiCisKKyNkZWZpbmUgX01GQ0xJQl9NQUdJQ19OVU1CRVIgICAgMHg5MjI0MTAwMAorCisjZGVmaW5lIFVTUl9EQVRBX1NUQVJUX0NPREUgICAgICgweDAwMDAwMUIyKQorI2RlZmluZSBWT1BfU1RBUlRfQ09ERSAgICAgICAgICAoMHgwMDAwMDFCNikKKyNkZWZpbmUgTVA0X1NUQVJUX0NPREUgICAgICAgICAgKDB4MDAwMDAxKQorCitzdGF0aWMgdm9pZCBnZXRBQnl0ZShjaGFyICpidWZmLCBpbnQgKmNvZGUpCit7CisgICAgaW50IGJ5dGU7CisKKyAgICAqY29kZSA9ICgqY29kZSA8PCA4KTsKKyAgICBieXRlID0gKGludCkqYnVmZjsKKyAgICBieXRlICY9IDB4RkY7CisgICAgKmNvZGUgfD0gYnl0ZTsKK30KKworc3RhdGljIG1mY19wYWNrZWRfbW9kZSBpc1BCUGFja2VkKF9NRkNMSUIgKnBDdHgsIGludCBsZW5ndGgpCit7CisgICAgY2hhciAqc3RybUJ1ZmZlciA9IE5VTEw7CisgICAgY2hhciAqc3RybUJ1ZmZlckVuZCA9IE5VTEw7CisgICAgaW50IHN0YXJ0Q29kZSA9IDB4RkZGRkZGRkY7CisKKyAgICBzdHJtQnVmZmVyID0gKGNoYXIgKilwQ3R4LT52aXJTdHJtQnVmOworICAgIHN0cm1CdWZmZXJFbmQgPSAoY2hhciAqKXBDdHgtPnZpclN0cm1CdWYgKyBsZW5ndGg7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICB3aGlsZSAoc3RhcnRDb2RlICE9IFVTUl9EQVRBX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgIGlmIChzdGFydENvZGUgPT0gVk9QX1NUQVJUX0NPREUpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaXNQQlBhY2tlZDogVk9QIFNUQVJUIEZvdW5kICEhLi4uLi5yZXR1cm5cbiIpOworICAgICAgICAgICAgICAgIEFMT0dWKCJpc1BCUGFja2VkOiBOb24gUGFja2VkIFBCXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1VOUEFDS0VEX1BCOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ2V0QUJ5dGUoc3RybUJ1ZmZlciwgJnN0YXJ0Q29kZSk7CisgICAgICAgICAgICBzdHJtQnVmZmVyKys7CisgICAgICAgICAgICBpZiAoc3RybUJ1ZmZlciA+PSBzdHJtQnVmZmVyRW5kKQorICAgICAgICAgICAgICAgIGdvdG8gb3V0OworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJpc1BCUGFja2VkOiBVc2VyIERhdGEgRm91bmQgISFcbiIpOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmICgqc3RybUJ1ZmZlciA9PSAncCcpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiaXNQQlBhY2tlZDogUGFja2VkIFBCXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTUZDX1BBQ0tFRF9QQjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGdldEFCeXRlKHN0cm1CdWZmZXIsICZzdGFydENvZGUpOworICAgICAgICAgICAgc3RybUJ1ZmZlcisrOworICAgICAgICAgICAgaWYgKHN0cm1CdWZmZXIgPj0gc3RybUJ1ZmZlckVuZCkKKyAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgfSB3aGlsZSAoKHN0YXJ0Q29kZSA+PiA4KSAhPSBNUDRfU1RBUlRfQ09ERSk7CisgICAgfQorCitvdXQ6CisgICAgQUxPR1YoImlzUEJQYWNrZWQ6IE5vbiBQYWNrZWQgUEJcbiIpOworICAgIHJldHVybiBNRkNfVU5QQUNLRURfUEI7Cit9CisKK3ZvaWQgKlNzYlNpcE1mY0RlY09wZW4odm9pZCAqdmFsdWUpCit7CisgICAgaW50IGhNRkNPcGVuOworICAgIHVuc2lnbmVkIGludCBtYXBwZWRfYWRkcjsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIG1mY19jb21tb25fYXJncyBEZWNBcmc7CisgICAgaW50IHJldF9jb2RlOworCisgICAgcENUWCA9IChfTUZDTElCICopbWFsbG9jKHNpemVvZihfTUZDTElCKSk7CisgICAgaWYgKHBDVFggPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjT3BlbjogbWFsbG9jIGZhaWxlZC5cbiIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbWVtc2V0KHBDVFgsIDAsIHNpemVvZihfTUZDTElCKSk7CisKKyAgICBoTUZDT3BlbiA9IG9wZW4oUzVQQzExMF9NRkNfREVWX05BTUUsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKyAgICBpZiAoaE1GQ09wZW4gPCAwKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNPcGVuOiBNRkMgT3BlbiBmYWlsdXJlXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCoodW5zaWduZWQgaW50ICopdmFsdWUgPT0gTk9fQ0FDSEUgfHwKKyAgICAgICAgKih1bnNpZ25lZCBpbnQgKil2YWx1ZSA9PSBDQUNIRSkgeworICAgICAgICBEZWNBcmcuYXJncy5idWZfdHlwZSA9ICoodW5zaWduZWQgaW50ICopdmFsdWU7CisgICAgICAgIHJldF9jb2RlID0gaW9jdGwoaE1GQ09wZW4sIElPQ1RMX01GQ19CVUZfQ0FDSEUsICZEZWNBcmcpOworICAgICAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNPcGVuRXh0OiBJT0NUTF9NRkNfQlVGX0NBQ0hFICglZCkgZmFpbGVkXG4iLCBEZWNBcmcucmV0X2NvZGUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY09wZW5FeHQ6IHZhbHVlIGlzIGludmFsaWQsIHZhbHVlOiAlZFxuIiwgKihpbnQgKil2YWx1ZSk7CisgICAgfQorCisgICAgbWFwcGVkX2FkZHIgPSAodW5zaWduZWQgaW50KW1tYXAoMCwgTU1BUF9CVUZGRVJfU0laRV9NTUFQLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBoTUZDT3BlbiwgMCk7CisgICAgaWYgKCFtYXBwZWRfYWRkcikgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjT3BlbjogRklNVjUuMCBkcml2ZXIgYWRkcmVzcyBtYXBwaW5nIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBDVFgtPm1hZ2ljID0gX01GQ0xJQl9NQUdJQ19OVU1CRVI7CisgICAgcENUWC0+aE1GQyA9IGhNRkNPcGVuOworICAgIHBDVFgtPm1hcHBlZF9hZGRyID0gbWFwcGVkX2FkZHI7CisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgPSBNRkNfVVNFX05PTkU7CisKKyAgICByZXR1cm4gKHZvaWQgKilwQ1RYOworfQorCitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjSW5pdCh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNfdHlwZSwgaW50IEZyYW1lbGVuZykKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisgICAgaW50IHBhY2tlZFBCID0gTUZDX1VOUEFDS0VEX1BCOworICAgIG1mY19jb21tb25fYXJncyBEZWNBcmc7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY1NldENvbmZpZzogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisKKyAgICBpZiAoKGNvZGVjX3R5cGUgIT0gTVBFRzRfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gSDI2NF9ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gSDI2M19ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gTVBFRzFfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gTVBFRzJfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjFfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjJfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjNfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gRklNVjRfREVDKSAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gWFZJRF9ERUMpICAgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gVkMxUkNWX0RFQykgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gVkMxX0RFQykpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY09wZW46IFVuZGVmaW5lZCBjb2RlYyB0eXBlLlxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWC0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisKKyAgICBpZiAoKHBDVFgtPmNvZGVjX3R5cGUgPT0gTVBFRzRfREVDKSAgIHx8CisgICAgICAgIChwQ1RYLT5jb2RlY190eXBlID09IEZJTVYxX0RFQykgfHwKKyAgICAgICAgKHBDVFgtPmNvZGVjX3R5cGUgPT0gRklNVjJfREVDKSB8fAorICAgICAgICAocENUWC0+Y29kZWNfdHlwZSA9PSBGSU1WM19ERUMpIHx8CisgICAgICAgIChwQ1RYLT5jb2RlY190eXBlID09IEZJTVY0X0RFQykgfHwKKyAgICAgICAgKHBDVFgtPmNvZGVjX3R5cGUgPT0gWFZJRF9ERUMpKQorICAgICAgICBwYWNrZWRQQiA9IGlzUEJQYWNrZWQocENUWCwgRnJhbWVsZW5nKTsKKworICAgIC8qIGluaXQgYXJncyAqLworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX2NvZGVjX3R5cGUgPSBwQ1RYLT5jb2RlY190eXBlOworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX3N0cm1fc2l6ZSA9IEZyYW1lbGVuZzsKKyAgICBEZWNBcmcuYXJncy5kZWNfaW5pdC5pbl9zdHJtX2J1ZiA9IHBDVFgtPnBoeVN0cm1CdWY7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2luaXQuaW5fcGFja2VkX1BCID0gcGFja2VkUEI7CisKKyAgICAvKiBtZW0gYWxsb2MgYXJncyAqLworICAgIERlY0FyZy5hcmdzLmRlY19pbml0LmluX21hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19ERUNfSU5JVCwgJkRlY0FyZyk7CisgICAgaWYgKERlY0FyZy5yZXRfY29kZSAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNJbml0OiBJT0NUTF9NRkNfREVDX0lOSVQgKCVkKSBmYWlsZWRcbiIsIERlY0FyZy5yZXRfY29kZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19JTklUX0ZBSUw7CisgICAgfQorCisgICAgcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGggPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfaW1nX3dpZHRoOworICAgIHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodCA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9pbWdfaGVpZ2h0OworICAgIHBDVFgtPmRlY091dEluZm8uYnVmX3dpZHRoID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2J1Zl93aWR0aDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl9oZWlnaHQgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfYnVmX2hlaWdodDsKKworICAgIC8qIGJ5IFJhaW5BZGUgOiBjcm9wIGluZm9ybWF0aW9uICovCisgICAgcENUWC0+ZGVjT3V0SW5mby5jcm9wX3RvcF9vZmZzZXQgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfY3JvcF90b3Bfb2Zmc2V0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2Nyb3BfYm90dG9tX29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfbGVmdF9vZmZzZXQgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfY3JvcF9sZWZ0X29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2Nyb3BfcmlnaHRfb2Zmc2V0OworCisgICAgcENUWC0+dmlyRnJtQnVmLmx1bWEgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfdV9hZGRyLmx1bWE7CisgICAgcENUWC0+dmlyRnJtQnVmLmNocm9tYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF91X2FkZHIuY2hyb21hOworCisgICAgcENUWC0+cGh5RnJtQnVmLmx1bWEgPSBEZWNBcmcuYXJncy5kZWNfaW5pdC5vdXRfcF9hZGRyLmx1bWE7CisgICAgcENUWC0+cGh5RnJtQnVmLmNocm9tYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9wX2FkZHIuY2hyb21hOworICAgIHBDVFgtPnNpemVGcm1CdWYubHVtYSA9IERlY0FyZy5hcmdzLmRlY19pbml0Lm91dF9mcmFtZV9idWZfc2l6ZS5sdW1hOworICAgIHBDVFgtPnNpemVGcm1CdWYuY2hyb21hID0gRGVjQXJnLmFyZ3MuZGVjX2luaXQub3V0X2ZyYW1lX2J1Zl9zaXplLmNocm9tYTsKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyB8PSBNRkNfVVNFX1lVVl9CVUZGOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNFeGUodm9pZCAqb3BlbkhhbmRsZSwgaW50IGxlbmd0aEJ1ZkZpbGwpCit7CisgICAgaW50IHJldF9jb2RlOworICAgIGludCBZb2Zmc2V0OworICAgIGludCBDb2Zmc2V0OworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgbWZjX2NvbW1vbl9hcmdzIERlY0FyZzsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY0V4ZTogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAoKGxlbmd0aEJ1ZkZpbGwgPCAwKSB8fCAobGVuZ3RoQnVmRmlsbCA+IE1BWF9ERUNPREVSX0lOUFVUX0JVRkZFUl9TSVpFKSkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjRXhlOiBsZW5ndGhCdWZGaWxsIGlzIGludmFsaWQuIChsZW5ndGhCdWZGaWxsPSVkKVxuIiwgbGVuZ3RoQnVmRmlsbCk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKyAgICBtZW1zZXQoJkRlY0FyZywgMHgwMCwgc2l6ZW9mKERlY0FyZykpOworCisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9jb2RlY190eXBlID0gcENUWC0+Y29kZWNfdHlwZTsKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX3N0cm1fYnVmID0gcENUWC0+cGh5U3RybUJ1ZjsKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX3N0cm1fc2l6ZSA9IGxlbmd0aEJ1ZkZpbGw7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmx1bWEgPSBwQ1RYLT5waHlGcm1CdWYubHVtYTsKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX2ZybV9idWYuY2hyb21hID0gcENUWC0+cGh5RnJtQnVmLmNocm9tYTsKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX2ZybV9zaXplLmx1bWEgPSBwQ1RYLT5zaXplRnJtQnVmLmx1bWE7CisgICAgRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fc2l6ZS5jaHJvbWEgPSBwQ1RYLT5zaXplRnJtQnVmLmNocm9tYTsKKyAgICBEZWNBcmcuYXJncy5kZWNfZXhlLmluX2ZyYW1ldGFnID0gcENUWC0+aW5fZnJhbWV0YWc7CisKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19ERUNfRVhFLCAmRGVjQXJnKTsKKyAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY0V4ZTogSU9DVExfTUZDX0RFQ19FWEUgZmFpbGVkKHJldCA6ICVkKVxuIiwgRGVjQXJnLnJldF9jb2RlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX0VYRV9FUlI7CisgICAgfQorCisgICAgWW9mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfWV9hZGRyIC0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmx1bWE7CisgICAgQ29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfQ19hZGRyIC0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5pbl9mcm1fYnVmLmNocm9tYTsKKworICAgIHBDVFgtPmRlY091dEluZm8uWVBoeUFkZHIgPSAodm9pZCAqKShEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9kaXNwbGF5X1lfYWRkcik7CisgICAgcENUWC0+ZGVjT3V0SW5mby5DUGh5QWRkciA9ICh2b2lkICopKERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfQ19hZGRyKTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyID0gKHZvaWQgKikocENUWC0+dmlyRnJtQnVmLmx1bWEgKyBZb2Zmc2V0KTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLkNWaXJBZGRyID0gKHZvaWQgKikocENUWC0+dmlyRnJtQnVmLmNocm9tYSArIENvZmZzZXQpOworICAgIHBDVFgtPmRlY091dEluZm8udGltZXN0YW1wX3RvcCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X3RpbWVzdGFtcF90b3A7CisgICAgcENUWC0+ZGVjT3V0SW5mby50aW1lc3RhbXBfYm90dG9tID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfdGltZXN0YW1wX2JvdHRvbTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNvbnN1bWVkQnl0ZSA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2NvbnN1bWVfYnl0ZXM7CisgICAgcENUWC0+ZGVjT3V0SW5mby5yZXNfY2hhbmdlID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfcmVzX2NoYW5nZTsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfdG9wX29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Nyb3BfdG9wX29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfYm90dG9tX29mZnNldCA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Nyb3BfYm90dG9tX29mZnNldDsKKyAgICBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfbGVmdF9vZmZzZXQgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9jcm9wX2xlZnRfb2Zmc2V0OworICAgIHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQgPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9jcm9wX3JpZ2h0X29mZnNldDsKKyAgICBwQ1RYLT5vdXRfZnJhbWV0YWdfdG9wID0gRGVjQXJnLmFyZ3MuZGVjX2V4ZS5vdXRfZnJhbWV0YWdfdG9wOworICAgIHBDVFgtPm91dF9mcmFtZXRhZ19ib3R0b20gPSBEZWNBcmcuYXJncy5kZWNfZXhlLm91dF9mcmFtZXRhZ19ib3R0b207CisgICAgcENUWC0+ZGlzcGxheVN0YXR1cyA9IERlY0FyZy5hcmdzLmRlY19leGUub3V0X2Rpc3BsYXlfc3RhdHVzOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNDbG9zZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIG1mY19jb21tb25fYXJncyBmcmVlX2FyZzsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY0Nsb3NlOiBvcGVuSGFuZGxlIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBpZiAocENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgJiBNRkNfVVNFX1lVVl9CVUZGKSB7CisgICAgICAgIGZyZWVfYXJnLmFyZ3MubWVtX2ZyZWUudV9hZGRyID0gcENUWC0+dmlyRnJtQnVmLmx1bWE7CisgICAgICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0ZSRUVfQlVGLCAmZnJlZV9hcmcpOworICAgICAgICBmcmVlX2FyZy5hcmdzLm1lbV9mcmVlLnVfYWRkciA9IHBDVFgtPnZpckZybUJ1Zi5jaHJvbWE7CisgICAgICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0ZSRUVfQlVGLCAmZnJlZV9hcmcpOworICAgIH0KKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfU1RSTV9CVUZGKSB7CisgICAgICAgIGZyZWVfYXJnLmFyZ3MubWVtX2ZyZWUudV9hZGRyID0gcENUWC0+dmlyU3RybUJ1ZjsKKyAgICAgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfRlJFRV9CVUYsICZmcmVlX2FyZyk7CisgICAgfQorCisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgPSBNRkNfVVNFX05PTkU7CisKKyAgICBtdW5tYXAoKHZvaWQgKilwQ1RYLT5tYXBwZWRfYWRkciwgTU1BUF9CVUZGRVJfU0laRV9NTUFQKTsKKyAgICBjbG9zZShwQ1RYLT5oTUZDKTsKKyAgICBmcmVlKHBDVFgpOworCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK3ZvaWQgKlNzYlNpcE1mY0RlY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKipwaHlJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBpbnQgcmV0X2NvZGU7CisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBtZmNfY29tbW9uX2FyZ3MgdXNlcl9hZGRyX2FyZywgcGh5c19hZGRyX2FyZzsKKworICAgIGlmIChpbnB1dEJ1ZmZlclNpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNHZXRJbkJ1ZjogaW5wdXRCdWZmZXJTaXplID0gJWQgaXMgaW52YWxpZFxuIiwgaW5wdXRCdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjR2V0SW5CdWY6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLmNvZGVjX3R5cGUgPSBwQ1RYLT5jb2RlY190eXBlOworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MuYnVmZl9zaXplID0gaW5wdXRCdWZmZXJTaXplOworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MubWFwcGVkX2FkZHIgPSBwQ1RYLT5tYXBwZWRfYWRkcjsKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19HRVRfSU5fQlVGLCAmdXNlcl9hZGRyX2FyZyk7CisgICAgaWYgKHJldF9jb2RlIDwgMCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjR2V0SW5CdWY6IElPQ1RMX01GQ19HRVRfSU5fQlVGIGZhaWxlZFxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBwQ1RYLT52aXJTdHJtQnVmID0gdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5vdXRfdWFkZHI7CisgICAgcENUWC0+cGh5U3RybUJ1ZiA9IHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub3V0X3BhZGRyOworICAgIHBDVFgtPnNpemVTdHJtQnVmID0gaW5wdXRCdWZmZXJTaXplOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfU1RSTV9CVUZGOworCisgICAgKnBoeUluQnVmID0gKHZvaWQgKilwQ1RYLT5waHlTdHJtQnVmOworCisgICAgcmV0dXJuICh2b2lkICopcENUWC0+dmlyU3RybUJ1ZjsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBoeUluQnVmLCB2b2lkICp2aXJJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSkKK3sKKyAgICBfTUZDTElCICpwQ1RYOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjU2V0SW5CdWY6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCAgPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBwQ1RYLT5waHlTdHJtQnVmID0gKGludClwaHlJbkJ1ZjsKKyAgICBwQ1RYLT52aXJTdHJtQnVmID0gKGludCl2aXJJbkJ1ZjsKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IGlucHV0QnVmZmVyU2l6ZTsKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19ERUNfT1VUQlVGX1NUQVRVUyBTc2JTaXBNZmNEZWNHZXRPdXRCdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gKm91dHB1dF9pbmZvKQoreworICAgIF9NRkNMSUIgKnBDVFg7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNHZXRPdXRCdWY6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBvdXRwdXRfaW5mby0+WVBoeUFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllQaHlBZGRyOworICAgIG91dHB1dF9pbmZvLT5DUGh5QWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1BoeUFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+WVZpckFkZHIgPSBwQ1RYLT5kZWNPdXRJbmZvLllWaXJBZGRyOworICAgIG91dHB1dF9pbmZvLT5DVmlyQWRkciA9IHBDVFgtPmRlY091dEluZm8uQ1ZpckFkZHI7CisKKyAgICBvdXRwdXRfaW5mby0+aW1nX3dpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGg7CisgICAgb3V0cHV0X2luZm8tPmltZ19oZWlnaHQ9IHBDVFgtPmRlY091dEluZm8uaW1nX2hlaWdodDsKKworICAgIG91dHB1dF9pbmZvLT5idWZfd2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aDsKKyAgICBvdXRwdXRfaW5mby0+YnVmX2hlaWdodD0gcENUWC0+ZGVjT3V0SW5mby5idWZfaGVpZ2h0OworCisgICAgLyogYnkgUmFpbkFkZSA6IGZvciBjcm9wIGluZm9ybWF0aW9uICovCisgICAgb3V0cHV0X2luZm8tPmNyb3BfdG9wX29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF90b3Bfb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX2JvdHRvbV9vZmZzZXQ9IHBDVFgtPmRlY091dEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX2xlZnRfb2Zmc2V0ID0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgIG91dHB1dF9pbmZvLT5jcm9wX3JpZ2h0X29mZnNldD0gcENUWC0+ZGVjT3V0SW5mby5jcm9wX3JpZ2h0X29mZnNldDsKKworICAgIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IDApCisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5EOworICAgIGVsc2UgaWYgKHBDVFgtPmRpc3BsYXlTdGF0dXMgPT0gMSkKKyAgICAgICAgcmV0dXJuIE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORzsKKyAgICBlbHNlIGlmIChwQ1RYLT5kaXNwbGF5U3RhdHVzID09IDIpCisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWTsKKyAgICBlbHNlCisgICAgICAgIHJldHVybiBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFk7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNTZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIG1mY19jb21tb25fYXJncyBEZWNBcmc7CisgICAgU1NCU0lQX01GQ19JTUdfUkVTT0xVVElPTiAqaW1nX3Jlc29sdXRpb247CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNTZXRDb25maWc6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgaWYgKHZhbHVlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY1NldENvbmZpZzogdmFsdWUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKyAgICBtZW1zZXQoJkRlY0FyZywgMHgwMCwgc2l6ZW9mKERlY0FyZykpOworCisgICAgc3dpdGNoIChjb25mX3R5cGUpIHsKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9QT1NUX0VOQUJMRToKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNOgorICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVk6CisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfSVNfTEFTVF9GUkFNRToKKyAgICBjYXNlIE1GQ19ERUNfU0VUQ09ORl9TTElDRV9FTkFCTEU6CisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfQ1JDX0VOQUJMRToKKyAgICAgICAgRGVjQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfcGFyYW0gPSBjb25mX3R5cGU7CisgICAgICAgIERlY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzBdID0gKigodW5zaWduZWQgaW50ICopdmFsdWUpOworICAgICAgICBEZWNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVsxXSA9IDA7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX1NFVENPTkZfRklNVjFfV0lEVEhfSEVJR0hUOgorICAgICAgICBpbWdfcmVzb2x1dGlvbiA9IChTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OICopdmFsdWU7CisgICAgICAgIERlY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3BhcmFtID0gY29uZl90eXBlOworICAgICAgICBEZWNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSA9IGltZ19yZXNvbHV0aW9uLT53aWR0aDsKKyAgICAgICAgRGVjQXJnLmFyZ3Muc2V0X2NvbmZpZy5pbl9jb25maWdfdmFsdWVbMV0gPSBpbWdfcmVzb2x1dGlvbi0+aGVpZ2h0OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgTUZDX0RFQ19TRVRDT05GX0ZSQU1FX1RBRzoKKyAgICAgICAgcENUWC0+aW5fZnJhbWV0YWcgPSAqKChpbnQgKil2YWx1ZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX09LOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY1NldENvbmZpZzogTm8gc3VjaCBjb25mX3R5cGUgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfU0VUX0NPTkZJRywgJkRlY0FyZyk7CisgICAgaWYgKERlY0FyZy5yZXRfY29kZSAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNTZXRDb25maWc6IElPQ1RMX01GQ19TRVRfQ09ORklHIGZhaWxlZChyZXQgOiAlZCwgY29uZl90eXBlOiAlZClcbiIsIERlY0FyZy5yZXRfY29kZSwgY29uZl90eXBlKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfREVDX1NFVF9DT05GX0ZBSUw7CisgICAgfQorCisgICAgcmV0dXJuIE1GQ19SRVRfT0s7Cit9CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNEZWNHZXRDb25maWcodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfQ09ORiBjb25mX3R5cGUsIHZvaWQgKnZhbHVlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIG1mY19jb21tb25fYXJncyBEZWNBcmc7CisKKyAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OICppbWdfcmVzb2x1dGlvbjsKKyAgICBTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04gKmNyb3BfaW5mb3JtYXRpb247CisgICAgTUZDX0NSQ19EQVRBICpjcmNfZGF0YTsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY0dldENvbmZpZzogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRkFJTDsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjR2V0Q29uZmlnOiB2YWx1ZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfRkFJTDsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRGVjQXJnLCAweDAwLCBzaXplb2YoRGVjQXJnKSk7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQ6CisgICAgICAgIGltZ19yZXNvbHV0aW9uID0gKFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gKil2YWx1ZTsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPndpZHRoID0gcENUWC0+ZGVjT3V0SW5mby5pbWdfd2lkdGg7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT5oZWlnaHQgPSBwQ1RYLT5kZWNPdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgIGltZ19yZXNvbHV0aW9uLT5idWZfd2lkdGggPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl93aWR0aDsKKyAgICAgICAgaW1nX3Jlc29sdXRpb24tPmJ1Zl9oZWlnaHQgPSBwQ1RYLT5kZWNPdXRJbmZvLmJ1Zl9oZWlnaHQ7CisgICAgICAgIGJyZWFrOworCisgICAgLyogQWRkZWQgYnkgUmFpbkFkZSAqLworICAgIGNhc2UgTUZDX0RFQ19HRVRDT05GX0NST1BfSU5GTzoKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbiA9IChTU0JTSVBfTUZDX0NST1BfSU5GT1JNQVRJT04qKXZhbHVlOworICAgICAgICBjcm9wX2luZm9ybWF0aW9uLT5jcm9wX3RvcF9vZmZzZXQgPSBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfdG9wX29mZnNldDsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF9ib3R0b21fb2Zmc2V0PSBwQ1RYLT5kZWNPdXRJbmZvLmNyb3BfYm90dG9tX29mZnNldDsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF9sZWZ0X29mZnNldCA9IHBDVFgtPmRlY091dEluZm8uY3JvcF9sZWZ0X29mZnNldDsKKyAgICAgICAgY3JvcF9pbmZvcm1hdGlvbi0+Y3JvcF9yaWdodF9vZmZzZXQ9IHBDVFgtPmRlY091dEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX0dFVENPTkZfQ1JDX0RBVEE6CisgICAgICAgIGNyY19kYXRhID0gKE1GQ19DUkNfREFUQSAqKXZhbHVlOworCisgICAgICAgIERlY0FyZy5hcmdzLmdldF9jb25maWcuaW5fY29uZmlnX3BhcmFtID0gY29uZl90eXBlOworCisgICAgICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0dFVF9DT05GSUcsICZEZWNBcmcpOworICAgICAgICBpZiAoRGVjQXJnLnJldF9jb2RlICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNHZXRDb25maWc6IElPQ1RMX01GQ19HRVRfQ09ORklHIGZhaWxlZChyZXQgOiAlZCwgY29uZl90eXBlOiAlZClcbiIsIERlY0FyZy5yZXRfY29kZSwgY29uZl90eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMOworICAgICAgICB9CisgICAgICAgIGNyY19kYXRhLT5sdW1hMCA9IERlY0FyZy5hcmdzLmdldF9jb25maWcub3V0X2NvbmZpZ192YWx1ZVswXTsKKyAgICAgICAgY3JjX2RhdGEtPmNocm9tYTAgPSBEZWNBcmcuYXJncy5nZXRfY29uZmlnLm91dF9jb25maWdfdmFsdWVbMV07CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICAqKCh1bnNpZ25lZCBpbnQgKil2YWx1ZSkgPSBwQ1RYLT5vdXRfZnJhbWV0YWdfdG9wOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNEZWNHZXRDb25maWc6IE5vIHN1Y2ggY29uZl90eXBlIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvZW5jL0FuZHJvaWQubWsgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9lbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTczNDZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNiBAQAorCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlzcmMvU3NiU2lwTWZjRW5jQVBJLmMKKworTE9DQUxfTU9EVUxFIDo9IGxpYnNlY21mY2VuY2FwaQorCisKKworTE9DQUxfQ0ZMQUdTIDo9IC1EVVNFX0ZJTUNfRlJBTUVfQlVGRkVSCisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibG9nCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gXAorCSQoU0VDX0NPREVDUykvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2VuYy9zcmMvU3NiU2lwTWZjRW5jQVBJLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9lbmMvc3JjL1NzYlNpcE1mY0VuY0FQSS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyN2ZjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9lbmMvc3JjL1NzYlNpcE1mY0VuY0FQSS5jCkBAIC0wLDAgKzEsNjg2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiU3NiU2lwTWZjQXBpLmgiCisjaW5jbHVkZSAibWZjX2ludGVyZmFjZS5oIgorCisjZGVmaW5lIF9NRkNMSUJfTUFHSUNfTlVNQkVSICAgICAweDkyMjQxMDAxCisKK3ZvaWQgKlNzYlNpcE1mY0VuY09wZW4odm9pZCAqdmFsdWUpCit7CisgICAgaW50IGhNRkNPcGVuOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgdW5zaWduZWQgaW50IG1hcHBlZF9hZGRyOworICAgIG1mY19jb21tb25fYXJncyBFbmNBcmc7CisgICAgaW50IHJldF9jb2RlOworCisgICAgaE1GQ09wZW4gPSBvcGVuKFM1UEMxMTBfTUZDX0RFVl9OQU1FLCBPX1JEV1IgfCBPX05ERUxBWSk7CisgICAgaWYgKGhNRkNPcGVuIDwgMCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRW5jT3BlbjogTUZDIE9wZW4gZmFpbHVyZVxuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW1hbGxvYyhzaXplb2YoX01GQ0xJQikpOworICAgIGlmIChwQ1RYID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY09wZW46IG1hbGxvYyBmYWlsZWQuXG4iKTsKKyAgICAgICAgY2xvc2UoaE1GQ09wZW4pOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoKih1bnNpZ25lZCBpbnQgKil2YWx1ZSA9PSBOT19DQUNIRSB8fAorICAgICAgICAqKHVuc2lnbmVkIGludCAqKXZhbHVlID09IENBQ0hFKSB7CisgICAgICAgIEVuY0FyZy5hcmdzLmJ1Zl90eXBlID0gKih1bnNpZ25lZCBpbnQgKil2YWx1ZTsKKyAgICAgICAgcmV0X2NvZGUgPSBpb2N0bChoTUZDT3BlbiwgSU9DVExfTUZDX0JVRl9DQUNIRSwgJkVuY0FyZyk7CisgICAgICAgIGlmIChFbmNBcmcucmV0X2NvZGUgIT0gTUZDX1JFVF9PSykgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0RlY09wZW5FeHQ6IElPQ1RMX01GQ19CVUZfQ0FDSEUgKCVkKSBmYWlsZWRcbiIsIEVuY0FyZy5yZXRfY29kZSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjT3BlbkV4dDogdmFsdWUgaXMgaW52YWxpZCwgdmFsdWU6ICVkXG4iLCAqKGludCAqKXZhbHVlKTsKKyAgICB9CisKKyAgICBtYXBwZWRfYWRkciA9ICh1bnNpZ25lZCBpbnQpbW1hcCgwLCBNTUFQX0JVRkZFUl9TSVpFX01NQVAsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIGhNRkNPcGVuLCAwKTsKKyAgICBpZiAoIW1hcHBlZF9hZGRyKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNPcGVuOiBGSU1WNS4wIGRyaXZlciBhZGRyZXNzIG1hcHBpbmcgZmFpbGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgbWVtc2V0KHBDVFgsIDAsIHNpemVvZihfTUZDTElCKSk7CisKKyAgICBwQ1RYLT5tYWdpYyA9IF9NRkNMSUJfTUFHSUNfTlVNQkVSOworICAgIHBDVFgtPmhNRkMgPSBoTUZDT3BlbjsKKyAgICBwQ1RYLT5tYXBwZWRfYWRkciA9IG1hcHBlZF9hZGRyOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzID0gTUZDX1VTRV9OT05FOworCisgICAgcmV0dXJuICh2b2lkICopcENUWDsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGFyYW0pCit7CisgICAgaW50IHJldF9jb2RlOworICAgIGludCBkcGJCdWZTaXplOworCisgICAgX01GQ0xJQiAqcENUWDsKKyAgICBtZmNfY29tbW9uX2FyZ3MgRW5jQXJnOworICAgIG1mY19jb21tb25fYXJncyB1c2VyX2FkZHJfYXJnLCBwaHlzX2FkZHJfYXJnOworICAgIFNTQlNJUF9NRkNfRU5DX0gyNjRfUEFSQU0gKmgyNjRfYXJnOworICAgIFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNICptcGVnNF9hcmc7CisgICAgU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTSAqaDI2M19hcmc7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjX3R5cGU7CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRW5jQXJnLCAwLCBzaXplb2YobWZjX2NvbW1vbl9hcmdzKSk7CisKKyAgICBBTE9HVigiU3NiU2lwTWZjRW5jSW5pdDogRW5jb2RlIEluaXQgc3RhcnRcbiIpOworCisgICAgbXBlZzRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNICopcGFyYW07CisgICAgY29kZWNfdHlwZSA9IG1wZWc0X2FyZy0+Y29kZWNUeXBlOworCisgICAgaWYgKChjb2RlY190eXBlICE9IE1QRUc0X0VOQykgJiYKKyAgICAgICAgKGNvZGVjX3R5cGUgIT0gSDI2NF9FTkMpICAmJgorICAgICAgICAoY29kZWNfdHlwZSAhPSBIMjYzX0VOQykpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY09wZW46IFVuZGVmaW5lZCBjb2RlYyB0eXBlLlxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWC0+Y29kZWNfdHlwZSA9IGNvZGVjX3R5cGU7CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIE1QRUc0X0VOQzoKKyAgICAgICAgQUxPR1YoIlNzYlNpcE1mY0VuY0luaXQ6IE1QRUc0IEVuY29kZVxuIik7CisgICAgICAgIG1wZWc0X2FyZyA9IChTU0JTSVBfTUZDX0VOQ19NUEVHNF9QQVJBTSAqKXBhcmFtOworCisgICAgICAgIHBDVFgtPndpZHRoID0gbXBlZzRfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgcENUWC0+aGVpZ2h0ID0gbXBlZzRfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjYzX0VOQzoKKyAgICAgICAgQUxPR1YoIlNzYlNpcE1mY0VuY0luaXQ6IEgyNjMgRW5jb2RlXG4iKTsKKyAgICAgICAgaDI2M19hcmcgPSAoU1NCU0lQX01GQ19FTkNfSDI2M19QQVJBTSAqKXBhcmFtOworCisgICAgICAgIHBDVFgtPndpZHRoID0gaDI2M19hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBwQ1RYLT5oZWlnaHQgPSBoMjYzX2FyZy0+U291cmNlSGVpZ2h0OworICAgICAgICBicmVhazsKKworICAgIGNhc2UgSDI2NF9FTkM6CisgICAgICAgIEFMT0dWKCJTc2JTaXBNZmNFbmNJbml0OiBIMjY0IEVuY29kZVxuIik7CisgICAgICAgIGgyNjRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX0gyNjRfUEFSQU0gKilwYXJhbTsKKworICAgICAgICBwQ1RYLT53aWR0aCA9IGgyNjRfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgcENUWC0+aGVpZ2h0ID0gaDI2NF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHBDVFgtPmNvZGVjX3R5cGUpIHsKKyAgICBjYXNlIE1QRUc0X0VOQzoKKyAgICAgICAgbXBlZzRfYXJnID0gKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNKilwYXJhbTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9jb2RlY190eXBlID0gcENUWC0+Y29kZWNfdHlwZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fcHJvZmlsZV9sZXZlbCA9IEVOQ19QUk9GSUxFX0xFVkVMKG1wZWc0X2FyZy0+UHJvZmlsZUlEQywgbXBlZzRfYXJnLT5MZXZlbElEQyk7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fd2lkdGggPSBtcGVnNF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9oZWlnaHQgPSBtcGVnNF9hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fZ29wX251bSA9IG1wZWc0X2FyZy0+SURSUGVyaW9kOworICAgICAgICBpZiAobXBlZzRfYXJnLT5EaXNhYmxlUXBlbE1FKQorICAgICAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fcXBlbE1FX2VuYWJsZSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX3FwZWxNRV9lbmFibGUgPSAxOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX01TX21vZGUgPSBtcGVnNF9hcmctPlNsaWNlTW9kZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fTVNfc2l6ZSA9IG1wZWc0X2FyZy0+U2xpY2VBcmd1bWVudDsKKworICAgICAgICBpZiAobXBlZzRfYXJnLT5OdW1iZXJCRnJhbWVzID4gMikgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0luaXQ6IE5vIHN1Y2ggQmZyYW1lTnVtIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICAgICAgfQorICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9CZnJhbWVOdW0gPSBtcGVnNF9hcmctPk51bWJlckJGcmFtZXM7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX21iX3JlZnJlc2ggPSBtcGVnNF9hcmctPlJhbmRvbUludHJhTUJSZWZyZXNoOworCisgICAgICAgIC8qIHJhdGUgY29udHJvbCovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX1JDX2ZybV9lbmFibGUgPSBtcGVnNF9hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBpZiAoKG1wZWc0X2FyZy0+UVNDb2RlTWluID4gNTEpIHx8IChtcGVnNF9hcmctPlFTQ29kZU1heCA+IDUxKSkgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0luaXQ6IE5vIHN1Y2ggTWluL01heCBRUCBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fUkNfcWJvdW5kID0gRU5DX1JDX1FCT1VORChtcGVnNF9hcmctPlFTQ29kZU1pbiwgbXBlZzRfYXJnLT5RU0NvZGVNYXgpOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9SQ19ycGFyYSA9IG1wZWc0X2FyZy0+Q0JSUGVyaW9kUmY7CisKKyAgICAgICAgLyogcGFkIGNvbnRyb2wgKi8KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fcGFkX2N0cmxfb24gPSBtcGVnNF9hcmctPlBhZENvbnRyb2xPbjsKKyAgICAgICAgaWYgKChtcGVnNF9hcmctPkx1bWFQYWRWYWwgPiAyNTUpIHx8IChtcGVnNF9hcmctPkNiUGFkVmFsID4gMjU1KSB8fCAobXBlZzRfYXJnLT5DclBhZFZhbCA+IDI1NSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIFBhZCB2YWx1ZSBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fbHVtYV9wYWRfdmFsID0gbXBlZzRfYXJnLT5MdW1hUGFkVmFsOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9jYl9wYWRfdmFsID0gbXBlZzRfYXJnLT5DYlBhZFZhbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fY3JfcGFkX3ZhbCA9IG1wZWc0X2FyZy0+Q3JQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX21hcCA9IG1wZWc0X2FyZy0+RnJhbWVNYXA7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fdGltZV9pbmNyZWFtZW50X3JlcyA9IG1wZWc0X2FyZy0+VGltZUluY3JlYW1lbnRSZXM7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX3RpbWVfdm9wX3RpbWVfaW5jcmVhbWVudCA9IG1wZWc0X2FyZy0+Vm9wVGltZUluY3JlYW1lbnQ7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX1JDX2ZyYW1lcmF0ZSA9IChtcGVnNF9hcmctPlRpbWVJbmNyZWFtZW50UmVzIC8gbXBlZzRfYXJnLT5Wb3BUaW1lSW5jcmVhbWVudCk7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX1JDX2JpdHJhdGUgPSBtcGVnNF9hcmctPkJpdHJhdGU7CisgICAgICAgIGlmICgobXBlZzRfYXJnLT5GcmFtZVFwID4gNTEpIHx8IChtcGVnNF9hcmctPkZyYW1lUXBfUCkgPiA1MSB8fCAobXBlZzRfYXJnLT5GcmFtZVFwX0IgPiA1MSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIEZyYW1lUXAgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX3FwID0gbXBlZzRfYXJnLT5GcmFtZVFwOworICAgICAgICBpZiAobXBlZzRfYXJnLT5GcmFtZVFwX1ApCisgICAgICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9mcmFtZV9QX3FwID0gbXBlZzRfYXJnLT5GcmFtZVFwX1A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX1BfcXAgPSBtcGVnNF9hcmctPkZyYW1lUXA7CisgICAgICAgIGlmIChtcGVnNF9hcmctPkZyYW1lUXBfQikKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX0JfcXAgPSBtcGVnNF9hcmctPkZyYW1lUXBfQjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fZnJhbWVfQl9xcCA9IG1wZWc0X2FyZy0+RnJhbWVRcDsKKworICAgICAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEgyNjNfRU5DOgorICAgICAgICBoMjYzX2FyZyA9IChTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICopcGFyYW07CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fY29kZWNfdHlwZSA9IHBDVFgtPmNvZGVjX3R5cGU7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX3Byb2ZpbGVfbGV2ZWwgPSBFTkNfUFJPRklMRV9MRVZFTCg2NiwgNDApOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl93aWR0aCA9IGgyNjNfYXJnLT5Tb3VyY2VXaWR0aDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5faGVpZ2h0ID0gaDI2M19hcmctPlNvdXJjZUhlaWdodDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fZ29wX251bSA9IGgyNjNfYXJnLT5JRFJQZXJpb2Q7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX21iX3JlZnJlc2ggPSBoMjYzX2FyZy0+UmFuZG9tSW50cmFNQlJlZnJlc2g7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX01TX21vZGUgPSBoMjYzX2FyZy0+U2xpY2VNb2RlOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9NU19zaXplID0gMDsKKworICAgICAgICAvKiByYXRlIGNvbnRyb2wqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9SQ19mcm1fZW5hYmxlID0gaDI2M19hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBpZiAoKGgyNjNfYXJnLT5RU0NvZGVNaW4gPiA1MSkgfHwgKGgyNjNfYXJnLT5RU0NvZGVNYXggPiA1MSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIE1pbi9NYXggUVAgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX1JDX3Fib3VuZCA9IEVOQ19SQ19RQk9VTkQoaDI2M19hcmctPlFTQ29kZU1pbiwgaDI2M19hcmctPlFTQ29kZU1heCk7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX1JDX3JwYXJhID0gaDI2M19hcmctPkNCUlBlcmlvZFJmOworCisgICAgICAgIC8qIHBhZCBjb250cm9sICovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX3BhZF9jdHJsX29uID0gaDI2M19hcmctPlBhZENvbnRyb2xPbjsKKyAgICAgICAgaWYgKChoMjYzX2FyZy0+THVtYVBhZFZhbCA+IDI1NSkgfHwgKGgyNjNfYXJnLT5DYlBhZFZhbCA+IDI1NSkgfHwgKGgyNjNfYXJnLT5DclBhZFZhbCA+IDI1NSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIFBhZCB2YWx1ZSBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fbHVtYV9wYWRfdmFsID0gaDI2M19hcmctPkx1bWFQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2NiX3BhZF92YWwgPSBoMjYzX2FyZy0+Q2JQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2NyX3BhZF92YWwgPSBoMjYzX2FyZy0+Q3JQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX21hcCA9IG1wZWc0X2FyZy0+RnJhbWVNYXA7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fUkNfZnJhbWVyYXRlID0gaDI2M19hcmctPkZyYW1lUmF0ZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fUkNfYml0cmF0ZSA9IGgyNjNfYXJnLT5CaXRyYXRlOworICAgICAgICBpZiAoaDI2M19hcmctPkZyYW1lUXAgPiA1MSkgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0luaXQ6IE5vIHN1Y2ggRnJhbWVRcCBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fZnJhbWVfcXAgPSBoMjYzX2FyZy0+RnJhbWVRcDsKKyAgICAgICAgaWYgKGgyNjNfYXJnLT5GcmFtZVFwX1ApCisgICAgICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9tcGVnNC5pbl9mcmFtZV9QX3FwID0gaDI2M19hcmctPkZyYW1lUXBfUDsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQuaW5fZnJhbWVfUF9xcCA9IGgyNjNfYXJnLT5GcmFtZVFwOworCisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBIMjY0X0VOQzoKKyAgICAgICAgaDI2NF9hcmcgPSAoU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTSAqKXBhcmFtOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fY29kZWNfdHlwZSA9IEgyNjRfRU5DOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX3Byb2ZpbGVfbGV2ZWwgPSBFTkNfUFJPRklMRV9MRVZFTChoMjY0X2FyZy0+UHJvZmlsZUlEQywgaDI2NF9hcmctPkxldmVsSURDKTsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX3dpZHRoID0gaDI2NF9hcmctPlNvdXJjZVdpZHRoOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX2hlaWdodCA9IGgyNjRfYXJnLT5Tb3VyY2VIZWlnaHQ7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZ29wX251bSA9IGgyNjRfYXJnLT5JRFJQZXJpb2Q7CisKKyAgICAgICAgaWYgKChoMjY0X2FyZy0+TnVtYmVyUmVmRm9yUGZyYW1lcyA+IDIpIHx8IChoMjY0X2FyZy0+TnVtYmVyUmVmZXJlbmNlRnJhbWVzID4gMikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIHJlZiBOdW0gaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fcmVmZXJlbmNlX251bSA9IGgyNjRfYXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXM7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fcmVmX251bV9wID0gaDI2NF9hcmctPk51bWJlclJlZkZvclBmcmFtZXM7CisKKyAgICAgICAgaWYgKChoMjY0X2FyZy0+U2xpY2VNb2RlID09IDApIHx8IChoMjY0X2FyZy0+U2xpY2VNb2RlID09IDEpIHx8CisgICAgICAgICAgICAoaDI2NF9hcmctPlNsaWNlTW9kZSA9PSAyKSB8fCAoaDI2NF9hcmctPlNsaWNlTW9kZSA9PSA0KSkgeworICAgICAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9NU19tb2RlID0gaDI2NF9hcmctPlNsaWNlTW9kZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIHNsaWNlIG1vZGUgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fTVNfc2l6ZSA9IGgyNjRfYXJnLT5TbGljZUFyZ3VtZW50OworCisgICAgICAgIGlmIChoMjY0X2FyZy0+TnVtYmVyQkZyYW1lcyA+IDIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIEJmcmFtZU51bSBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9CZnJhbWVOdW0gPSBoMjY0X2FyZy0+TnVtYmVyQkZyYW1lczsKKworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX2RlYmxvY2tfZmlsdCA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyRGlzYWJsZTsKKyAgICAgICAgaWYgKChhYnMoaDI2NF9hcmctPkxvb3BGaWx0ZXJBbHBoYUMwT2Zmc2V0KSA+IDYpIHx8IChhYnMoaDI2NF9hcmctPkxvb3BGaWx0ZXJCZXRhT2Zmc2V0KSA+IDYpKSB7CisgICAgICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRW5jSW5pdDogTm8gc3VjaCBBbHBoYUMwT2Zmc2V0IG9yIEJldGFPZmZzZXQgaXMgc3VwcG9ydGVkLlxuIik7CisgICAgICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgICAgICB9CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZGVibG9ja19hbHBoYV9DMCA9IGgyNjRfYXJnLT5Mb29wRmlsdGVyQWxwaGFDME9mZnNldDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9kZWJsb2NrX2JldGEgPSBoMjY0X2FyZy0+TG9vcEZpbHRlckJldGFPZmZzZXQ7CisKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9zeW1ib2xtb2RlID0gaDI2NF9hcmctPlN5bWJvbE1vZGU7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5faW50ZXJsYWNlX21vZGUgPSBoMjY0X2FyZy0+UGljdHVyZUludGVybGFjZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl90cmFuc2Zvcm04eDhfbW9kZSA9IGgyNjRfYXJnLT5UcmFuc2Zvcm04eDhNb2RlOworCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fbWJfcmVmcmVzaCA9IGgyNjRfYXJnLT5SYW5kb21JbnRyYU1CUmVmcmVzaDsKKworICAgICAgICAvKiBwYWQgY29udHJvbCAqLworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX3BhZF9jdHJsX29uID0gaDI2NF9hcmctPlBhZENvbnRyb2xPbjsKKyAgICAgICAgaWYgKChoMjY0X2FyZy0+THVtYVBhZFZhbCA+IDI1NSkgfHwgKGgyNjRfYXJnLT5DYlBhZFZhbCA+IDI1NSkgfHwgKGgyNjRfYXJnLT5DclBhZFZhbCA+IDI1NSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBObyBzdWNoIFBhZCB2YWx1ZSBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9sdW1hX3BhZF92YWwgPSBoMjY0X2FyZy0+THVtYVBhZFZhbDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9jYl9wYWRfdmFsID0gaDI2NF9hcmctPkNiUGFkVmFsOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX2NyX3BhZF92YWwgPSBoMjY0X2FyZy0+Q3JQYWRWYWw7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX2ZyYW1lX21hcCA9IG1wZWc0X2FyZy0+RnJhbWVNYXA7CisKKyAgICAgICAgLyogcmF0ZSBjb250cm9sKi8KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9SQ19mcm1fZW5hYmxlID0gaDI2NF9hcmctPkVuYWJsZUZSTVJhdGVDb250cm9sOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX1JDX21iX2VuYWJsZSA9IGgyNjRfYXJnLT5FbmFibGVNQlJhdGVDb250cm9sOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX1JDX2ZyYW1lcmF0ZSA9IGgyNjRfYXJnLT5GcmFtZVJhdGU7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fUkNfYml0cmF0ZSA9IGgyNjRfYXJnLT5CaXRyYXRlOworICAgICAgICBpZiAoaDI2NF9hcmctPkZyYW1lUXAgPiA1MSkgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0luaXQ6IE5vIHN1Y2ggRnJhbWVRcCBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9mcmFtZV9xcCA9IGgyNjRfYXJnLT5GcmFtZVFwOworICAgICAgICBpZiAoaDI2NF9hcmctPkZyYW1lUXBfUCkKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZnJhbWVfUF9xcCA9IGgyNjRfYXJnLT5GcmFtZVFwX1A7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZnJhbWVfUF9xcCA9IGgyNjRfYXJnLT5GcmFtZVFwOworICAgICAgICBpZiAoaDI2NF9hcmctPkZyYW1lUXBfQikKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZnJhbWVfQl9xcCA9IGgyNjRfYXJnLT5GcmFtZVFwX0I7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fZnJhbWVfQl9xcCA9IGgyNjRfYXJnLT5GcmFtZVFwOworCisgICAgICAgIGlmICgoaDI2NF9hcmctPlFTQ29kZU1pbiA+IDUxKSB8fCAoaDI2NF9hcmctPlFTQ29kZU1heCA+IDUxKSkgeworICAgICAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0luaXQ6IE5vIHN1Y2ggTWluL01heCBRUCBpcyBzdXBwb3J0ZWQuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgICAgIH0KKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9SQ19xYm91bmQgPSBFTkNfUkNfUUJPVU5EKGgyNjRfYXJnLT5RU0NvZGVNaW4sIGgyNjRfYXJnLT5RU0NvZGVNYXgpOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX1JDX3JwYXJhID0gaDI2NF9hcmctPkNCUlBlcmlvZFJmOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX1JDX21iX2RhcmtfZGlzYWJsZSAgICA9IGgyNjRfYXJnLT5EYXJrRGlzYWJsZTsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9SQ19tYl9zbW9vdGhfZGlzYWJsZSA9IGgyNjRfYXJnLT5TbW9vdGhEaXNhYmxlOworICAgICAgICBFbmNBcmcuYXJncy5lbmNfaW5pdF9oMjY0LmluX1JDX21iX3N0YXRpY19kaXNhYmxlID0gaDI2NF9hcmctPlN0YXRpY0Rpc2FibGU7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fUkNfbWJfYWN0aXZpdHlfZGlzYWJsZSA9IGgyNjRfYXJnLT5BY3Rpdml0eURpc2FibGU7CisKKyAgICAgICAgLyogZGVmYXVsdCBzZXR0aW5nICovCisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X2gyNjQuaW5fbWRfaW50ZXJ3ZWlnaHRfcHBzID0gMDsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2luaXRfaDI2NC5pbl9tZF9pbnRyYXdlaWdodF9wcHMgPSAwOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0LmluX21hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisKKyAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19FTkNfSU5JVCwgJkVuY0FyZyk7CisgICAgaWYgKEVuY0FyZy5yZXRfY29kZSAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNJbml0OiBJT0NUTF9NRkNfRU5DX0lOSVQgKCVkKSBmYWlsZWRcbiIsIEVuY0FyZy5yZXRfY29kZSk7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0VOQ19JTklUX0ZBSUw7CisgICAgfQorCisgICAgcENUWC0+dmlyU3RybUJ1ZiA9IEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0Lm91dF91X2FkZHIuc3RybV9yZWZfeTsKKyAgICBwQ1RYLT5waHlTdHJtQnVmID0gRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQub3V0X3BfYWRkci5zdHJtX3JlZl95OworICAgIHBDVFgtPnNpemVTdHJtQnVmID0gTUFYX0VOQ09ERVJfT1VUUFVUX0JVRkZFUl9TSVpFOworICAgIHBDVFgtPmVuY29kZWRIZWFkZXJTaXplID0gRW5jQXJnLmFyZ3MuZW5jX2luaXRfbXBlZzQub3V0X2hlYWRlcl9zaXplOworCisgICAgcENUWC0+dmlyTXZSZWZZQyA9IEVuY0FyZy5hcmdzLmVuY19pbml0X21wZWc0Lm91dF91X2FkZHIubXZfcmVmX3ljOworCisgICAgcENUWC0+aW50ZXJfYnVmZl9zdGF0dXMgfD0gTUZDX1VTRV9TVFJNX0JVRkY7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0V4ZSh2b2lkICpvcGVuSGFuZGxlKQoreworICAgIGludCByZXRfY29kZTsKKyAgICBfTUZDTElCICpwQ1RYOworICAgIG1mY19jb21tb25fYXJncyBFbmNBcmc7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNFeGU6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKworICAgIG1lbXNldCgmRW5jQXJnLCAweDAwLCBzaXplb2YobWZjX2NvbW1vbl9hcmdzKSk7CisKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX2NvZGVjX3R5cGUgPSBwQ1RYLT5jb2RlY190eXBlOworICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fWV9hZGRyID0gKHVuc2lnbmVkIGludClwQ1RYLT5waHlGcm1CdWYubHVtYTsKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX0NiQ3JfYWRkciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5RnJtQnVmLmNocm9tYTsKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX1lfYWRkcl92aXIgPSAodW5zaWduZWQgaW50KXBDVFgtPnZpckZybUJ1Zi5sdW1hOworICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fQ2JDcl9hZGRyX3ZpciA9ICh1bnNpZ25lZCBpbnQpcENUWC0+dmlyRnJtQnVmLmNocm9tYTsKKyAgICBFbmNBcmcuYXJncy5lbmNfZXhlLmluX3N0cm1fc3QgPSAodW5zaWduZWQgaW50KXBDVFgtPnBoeVN0cm1CdWY7CisgICAgRW5jQXJnLmFyZ3MuZW5jX2V4ZS5pbl9zdHJtX2VuZCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIHBDVFgtPnNpemVTdHJtQnVmOworICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fZnJhbWV0YWcgPSBwQ1RYLT5pbl9mcmFtZXRhZzsKKyAgICBpZiAocENUWC0+ZW5jb2RlX2NudCA9PSAwKSB7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fc3RybV9zdCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZjsKKyAgICAgICAgRW5jQXJnLmFyZ3MuZW5jX2V4ZS5pbl9zdHJtX2VuZCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIHBDVFgtPnNpemVTdHJtQnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fc3RybV9zdCA9ICh1bnNpZ25lZCBpbnQpcENUWC0+cGh5U3RybUJ1ZiArIChNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkUvMik7CisgICAgICAgIEVuY0FyZy5hcmdzLmVuY19leGUuaW5fc3RybV9lbmQgPSAodW5zaWduZWQgaW50KXBDVFgtPnBoeVN0cm1CdWYgICsgKE1BWF9FTkNPREVSX09VVFBVVF9CVUZGRVJfU0laRS8yKSArIHBDVFgtPnNpemVTdHJtQnVmOworICAgIH0KKworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX0VOQ19FWEUsICZFbmNBcmcpOworICAgIGlmIChFbmNBcmcucmV0X2NvZGUgIT0gTUZDX1JFVF9PSykgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRGVjRXhlOiBJT0NUTF9NRkNfRU5DX0VYRSBmYWlsZWQocmV0IDogJWQpXG4iLCBFbmNBcmcucmV0X2NvZGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfRVhFX0VSUjsKKyAgICB9CisKKyAgICBwQ1RYLT5lbmNvZGVkRGF0YVNpemUgPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9lbmNvZGVkX3NpemU7CisgICAgcENUWC0+ZW5jb2RlZGZyYW1lVHlwZSA9IEVuY0FyZy5hcmdzLmVuY19leGUub3V0X2ZyYW1lX3R5cGU7CisgICAgcENUWC0+ZW5jb2RlZF9ZX3BhZGRyID0gRW5jQXJnLmFyZ3MuZW5jX2V4ZS5vdXRfZW5jb2RlZF9ZX3BhZGRyOworICAgIHBDVFgtPmVuY29kZWRfQ19wYWRkciA9IEVuY0FyZy5hcmdzLmVuY19leGUub3V0X2VuY29kZWRfQ19wYWRkcjsKKyAgICBwQ1RYLT5vdXRfZnJhbWV0YWdfdG9wID0gRW5jQXJnLmFyZ3MuZW5jX2V4ZS5vdXRfZnJhbWV0YWdfdG9wOworICAgIHBDVFgtPm91dF9mcmFtZXRhZ19ib3R0b20gPSBFbmNBcmcuYXJncy5lbmNfZXhlLm91dF9mcmFtZXRhZ19ib3R0b207CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0Nsb3NlKHZvaWQgKm9wZW5IYW5kbGUpCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgbWZjX2NvbW1vbl9hcmdzIGZyZWVfYXJnOworCisgICAgaWYgKG9wZW5IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRW5jQ2xvc2U6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorCisgICAgcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKworICAgIGlmIChwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyAmIE1GQ19VU0VfWVVWX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS51X2FkZHIgPSBwQ1RYLT52aXJGcm1CdWYubHVtYTsKKyAgICAgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfRlJFRV9CVUYsICZmcmVlX2FyZyk7CisgICAgfQorCisgICAgaWYgKHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzICYgTUZDX1VTRV9TVFJNX0JVRkYpIHsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS51X2FkZHIgPSBwQ1RYLT52aXJTdHJtQnVmOworICAgICAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19GUkVFX0JVRiwgJmZyZWVfYXJnKTsKKyAgICAgICAgZnJlZV9hcmcuYXJncy5tZW1fZnJlZS51X2FkZHIgPSBwQ1RYLT52aXJNdlJlZllDOworICAgICAgICByZXRfY29kZSA9IGlvY3RsKHBDVFgtPmhNRkMsIElPQ1RMX01GQ19GUkVFX0JVRiwgJmZyZWVfYXJnKTsKKyAgICB9CisKKyAgICBwQ1RYLT5pbnRlcl9idWZmX3N0YXR1cyA9IE1GQ19VU0VfTk9ORTsKKworICAgIG11bm1hcCgodm9pZCAqKXBDVFgtPm1hcHBlZF9hZGRyLCBNTUFQX0JVRkZFUl9TSVpFX01NQVApOworICAgIGNsb3NlKHBDVFgtPmhNRkMpOworICAgIGZyZWUocENUWCk7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldFNpemUodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjVHlwZSwgaW50IG5XaWR0aCwgaW50IG5IZWlnaHQpCit7CisgICAgX01GQ0xJQiAqcENUWCA9IChfTUZDTElCICopb3BlbkhhbmRsZTsKKworICAgIGlmIChwQ1RYID09IE5VTEwpCisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisKKyAgICBpZiAobldpZHRoIDw9IDAgfHwgbkhlaWdodCA8PSAwKQorICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIHBDVFgtPndpZHRoID0gbldpZHRoOworICAgIHBDVFgtPmhlaWdodCA9IG5IZWlnaHQ7CisKKyAgICBpZiAoKEgyNjRfRU5DICE9IGNvZGVjVHlwZSkgJiYKKyAgICAgICAgKE1QRUc0X0VOQyAhPSBjb2RlY1R5cGUpICYmCisgICAgICAgIChIMjYzX0VOQyAhPSBjb2RlY1R5cGUpKQorICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIHBDVFgtPmNvZGVjX3R5cGUgPSBjb2RlY1R5cGU7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgbWZjX2NvbW1vbl9hcmdzIHVzZXJfYWRkcl9hcmcsIHBoeXNfYWRkcl9hcmc7CisgICAgaW50IHlfc2l6ZSwgY19zaXplOworICAgIGludCBhbGlnbmVkX3lfc2l6ZSwgYWxpZ25lZF9jX3NpemU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNHZXRJbkJ1Zjogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5jb2RlY190eXBlID0gcENUWC0+Y29kZWNfdHlwZTsKKworICAgIHlfc2l6ZSA9IHBDVFgtPndpZHRoICogcENUWC0+aGVpZ2h0OworICAgIGNfc2l6ZSA9IChwQ1RYLT53aWR0aCAqIHBDVFgtPmhlaWdodCkgPj4gMTsKKworICAgIGFsaWduZWRfeV9zaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocENUWC0+d2lkdGgpICogQUxJR05fVE9fMzJCKHBDVFgtPmhlaWdodCkpOworICAgIGFsaWduZWRfY19zaXplID0gQUxJR05fVE9fOEtCKEFMSUdOX1RPXzEyOEIocENUWC0+d2lkdGgpICogQUxJR05fVE9fMzJCKHBDVFgtPmhlaWdodC8yKSk7CisKKyAgICAvKiBBbGxvY2F0ZSBsdW1hICYgY2hyb21hIGJ1ZiAqLworICAgIHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2MuYnVmZl9zaXplID0gYWxpZ25lZF95X3NpemUgKyBhbGlnbmVkX2Nfc2l6ZTsKKyAgICB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLm1hcHBlZF9hZGRyID0gcENUWC0+bWFwcGVkX2FkZHI7CisgICAgcmV0X2NvZGUgPSBpb2N0bChwQ1RYLT5oTUZDLCBJT0NUTF9NRkNfR0VUX0lOX0JVRiwgJnVzZXJfYWRkcl9hcmcpOworICAgIGlmIChyZXRfY29kZSA8IDApIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0dldEluQnVmOiBJT0NUTF9NRkNfR0VUX0lOX0JVRiBmYWlsZWRcbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfR0VUX0lOQlVGX0ZBSUw7CisgICAgfQorICAgIHBDVFgtPnZpckZybUJ1Zi5sdW1hID0gdXNlcl9hZGRyX2FyZy5hcmdzLm1lbV9hbGxvYy5vdXRfdWFkZHI7CisgICAgcENUWC0+dmlyRnJtQnVmLmNocm9tYSA9IHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub3V0X3VhZGRyICsgKHVuc2lnbmVkIGludClhbGlnbmVkX3lfc2l6ZTsKKyAgICBwQ1RYLT5waHlGcm1CdWYubHVtYSA9IHVzZXJfYWRkcl9hcmcuYXJncy5tZW1fYWxsb2Mub3V0X3BhZGRyOworICAgIHBDVFgtPnBoeUZybUJ1Zi5jaHJvbWEgPSB1c2VyX2FkZHJfYXJnLmFyZ3MubWVtX2FsbG9jLm91dF9wYWRkciArICh1bnNpZ25lZCBpbnQpYWxpZ25lZF95X3NpemU7CisKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmx1bWEgPSAodW5zaWduZWQgaW50KXlfc2l6ZTsKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmNocm9tYSA9ICh1bnNpZ25lZCBpbnQpY19zaXplOworICAgIHBDVFgtPmludGVyX2J1ZmZfc3RhdHVzIHw9IE1GQ19VU0VfWVVWX0JVRkY7CisKKyAgICBpbnB1dF9pbmZvLT5ZUGh5QWRkciA9ICh2b2lkKilwQ1RYLT5waHlGcm1CdWYubHVtYTsKKyAgICBpbnB1dF9pbmZvLT5DUGh5QWRkciA9ICh2b2lkKilwQ1RYLT5waHlGcm1CdWYuY2hyb21hOworICAgIGlucHV0X2luZm8tPllWaXJBZGRyID0gKHZvaWQqKXBDVFgtPnZpckZybUJ1Zi5sdW1hOworICAgIGlucHV0X2luZm8tPkNWaXJBZGRyID0gKHZvaWQqKXBDVFgtPnZpckZybUJ1Zi5jaHJvbWE7CisKKyAgICBpbnB1dF9pbmZvLT5ZU2l6ZSAgICA9IGFsaWduZWRfeV9zaXplOworICAgIGlucHV0X2luZm8tPkNTaXplICAgID0gYWxpZ25lZF9jX3NpemU7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk8gKmlucHV0X2luZm8pCit7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY1NldEluQnVmOiBvcGVuSGFuZGxlIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIEFMT0dWKCJTc2JTaXBNZmNFbmNTZXRJbkJ1ZjogaW5wdXRfaW5mby0+WVBoeUFkZHIgJiBpbnB1dF9pbmZvLT5DUGh5QWRkciBzaG91bGQgYmUgNjRLQiBhbGlnbmVkXG4iKTsKKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBwQ1RYLT5waHlGcm1CdWYubHVtYSA9ICh1bnNpZ25lZCBpbnQpaW5wdXRfaW5mby0+WVBoeUFkZHI7CisgICAgcENUWC0+cGh5RnJtQnVmLmNocm9tYSA9ICh1bnNpZ25lZCBpbnQpaW5wdXRfaW5mby0+Q1BoeUFkZHI7CisgICAgcENUWC0+dmlyRnJtQnVmLmx1bWEgPSAodW5zaWduZWQgaW50KWlucHV0X2luZm8tPllWaXJBZGRyOworICAgIHBDVFgtPnZpckZybUJ1Zi5jaHJvbWEgPSAodW5zaWduZWQgaW50KWlucHV0X2luZm8tPkNWaXJBZGRyOworCisgICAgcENUWC0+c2l6ZUZybUJ1Zi5sdW1hID0gKHVuc2lnbmVkIGludClpbnB1dF9pbmZvLT5ZU2l6ZTsKKyAgICBwQ1RYLT5zaXplRnJtQnVmLmNocm9tYSA9ICh1bnNpZ25lZCBpbnQpaW5wdXRfaW5mby0+Q1NpemU7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pCit7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY0dldE91dEJ1Zjogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgb3V0cHV0X2luZm8tPmhlYWRlclNpemUgPSBwQ1RYLT5lbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBvdXRwdXRfaW5mby0+ZGF0YVNpemUgPSBwQ1RYLT5lbmNvZGVkRGF0YVNpemU7CisKKyAgICBpZiAocENUWC0+ZW5jb2RlX2NudCA9PSAwKSB7CisgICAgICAgIG91dHB1dF9pbmZvLT5TdHJtUGh5QWRkciA9ICh2b2lkICopcENUWC0+cGh5U3RybUJ1ZjsKKyAgICAgICAgb3V0cHV0X2luZm8tPlN0cm1WaXJBZGRyID0gKHZvaWQgKilwQ1RYLT52aXJTdHJtQnVmOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dF9pbmZvLT5TdHJtUGh5QWRkciA9ICh1bnNpZ25lZCBjaGFyICopcENUWC0+cGh5U3RybUJ1ZiArIChNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkUvMik7CisgICAgICAgIG91dHB1dF9pbmZvLT5TdHJtVmlyQWRkciA9ICh1bnNpZ25lZCBjaGFyICopcENUWC0+dmlyU3RybUJ1ZiArIChNQVhfRU5DT0RFUl9PVVRQVVRfQlVGRkVSX1NJWkUvMik7CisgICAgfQorCisgICAgcENUWC0+ZW5jb2RlX2NudCArKzsKKyAgICBwQ1RYLT5lbmNvZGVfY250ICU9IDI7CisKKyAgICBpZiAocENUWC0+ZW5jb2RlZGZyYW1lVHlwZSA9PSAwKQorICAgICAgICBvdXRwdXRfaW5mby0+ZnJhbWVUeXBlID0gTUZDX0ZSQU1FX1RZUEVfTk9UX0NPREVEOworICAgIGVsc2UgaWYgKHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPT0gMSkKKyAgICAgICAgb3V0cHV0X2luZm8tPmZyYW1lVHlwZSA9IE1GQ19GUkFNRV9UWVBFX0lfRlJBTUU7CisgICAgZWxzZSBpZiAocENUWC0+ZW5jb2RlZGZyYW1lVHlwZSA9PSAyKQorICAgICAgICBvdXRwdXRfaW5mby0+ZnJhbWVUeXBlID0gTUZDX0ZSQU1FX1RZUEVfUF9GUkFNRTsKKyAgICBlbHNlIGlmIChwQ1RYLT5lbmNvZGVkZnJhbWVUeXBlID09IDMpCisgICAgICAgIG91dHB1dF9pbmZvLT5mcmFtZVR5cGUgPSBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FOworICAgIGVsc2UgaWYgKHBDVFgtPmVuY29kZWRmcmFtZVR5cGUgPT0gNCkKKyAgICAgICAgb3V0cHV0X2luZm8tPmZyYW1lVHlwZSA9IE1GQ19GUkFNRV9UWVBFX09USEVSUzsKKyAgICBlbHNlIHsKKyAgICAgICAgQUxPR0UoIlN0cmFuZ2UgZW5jb2RlZCBmcmFtZSB0eXBlID0gJWRcbiIsIHBDVFgtPmVuY29kZWRmcmFtZVR5cGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIG91dHB1dF9pbmZvLT5lbmNvZGVkWVBoeUFkZHIgPSAodm9pZCAqKXBDVFgtPmVuY29kZWRfWV9wYWRkcjsKKyAgICBvdXRwdXRfaW5mby0+ZW5jb2RlZENQaHlBZGRyID0gKHZvaWQgKilwQ1RYLT5lbmNvZGVkX0NfcGFkZHI7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCB2b2lkICpwaHlPdXRidWYsIHZvaWQgKnZpck91dGJ1ZiwgaW50IG91dHB1dEJ1ZmZlclNpemUpCit7CisgICAgX01GQ0xJQiAqcENUWDsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY1NldE91dEJ1Zjogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworCisgICAgcENUWC0+cGh5U3RybUJ1ZiA9IChpbnQpcGh5T3V0YnVmOworICAgIHBDVFgtPnZpclN0cm1CdWYgPSAoaW50KXZpck91dGJ1ZjsKKyAgICBwQ1RYLT5zaXplU3RybUJ1ZiA9IG91dHB1dEJ1ZmZlclNpemU7CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgbWZjX2NvbW1vbl9hcmdzIEVuY0FyZzsKKworICAgIGlmIChvcGVuSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlNzYlNpcE1mY0VuY1NldENvbmZpZzogb3BlbkhhbmRsZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBpZiAodmFsdWUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRW5jU2V0Q29uZmlnOiB2YWx1ZSBpcyBOVUxMXG4iKTsKKyAgICAgICAgcmV0dXJuIE1GQ19SRVRfSU5WQUxJRF9QQVJBTTsKKyAgICB9CisKKyAgICBwQ1RYID0gKF9NRkNMSUIgKilvcGVuSGFuZGxlOworICAgIG1lbXNldCgmRW5jQXJnLCAweDAwLCBzaXplb2YobWZjX2NvbW1vbl9hcmdzKSk7CisKKyAgICBzd2l0Y2ggKGNvbmZfdHlwZSkgeworICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0ZSQU1FX1RZUEU6CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0ZSQU1FX1JBVEU6CisgICAgY2FzZSBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0JJVF9SQVRFOgorICAgIGNhc2UgTUZDX0VOQ19TRVRDT05GX0FMTE9XX0ZSQU1FX1NLSVA6CisgICAgICAgIEVuY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3BhcmFtID0gY29uZl90eXBlOworICAgICAgICBFbmNBcmcuYXJncy5zZXRfY29uZmlnLmluX2NvbmZpZ192YWx1ZVswXSA9ICooKHVuc2lnbmVkIGludCAqKSB2YWx1ZSk7CisgICAgICAgIEVuY0FyZy5hcmdzLnNldF9jb25maWcuaW5fY29uZmlnX3ZhbHVlWzFdID0gMDsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1GQ19FTkNfU0VUQ09ORl9GUkFNRV9UQUc6CisgICAgICAgIHBDVFgtPmluX2ZyYW1ldGFnID0gKigoaW50ICopdmFsdWUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9PSzsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNTZXRDb25maWc6IE5vIHN1Y2ggY29uZl90eXBlIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldF9jb2RlID0gaW9jdGwocENUWC0+aE1GQywgSU9DVExfTUZDX1NFVF9DT05GSUcsICZFbmNBcmcpOworICAgIGlmIChFbmNBcmcucmV0X2NvZGUgIT0gTUZDX1JFVF9PSykgeworICAgICAgICBBTE9HRSgiU3NiU2lwTWZjRW5jU2V0Q29uZmlnOiBJT0NUTF9NRkNfU0VUX0NPTkZJRyBmYWlsZWQocmV0IDogJWQpXG4iLCBFbmNBcmcucmV0X2NvZGUpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9FTkNfU0VUX0NPTkZfRkFJTDsKKyAgICB9CisKKyAgICByZXR1cm4gTUZDX1JFVF9PSzsKK30KKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpCit7CisgICAgaW50IHJldF9jb2RlOworICAgIF9NRkNMSUIgKnBDVFg7CisgICAgbWZjX2NvbW1vbl9hcmdzIEVuY0FyZzsKKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisKKyAgICBpZiAob3BlbkhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNHZXRDb25maWc6IG9wZW5IYW5kbGUgaXMgTlVMTFxuIik7CisgICAgICAgIHJldHVybiBNRkNfUkVUX0lOVkFMSURfUEFSQU07CisgICAgfQorICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNHZXRDb25maWc6IHZhbHVlIGlzIE5VTExcbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHBDVFggPSAoX01GQ0xJQiAqKW9wZW5IYW5kbGU7CisgICAgbWVtc2V0KCZFbmNBcmcsIDB4MDAsIHNpemVvZihtZmNfY29tbW9uX2FyZ3MpKTsKKworICAgIHN3aXRjaCAoY29uZl90eXBlKSB7CisgICAgY2FzZSBNRkNfRU5DX0dFVENPTkZfRlJBTUVfVEFHOgorICAgICAgICAqKCh1bnNpZ25lZCBpbnQgKil2YWx1ZSkgPSBwQ1RYLT5vdXRfZnJhbWV0YWdfdG9wOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIEFMT0dFKCJTc2JTaXBNZmNFbmNHZXRDb25maWc6IE5vIHN1Y2ggY29uZl90eXBlIGlzIHN1cHBvcnRlZC5cbiIpOworICAgICAgICByZXR1cm4gTUZDX1JFVF9JTlZBTElEX1BBUkFNOworICAgIH0KKworICAgIHJldHVybiBNRkNfUkVUX09LOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZS9Tc2JTaXBNZmNBcGkuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2luY2x1ZGUvU3NiU2lwTWZjQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ZTFiYQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2luY2x1ZGUvU3NiU2lwTWZjQXBpLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfU1NCU0lQX01GQ19BUElfSF8KKyNkZWZpbmUgX1NTQlNJUF9NRkNfQVBJX0hfCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgTUFYX0RFQ09ERVJfSU5QVVRfQlVGRkVSX1NJWkUgICgxMDI0ICogMzA3MikKKyNkZWZpbmUgTUFYX0VOQ09ERVJfT1VUUFVUX0JVRkZFUl9TSVpFICgxMDI0ICogMzA3MikKKworI2RlZmluZSBNTUFQX0JVRkZFUl9TSVpFX01NQVAgICAgICAgICAgKDM1MzI4KjEwMjQpIC8vIDM0LjUqMTAyNCoxMDI0CisKKyNkZWZpbmUgUzVQQzExMF9NRkNfREVWX05BTUUgICAgICAgICAgICIvZGV2L3MzYy1tZmMiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogU3RydWN0dXJlIGFuZCBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3R5cGVkZWYgZW51bSB7CisgICAgSDI2NF9ERUMsCisgICAgVkMxX0RFQywgICAgIC8qIFZDMSBhZHZhY2VkIFByb2ZpbGUgZGVjb2RpbmcgICovCisgICAgTVBFRzRfREVDLAorICAgIFhWSURfREVDLAorICAgIE1QRUcxX0RFQywKKyAgICBNUEVHMl9ERUMsCisgICAgSDI2M19ERUMsCisgICAgVkMxUkNWX0RFQywgIC8qIFZDMSBzaW1wbGUvbWFpbiBwcm9maWxlIGRlY29kaW5nICAqLworICAgIEZJTVYxX0RFQywKKyAgICBGSU1WMl9ERUMsCisgICAgRklNVjNfREVDLAorICAgIEZJTVY0X0RFQywKKyAgICBIMjY0X0VOQywKKyAgICBNUEVHNF9FTkMsCisgICAgSDI2M19FTkMsCisgICAgVU5LTk9XTl9UWVBFCit9IFNTQlNJUF9NRkNfQ09ERUNfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBET05UX0NBUkUgPSAwLAorICAgIElfRlJBTUUgPSAxLAorICAgIE5PVF9DT0RFRCA9IDIKK30gU1NCU0lQX01GQ19GT1JDRV9TRVRfRlJBTUVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOVjEyX0xJTkVBUiA9IDAsCisgICAgTlYxMl9USUxFCit9IFNTQlNJUF9NRkNfSU5TVFJNX01PREVfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBOT19DQUNIRSA9IDAsCisgICAgQ0FDSEUgPSAxCit9IFNTQklQX01GQ19CVUZGRVJfVFlQRTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEUgPSAxLAorICAgIE1GQ19ERUNfU0VUQ09ORl9FWFRSQV9CVUZGRVJfTlVNLAorICAgIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLAorICAgIE1GQ19ERUNfU0VUQ09ORl9JU19MQVNUX0ZSQU1FLAorICAgIE1GQ19ERUNfU0VUQ09ORl9TTElDRV9FTkFCTEUsCisgICAgTUZDX0RFQ19TRVRDT05GX0NSQ19FTkFCTEUsCisgICAgTUZDX0RFQ19TRVRDT05GX0ZJTVYxX1dJRFRIX0hFSUdIVCwKKyAgICBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLAorICAgIE1GQ19ERUNfR0VUQ09ORl9DUkNfREFUQSwKKyAgICBNRkNfREVDX0dFVENPTkZfQlVGX1dJRFRIX0hFSUdIVCwKKyAgICBNRkNfREVDX0dFVENPTkZfQ1JPUF9JTkZPLAorICAgIE1GQ19ERUNfR0VUQ09ORl9GUkFNRV9UQUcKK30gU1NCU0lQX01GQ19ERUNfQ09ORjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVFlQRSA9IDEwMCwKKyAgICBNRkNfRU5DX1NFVENPTkZfQ0hBTkdFX0ZSQU1FX1JBVEUsCisgICAgTUZDX0VOQ19TRVRDT05GX0NIQU5HRV9CSVRfUkFURSwKKyAgICBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHLAorICAgIE1GQ19FTkNfU0VUQ09ORl9BTExPV19GUkFNRV9TS0lQLAorICAgIE1GQ19FTkNfR0VUQ09ORl9GUkFNRV9UQUcKK30gU1NCU0lQX01GQ19FTkNfQ09ORjsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfR0VUT1VUQlVGX1NUQVRVU19OVUxMID0gMCwKKyAgICBNRkNfR0VUT1VUQlVGX0RFQ09ESU5HX09OTFkgPSAxLAorICAgIE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORywKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSwKKyAgICBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfRU5ECit9IFNTQlNJUF9NRkNfREVDX09VVEJVRl9TVEFUVVM7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX0ZSQU1FX1RZUEVfTk9UX0NPREVELAorICAgIE1GQ19GUkFNRV9UWVBFX0lfRlJBTUUsCisgICAgTUZDX0ZSQU1FX1RZUEVfUF9GUkFNRSwKKyAgICBNRkNfRlJBTUVfVFlQRV9CX0ZSQU1FLAorICAgIE1GQ19GUkFNRV9UWVBFX09USEVSUworfSBTU0JTSVBfTUZDX0ZSQU1FX1RZUEU7CisKK3R5cGVkZWYgZW51bSB7CisgICAgTUZDX1JFVF9PSyAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgICAgTUZDX1JFVF9GQUlMICAgICAgICAgICAgICAgICAgICA9IC0xMDAwLAorICAgIE1GQ19SRVRfT1BFTl9GQUlMICAgICAgICAgICAgICAgPSAtMTAwMSwKKyAgICBNRkNfUkVUX0NMT1NFX0ZBSUwgICAgICAgICAgICAgID0gLTEwMDIsCisKKyAgICBNRkNfUkVUX0RFQ19JTklUX0ZBSUwgICAgICAgICAgID0gLTIwMDAsCisgICAgTUZDX1JFVF9ERUNfRVhFX1RJTUVfT1VUICAgICAgICA9IC0yMDAxLAorICAgIE1GQ19SRVRfREVDX0VYRV9FUlIgICAgICAgICAgICAgPSAtMjAwMiwKKyAgICBNRkNfUkVUX0RFQ19HRVRfSU5CVUZfRkFJTCAgICAgID0gLTIwMDMsCisgICAgTUZDX1JFVF9ERUNfU0VUX0lOQlVGX0ZBSUwgICAgICA9IC0yMDA0LAorICAgIE1GQ19SRVRfREVDX0dFVF9PVVRCVUZfRkFJTCAgICAgPSAtMjAwNSwKKyAgICBNRkNfUkVUX0RFQ19HRVRfQ09ORl9GQUlMICAgICAgID0gLTIwMDYsCisgICAgTUZDX1JFVF9ERUNfU0VUX0NPTkZfRkFJTCAgICAgICA9IC0yMDA3LAorCisgICAgTUZDX1JFVF9FTkNfSU5JVF9GQUlMICAgICAgICAgICA9IC0zMDAwLAorICAgIE1GQ19SRVRfRU5DX0VYRV9USU1FX09VVCAgICAgICAgPSAtMzAwMSwKKyAgICBNRkNfUkVUX0VOQ19FWEVfRVJSICAgICAgICAgICAgID0gLTMwMDIsCisgICAgTUZDX1JFVF9FTkNfR0VUX0lOQlVGX0ZBSUwgICAgICA9IC0zMDAzLAorICAgIE1GQ19SRVRfRU5DX1NFVF9JTkJVRl9GQUlMICAgICAgPSAtMzAwNCwKKyAgICBNRkNfUkVUX0VOQ19HRVRfT1VUQlVGX0ZBSUwgICAgID0gLTMwMDUsCisgICAgTUZDX1JFVF9FTkNfU0VUX09VVEJVRl9GQUlMICAgICA9IC0zMDA2LAorICAgIE1GQ19SRVRfRU5DX0dFVF9DT05GX0ZBSUwgICAgICAgPSAtMzAwNywKKyAgICBNRkNfUkVUX0VOQ19TRVRfQ09ORl9GQUlMICAgICAgID0gLTMwMDgsCisKKyAgICBNRkNfUkVUX0lOVkFMSURfUEFSQU0gICAgICAgICAgID0gLTQwMDAKK30gU1NCU0lQX01GQ19FUlJPUl9DT0RFOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkKKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvLyBbT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDcgorCisgICAgaW50IGltZ193aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLy8gW09VVF0gd2lkdGggb2YgcmVhbCBpbWFnZQorICAgIGludCBpbWdfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vIFtPVVRdIGhlaWdodCBvZiByZWFsIGltYWdlCisgICAgaW50IGJ1Zl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgLy8gW09VVF0gd2lkdGggYWxpZ25lZCB0byAxNgorICAgIGludCBidWZfaGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgIC8vIFtPVVRdIGhlaWdodCBhbGlnaGVkIHRvIDE2CisKKyAgICBpbnQgdGltZXN0YW1wX3RvcDsgICAgICAgICAgICAgICAgICAvLyBbT1VUXSB0aW1lc3RhbXAgb2YgdG9wIGZpbGVkKFRoaXMgaXMgdXNlZCBmb3IgaW50ZXJsYWNlZCBzdHJlYW0pCisgICAgaW50IHRpbWVzdGFtcF9ib3R0b207ICAgICAgICAgICAgICAgLy8gW09VVF0gdGltZXN0YW1wIG9mIGJvdHRvbSBmaWxlZChUaGlzIGlzIHVzZWQgZm9yIGludGVybGFjZWQgc3RyZWFtKQorICAgIGludCBjb25zdW1lZEJ5dGU7ICAgICAgICAgICAgICAgICAgIC8vIFtPVVRdIHRoZSBudW1iZXIgb2YgYnl0ZSBjb25zdW1lZCBkdXJpbmcgZGVjb2RpbmcKKyAgICBpbnQgcmVzX2NoYW5nZTsgICAgICAgICAgICAgICAgICAgICAvLyBbT1VUXSB3aGV0aGVyIHJlc29sdXRpb24gaXMgY2hhbmdlZCBvciBub3QuIDA6IG5vdCBjaGFuZ2UsIDE6IGluY3JlYXNlZCwgMjogZGVjcmVhc2VkCisgICAgaW50IGNyb3BfdG9wX29mZnNldDsgICAgICAgICAgICAgICAgLy8gW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgdG9wX29mZnNldAorICAgIGludCBjcm9wX2JvdHRvbV9vZmZzZXQ7ICAgICAgICAgICAgIC8vIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIGJvdHRvbV9vZmZzZXQKKyAgICBpbnQgY3JvcF9sZWZ0X29mZnNldDsgICAgICAgICAgICAgICAvLyBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCBsZWZ0X29mZnNldAorICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsgICAgICAgICAgICAgIC8vIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHJpZ2h0X29mZnNldAorfSBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHZvaWQgKllQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8vIFtJTi9PVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgWQorICAgIHZvaWQgKkNQaHlBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8vIFtJTi9PVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ2JDcgorICAgIHZvaWQgKllWaXJBZGRyOyAgICAgICAgICAgICAgICAgICAgIC8vIFtJTi9PVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1ZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOL09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIENiQ3IKKyAgICBpbnQgWVNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU4vT1VUXSBpbnB1dCBzaXplIG9mIFkgZGF0YQorICAgIGludCBDU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgQ2JDciBkYXRhCit9IFNTQlNJUF9NRkNfRU5DX0lOUFVUX0lORk87CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICB1bnNpZ25lZCBpbnQgZGF0YVNpemU7ICAgICAgICAgICAgICAvLyBbT1VUXSBlbmNvZGVkIGRhdGEgc2l6ZSh3aXRob3V0IGhlYWRlcikKKyAgICB1bnNpZ25lZCBpbnQgaGVhZGVyU2l6ZTsgICAgICAgICAgICAvLyBbT1VUXSBlbmNvZGVkIGhlYWRlciBzaXplCisgICAgdW5zaWduZWQgaW50IGZyYW1lVHlwZTsgICAgICAgICAgICAgLy8gW09VVF0gZnJhbWUgdHlwZSBvZiBlbmNvZGVkIHN0cmVhbQorICAgIHZvaWQgKlN0cm1QaHlBZGRyOyAgICAgICAgICAgICAgICAgIC8vIFtPVVRdIHBoeXNpY2FsIGFkZHJlc3Mgb2YgWQorICAgIHZvaWQgKlN0cm1WaXJBZGRyOyAgICAgICAgICAgICAgICAgIC8vIFtPVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqZW5jb2RlZFlQaHlBZGRyOyAgICAgICAgICAgICAgLy8gW09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZIHdoaWNoIGlzIGZsdXNoZWQKKyAgICB2b2lkICplbmNvZGVkQ1BoeUFkZHI7ICAgICAgICAgICAgICAvLyBbT1VUXSBwaHlzaWNhbCBhZGRyZXNzIG9mIEMgd2hpY2ggaXMgZmx1c2hlZAorfSBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8vIGNvbW1vbiBwYXJhbWV0ZXJzCisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjVHlwZTsgICAgLy8gW0lOXSBjb2RlYyB0eXBlCisgICAgaW50IFNvdXJjZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBoZWlnaHQgb2YgdmlkZW8gdG8gYmUgZW5jb2RlZAorICAgIGludCBJRFJQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gR09QIG51bWJlcihpbnRlcnZhbCBvZiBJLWZyYW1lKQorICAgIGludCBTbGljZU1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gTXVsdGkgc2xpY2UgbW9kZQorICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgIC8vIFtJTl0gY3ljbGljIGludHJhIHJlZnJlc2gKKyAgICBpbnQgRW5hYmxlRlJNUmF0ZUNvbnRyb2w7ICAgICAgICAgICAvLyBbSU5dIGZyYW1lIGJhc2VkIHJhdGUgY29udHJvbCBlbmFibGUKKyAgICBpbnQgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgZnJhbWUKKyAgICBpbnQgRnJhbWVRcF9QOyAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBQIGZyYW1lCisgICAgaW50IFFTQ29kZU1heDsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZQorICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gTWluaW11bSBRdWFudGl6YXRpb24gdmFsdWUKKyAgICBpbnQgQ0JSUGVyaW9kUmY7ICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFJlYWN0aW9uIGNvZWZmaWNpZW50IHBhcmFtZXRlciBmb3IgcmF0ZSBjb250cm9sCisgICAgaW50IFBhZENvbnRyb2xPbjsgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBMdW1hIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhCisgICAgaW50IENiUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBDQiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYQorICAgIGludCBDclBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEKKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIEVuY29kaW5nIGlucHV0IG1vZGUodGlsZSBtb2RlIG9yIGxpbmVhciBtb2RlKQorCisgICAgLy8gSC4yNjQgc3BlY2lmaWMgcGFyYW1ldGVycworICAgIGludCBQcm9maWxlSURDOyAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gcHJvZmlsZQorICAgIGludCBMZXZlbElEQzsgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gbGV2ZWwKKyAgICBpbnQgRnJhbWVRcF9COyAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBCIGZyYW1lCisgICAgaW50IEZyYW1lUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSByYXRlIGNvbnRyb2wgcGFyYW1ldGVyKGZyYW1lIHJhdGUpCisgICAgaW50IFNsaWNlQXJndW1lbnQ7ICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNQiBudW1iZXIgb3IgYnl0ZSBudW1iZXIKKyAgICBpbnQgTnVtYmVyQkZyYW1lczsgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQiBmcmFtZSBpbnNlcnRlZAorICAgIGludCBOdW1iZXJSZWZlcmVuY2VGcmFtZXM7ICAgICAgICAgIC8vIFtJTl0gVGhlIG51bWJlciBvZiByZWZlcmVuY2UgcGljdHVyZXMgdXNlZAorICAgIGludCBOdW1iZXJSZWZGb3JQZnJhbWVzOyAgICAgICAgICAgIC8vIFtJTl0gVGhlIG51bWJlciBvZiByZWZlcmVuY2UgcGljdHVyZXMgdXNlZCBmb3IgZW5jb2RpbmcgUCBwaWN0dXJlcworICAgIGludCBMb29wRmlsdGVyRGlzYWJsZTsgICAgICAgICAgICAgIC8vIFtJTl0gZGlzYWJsZSB0aGUgbG9vcCBmaWx0ZXIKKyAgICBpbnQgTG9vcEZpbHRlckFscGhhQzBPZmZzZXQ7ICAgICAgICAvLyBbSU5dIEFscGhhICYgQzAgb2Zmc2V0IGZvciBILjI2NCBsb29wIGZpbHRlcgorICAgIGludCBMb29wRmlsdGVyQmV0YU9mZnNldDsgICAgICAgICAgIC8vIFtJTl0gQmV0YSBvZmZzZXQgZm9yIEguMjY0IGxvb3AgZmlsdGVyCisgICAgaW50IFN5bWJvbE1vZGU7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUaGUgbW9kZSBvZiBlbnRyb3B5IGNvZGluZyhDQUJBQywgQ0FWTEMpCisgICAgaW50IFBpY3R1cmVJbnRlcmxhY2U7ICAgICAgICAgICAgICAgLy8gW0lOXSBFbmFibGVzIHRoZSBpbnRlcmxhY2UgbW9kZQorICAgIGludCBUcmFuc2Zvcm04eDhNb2RlOyAgICAgICAgICAgICAgIC8vIFtJTl0gQWxsb3cgOHg4IHRyYW5zZm9ybShUaGlzIGlzIGFsbG93ZWQgb25seSBmb3IgaGlnaCBwcm9maWxlKQorICAgIGludCBFbmFibGVNQlJhdGVDb250cm9sOyAgICAgICAgICAgIC8vIFtJTl0gRW5hYmxlIG1hY3JvYmxvY2stbGV2ZWwgcmF0ZSBjb250cm9sCisgICAgaW50IERhcmtEaXNhYmxlOyAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBkYXJrIHJlZ2lvbgorICAgIGludCBTbW9vdGhEaXNhYmxlOyAgICAgICAgICAgICAgICAgIC8vIFtJTl0gRGlzYWJsZSBhZGFwdGl2ZSByYXRlIGNvbnRyb2wgb24gc21vb3RoIHJlZ2lvbgorICAgIGludCBTdGF0aWNEaXNhYmxlOyAgICAgICAgICAgICAgICAgIC8vIFtJTl0gRGlzYWJsZSBhZGFwdGl2ZSByYXRlIGNvbnRyb2wgb24gc3RhdGljIHJlZ2lvbgorICAgIGludCBBY3Rpdml0eURpc2FibGU7ICAgICAgICAgICAgICAgIC8vIFtJTl0gRGlzYWJsZSBhZGFwdGl2ZSByYXRlIGNvbnRyb2wgb24gaGlnaCBhY3Rpdml0eSByZWdpb24KK30gU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIC8vIGNvbW1vbiBwYXJhbWV0ZXJzCisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjVHlwZTsgICAgLy8gW0lOXSBjb2RlYyB0eXBlCisgICAgaW50IFNvdXJjZVdpZHRoOyAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSB3aWR0aCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkCisgICAgaW50IFNvdXJjZUhlaWdodDsgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBoZWlnaHQgb2YgdmlkZW8gdG8gYmUgZW5jb2RlZAorICAgIGludCBJRFJQZXJpb2Q7ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gR09QIG51bWJlcihpbnRlcnZhbCBvZiBJLWZyYW1lKQorICAgIGludCBTbGljZU1vZGU7ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gTXVsdGkgc2xpY2UgbW9kZQorICAgIGludCBSYW5kb21JbnRyYU1CUmVmcmVzaDsgICAgICAgICAgIC8vIFtJTl0gY3ljbGljIGludHJhIHJlZnJlc2gKKyAgICBpbnQgRW5hYmxlRlJNUmF0ZUNvbnRyb2w7ICAgICAgICAgICAvLyBbSU5dIGZyYW1lIGJhc2VkIHJhdGUgY29udHJvbCBlbmFibGUKKyAgICBpbnQgQml0cmF0ZTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIHJhdGUgY29udHJvbCBwYXJhbWV0ZXIoYml0IHJhdGUpCisgICAgaW50IEZyYW1lUXA7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBUaGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgZnJhbWUKKyAgICBpbnQgRnJhbWVRcF9QOyAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBQIGZyYW1lCisgICAgaW50IFFTQ29kZU1heDsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNYXhpbXVtIFF1YW50aXphdGlvbiB2YWx1ZQorICAgIGludCBRU0NvZGVNaW47ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gTWluaW11bSBRdWFudGl6YXRpb24gdmFsdWUKKyAgICBpbnQgQ0JSUGVyaW9kUmY7ICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFJlYWN0aW9uIGNvZWZmaWNpZW50IHBhcmFtZXRlciBmb3IgcmF0ZSBjb250cm9sCisgICAgaW50IFBhZENvbnRyb2xPbjsgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBFbmFibGUgcGFkZGluZyBjb250cm9sCisgICAgaW50IEx1bWFQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBMdW1hIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhCisgICAgaW50IENiUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBDQiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYQorICAgIGludCBDclBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEKKyAgICBpbnQgRnJhbWVNYXA7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIEVuY29kaW5nIGlucHV0IG1vZGUodGlsZSBtb2RlIG9yIGxpbmVhciBtb2RlKQorCisgICAgLy8gTVBFRzQgc3BlY2lmaWMgcGFyYW1ldGVycworICAgIGludCBQcm9maWxlSURDOyAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gcHJvZmlsZQorICAgIGludCBMZXZlbElEQzsgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gbGV2ZWwKKyAgICBpbnQgRnJhbWVRcF9COyAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBCIGZyYW1lCisgICAgaW50IFRpbWVJbmNyZWFtZW50UmVzOyAgICAgICAgICAgICAgLy8gW0lOXSBmcmFtZSByYXRlCisgICAgaW50IFZvcFRpbWVJbmNyZWFtZW50OyAgICAgICAgICAgICAgLy8gW0lOXSBmcmFtZSByYXRlCisgICAgaW50IFNsaWNlQXJndW1lbnQ7ICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNQiBudW1iZXIgb3IgYnl0ZSBudW1iZXIKKyAgICBpbnQgTnVtYmVyQkZyYW1lczsgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBudW1iZXIgb2YgY29uc2VjdXRpdmUgQiBmcmFtZSBpbnNlcnRlZAorICAgIGludCBEaXNhYmxlUXBlbE1FOyAgICAgICAgICAgICAgICAgIC8vIFtJTl0gZGlzYWJsZSBxdWFydGVyLXBpeGVsIG1vdGlvbiBlc3RpbWF0aW9uCit9IFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8gY29tbW9uIHBhcmFtZXRlcnMKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNUeXBlOyAgICAvLyBbSU5dIGNvZGVjIHR5cGUKKyAgICBpbnQgU291cmNlV2lkdGg7ICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIHdpZHRoIG9mIHZpZGVvIHRvIGJlIGVuY29kZWQKKyAgICBpbnQgU291cmNlSGVpZ2h0OyAgICAgICAgICAgICAgICAgICAvLyBbSU5dIGhlaWdodCBvZiB2aWRlbyB0byBiZSBlbmNvZGVkCisgICAgaW50IElEUlBlcmlvZDsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBHT1AgbnVtYmVyKGludGVydmFsIG9mIEktZnJhbWUpCisgICAgaW50IFNsaWNlTW9kZTsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNdWx0aSBzbGljZSBtb2RlCisgICAgaW50IFJhbmRvbUludHJhTUJSZWZyZXNoOyAgICAgICAgICAgLy8gW0lOXSBjeWNsaWMgaW50cmEgcmVmcmVzaAorICAgIGludCBFbmFibGVGUk1SYXRlQ29udHJvbDsgICAgICAgICAgIC8vIFtJTl0gZnJhbWUgYmFzZWQgcmF0ZSBjb250cm9sIGVuYWJsZQorICAgIGludCBCaXRyYXRlOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gcmF0ZSBjb250cm9sIHBhcmFtZXRlcihiaXQgcmF0ZSkKKyAgICBpbnQgRnJhbWVRcDsgICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIFRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZQorICAgIGludCBGcmFtZVFwX1A7ICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gVGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIFAgZnJhbWUKKyAgICBpbnQgUVNDb2RlTWF4OyAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIE1heGltdW0gUXVhbnRpemF0aW9uIHZhbHVlCisgICAgaW50IFFTQ29kZU1pbjsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBNaW5pbXVtIFF1YW50aXphdGlvbiB2YWx1ZQorICAgIGludCBDQlJQZXJpb2RSZjsgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gUmVhY3Rpb24gY29lZmZpY2llbnQgcGFyYW1ldGVyIGZvciByYXRlIGNvbnRyb2wKKyAgICBpbnQgUGFkQ29udHJvbE9uOyAgICAgICAgICAgICAgICAgICAvLyBbSU5dIEVuYWJsZSBwYWRkaW5nIGNvbnRyb2wKKyAgICBpbnQgTHVtYVBhZFZhbDsgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEKKyAgICBpbnQgQ2JQYWRWYWw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBbSU5dIENCIHBlbCB2YWx1ZSB1c2VkIHRvIGZpbGwgcGFkZGluZyBhcmVhCisgICAgaW50IENyUGFkVmFsOyAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSBDUiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYQorICAgIGludCBGcmFtZU1hcDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTl0gRW5jb2RpbmcgaW5wdXQgbW9kZSh0aWxlIG1vZGUgb3IgbGluZWFyIG1vZGUpCisKKyAgICAvLyBILjI2MyBzcGVjaWZpYyBwYXJhbWV0ZXJzCisgICAgaW50IEZyYW1lUmF0ZTsgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOXSByYXRlIGNvbnRyb2wgcGFyYW1ldGVyKGZyYW1lIHJhdGUpCit9IFNTQlNJUF9NRkNfRU5DX0gyNjNfUEFSQU07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgd2lkdGg7CisgICAgaW50IGhlaWdodDsKKyAgICBpbnQgYnVmX3dpZHRoOworICAgIGludCBidWZfaGVpZ2h0OworfSBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OOworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGNyb3BfdG9wX29mZnNldDsKKyAgICBpbnQgY3JvcF9ib3R0b21fb2Zmc2V0OworICAgIGludCBjcm9wX2xlZnRfb2Zmc2V0OworICAgIGludCBjcm9wX3JpZ2h0X29mZnNldDsKK30gU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OOworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRGVjb2RpbmcgQVBJcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgKlNzYlNpcE1mY0RlY09wZW4odm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0luaXQodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGNvZGVjX3R5cGUsIGludCBGcmFtZWxlbmcpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0V4ZSh2b2lkICpvcGVuSGFuZGxlLCBpbnQgbGVuZ3RoQnVmRmlsbCk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjQ2xvc2Uodm9pZCAqb3BlbkhhbmRsZSk7CisKK3ZvaWQgKlNzYlNpcE1mY0RlY0dldEluQnVmKHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKipwaHlJbkJ1ZiwgaW50IGlucHV0QnVmZmVyU2l6ZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRGVjU2V0SW5CdWYodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGh5SW5CdWYsIHZvaWQgKnZpckluQnVmLCBpbnQgaW5wdXRCdWZmZXJTaXplKTsKKworU1NCU0lQX01GQ19ERUNfT1VUQlVGX1NUQVRVUyBTc2JTaXBNZmNEZWNHZXRPdXRCdWYodm9pZCAqb3BlbkhhbmRsZSwgU1NCU0lQX01GQ19ERUNfT1VUUFVUX0lORk8gKm91dHB1dF9pbmZvKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY1NldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0RlY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0RFQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEVuY29kaW5nIEFQSXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkICpTc2JTaXBNZmNFbmNPcGVuKHZvaWQgKnZhbHVlKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNJbml0KHZvaWQgKm9wZW5IYW5kbGUsIHZvaWQgKnBhcmFtKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNFeGUodm9pZCAqb3BlbkhhbmRsZSk7CitTU0JTSVBfTUZDX0VSUk9SX0NPREUgU3NiU2lwTWZjRW5jQ2xvc2Uodm9pZCAqb3BlbkhhbmRsZSk7CisKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRTaXplKHZvaWQgKm9wZW5IYW5kbGUsIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBjb2RlY1R5cGUsIGludCBuV2lkdGgsIGludCBuSGVpZ2h0KTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNHZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICppbnB1dF9pbmZvKTsKK1NTQlNJUF9NRkNfRVJST1JfQ09ERSBTc2JTaXBNZmNFbmNTZXRJbkJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICppbnB1dF9pbmZvKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldE91dEJ1Zih2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19PVVRQVVRfSU5GTyAqb3V0cHV0X2luZm8pOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldE91dEJ1ZiAodm9pZCAqb3BlbkhhbmRsZSwgdm9pZCAqcGh5T3V0YnVmLCB2b2lkICp2aXJPdXRidWYsIGludCBvdXRwdXRCdWZmZXJTaXplKTsKKworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY1NldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpOworU1NCU0lQX01GQ19FUlJPUl9DT0RFIFNzYlNpcE1mY0VuY0dldENvbmZpZyh2b2lkICpvcGVuSGFuZGxlLCBTU0JTSVBfTUZDX0VOQ19DT05GIGNvbmZfdHlwZSwgdm9pZCAqdmFsdWUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX1NTQlNJUF9NRkNfQVBJX0hfICovCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9pbmNsdWRlL2NvbG9yX3NwYWNlX2NvbnZlcnRvci5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZS9jb2xvcl9zcGFjZV9jb252ZXJ0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWQ1YmRhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZS9jb2xvcl9zcGFjZV9jb252ZXJ0b3IuaApAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMSBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIGNvbG9yX3NwYWNlX2NvbnZlcnRvci5oCisgKiBAYnJpZWYgICBTRUNfT01YIHNwZWNpZmljIGRlZmluZS4KKyAqICAgTlYxMlQodGlsZWQpIGxheW91dDoKKyAqICAgRWFjaCBlbGVtZW50IGlzIG5vdCBwaXhlbC4gSXQgaXMgNjR4MzIgcGl4ZWwgYmxvY2suCisgKiAgIHV2IHBpeGVsIGJsb2NrIGlzIGludGVybGVhdmVkIGFzIHUgdiB1IHYgdSB2IC4uLgorICogICB5MSAgICB5MiAgICB5NyAgICB5OCAgICB5OSAgICB5MTAgICB5MTUgICB5MTYKKyAqICAgeTMgICAgeTQgICAgeTUgICAgeTYgICAgeTExICAgeTEyICAgeTEzICAgeTE0CisgKiAgIHkxNyAgIHkxOCAgIHkyMyAgIHkyNCAgIHkyNSAgIHkyNiAgIHkzMSAgIHkzMgorICogICB5MTkgICB5MjAgICB5MjEgICB5MjIgICB5MjcgICB5MjggICB5MjkgICB5MzAKKyAqICAgdXYxICAgdXYyICAgdXY3ICAgdXY4ICAgdXY5ICAgdXYxMCAgdXYxNSAgdXYxNgorICogICB1djMgICB1djQgICB1djUgICB1djYgICB1djExICB1djEyICB1djEzICB1djE0CisgKiAgIFlVVjQyMFBsYW5hcihsaW5lYXIpIGxheW91dDoKKyAqICAgRWFjaCBlbGVtZW50IGlzIG5vdCBwaXhlbC4gSXQgaXMgNjR4MzIgcGl4ZWwgYmxvY2suCisgKiAgIHkxICAgIHkyICAgIHkzICAgIHk0ICAgIHk1ICAgIHk2ICAgIHk3ICAgIHk4CisgKiAgIHk5ICAgIHkxMCAgIHkxMSAgIHkxMiAgIHkxMyAgIHkxNCAgIHkxNSAgIHkxNgorICogICB5MTcgICB5MTggICB5MTkgICB5MjAgICB5MjEgICB5MjIgICB5MjMgICB5MjQKKyAqICAgeTI1ICAgeTI2ICAgeTI3ICAgeTI4ICAgeTI5ICAgeTMwICAgeTMxICAgeTMyCisgKiAgIHUxICAgIHUyICAgIHUzICAgIHU0ICAgIHU1ICAgIHU2ICAgIHU3ICAgIHU4CisgKiAgIHYxICAgIHYyICAgIHYzICAgIHY0ICAgIHY1ICAgIHY2ICAgIHY3ICAgIHY4CisgKiAgIFlVVjQyMFNlbWlwbGFuYXIobGluZWFyKSBsYXlvdXQ6CisgKiAgIEVhY2ggZWxlbWVudCBpcyBub3QgcGl4ZWwuIEl0IGlzIDY0eDMyIHBpeGVsIGJsb2NrLgorICogICB1diBwaXhlbCBibG9jayBpcyBpbnRlcmxlYXZlZCBhcyB1IHYgdSB2IHUgdiAuLi4KKyAqICAgeTEgICAgeTIgICAgeTMgICAgeTQgICAgeTUgICAgeTYgICAgeTcgICAgeTgKKyAqICAgeTkgICAgeTEwICAgeTExICAgeTEyICAgeTEzICAgeTE0ICAgeTE1ICAgeTE2CisgKiAgIHkxNyAgIHkxOCAgIHkxOSAgIHkyMCAgIHkyMSAgIHkyMiAgIHkyMyAgIHkyNAorICogICB5MjUgICB5MjYgICB5MjcgICB5MjggICB5MjkgICB5MzAgICB5MzEgICB5MzIKKyAqICAgdXYxICAgdXYyICAgdXYzICAgdXY0ICAgdXY1ICAgdXY2ICAgdXY3ICAgdXY4CisgKiAgIHV2OSAgIHV2MTAgIHV2MTEgIHV2MTIgIHV2MTMgIHV2MTQgIHV2MTUgIHV2MTYKKyAqIEBhdXRob3IgIFNoaW5Xb24gTGVlIChzaGlud29uLmxlZUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMS43LjAxIDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBDT0xPUl9TUEFDRV9DT05WRVJUT1JfSF8KKyNkZWZpbmUgQ09MT1JfU1BBQ0VfQ09OVkVSVE9SX0hfCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRm9ybWF0IENvbnZlcnNpb24gQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEMgQ29kZSAqLworLyoKKyAqIERlLWludGVybGVhdmVzIHNyYyB0byBkZXN0MSwgZGVzdDIKKyAqCisgKiBAcGFyYW0gZGVzdDEKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gZGVzdDIKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gc3JjCisgKiAgIEFkZHJlc3Mgb2YgaW50ZXJsZWF2ZWQgZGF0YVtpbl0KKyAqCisgKiBAcGFyYW0gc3JjX3NpemUKKyAqICAgU2l6ZSBvZiBpbnRlcmxlYXZlZCBkYXRhW2luXQorICovCit2b2lkIGNzY19kZWludGVybGVhdmVfbWVtY3B5KGNoYXIgKmRlc3QxLCBjaGFyICpkZXN0MiwgY2hhciAqc3JjLCBpbnQgc3JjX3NpemUpOworCisvKgorICogSW50ZXJsZWF2ZXMgc3JjMSwgc3JjMiB0byBkZXN0CisgKgorICogQHBhcmFtIGRlc3QKKyAqICAgQWRkcmVzcyBvZiBpbnRlcmxlYXZlZCBkYXRhW291dF0KKyAqCisgKiBAcGFyYW0gc3JjMQorICogICBBZGRyZXNzIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKgorICogQHBhcmFtIHNyYzIKKyAqICAgQWRkcmVzcyBvZiBkZS1pbnRlcmxlYXZlZCBkYXRhW2luXQorICoKKyAqIEBwYXJhbSBzcmNfc2l6ZQorICogICBTaXplIG9mIGRlLWludGVybGVhdmVkIGRhdGFbaW5dCisgKi8KK3ZvaWQgY3NjX2ludGVybGVhdmVfbWVtY3B5KGNoYXIgKmRlc3QsIGNoYXIgKnNyYzEsIGNoYXIgKnNyYzIsIGludCBzcmNfc2l6ZSk7CisKKy8qCisgKiBDb252ZXJ0cyB0aWxlZCBkYXRhIHRvIGxpbmVhci4KKyAqIDEuIFkgb2YgTlYxMlQgdG8gWSBvZiBZVVY0MjBQCisgKiAyLiBZIG9mIE5WMTJUIHRvIFkgb2YgWVVWNDIwUworICogMy4gVVYgb2YgTlYxMlQgdG8gVVYgb2YgWVVWNDIwUworICoKKyAqIEBwYXJhbSB5dXY0MjBfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwW291dF0KKyAqCisgKiBAcGFyYW0gbnYxMnRfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX2hlaWdodAorICogICBZOiBIZWlnaHQgb2YgWVVWNDIwLCBVVjogSGVpZ2h0LzIgb2YgWVVWNDIwW2luXQorICovCit2b2lkIGNzY190aWxlZF90b19saW5lYXIoY2hhciAqeXV2NDIwcF95X2Rlc3QsIGNoYXIgKm52MTJ0X3lfc3JjLCBpbnQgeXV2NDIwcF93aWR0aCwgaW50IHl1djQyMHBfeV9oZWlnaHQpOworCisvKgorICogQ29udmVydHMgYW5kIERlaW50ZXJsZWF2ZXMgdGlsZWQgZGF0YSB0byBsaW5lYXIKKyAqIDEuIFVWIG9mIE5WMTJUIHRvIFVWIG9mIFlVVjQyMFAKKyAqCisgKiBAcGFyYW0geXV2NDIwX3VfZGVzdAorICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtvdXRdCisgKgorICogQHBhcmFtIHl1djQyMF92X2Rlc3QKKyAqICAgViBwbGFuZSBhZGRyZXNzIG9mIFlVVjQyMFBbb3V0XQorICoKKyAqIEBwYXJhbSBudjEydF9zcmMKKyAqICAgVVYgcGxhbmUgYWRkcmVzcyBvZiBOVjEyVFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3V2X2hlaWdodAorICogICBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmUoY2hhciAqeXV2NDIwcF91X2Rlc3QsIGNoYXIgKnl1djQyMHBfdl9kZXN0LCBjaGFyICpudjEydF91dl9zcmMsIGludCB5dXY0MjBwX3dpZHRoLCBpbnQgeXV2NDIwcF91dl9oZWlnaHQpOworCisvKgorICogQ29udmVydHMgbGluZWFyIGRhdGEgdG8gdGlsZWQuCisgKiAxLiBZIG9mIFlVVjQyMFAgdG8gWSBvZiBOVjEyVAorICogMi4gWSBvZiBZVVY0MjBTIHRvIFkgb2YgTlYxMlQKKyAqIDMuIFVWIG9mIFlVVjQyMFMgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfZGVzdAorICogICBZIG9yIFVWIHBsYW5lIGFkZHJlc3Mgb2YgTlYxMlRbb3V0XQorICoKKyAqIEBwYXJhbSB5dXY0MjBfc3JjCisgKiAgIFkgb3IgVVYgcGxhbmUgYWRkcmVzcyBvZiBZVVY0MjBQKFMpW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfd2lkdGgKKyAqICAgV2lkdGggb2YgWVVWNDIwW2luXQorICoKKyAqIEBwYXJhbSB5dXY0MjBfaGVpZ2h0CisgKiAgIFk6IEhlaWdodCBvZiBZVVY0MjAsIFVWOiBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZChjaGFyICpudjEydF9kZXN0LCBjaGFyICp5dXY0MjBwX3NyYywgaW50IHl1djQyMHBfd2lkdGgsIGludCB5dXY0MjBwX3lfaGVpZ2h0KTsKKworLyoKKyAqIENvbnZlcnRzIGFuZCBJbnRlcmxlYXZlcyBsaW5lYXIgdG8gdGlsZWQKKyAqIDEuIFVWIG9mIFlVVjQyMFAgdG8gVVYgb2YgTlYxMlQKKyAqCisgKiBAcGFyYW0gbnYxMnRfdXZfZGVzdAorICogICBVViBwbGFuZSBhZGRyZXNzIG9mIE5WMTJUW291dF0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF91X3NyYworICogICBVIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwcF92X3NyYworICogICBWIHBsYW5lIGFkZHJlc3Mgb2YgWVVWNDIwUFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3dpZHRoCisgKiAgIFdpZHRoIG9mIFlVVjQyMFtpbl0KKyAqCisgKiBAcGFyYW0geXV2NDIwX3V2X2hlaWdodAorICogICBIZWlnaHQvMiBvZiBZVVY0MjBbaW5dCisgKi8KK3ZvaWQgY3NjX2xpbmVhcl90b190aWxlZF9pbnRlcmxlYXZlKGNoYXIgKm52MTJ0X3V2X2Rlc3QsIGNoYXIgKnl1djQyMHBfdV9zcmMsIGNoYXIgKnl1djQyMHBfdl9zcmMsIGludCB5dXY0MjBwX3dpZHRoLCBpbnQgeXV2NDIwcF91dl9oZWlnaHQpOworCisjZW5kaWYgLypDT0xPUl9TUEFDRV9DT05WRVJUT1JfSF8qLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZS9tZmNfaW50ZXJmYWNlLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9pbmNsdWRlL21mY19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjY4NjBkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZS9tZmNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTUZDX0lOVEVSRkFDRV9IXworI2RlZmluZSBfTUZDX0lOVEVSRkFDRV9IXworCisjaW5jbHVkZSAiU3NiU2lwTWZjQXBpLmgiCisKKyNkZWZpbmUgSU9DVExfTUZDX0RFQ19JTklUICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwMQorI2RlZmluZSBJT0NUTF9NRkNfRU5DX0lOSVQgICAgICAgICAgICAgICAgICAgICAweDAwODAwMDAyCisjZGVmaW5lIElPQ1RMX01GQ19ERUNfRVhFICAgICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMDMKKyNkZWZpbmUgSU9DVExfTUZDX0VOQ19FWEUgICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAwNAorCisjZGVmaW5lIElPQ1RMX01GQ19HRVRfSU5fQlVGICAgICAgICAgICAgICAgICAgIDB4MDA4MDAwMTAKKyNkZWZpbmUgSU9DVExfTUZDX0ZSRUVfQlVGICAgICAgICAgICAgICAgICAgICAgMHgwMDgwMDAxMQorI2RlZmluZSBJT0NUTF9NRkNfR0VUX1BIWVNfQUREUiAgICAgICAgICAgICAgICAweDAwODAwMDEyCisKKyNkZWZpbmUgSU9DVExfTUZDX1NFVF9DT05GSUcgICAgICAgICAgICAgICAgICAgMHgwMDgwMDEwMQorI2RlZmluZSBJT0NUTF9NRkNfR0VUX0NPTkZJRyAgICAgICAgICAgICAgICAgICAweDAwODAwMTAyCisKKyNkZWZpbmUgSU9DVExfTUZDX0JVRl9DQUNIRSAgICAgICAgICAgICAgICAgICAgMHgwMDgwMTAwMAorCisvKiBNRkMgSC9XIHN1cHBvcnQgbWF4aW11bSAzMiBleHRyYSBEUEIgKi8KKyNkZWZpbmUgTUZDX01BWF9FWFRSQV9EUEIgICAgICAgICAgICAgICAgICAgICAgNQorCisjZGVmaW5lIEVOQ19QUk9GSUxFX0xFVkVMKHByb2ZpbGUsIGxldmVsKSAgICAgICgocHJvZmlsZSkgfCAoKGxldmVsKSA8PCA4KSkKKworI2RlZmluZSBFTkNfUFJPRklMRV9NUEVHNF9TUCAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVOQ19QUk9GSUxFX01QRUc0X0FTUCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRU5DX1BST0ZJTEVfSDI2NF9CUCAgICAgICAgICAgICAgICAgICAgMAorI2RlZmluZSBFTkNfUFJPRklMRV9IMjY0X01BSU4gICAgICAgICAgICAgICAgICAxCisjZGVmaW5lIEVOQ19QUk9GSUxFX0gyNjRfSElHSCAgICAgICAgICAgICAgICAgIDIKKworI2RlZmluZSBFTkNfUkNfRElTQUJMRSAgICAgICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEVOQ19SQ19FTkFCTEVfTUFDUk9CTE9DSyAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRU5DX1JDX0VOQUJMRV9GUkFNRSAgICAgICAgICAgICAgICAgICAgMgorCisjZGVmaW5lIEVOQ19SQ19RQk9VTkQobWluX3FwLCBtYXhfcXApICAgICAgICAgICgobWluX3FwKSB8ICgobWF4X3FwKSA8PCA4KSkKKyNkZWZpbmUgRU5DX1JDX01CX0NUUkxfREFSS19ESVNBQkxFICAgICAgICAgICAgKDEgPDwgMykKKyNkZWZpbmUgRU5DX1JDX01CX0NUUkxfU01PT1RIX0RJU0FCTEUgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgRU5DX1JDX01CX0NUUkxfU1RBVElDX0RJU0FCTEUgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgRU5DX1JDX01CX0NUUkxfQUNUSVZJVFlfRElTQUJMRSAgICAgICAgKDEgPDwgMCkKKworI2RlZmluZSBBTElHTl9UT18xNkIoeCkgICAoKCgoeCkgKyAoMSA8PCAgNCkgLSAxKSA+PiAgNCkgPDwgIDQpCisjZGVmaW5lIEFMSUdOX1RPXzMyQih4KSAgICgoKCh4KSArICgxIDw8ICA1KSAtIDEpID4+ICA1KSA8PCAgNSkKKyNkZWZpbmUgQUxJR05fVE9fNjRCKHgpICAgKCgoKHgpICsgKDEgPDwgIDYpIC0gMSkgPj4gIDYpIDw8ICA2KQorI2RlZmluZSBBTElHTl9UT18xMjhCKHgpICAoKCgoeCkgKyAoMSA8PCAgNykgLSAxKSA+PiAgNykgPDwgIDcpCisjZGVmaW5lIEFMSUdOX1RPXzJLQih4KSAgICgoKCh4KSArICgxIDw8IDExKSAtIDEpID4+IDExKSA8PCAxMSkKKyNkZWZpbmUgQUxJR05fVE9fNEtCKHgpICAgKCgoKHgpICsgKDEgPDwgMTIpIC0gMSkgPj4gMTIpIDw8IDEyKQorI2RlZmluZSBBTElHTl9UT184S0IoeCkgICAoKCgoeCkgKyAoMSA8PCAxMykgLSAxKSA+PiAxMykgPDwgMTMpCisjZGVmaW5lIEFMSUdOX1RPXzY0S0IoeCkgICgoKCh4KSArICgxIDw8IDE2KSAtIDEpID4+IDE2KSA8PCAxNikKKyNkZWZpbmUgQUxJR05fVE9fMTI4S0IoeCkgKCgoKHgpICsgKDEgPDwgMTcpIC0gMSkgPj4gMTcpIDw8IDE3KQorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgaW50IGx1bWEwOyAgICAvLyBwZXIgZnJhbWUgKG9yIHRvcCBmaWVsZCkKKyAgICBpbnQgY2hyb21hMDsgICAgLy8gcGVyIGZyYW1lIChvciB0b3AgZmllbGQpCisgICAgaW50IGx1bWExOyAgICAvLyBwZXIgZnJhbWUgKG9yIGJvdHRvbSBmaWVsZCkKKyAgICBpbnQgY2hyb21hMTsgICAgLy8gcGVyIGZyYW1lIChvciBib3R0b20gZmllbGQpCit9IE1GQ19DUkNfREFUQTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfVVNFX05PTkUgPSAweDAwLAorICAgIE1GQ19VU0VfWVVWX0JVRkYgPSAweDAxLAorICAgIE1GQ19VU0VfU1RSTV9CVUZGID0gMHgxMAorfSBtZmNfaW50ZXJidWZmX3N0YXR1czsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNRkNfVU5QQUNLRURfUEIgPSAwLAorICAgIE1GQ19QQUNLRURfUEIgPSAxCit9IG1mY19wYWNrZWRfbW9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX3N0cm1fcmVmX2J1Zl9hcmcgeworICAgIHVuc2lnbmVkIGludCBzdHJtX3JlZl95OworICAgIHVuc2lnbmVkIGludCBtdl9yZWZfeWM7Cit9IG1mY19zdHJtX3JlZl9idWZfYXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ19mcmFtZV9idWZfYXJnIHsKKyAgICB1bnNpZ25lZCBpbnQgbHVtYTsKKyAgICB1bnNpZ25lZCBpbnQgY2hyb21hOworfSBtZmNfZnJhbWVfYnVmX2FyZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gY29kZWMgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl93aWR0aDsgICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHdpZHRoIG9mIFlVVjQyMCBmcmFtZSB0byBiZSBlbmNvZGVkICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5faGVpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBoZWlnaHQgb2YgWVVWNDIwIGZyYW1lIHRvIGJlIGVuY29kZWQgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX3Byb2ZpbGVfbGV2ZWw7ICAgICAgICAgICAgICAgIC8qIFtJTl0gcHJvZmlsZSAmIGxldmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9nb3BfbnVtOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEdPUCBOdW1iZXIgKGludGVydmFsIG9mIEktZnJhbWUpICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fZnJhbWVfcXA7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgZnJhbWUgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX2ZyYW1lX1BfcXA7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIFAgZnJhbWUgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9mcmFtZV9CX3FwOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBCIGZyYW1lICAgICAgICAgICAgICAgKi8KKworICAgIGludCBpbl9SQ19mcm1fZW5hYmxlOyAgICAgICAgICAgICAgICAvKiBbSU5dIFJDIGVuYWJsZSAoMDpkaXNhYmxlLCAxOmZyYW1lIGxldmVsIFJDKSAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fUkNfZnJhbWVyYXRlOyAgICAgICAgICAgICAgICAgLyogW0lOXSBSQyBwYXJhbWV0ZXIgKGZyYW1lcmF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX1JDX2JpdHJhdGU7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gUkMgcGFyYW1ldGVyIChiaXRyYXRlIGluIGticHMpICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9SQ19xYm91bmQ7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIFJDIHBhcmFtZXRlciAoUSBib3VuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fUkNfcnBhcmE7ICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBSQyBwYXJhbWV0ZXIgKFJlYWN0aW9uIENvZWZmaWNpZW50KSAgICAgICAgICAgICAgICAgICAgICovCisKKyAgICBpbnQgaW5fTVNfbW9kZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aS1zbGljZSBtb2RlICgwOnNpbmdsZSwgMTptdWx0aXBsZSkgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX01TX3NpemU7ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTXVsdGktc2xpY2Ugc2l6ZSAoaW4gbnVtLiBvZiBtYiBvciBieXRlKSAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9tYl9yZWZyZXNoOyAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE1hY3JvYmxvY2sgcmVmcmVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5faW50ZXJsYWNlX21vZGU7ICAgICAgICAgICAgICAgLyogW0lOXSBpbnRlcmxhY2UgbW9kZSgwOnByb2dyZXNzaXZlLCAxOmludGVybGFjZSkgICAgICAgICAgICAgICovCisgICAgaW50IGluX0JmcmFtZU51bTsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQiBmcmFtZSBudW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgaW50IGluX3BhZF9jdHJsX29uOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5hYmxlICgxKSAvIERpc2FibGUgKDApIHBhZGRpbmcgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9sdW1hX3BhZF92YWw7ICAgICAgICAgICAgICAgICAvKiBbSU5dIHBhZCB2YWx1ZSBpZiBwYWRfY3RybF9vbiBpcyBFbmFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fY2JfcGFkX3ZhbDsKKyAgICBpbnQgaW5fY3JfcGFkX3ZhbDsKKworICAgIGludCBpbl9mcmFtZV9tYXA7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIEVuY29kaW5nIGlucHV0IE5WMTIgdHlwZSBsaW5lYXIoMCkgVElMRSgxKSAgICAgICAgICAgICAgKi8KKworICAgIHVuc2lnbmVkIGludCBpbl9tYXBwZWRfYWRkcjsKKyAgICBtZmNfc3RybV9yZWZfYnVmX2FyZ190IG91dF91X2FkZHI7CisgICAgbWZjX3N0cm1fcmVmX2J1Zl9hcmdfdCBvdXRfcF9hZGRyOworICAgIG1mY19zdHJtX3JlZl9idWZfYXJnX3Qgb3V0X2J1Zl9zaXplOworICAgIHVuc2lnbmVkIGludCBvdXRfaGVhZGVyX3NpemU7CisKKyAgICAvKiBNUEVHNCBPbmx5ICovCisgICAgaW50IGluX3FwZWxNRV9lbmFibGU7ICAgICAgICAgICAgICAgIC8qIFtJTl0gUXVhcnRlci1wZWwgTUMgZW5hYmxlKDE6ZW5hYmxlLCAwOmRpc2FibGUpICAgICAgICAgICAgICAqLworICAgIGludCBpbl90aW1lX2luY3JlYW1lbnRfcmVzOyAgICAgICAgICAvKiBbSU5dIHRpbWUgaW5jcmVtZW50IHJlc29sdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fdGltZV92b3BfdGltZV9pbmNyZWFtZW50OyAgICAgLyogW0lOXSB0aW1lIGluY3JlbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IG1mY19lbmNfaW5pdF9tcGVnNF9hcmdfdDsKKwordHlwZWRlZiBtZmNfZW5jX2luaXRfbXBlZzRfYXJnX3QgbWZjX2VuY19pbml0X2gyNjNfYXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSBjb2RlYyB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX3dpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gd2lkdGggIG9mIFlVVjQyMCBmcmFtZSB0byBiZSBlbmNvZGVkICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9oZWlnaHQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgdG8gYmUgZW5jb2RlZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fcHJvZmlsZV9sZXZlbDsgICAgICAgICAgICAgICAgLyogW0lOXSBwcm9maWxlICYgbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX2dvcF9udW07ICAgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gR09QIE51bWJlciAoaW50ZXJ2YWwgb2YgSS1mcmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9mcmFtZV9xcDsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyIG9mIHRoZSBmcmFtZSAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fZnJhbWVfUF9xcDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciBvZiB0aGUgUCBmcmFtZSAgICAgICAgICAgICAgICovCisgICAgaW50IGluX2ZyYW1lX0JfcXA7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgb2YgdGhlIEIgZnJhbWUgICAgICAgICAgICAgICAqLworCisgICAgaW50IGluX1JDX2ZybV9lbmFibGU7ICAgICAgICAgICAgICAgIC8qIFtJTl0gUkMgZW5hYmxlICgwOmRpc2FibGUsIDE6ZnJhbWUgbGV2ZWwgUkMpICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9SQ19mcmFtZXJhdGU7ICAgICAgICAgICAgICAgICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKGZyYW1lcmF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fUkNfYml0cmF0ZTsgICAgICAgICAgICAgICAgICAgLyogW0lOXSAgUkMgcGFyYW1ldGVyIChiaXRyYXRlIGluIGticHMpICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX1JDX3Fib3VuZDsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gIFJDIHBhcmFtZXRlciAoUSBib3VuZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9SQ19ycGFyYTsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICBSQyBwYXJhbWV0ZXIgKFJlYWN0aW9uIENvZWZmaWNpZW50KSAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIGludCBpbl9NU19tb2RlOyAgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dIE11bHRpLXNsaWNlIG1vZGUgKDA6c2luZ2xlLCAxOm11bHRpcGxlKSAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fTVNfc2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyogW0lOXSBNdWx0aS1zbGljZSBzaXplIChpbiBudW0uIG9mIG1iIG9yIGJ5dGUpICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX21iX3JlZnJlc2g7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gTWFjcm9ibG9jayByZWZyZXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9pbnRlcmxhY2VfbW9kZTsgICAgICAgICAgICAgICAvKiBbSU5dIGludGVybGFjZSBtb2RlKDA6cHJvZ3Jlc3NpdmUsIDE6aW50ZXJsYWNlKSAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fQmZyYW1lTnVtOworCisgICAgaW50IGluX3BhZF9jdHJsX29uOyAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5hYmxlIHBhZGRpbmcgY29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9sdW1hX3BhZF92YWw7ICAgICAgICAgICAgICAgICAvKiBbSU5dIEx1bWEgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fY2JfcGFkX3ZhbDsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBDQiBwZWwgdmFsdWUgdXNlZCB0byBmaWxsIHBhZGRpbmcgYXJlYSAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX2NyX3BhZF92YWw7ICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gQ1IgcGVsIHZhbHVlIHVzZWQgdG8gZmlsbCBwYWRkaW5nIGFyZWEgICAgICAgICAgICAgICAgICAqLworCisgICAgaW50IGluX2ZyYW1lX21hcDsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gRW5jb2RpbmcgaW5wdXQgTlYxMiB0eXBlIGxpbmVhcigwKSBUSUxFKDEpICAgICAgICAgICAgICAqLworCisgICAgdW5zaWduZWQgaW50IGluX21hcHBlZF9hZGRyOworICAgIG1mY19zdHJtX3JlZl9idWZfYXJnX3Qgb3V0X3VfYWRkcjsKKyAgICBtZmNfc3RybV9yZWZfYnVmX2FyZ190IG91dF9wX2FkZHI7CisgICAgbWZjX3N0cm1fcmVmX2J1Zl9hcmdfdCBvdXRfYnVmX3NpemU7CisgICAgdW5zaWduZWQgaW50IG91dF9oZWFkZXJfc2l6ZTsKKworICAgIC8qIEgyNjQgT25seSAqLworICAgIGludCBpbl9SQ19tYl9lbmFibGU7ICAgICAgICAgICAgICAgICAvKiBbSU5dIFJDIGVuYWJsZSAoMDpkaXNhYmxlLCAxOk1CIGxldmVsIFJDKSAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fcmVmZXJlbmNlX251bTsgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgbnVtYmVyIG9mIHJlZmVyZW5jZSBwaWN0dXJlcyB1c2VkICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX3JlZl9udW1fcDsgICAgICAgICAgICAgICAgICAgIC8qIFtJTl0gVGhlIG51bWJlciBvZiByZWZlcmVuY2UgcGljdHVyZXMgdXNlZCBmb3IgUCBwaWN0dXJlcyAgICAqLworICAgIGludCBpbl9SQ19tYl9kYXJrX2Rpc2FibGU7ICAgICAgICAgICAvKiBbSU5dIERpc2FibGUgYWRhcHRpdmUgcmF0ZSBjb250cm9sIG9uIGRhcmsgcmVnaW9uICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fUkNfbWJfc21vb3RoX2Rpc2FibGU7ICAgICAgICAgLyogW0lOXSBEaXNhYmxlIGFkYXB0aXZlIHJhdGUgY29udHJvbCBvbiBzbW9vdGggcmVnaW9uICAgICAgICAgICovCisgICAgaW50IGluX1JDX21iX3N0YXRpY19kaXNhYmxlOyAgICAgICAgIC8qIFtJTl0gRGlzYWJsZSBhZGFwdGl2ZSByYXRlIGNvbnRyb2wgb24gc3RhdGljIHJlZ2lvbiAgICAgICAgICAqLworICAgIGludCBpbl9SQ19tYl9hY3Rpdml0eV9kaXNhYmxlOyAgICAgICAvKiBbSU5dIERpc2FibGUgYWRhcHRpdmUgcmF0ZSBjb250cm9sIG9uIHN0YXRpYyByZWdpb24gICAgICAgICAgKi8KKyAgICBpbnQgaW5fZGVibG9ja19maWx0OyAgICAgICAgICAgICAgICAgLyogW0lOXSBkaXNhYmxlIHRoZSBsb29wIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX2RlYmxvY2tfYWxwaGFfQzA7ICAgICAgICAgICAgIC8qIFtJTl0gQWxwaGEgJiBDMCBvZmZzZXQgZm9yIEguMjY0IGxvb3AgZmlsdGVyICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9kZWJsb2NrX2JldGE7ICAgICAgICAgICAgICAgICAvKiBbSU5dIEJldGEgb2Zmc2V0IGZvciBILjI2NCBsb29wIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fc3ltYm9sbW9kZTsgICAgICAgICAgICAgICAgICAgLyogW0lOXSBUaGUgbW9kZSBvZiBlbnRyb3B5IGNvZGluZyhDQUJBQywgQ0FWTEMpICAgICAgICAgICAgICAgICovCisgICAgaW50IGluX3RyYW5zZm9ybTh4OF9tb2RlOyAgICAgICAgICAgIC8qIFtJTl0gQWxsb3cgOHg4IHRyYW5zZm9ybShvbmx5IGZvciBoaWdoIHByb2ZpbGUpICAgICAgICAgICAgICAqLworICAgIGludCBpbl9tZF9pbnRlcndlaWdodF9wcHM7ICAgICAgICAgICAvKiBbSU5dIEludGVyIHdlaWdodGVkIHBhcmFtZXRlciBmb3IgbW9kZSBkZWNpc2lvbiAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fbWRfaW50cmF3ZWlnaHRfcHBzOyAgICAgICAgICAgLyogW0lOXSBJbnRyYSB3ZWlnaHRlZCBwYXJhbWV0ZXIgZm9yIG1vZGUgZGVjaXNpb24gICAgICAgICAgICAgICovCit9IG1mY19lbmNfaW5pdF9oMjY0X2FyZ190OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGluX2NvZGVjX3R5cGU7IC8qIFtJTl0gIGNvZGVjIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGludCBpbl9ZX2FkZHI7ICAgICAgICAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBZIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fQ2JDcl9hZGRyOyAgICAgICAgICAgLyogW0lOXSAgSW4tYnVmZmVyIGFkZHIgb2YgQ2JDciBjb21wb25lbnQgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IGluX1lfYWRkcl92aXI7ICAgICAgICAgIC8qIFtJTl0gIEluLWJ1ZmZlciBhZGRyIG9mIFkgY29tcG9uZW50ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGludCBpbl9DYkNyX2FkZHJfdmlyOyAgICAgICAvKiBbSU5dICBJbi1idWZmZXIgYWRkciBvZiBDYkNyIGNvbXBvbmVudCAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fc3RybV9zdDsgICAgICAgICAgICAgLyogW0lOXSAgT3V0LWJ1ZmZlciBzdGFydCBhZGRyIG9mIGVuY29kZWQgc3RybSAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IGluX3N0cm1fZW5kOyAgICAgICAgICAgIC8qIFtJTl0gIE91dC1idWZmZXIgZW5kIGFkZHIgb2YgZW5jb2RlZCBzdHJtICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9mcmFtZXRhZzsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICB1bmlxdWUgZnJhbWUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHVuc2lnbmVkIGludCBvdXRfZnJhbWVfdHlwZTsgICAgICAgICAvKiBbT1VUXSBmcmFtZSB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgb3V0X2VuY29kZWRfc2l6ZTsgICAgICAgICAgICAgICAgLyogW09VVF0gTGVuZ3RoIG9mIEVuY29kZWQgdmlkZW8gc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IG91dF9lbmNvZGVkX1lfcGFkZHI7ICAgIC8qIFtPVVRdIHBoeXNpY2FsIFkgYWRkcmVzcyB3aGljaCBpcyBmbHVzaGVkICAgICAgICAgICAgICAgICAgICAqLworICAgIHVuc2lnbmVkIGludCBvdXRfZW5jb2RlZF9DX3BhZGRyOyAgICAvKiBbT1VUXSBwaHlzaWNhbCBDIGFkZHJlc3Mgd2hpY2ggaXMgZmx1c2hlZCAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgb3V0X2ZyYW1ldGFnX3RvcDsgICAgICAgICAgICAgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGFuIG91dHB1dCBmcmFtZSBvciB0b3AgZmllbGQgICAgICAgICovCisgICAgaW50IG91dF9mcmFtZXRhZ19ib3R0b207ICAgICAgICAgICAgIC8qIFtPVVRdIHVuaXF1ZSBmcmFtZSBJRCBvZiBib3R0b20gZmllbGQgICAgICAgICAgICAgICAgICAgICAgICAqLworfSBtZmNfZW5jX2V4ZV9hcmc7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSAgY29kZWMgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IGluX3N0cm1fYnVmOyAgICAgICAgICAgIC8qIFtJTl0gIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIFNUUk1fQlVGICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9zdHJtX3NpemU7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICBzaXplIG9mIHZpZGVvIHN0cmVhbSBmaWxsZWQgaW4gU1RSTV9CVUYgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fcGFja2VkX1BCOyAgICAgICAgICAgICAgICAgICAgLyogW0lOXSAgSXMgcGFja2VkIFBCIGZyYW1lIG9yIG5vdCwgMTogcGFja2VkUEIgIDA6IHVucGFja2VkICAgICovCisKKyAgICBpbnQgb3V0X2ltZ193aWR0aDsgICAgICAgICAgICAgICAgICAgLyogW09VVF0gd2lkdGggIG9mIFlVVjQyMCBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9pbWdfaGVpZ2h0OyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIGhlaWdodCBvZiBZVVY0MjAgZnJhbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfYnVmX3dpZHRoOyAgICAgICAgICAgICAgICAgICAvKiBbT1VUXSB3aWR0aCAgb2YgWVVWNDIwIGZyYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgb3V0X2J1Zl9oZWlnaHQ7ICAgICAgICAgICAgICAgICAgLyogW09VVF0gaGVpZ2h0IG9mIFlVVjQyMCBmcmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9kcGJfY250OyAgICAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHRoZSBudW1iZXIgb2YgYnVmZmVycyB3aGljaCBpcyBuZXNzYXJ5IGR1cmluZyBkZWNvZGluZyAqLworCisgICAgaW50IG91dF9jcm9wX3RvcF9vZmZzZXQ7ICAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHRvcCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfY3JvcF9ib3R0b21fb2Zmc2V0OyAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCBib3R0b20gb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgb3V0X2Nyb3BfbGVmdF9vZmZzZXQ7ICAgICAgICAgICAgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgbGVmdCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9jcm9wX3JpZ2h0X29mZnNldDsgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIHJpZ2h0IG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgbWZjX2ZyYW1lX2J1Zl9hcmdfdCBpbl9mcm1fYnVmOyAgICAgIC8qIFtJTl0gdGhlIGFkZHJlc3Mgb2YgZHBiIEZSQU1FX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIG1mY19mcmFtZV9idWZfYXJnX3QgaW5fZnJtX3NpemU7ICAgICAvKiBbSU5dIHNpemUgb2YgZHBiIEZSQU1FX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgaW5fbWFwcGVkX2FkZHI7CisKKyAgICBtZmNfZnJhbWVfYnVmX2FyZ190IG91dF91X2FkZHI7CisgICAgbWZjX2ZyYW1lX2J1Zl9hcmdfdCBvdXRfcF9hZGRyOworICAgIG1mY19mcmFtZV9idWZfYXJnX3Qgb3V0X2ZyYW1lX2J1Zl9zaXplOworfSBtZmNfZGVjX2luaXRfYXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgaW5fY29kZWNfdHlwZTsgLyogW0lOXSAgY29kZWMgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgdW5zaWduZWQgaW50IGluX3N0cm1fYnVmOyAgICAgICAgICAgIC8qIFtJTl0gIHRoZSBwaHlzaWNhbCBhZGRyZXNzIG9mIFNUUk1fQlVGICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9zdHJtX3NpemU7ICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICBTaXplIG9mIHZpZGVvIHN0cmVhbSBmaWxsZWQgaW4gU1RSTV9CVUYgICAgICAgICAgICAgICAgKi8KKyAgICBtZmNfZnJhbWVfYnVmX2FyZ190IGluX2ZybV9idWY7ICAgICAgLyogW0lOXSAgdGhlIGFkZHJlc3Mgb2YgZHBiIEZSQU1FX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgbWZjX2ZyYW1lX2J1Zl9hcmdfdCBpbl9mcm1fc2l6ZTsgICAgIC8qIFtJTl0gIHNpemUgb2YgZHBiIEZSQU1FX0JVRiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBpbl9mcmFtZXRhZzsgICAgICAgICAgICAgICAgICAgICAvKiBbSU5dICB1bmlxdWUgZnJhbWUgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHVuc2lnbmVkIGludCBvdXRfZGlzcGxheV9ZX2FkZHI7ICAgICAvKiBbT1VUXSB0aGUgcGh5c2ljYWwgYWRkcmVzcyBvZiBkaXNwbGF5IGJ1ZiAgICAgICAgICAgICAgICAgICAgKi8KKyAgICB1bnNpZ25lZCBpbnQgb3V0X2Rpc3BsYXlfQ19hZGRyOyAgICAgLyogW09VVF0gdGhlIHBoeXNpY2FsIGFkZHJlc3Mgb2YgZGlzcGxheSBidWYgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9kaXNwbGF5X3N0YXR1czsgICAgICAgICAgICAgIC8qIFtPVVRdIHdoZXRoZXIgZGlzcGxheSBmcmFtZSBleGlzdCBvciBub3QuICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfdGltZXN0YW1wX3RvcDsgICAgICAgICAgICAgICAvKiBbT1VUXSBwcmVzZW50YXRpb24gdGltZSBvZiBhbiBvdXRwdXQgZnJhbWUgb3IgdG9wIGZpZWxkICAgICAgKi8KKyAgICBpbnQgb3V0X3RpbWVzdGFtcF9ib3R0b207ICAgICAgICAgICAgLyogW09VVF0gcHJlc2VudGF0aW9uIHRpbWUgb2YgYm90dG9tIGZpZWxkICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9jb25zdW1lX2J5dGVzOyAgICAgICAgICAgICAgIC8qIFtPVVRdIGNvbnN1bWVkIGJ5dGVzIHdoZW4gZGVjb2RpbmcgZmluaXNoZWQgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfZnJhbWV0YWdfdG9wOyAgICAgICAgICAgICAgICAvKiBbT1VUXSB1bmlxdWUgZnJhbWUgSUQgb2YgYW4gb3V0cHV0IGZyYW1lIG9yIHRvcCBmaWVsZCAgICAgICAgKi8KKyAgICBpbnQgb3V0X2ZyYW1ldGFnX2JvdHRvbTsgICAgICAgICAgICAgLyogW09VVF0gdW5pcXVlIGZyYW1lIElEIG9mIGJvdHRvbSBmaWVsZCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9yZXNfY2hhbmdlOyAgICAgICAgICAgICAgICAgIC8qIFtPVVRdIHdoZXRoZXIgcmVzb2x1dGlvbiBpcyBjaGFuZ2VkIG9yIG5vdCAoMCwgMSwgMikgICAgICAgICAqLworICAgIGludCBvdXRfY3JvcF90b3Bfb2Zmc2V0OyAgICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCB0b3Agb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgb3V0X2Nyb3BfYm90dG9tX29mZnNldDsgICAgICAgICAgLyogW09VVF0gY3JvcCBpbmZvcm1hdGlvbiwgYm90dG9tIG9mZnNldCAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9jcm9wX2xlZnRfb2Zmc2V0OyAgICAgICAgICAgIC8qIFtPVVRdIGNyb3AgaW5mb3JtYXRpb24sIGxlZnQgb2Zmc2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGludCBvdXRfY3JvcF9yaWdodF9vZmZzZXQ7ICAgICAgICAgICAvKiBbT1VUXSBjcm9wIGluZm9ybWF0aW9uLCByaWdodCBvZmZzZXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KK30gbWZjX2RlY19leGVfYXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgaW5fY29uZmlnX3BhcmFtOyAgICAgICAgICAgICAgICAgLyogW0lOXSAgQ29uZmlndXJhYmxlIHBhcmFtZXRlciB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50IG91dF9jb25maWdfdmFsdWVbNF07ICAgICAgICAgICAgIC8qIFtJTl0gIFZhbHVlcyB0byBnZXQgZm9yIHRoZSBjb25maWd1cmFibGUgcGFyYW1ldGVyLiAgICAgICAgICAqLworfSBtZmNfZ2V0X2NvbmZpZ19hcmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGludCBpbl9jb25maWdfcGFyYW07ICAgICAgICAgICAgICAgICAvKiBbSU5dICBDb25maWd1cmFibGUgcGFyYW1ldGVyIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBpbnQgaW5fY29uZmlnX3ZhbHVlWzJdOyAgICAgICAgICAgICAgLyogW0lOXSAgVmFsdWVzIHRvIGJlIHNldCBmb3IgdGhlIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXIuICAgICAgICovCisgICAgaW50IG91dF9jb25maWdfdmFsdWVfb2xkWzJdOyAgICAgICAgIC8qIFtPVVRdIE9sZCB2YWx1ZXMgb2YgdGhlIGNvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAqLworfSBtZmNfc2V0X2NvbmZpZ19hcmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX2dldF9waHlzX2FkZHJfYXJnCit7CisgICAgdW5zaWduZWQgaW50IHVfYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgcF9hZGRyOworfSBtZmNfZ2V0X3BoeXNfYWRkcl9hcmdfdDsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX21lbV9hbGxvY19hcmcKK3sKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNfdHlwZTsKKyAgICBpbnQgYnVmZl9zaXplOworICAgIHVuc2lnbmVkIGludCBtYXBwZWRfYWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgb3V0X3VhZGRyOworICAgIHVuc2lnbmVkIGludCBvdXRfcGFkZHI7Cit9IG1mY19tZW1fYWxsb2NfYXJnX3Q7CisKK3R5cGVkZWYgc3RydWN0IHRhZ19tZW1fZnJlZV9hcmdfdAoreworICAgIHVuc2lnbmVkIGludCB1X2FkZHI7Cit9IG1mY19tZW1fZnJlZV9hcmdfdDsKKwordHlwZWRlZiBlbnVtIHsKKwlNRkNfQlVGRkVSX05PX0NBQ0hFID0gMCwKKwlNRkNfQlVGRkVSX0NBQ0hFID0gMQorfSBtZmNfYnVmZmVyX3R5cGU7CisKK3R5cGVkZWYgdW5pb24geworICAgIG1mY19lbmNfaW5pdF9tcGVnNF9hcmdfdCBlbmNfaW5pdF9tcGVnNDsKKyAgICBtZmNfZW5jX2luaXRfaDI2M19hcmdfdCBlbmNfaW5pdF9oMjYzOworICAgIG1mY19lbmNfaW5pdF9oMjY0X2FyZ190IGVuY19pbml0X2gyNjQ7CisgICAgbWZjX2VuY19leGVfYXJnIGVuY19leGU7CisKKyAgICBtZmNfZGVjX2luaXRfYXJnX3QgZGVjX2luaXQ7CisgICAgbWZjX2RlY19leGVfYXJnX3QgZGVjX2V4ZTsKKworICAgIG1mY19nZXRfY29uZmlnX2FyZ190IGdldF9jb25maWc7CisgICAgbWZjX3NldF9jb25maWdfYXJnX3Qgc2V0X2NvbmZpZzsKKworICAgIG1mY19tZW1fYWxsb2NfYXJnX3QgbWVtX2FsbG9jOworICAgIG1mY19tZW1fZnJlZV9hcmdfdCBtZW1fZnJlZTsKKyAgICBtZmNfZ2V0X3BoeXNfYWRkcl9hcmdfdCBnZXRfcGh5c19hZGRyOworCisgICAgbWZjX2J1ZmZlcl90eXBlIGJ1Zl90eXBlOworfSBtZmNfYXJnczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFnX21mY19hcmdzIHsKKyAgICBTU0JTSVBfTUZDX0VSUk9SX0NPREUgcmV0X2NvZGU7IC8qIFtPVVRdIGVycm9yIGNvZGUgKi8KKyAgICBtZmNfYXJncyBhcmdzOworfSBtZmNfY29tbW9uX2FyZ3M7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQgbWFnaWM7CisgICAgaW50IGhNRkM7CisgICAgaW50IHdpZHRoOworICAgIGludCBoZWlnaHQ7CisgICAgaW50IHNpemVTdHJtQnVmOworICAgIG1mY19mcmFtZV9idWZfYXJnX3Qgc2l6ZUZybUJ1ZjsKKyAgICBpbnQgZGlzcGxheVN0YXR1czsKKyAgICBpbnQgaW50ZXJfYnVmZl9zdGF0dXM7CisgICAgdW5zaWduZWQgaW50IHZpckZyZWVTdHJtQWRkcjsKKyAgICB1bnNpZ25lZCBpbnQgcGh5U3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyU3RybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgdmlyTXZSZWZZQzsKKyAgICBtZmNfZnJhbWVfYnVmX2FyZ190IHBoeUZybUJ1ZjsKKyAgICBtZmNfZnJhbWVfYnVmX2FyZ190IHZpckZybUJ1ZjsKKyAgICB1bnNpZ25lZCBpbnQgbWFwcGVkX2FkZHI7CisgICAgbWZjX2NvbW1vbl9hcmdzIE1mY0FyZzsKKyAgICBTU0JTSVBfTUZDX0NPREVDX1RZUEUgY29kZWNfdHlwZTsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyBkZWNPdXRJbmZvOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkSGVhZGVyU2l6ZTsKKyAgICBpbnQgZW5jb2RlZERhdGFTaXplOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkZnJhbWVUeXBlOworICAgIGludCBpbl9mcmFtZXRhZzsKKyAgICBpbnQgb3V0X2ZyYW1ldGFnX3RvcDsKKyAgICBpbnQgb3V0X2ZyYW1ldGFnX2JvdHRvbTsKKyAgICB1bnNpZ25lZCBpbnQgZW5jb2RlZF9ZX3BhZGRyOworICAgIHVuc2lnbmVkIGludCBlbmNvZGVkX0NfcGFkZHI7CisgICAgdW5zaWduZWQgaW50IGVuY29kZV9jbnQ7Cit9IF9NRkNMSUI7CisKKyNlbmRpZiAvKiBfTUZDX0lOVEVSRkFDRV9IXyAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9BbmRyb2lkLm1rIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMDUxNmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyNCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9CYXNlY29tcG9uZW50LmMgXAorCVNFQ19PTVhfQmFzZXBvcnQuYyBcCisJU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuYworCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZWNiYXNlY29tcG9uZW50CisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNlY29zYWwKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIGxpYnV0aWxzCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbAorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlY29tcG9uZW50LmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZWNvbXBvbmVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZTlhZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZWNvbXBvbmVudC5jCkBAIC0wLDAgKzEsMTQ4NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfQmFzZWNvbXBvbmVudC5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfRXZlbnQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0JBU0VfQ09NUCIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCisvKiBDaGFuZ2UgQ0hFQ0tfU0laRV9WRVJTSU9OIE1hY3JvICovCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oT01YX1BUUiBoZWFkZXIsIE9NWF9VMzIgc2l6ZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBPTVhfVkVSU0lPTlRZUEUqIHZlcnNpb24gPSBOVUxMOworICAgIGlmIChoZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgdmVyc2lvbiA9IChPTVhfVkVSU0lPTlRZUEUqKSgoY2hhciopaGVhZGVyICsgc2l6ZW9mKE9NWF9VMzIpKTsKKyAgICBpZiAoKigoT01YX1UzMiopaGVhZGVyKSAhPSBzaXplKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAodmVyc2lvbi0+cy5uVmVyc2lvbk1ham9yICE9IFZFUlNJT05NQUpPUl9OVU1CRVIgfHwKKyAgICAgICAgdmVyc2lvbi0+cy5uVmVyc2lvbk1pbm9yICE9IFZFUlNJT05NSU5PUl9OVU1CRVIpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVmVyc2lvbk1pc21hdGNoOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRDb21wb25lbnRWZXJzaW9uKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgICBoQ29tcG9uZW50LAorICAgIE9NWF9PVVQgT01YX1NUUklORyAgICAgICBwQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfT1VUIE9NWF9WRVJTSU9OVFlQRSAqcENvbXBvbmVudFZlcnNpb24sCisgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUgKnBTcGVjVmVyc2lvbiwKKyAgICBPTVhfT1VUIE9NWF9VVUlEVFlQRSAgICAqcENvbXBvbmVudFVVSUQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvbXBVVUlEWzNdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChoQ29tcG9uZW50ICAgICA9PSBOVUxMIHx8CisgICAgICAgIHBDb21wb25lbnROYW1lID09IE5VTEwgfHwgcENvbXBvbmVudFZlcnNpb24gPT0gTlVMTCB8fAorICAgICAgICBwU3BlY1ZlcnNpb24gICA9PSBOVUxMIHx8IHBDb21wb25lbnRVVUlEICAgID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT1NBTF9TdHJjcHkocENvbXBvbmVudE5hbWUsIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIFNFQ19PU0FMX01lbWNweShwQ29tcG9uZW50VmVyc2lvbiwgJihwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uKSwgc2l6ZW9mKE9NWF9WRVJTSU9OVFlQRSkpOworICAgIFNFQ19PU0FMX01lbWNweShwU3BlY1ZlcnNpb24sICYocFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24pLCBzaXplb2YoT01YX1ZFUlNJT05UWVBFKSk7CisKKyAgICAvKiBGaWxsIFVVSUQgd2l0aCBoYW5kbGUgYWRkcmVzcywgUElEIGFuZCBVSUQuCisgICAgICogVGhpcyBzaG91bGQgZ3VhcmFudGVlIHVpbmlxbmVzcyAqLworICAgIGNvbXBVVUlEWzBdID0gKE9NWF9VMzIpcE9NWENvbXBvbmVudDsKKyAgICBjb21wVVVJRFsxXSA9IGdldHBpZCgpOworICAgIGNvbXBVVUlEWzJdID0gZ2V0dWlkKCk7CisgICAgU0VDX09TQUxfTWVtY3B5KCpwQ29tcG9uZW50VVVJRCwgY29tcFVVSUQsIDMgKiBzaXplb2YoKmNvbXBVVUlEKSk7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0U3RhdGUgKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUgKnBTdGF0ZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwU3RhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgKnBTdGF0ZSA9IHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZTsKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3NUaHJlYWQoT01YX1BUUiB0aHJlYWREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICAgICptZXNzYWdlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICh0aHJlYWREYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKil0aHJlYWREYXRhOworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUHJvY2VzcyhwT01YQ29tcG9uZW50KTsKKworICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRTdGF0ZVNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBtZXNzYWdlUGFyYW0pCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2U7CisgICAgT01YX1NUQVRFVFlQRSAgICAgICAgICBkZXN0U3RhdGUgPSBtZXNzYWdlUGFyYW07CisgICAgT01YX1NUQVRFVFlQRSAgICAgICAgICBjdXJyZW50U3RhdGUgPSBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICBjb3VudFZhbHVlID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaSA9IDAsIGogPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgLyogY2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmIChjdXJyZW50U3RhdGUgPT0gZGVzdFN0YXRlKSB7CisgICAgICAgICByZXQgPSBPTVhfRXJyb3JTYW1lU3RhdGU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChjdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpICYmIChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkpIHsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRfUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorICAgIGlmICgoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJiAoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkpICAgICAgIHx8CisgICAgICAgICgoY3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpICYmIChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkpICAgICAgfHwKKyAgICAgICAgKChjdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSAmJiAoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpKSB8fAorICAgICAgICAoKGN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgJiYgKGRlc3RTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSkpIHsKKyAgICAgICAgU0VDX09NWF9SZWxlYXNlX1Jlc291cmNlKHBPTVhDb21wb25lbnQpOworICAgIH0KKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZGVzdFN0YXRlOiAlZCIsIGRlc3RTdGF0ZSk7CisKKyAgICBzd2l0Y2ggKGRlc3RTdGF0ZSkgeworICAgIGNhc2UgT01YX1N0YXRlSW52YWxpZDoKKyAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVJZGxlOgorICAgICAgICBjYXNlIE9NWF9TdGF0ZUV4ZWN1dGluZzoKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVQYXVzZToKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVMb2FkZWQ6CisgICAgICAgIGNhc2UgT01YX1N0YXRlV2FpdEZvclJlc291cmNlczoKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+aEJ1ZmZlclByb2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9HZXRfU2VtYXBob3JlQ291bnQocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQsICZjb3VudFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50VmFsdWUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9UaHJlYWRUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+aEJ1ZmZlclByb2Nlc3MpOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmhCdWZmZXJQcm9jZXNzID0gTlVMTDsKKworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW2ldLmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsVGVybWluYXRlKHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50VGVybWluYXRlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgeworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQgPSBPTVhfVFJVRTsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlELCAmY291bnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50VmFsdWUgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1RocmVhZFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5oQnVmZmVyUHJvY2Vzcyk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5oQnVmZmVyUHJvY2VzcyA9IE5VTEw7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VGVybWluYXRlKHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXggPSBOVUxMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlEID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAocFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cyk7IGkrKykgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0ID0gKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0ICsgaSk7CisgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoU0VDX09TQUxfR2V0RWxlbU51bSgmcFNFQ1BvcnQtPmJ1ZmZlclEpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IChTRUNfT01YX01FU1NBR0UqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlICE9IE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfRnJlZVR1bm5lbEJ1ZmZlcihwU0VDQ29tcG9uZW50LCBpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgICAgICByZXQgPSBTRUNfT01YX091dF9XYWl0Rm9yUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0ID0gKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0ICsgaSk7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19BbGxvY2F0ZVR1bm5lbEJ1ZmZlcihwU0VDUG9ydCwgaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0IT1PTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEID09IE9NWF9UUlVFKSB0aGVuVHVubmVsIEJ1ZmZlciBGcmVlCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IEFMTF9QT1JUX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhDcmVhdGUoJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gU0VDX09TQUxfVGhyZWFkQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5oQnVmZmVyUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09NWF9CdWZmZXJQcm9jZXNzVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQgPT0gT01YX1RSVUUpIHRoZW5UdW5uZWwgQnVmZmVyIEZyZWUKKyAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUocFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltpXS5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbaV0uYnVmZmVyTXV0ZXggPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVJZGxlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOgorICAgICAgICBjYXNlIE9NWF9TdGF0ZVBhdXNlOgorICAgICAgICAgICAgU0VDX09NWF9CdWZmZXJGbHVzaFByb2Nlc3NOb0V2ZW50KHBPTVhDb21wb25lbnQsIEFMTF9QT1JUX0lOREVYKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOgorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlSWRsZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1N0YXRlRXhlY3V0aW5nOgorICAgICAgICBzd2l0Y2ggKGN1cnJlbnRTdGF0ZSkgeworICAgICAgICBjYXNlIE9NWF9TdGF0ZUxvYWRlZDoKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZUlkbGU6CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0czsgaSsrKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBwU0VDUG9ydC0+dHVubmVsQnVmZmVyTnVtOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9IFNFQ19PTVhfVHJhbnNTdGF0ZU1heDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUV4ZWN1dGluZzsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZVBhdXNlOgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldOworICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICBPTVhfVTMyIHNlbWFWYWx1ZSA9IDAsIGNudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0dldF9TZW1hcGhvcmVDb3VudChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXS5idWZmZXJTZW1JRCwgJnNlbWFWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTRUNfT1NBTF9HZXRFbGVtTnVtKCZwU0VDUG9ydC0+YnVmZmVyUSkgPiBzZW1hVmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNudCA9IFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSAtIHNlbWFWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCBjbnQ7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0uYnVmZmVyU2VtSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVFeGVjdXRpbmc7CisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxTZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOgorICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVUcmFuc2l0aW9uOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU3RhdGVQYXVzZToKKyAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVMb2FkZWQ6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVJZGxlOgorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlUGF1c2U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVQYXVzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXM6CisgICAgICAgIHN3aXRjaCAoY3VycmVudFN0YXRlKSB7CisgICAgICAgIGNhc2UgT01YX1N0YXRlTG9hZGVkOgorICAgICAgICAgICAgcmV0ID0gU0VDX09NWF9Jbl9XYWl0Rm9yUmVzb3VyY2UocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT01YX1N0YXRlSWRsZToKKyAgICAgICAgY2FzZSBPTVhfU3RhdGVFeGVjdXRpbmc6CisgICAgICAgIGNhc2UgT01YX1N0YXRlUGF1c2U6CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZVRyYW5zaXRpb247CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLCBPTVhfQ29tbWFuZFN0YXRlU2V0LAorICAgICAgICAgICAgZGVzdFN0YXRlLCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCByZXQsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgfQorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT01YX01lc3NhZ2VIYW5kbGVyVGhyZWFkKE9NWF9QVFIgdGhyZWFkRGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfTUVTU0FHRSAgICAgICAqbWVzc2FnZSA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZSA9IDAsIHBvcnRJbmRleCA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAodGhyZWFkRGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKil0aHJlYWREYXRhOworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgd2hpbGUgKHBTRUNDb21wb25lbnQtPmJFeGl0TWVzc2FnZUhhbmRsZXJUaHJlYWQgIT0gT01YX1RSVUUpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNDb21wb25lbnQtPm1lc3NhZ2VRKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgbWVzc2FnZVR5cGUgPSBtZXNzYWdlLT5tZXNzYWdlVHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRTdGF0ZVNldDoKKyAgICAgICAgICAgICAgICByZXQgPSBTRUNfT01YX0NvbXBvbmVudFN0YXRlU2V0KHBPTVhDb21wb25lbnQsIG1lc3NhZ2UtPm1lc3NhZ2VQYXJhbSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9Db21tYW5kRmx1c2g6CisgICAgICAgICAgICAgICAgcmV0ID0gU0VDX09NWF9CdWZmZXJGbHVzaFByb2Nlc3MocE9NWENvbXBvbmVudCwgbWVzc2FnZS0+bWVzc2FnZVBhcmFtKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZToKKyAgICAgICAgICAgICAgICByZXQgPSBTRUNfT01YX1BvcnREaXNhYmxlUHJvY2VzcyhwT01YQ29tcG9uZW50LCBtZXNzYWdlLT5tZXNzYWdlUGFyYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZFBvcnRFbmFibGU6CisgICAgICAgICAgICAgICAgcmV0ID0gU0VDX09NWF9Qb3J0RW5hYmxlUHJvY2VzcyhwT01YQ29tcG9uZW50LCBtZXNzYWdlLT5tZXNzYWdlUGFyYW0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPTVhfQ29tbWFuZE1hcmtCdWZmZXI6CisgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gbWVzc2FnZS0+bWVzc2FnZVBhcmFtOworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0ubWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSAoKE9NWF9NQVJLVFlQRSAqKW1lc3NhZ2UtPnBDbWREYXRhKS0+aE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5tYXJrVHlwZS5wTWFya0RhdGEgICAgICAgICAgICA9ICgoT01YX01BUktUWVBFICopbWVzc2FnZS0+cENtZERhdGEpLT5wTWFya0RhdGE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIChPTVhfQ09NTUFORFRZUEUpU0VDX09NWF9Db21tYW5kQ29tcG9uZW50RGVJbml0OgorICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJFeGl0TWVzc2FnZUhhbmRsZXJUaHJlYWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICAgICAgbWVzc2FnZSA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KE5VTEwpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfU3RhdGVTZXQoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50LCBPTVhfVTMyIG5QYXJhbSkKK3sKKyAgICBPTVhfVTMyIGRlc3RTdGF0ZSA9IG5QYXJhbTsKKyAgICBPTVhfVTMyIGkgPSAwOworCisgICAgaWYgKChkZXN0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVMb2FkZWQpKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID0gU0VDX09NWF9UcmFuc1N0YXRlTG9hZGVkVG9JZGxlOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzOyBpKyspIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLnBvcnRTdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0byBPTVhfU3RhdGVJZGxlIik7CisgICAgfSBlbHNlIGlmICgoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9IFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0xvYWRlZDsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV0ucG9ydFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAidG8gT01YX1N0YXRlTG9hZGVkIik7CisgICAgfSBlbHNlIGlmICgoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9IFNFQ19PTVhfVHJhbnNTdGF0ZUV4ZWN1dGluZ1RvSWRsZTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0byBPTVhfU3RhdGVJZGxlIik7CisgICAgfSBlbHNlIGlmICgoZGVzdFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9IFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0V4ZWN1dGluZzsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0byBPTVhfU3RhdGVFeGVjdXRpbmciKTsKKyAgICB9IGVsc2UgaWYgKGRlc3RTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzOyBpKyspIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2ldLnBvcnRTdGF0ZSA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX1NldFBvcnRGbHVzaChTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsIE9NWF9VMzIgblBhcmFtKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgIHBvcnRJbmRleCA9IG5QYXJhbTsKKyAgICBPTVhfVTE2ICAgICAgICAgICBpID0gMCwgY250ID0gMCwgaW5kZXggPSAwOworCisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8CisgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpKSB7CisgICAgICAgIGlmICgocG9ydEluZGV4ICE9IEFMTF9QT1JUX0lOREVYKSAmJgorICAgICAgICAgICAoKE9NWF9TMzIpcG9ydEluZGV4ID49IChPTVhfUzMyKXBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICogICAgbmVlZCBmbHVzaCBldmVudCBzZXQgPz8/Pz8KKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgY250ID0gKHBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCApID8gQUxMX1BPUlRfTlVNIDogMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBpbmRleCA9IHBvcnRJbmRleDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W2luZGV4XS5iSXNQb3J0Rmx1c2hlZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfU2V0UG9ydEVuYWJsZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsIE9NWF9VMzIgblBhcmFtKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgIHBvcnRJbmRleCA9IG5QYXJhbTsKKyAgICBPTVhfVTE2ICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgocG9ydEluZGV4ICE9IEFMTF9QT1JUX0lOREVYKSAmJgorICAgICAgICAoKE9NWF9TMzIpcG9ydEluZGV4ID49IChPTVhfUzMyKXBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnRTdGF0ZSA9IE9NWF9TdGF0ZUlkbGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydFN0YXRlID0gT01YX1N0YXRlSWRsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19TZXRQb3J0RGlzYWJsZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsIE9NWF9VMzIgblBhcmFtKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgIHBvcnRJbmRleCA9IG5QYXJhbTsKKyAgICBPTVhfVTE2ICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgocG9ydEluZGV4ICE9IEFMTF9QT1JUX0lOREVYKSAmJgorICAgICAgICAoKE9NWF9TMzIpcG9ydEluZGV4ID49IChPTVhfUzMyKXBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7IGkrKykgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgICAgICBpZiAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworICAgICAgICAgICAgcFNFQ1BvcnQtPmJJc1BvcnREaXNhYmxlZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKyAgICAgICAgcFNFQ1BvcnQtPmJJc1BvcnREaXNhYmxlZCA9IE9NWF9UUlVFOworICAgIH0KKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfU2V0TWFya0J1ZmZlcihTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQsIE9NWF9VMzIgblBhcmFtKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgIHBvcnRJbmRleCA9IG5QYXJhbTsKKyAgICBPTVhfVTE2ICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKworCisgICAgaWYgKG5QYXJhbSA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgfHwKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21tYW5kUXVldWUoCisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50LAorICAgIE9NWF9DT01NQU5EVFlQRSAgICAgICAgQ21kLAorICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgblBhcmFtLAorICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcENtZERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfTUVTU0FHRSAqY29tbWFuZCA9IChTRUNfT01YX01FU1NBR0UgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfTUVTU0FHRSkpOworCisgICAgaWYgKGNvbW1hbmQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgY29tbWFuZC0+bWVzc2FnZVR5cGUgID0gKE9NWF9VMzIpQ21kOworICAgIGNvbW1hbmQtPm1lc3NhZ2VQYXJhbSA9IG5QYXJhbTsKKyAgICBjb21tYW5kLT5wQ21kRGF0YSAgICAgPSBwQ21kRGF0YTsKKworICAgIHJldCA9IFNFQ19PU0FMX1F1ZXVlKCZwU0VDQ29tcG9uZW50LT5tZXNzYWdlUSwgKHZvaWQgKiljb21tYW5kKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+bXNnU2VtYXBob3JlSGFuZGxlKTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfU2VuZENvbW1hbmQoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfQ09NTUFORFRZUEUgQ21kLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgblBhcmFtLAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgcENtZERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2UgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoQ21kKSB7CisgICAgY2FzZSBPTVhfQ29tbWFuZFN0YXRlU2V0IDoKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDb21tYW5kOiBPTVhfQ29tbWFuZFN0YXRlU2V0Iik7CisgICAgICAgIFNFQ19TdGF0ZVNldChwU0VDQ29tcG9uZW50LCBuUGFyYW0pOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9Db21tYW5kRmx1c2ggOgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNvbW1hbmQ6IE9NWF9Db21tYW5kRmx1c2giKTsKKyAgICAgICAgcmV0ID0gU0VDX1NldFBvcnRGbHVzaChwU0VDQ29tcG9uZW50LCBuUGFyYW0pOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0NvbW1hbmRQb3J0RGlzYWJsZSA6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ29tbWFuZDogT01YX0NvbW1hbmRQb3J0RGlzYWJsZSIpOworICAgICAgICByZXQgPSBTRUNfU2V0UG9ydERpc2FibGUocFNFQ0NvbXBvbmVudCwgblBhcmFtKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9Db21tYW5kUG9ydEVuYWJsZSA6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ29tbWFuZDogT01YX0NvbW1hbmRQb3J0RW5hYmxlIik7CisgICAgICAgIHJldCA9IFNFQ19TZXRQb3J0RW5hYmxlKHBTRUNDb21wb25lbnQsIG5QYXJhbSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfQ29tbWFuZE1hcmtCdWZmZXIgOgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNvbW1hbmQ6IE9NWF9Db21tYW5kTWFya0J1ZmZlciIpOworICAgICAgICByZXQgPSBTRUNfU2V0TWFya0J1ZmZlcihwU0VDQ29tcG9uZW50LCBuUGFyYW0pOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIGJyZWFrOworLyoKKyAgICBjYXNlIFNFQ19Db21tYW5kRmlsbEJ1ZmZlciA6CisgICAgY2FzZSBTRUNfQ29tbWFuZEVtcHR5QnVmZmVyIDoKKyAgICBjYXNlIFNFQ19Db21tYW5kRGVJbml0IDoKKyovCisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Db21tYW5kUXVldWUocFNFQ0NvbXBvbmVudCwgQ21kLCBuUGFyYW0sIHBDbWREYXRhKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuUGFyYW1JbmRleCkgeworICAgIGNhc2UgKE9NWF9JTkRFWFRZUEUpT01YX0NPTVBPTkVOVF9DQVBBQklMSVRZX1RZUEVfSU5ERVg6CisgICAgeworICAgICAgICAvKiBGb3IgQW5kcm9pZCBQViBPcGVuQ09SRSAqLworICAgICAgICBPTVhDb21wb25lbnRDYXBhYmlsaXR5RmxhZ3NUeXBlICpjYXBhYmlsaXR5RmxhZ3MgPSAoT01YQ29tcG9uZW50Q2FwYWJpbGl0eUZsYWdzVHlwZSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KGNhcGFiaWxpdHlGbGFncywgJnBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncywgc2l6ZW9mKE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1BdWRpb0luaXQ6CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSW5pdDoKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtSW1hZ2VJbml0OgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1PdGhlckluaXQ6CisgICAgeworICAgICAgICBPTVhfUE9SVF9QQVJBTV9UWVBFICpwb3J0UGFyYW0gPSAoT01YX1BPUlRfUEFSQU1fVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0UGFyYW0sIHNpemVvZihPTVhfUE9SVF9QQVJBTV9UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgIHBvcnRQYXJhbS0+blBvcnRzICAgICAgICAgPSAwOworICAgICAgICBwb3J0UGFyYW0tPm5TdGFydFBvcnROdW1iZXIgICAgID0gMDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBvcnREZWZpbml0aW9uLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnREZWZpbml0aW9uLCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgIFNFQ19PU0FMX01lbWNweShwb3J0RGVmaW5pdGlvbiwgJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcG9ydERlZmluaXRpb24tPm5TaXplKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6CisgICAgeworICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSAqY29tcFByaW9yaXR5ID0gKE9NWF9QUklPUklUWU1HTVRUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oY29tcFByaW9yaXR5LCBzaXplb2YoT01YX1BSSU9SSVRZTUdNVFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBjb21wUHJpb3JpdHktPm5Hcm91cElEICAgICAgID0gcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cElEOworICAgICAgICBjb21wUHJpb3JpdHktPm5Hcm91cFByaW9yaXR5ID0gcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cFByaW9yaXR5OworICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqYnVmZmVyU3VwcGxpZXIgPSAoT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gYnVmZmVyU3VwcGxpZXItPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0OworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUxvYWRlZCkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKGJ1ZmZlclN1cHBsaWVyLCBzaXplb2YoT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSkpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworCisKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZURpciA9PSBPTVhfRGlySW5wdXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5SW5wdXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID0gT01YX0J1ZmZlclN1cHBseU91dHB1dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID0gT01YX0J1ZmZlclN1cHBseVVuc3BlY2lmaWVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID0gT01YX0J1ZmZlclN1cHBseU91dHB1dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5SW5wdXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9IE9NWF9CdWZmZXJTdXBwbHlVbnNwZWNpZmllZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1NldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUF1ZGlvSW5pdDoKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1JbWFnZUluaXQ6CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbU90aGVySW5pdDoKKyAgICB7CisgICAgICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgKnBvcnRQYXJhbSA9IChPTVhfUE9SVF9QQVJBTV9UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRQYXJhbSwgc2l6ZW9mKE9NWF9QT1JUX1BBUkFNX1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIC8qIFNFQ19PU0FMX01lbWNweSgmcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLCBwb3J0UGFyYW0sIHNpemVvZihPTVhfUE9SVF9QQVJBTV9UWVBFKSk7ICovCisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmaW5pdGlvbiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydERlZmluaXRpb24tPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAqcFNFQ1BvcnQ7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0RGVmaW5pdGlvbiwgc2l6ZW9mKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocG9ydERlZmluaXRpb24tPm5CdWZmZXJDb3VudEFjdHVhbCA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRNaW4pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX01lbWNweSgmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLCBwb3J0RGVmaW5pdGlvbiwgcG9ydERlZmluaXRpb24tPm5TaXplKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQ6CisgICAgeworICAgICAgICBPTVhfUFJJT1JJVFlNR01UVFlQRSAqY29tcFByaW9yaXR5ID0gKE9NWF9QUklPUklUWU1HTVRUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihjb21wUHJpb3JpdHksIHNpemVvZihPTVhfUFJJT1JJVFlNR01UVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNDb21wb25lbnQtPmNvbXBQcmlvcml0eS5uR3JvdXBJRCA9IGNvbXBQcmlvcml0eS0+bkdyb3VwSUQ7CisgICAgICAgIHBTRUNDb21wb25lbnQtPmNvbXBQcmlvcml0eS5uR3JvdXBQcmlvcml0eSA9IGNvbXBQcmlvcml0eS0+bkdyb3VwUHJpb3JpdHk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqYnVmZmVyU3VwcGxpZXIgPSAoT01YX1BBUkFNX0JVRkZFUlNVUFBMSUVSVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IGJ1ZmZlclN1cHBsaWVyLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihidWZmZXJTdXBwbGllciwgc2l6ZW9mKE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9PSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpID09IDApIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7IC8qT01YX0Vycm9yTm9uZSA/Pz8/PyovCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEaXIgPT0gT01YX0RpcklucHV0KSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyU3VwcGxpZXItPmVCdWZmZXJTdXBwbGllciA9PSBPTVhfQnVmZmVyU3VwcGx5SW5wdXQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+dHVubmVsRmxhZ3MgfD0gU0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleCA9IHBTRUNQb3J0LT50dW5uZWxlZFBvcnQ7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX1NldFBhcmFtZXRlcihwU0VDUG9ydC0+dHVubmVsZWRDb21wb25lbnQsIE9NWF9JbmRleFBhcmFtQ29tcEJ1ZmZlclN1cHBsaWVyLCBidWZmZXJTdXBwbGllcik7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID09IE9NWF9CdWZmZXJTdXBwbHlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnR1bm5lbEZsYWdzICY9IH5TRUNfVFVOTkVMX0lTX1NVUFBMSUVSOworICAgICAgICAgICAgICAgICAgICBidWZmZXJTdXBwbGllci0+blBvcnRJbmRleCA9IHBTRUNQb3J0LT50dW5uZWxlZFBvcnQ7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9TZXRQYXJhbWV0ZXIocFNFQ1BvcnQtPnR1bm5lbGVkQ29tcG9uZW50LCBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciwgYnVmZmVyU3VwcGxpZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEaXIgPT0gT01YX0Rpck91dHB1dCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlclN1cHBsaWVyLT5lQnVmZmVyU3VwcGxpZXIgPT0gT01YX0J1ZmZlclN1cHBseUlucHV0KSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT50dW5uZWxGbGFncyAmPSB+U0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIGlmIChidWZmZXJTdXBwbGllci0+ZUJ1ZmZlclN1cHBsaWVyID09IE9NWF9CdWZmZXJTdXBwbHlPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+dHVubmVsRmxhZ3MgfD0gU0VDX1RVTk5FTF9JU19TVVBQTElFUjsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldENvbmZpZygKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9TZXRDb25maWcoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICByZXQgPSBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4OworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfU1RSSU5HICAgICAgY1BhcmFtZXRlck5hbWUsCisgICAgT01YX09VVCBPTVhfSU5ERVhUWVBFICpwSW5kZXhUeXBlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfU2V0Q2FsbGJhY2tzICgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0NBTExCQUNLVFlQRSogcENhbGxiYWNrcywKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgcEFwcERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ2FsbGJhY2tzID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzID0gcENhbGxiYWNrczsKKyAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEgPSBwQXBwRGF0YTsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Vc2VFR0xJbWFnZSgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIHZvaWQgICAgICAgICAgICAgICAgICAgICAqZWdsSW1hZ2UpCit7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQmFzZUNvbXBvbmVudF9Db25zdHJ1Y3RvcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50OworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JCYWRQYXJhbWV0ZXIsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9CQVNFQ09NUE9ORU5UKSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LCAwLCBzaXplb2YoU0VDX09NWF9CQVNFQ09NUE9ORU5UKSk7CisgICAgcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPSAoT01YX1BUUilwU0VDQ29tcG9uZW50OworCisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PU0FMX011dGV4Q3JlYXRlKCZwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudC0+YkV4aXRNZXNzYWdlSGFuZGxlclRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT1NBTF9RdWV1ZUNyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+bWVzc2FnZVEpOworICAgIHJldCA9IFNFQ19PU0FMX1RocmVhZENyZWF0ZSgmcFNFQ0NvbXBvbmVudC0+aE1lc3NhZ2VIYW5kbGVyLCBTRUNfT01YX01lc3NhZ2VIYW5kbGVyVGhyZWFkLCBwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQtPkdldENvbXBvbmVudFZlcnNpb24gPSAmU0VDX09NWF9HZXRDb21wb25lbnRWZXJzaW9uOworICAgIHBPTVhDb21wb25lbnQtPlNlbmRDb21tYW5kICAgICAgICAgPSAmU0VDX09NWF9TZW5kQ29tbWFuZDsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCAgID0gJlNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXg7CisgICAgcE9NWENvbXBvbmVudC0+R2V0U3RhdGUgICAgICAgICAgICA9ICZTRUNfT01YX0dldFN0YXRlOworICAgIHBPTVhDb21wb25lbnQtPlNldENhbGxiYWNrcyAgICAgICAgPSAmU0VDX09NWF9TZXRDYWxsYmFja3M7CisgICAgcE9NWENvbXBvbmVudC0+VXNlRUdMSW1hZ2UgICAgICAgICA9ICZTRUNfT01YX1VzZUVHTEltYWdlOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQmFzZUNvbXBvbmVudF9EZXN0cnVjdG9yKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBzZW1hVmFsdWUgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgU0VDX09NWF9Db21tYW5kUXVldWUocFNFQ0NvbXBvbmVudCwgU0VDX09NWF9Db21tYW5kQ29tcG9uZW50RGVJbml0LCAwLCBOVUxMKTsKKyAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworICAgIFNFQ19PU0FMX0dldF9TZW1hcGhvcmVDb3VudChwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUsICZzZW1hVmFsdWUpOworICAgIGlmIChzZW1hVmFsdWUgPT0gMCkKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5tc2dTZW1hcGhvcmVIYW5kbGUpOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+bXNnU2VtYXBob3JlSGFuZGxlKTsKKworICAgIFNFQ19PU0FMX1RocmVhZFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5oTWVzc2FnZUhhbmRsZXIpOworICAgIHBTRUNDb21wb25lbnQtPmhNZXNzYWdlSGFuZGxlciA9IE5VTEw7CisKKyAgICBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCA9IE5VTEw7CisgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNDb21wb25lbnQtPm1zZ1NlbWFwaG9yZUhhbmRsZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+bXNnU2VtYXBob3JlSGFuZGxlID0gTlVMTDsKKyAgICBTRUNfT1NBTF9RdWV1ZVRlcm1pbmF0ZSgmcFNFQ0NvbXBvbmVudC0+bWVzc2FnZVEpOworCisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50KTsKKyAgICBwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vjb21wb25lbnQuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlY29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxMzI1NwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlY29tcG9uZW50LmgKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT01YX0Jhc2Vjb21wb25lbnQuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfQkFTRUNPTVAKKyNkZWZpbmUgU0VDX09NWF9CQVNFQ09NUAorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfTUVTU0FHRQoreworICAgIE9NWF9VMzIgbWVzc2FnZVR5cGU7CisgICAgT01YX1UzMiBtZXNzYWdlUGFyYW07CisgICAgT01YX1BUUiBwQ21kRGF0YTsKK30gU0VDX09NWF9NRVNTQUdFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9EQVRBQlVGRkVSCit7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgIGJ1ZmZlck11dGV4OworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBidWZmZXJIZWFkZXI7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgIGRhdGFWYWxpZDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgYWxsb2NTaXplOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICBkYXRhTGVuOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICB1c2VkRGF0YUxlbjsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgcmVtYWluRGF0YUxlbjsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgbkZsYWdzOworICAgIE9NWF9USUNLUyAgICAgICAgICAgICB0aW1lU3RhbXA7Cit9IFNFQ19PTVhfREFUQUJVRkZFUjsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19CVUZGRVJfSEVBREVSeworICAgIHZvaWQgKllQaHlBZGRyOyAvLyBbSU4vT1VUXSBwaHlzaWNhbCBhZGRyZXNzIG9mIFkKKyAgICB2b2lkICpDUGh5QWRkcjsgLy8gW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyCisgICAgdm9pZCAqWVZpckFkZHI7IC8vIFtJTi9PVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1ZpckFkZHI7IC8vIFtJTi9PVVRdIHZpcnR1YWwgYWRkcmVzcyBvZiBDYkNyCisgICAgaW50IFlTaXplOyAgICAgIC8vIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgWSBkYXRhCisgICAgaW50IENTaXplOyAgICAgIC8vIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgQ2JDciBkYXRhCit9IFNFQ19CVUZGRVJfSEVBREVSOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9EQVRBCit7CisgICAgT01YX0JZVEUgIGRhdGFCdWZmZXI7CisgICAgT01YX1UzMiAgIGFsbG9jU2l6ZTsKKyAgICBPTVhfVTMyICAgZGF0YUxlbjsKKyAgICBPTVhfVTMyICAgdXNlZERhdGFMZW47CisgICAgT01YX1UzMiAgIHJlbWFpbkRhdGFMZW47CisgICAgT01YX1UzMiAgIHByZXZpb3VzRGF0YUxlbjsKKyAgICBPTVhfVTMyICAgbkZsYWdzOworICAgIE9NWF9USUNLUyB0aW1lU3RhbXA7CisgICAgU0VDX0JVRkZFUl9IRUFERVIgc3BlY2lmaWNCdWZmZXJIZWFkZXI7Cit9IFNFQ19PTVhfREFUQTsKKworLyogZm9yIENoZWNrIFRpbWVTdGFtcCBhZnRlciBTZWVrICovCit0eXBlZGVmIHN0cnVjdCBfU0VDX09NWF9USU1FU1RBUE0KK3sKKyAgICBPTVhfQk9PTCAgbmVlZFNldFN0YXJ0VGltZVN0YW1wOworICAgIE9NWF9CT09MICBuZWVkQ2hlY2tTdGFydFRpbWVTdGFtcDsKKyAgICBPTVhfVElDS1Mgc3RhcnRUaW1lU3RhbXA7CisgICAgT01YX1UzMiAgIG5TdGFydEZsYWdzOworfSBTRUNfT01YX1RJTUVTVEFNUDsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQkFTRUNPTVBPTkVOVAoreworICAgIE9NWF9TVFJJTkcgICAgICAgICAgICAgICBjb21wb25lbnROYW1lOworICAgIE9NWF9WRVJTSU9OVFlQRSAgICAgICAgICBjb21wb25lbnRWZXJzaW9uOworICAgIE9NWF9WRVJTSU9OVFlQRSAgICAgICAgICBzcGVjVmVyc2lvbjsKKworICAgIE9NWF9TVEFURVRZUEUgICAgICAgICAgICBjdXJyZW50U3RhdGU7CisgICAgU0VDX09NWF9UUkFOU19TVEFURVRZUEUgIHRyYW5zaWVudFN0YXRlOworCisgICAgU0VDX0NPREVDX1RZUEUgICAgICAgICAgIGNvZGVjVHlwZTsKKyAgICBTRUNfT01YX1BSSU9SSVRZTUdNVFRZUEUgY29tcFByaW9yaXR5OworICAgIE9NWF9NQVJLVFlQRSAgICAgICAgICAgICBwcm9wYWdhdGVNYXJrVHlwZTsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgY29tcE11dGV4OworCisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgIGhDb2RlY0hhbmRsZTsKKworICAgIC8qIE1lc3NhZ2UgSGFuZGxlciAqLworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBiRXhpdE1lc3NhZ2VIYW5kbGVyVGhyZWFkOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICBoTWVzc2FnZUhhbmRsZXI7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgIG1zZ1NlbWFwaG9yZUhhbmRsZTsKKyAgICBTRUNfUVVFVUUgICAgICAgICAgICAgICAgbWVzc2FnZVE7CisKKyAgICAvKiBCdWZmZXIgUHJvY2VzcyAqLworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBiRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQ7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgIGhCdWZmZXJQcm9jZXNzOworCisgICAgLyogQnVmZmVyICovCisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICAgIHNlY0RhdGFCdWZmZXJbMl07CisKKyAgICAvKiBEYXRhICovCisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICAgIHByb2Nlc3NEYXRhWzJdOworCisgICAgLyogUG9ydCAqLworICAgIE9NWF9QT1JUX1BBUkFNX1RZUEUgICAgICBwb3J0UGFyYW07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNQb3J0OworCisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgIHBhdXNlRXZlbnQ7CisKKyAgICAvKiBDYWxsYmFjayBmdW5jdGlvbiAqLworICAgIE9NWF9DQUxMQkFDS1RZUEUgICAgICAgICpwQ2FsbGJhY2tzOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgICBjYWxsYmFja0RhdGE7CisKKyAgICAvKiBTYXZlIFRpbWVzdGFtcCAqLworICAgIE9NWF9USUNLUyAgICAgICAgICAgICAgICB0aW1lU3RhbXBbTUFYX1RJTUVTVEFNUF07CisgICAgU0VDX09NWF9USU1FU1RBTVAgICAgICAgIGNoZWNrVGltZVN0YW1wOworCisgICAgLyogU2F2ZSBGbGFncyAqLworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICBuRmxhZ3NbTUFYX0ZMQUdTXTsKKworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBnZXRBbGxEZWxheUJ1ZmZlcjsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgcmVtYWluT3V0cHV0RGF0YTsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgcmVJbnB1dERhdGE7CisKKyAgICAvKiBBbmRyb2lkIENhcGFiaWxpdHlGbGFncyAqLworICAgIE9NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUgY2FwYWJpbGl0eUZsYWdzOworCisgICAgT01YX0JPT0wgYlVzZUZsYWdFT0Y7CisgICAgT01YX0JPT0wgYlNhdmVGbGFnRU9TOworCisgICAgT01YX0VSUk9SVFlQRSAoKnNlY19tZmNfY29tcG9uZW50SW5pdCkoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfbWZjX2NvbXBvbmVudFRlcm1pbmF0ZSkoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfbWZjX2J1ZmZlclByb2Nlc3MpIChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKTsKKworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfQWxsb2NhdGVUdW5uZWxCdWZmZXIpKFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwgT01YX1UzMiBuUG9ydEluZGV4KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX0ZyZWVUdW5uZWxCdWZmZXIpKFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwgT01YX1UzMiBuUG9ydEluZGV4KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX0J1ZmZlclByb2Nlc3MpKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfQnVmZmVyUmVzZXQpKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfVTMyIG5Qb3J0SW5kZXgpOworICAgIE9NWF9FUlJPUlRZUEUgKCpzZWNfSW5wdXRCdWZmZXJSZXR1cm4pKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KTsKKyAgICBPTVhfRVJST1JUWVBFICgqc2VjX091dHB1dEJ1ZmZlclJldHVybikoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworCisgICAgaW50ICgqc2VjX2NoZWNrSW5wdXRGcmFtZSkodW5zaWduZWQgY2hhciAqcElucHV0U3RyZWFtLCBpbnQgYnVmZlNpemUsIE9NWF9VMzIgZmxhZywgT01YX0JPT0wgYlByZXZpb3VzRnJhbWVFT0YsIE9NWF9CT09MICpwYkVuZE9mRnJhbWUpOworCit9IFNFQ19PTVhfQkFTRUNPTVBPTkVOVDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyAgICBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24oT01YX1BUUiBoZWFkZXIsIE9NWF9VMzIgc2l6ZSk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vwb3J0LmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZXBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2UwMGFmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX0Jhc2Vwb3J0LmMKQEAgLTAsMCArMSwxMDA5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9CYXNlcG9ydC5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FdmVudC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX011dGV4LmgiCisKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19CQVNFX1BPUlQiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZsdXNoUG9ydChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICAgICptZXNzYWdlID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGZsdXNoTnVtID0gMDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHNlbVZhbHVlID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA+IDApIHsKKyAgICAgICAgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYnVmZmVyU2VtSUQsICZzZW1WYWx1ZSk7CisgICAgICAgIGlmIChzZW1WYWx1ZSA9PSAwKQorICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKworICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopbWVzc2FnZS0+cENtZERhdGE7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSAwOworCisgICAgICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0VtcHR5VGhpc0J1ZmZlcihwU0VDUG9ydC0+dHVubmVsZWRDb21wb25lbnQsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0ZpbGxUaGlzQnVmZmVyKHBTRUNQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJUdW5uZWxlZCBtb2RlIGlzIG5vdCB3b3JraW5nLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vdEltcGxlbWVudGVkOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1F1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSwgcFNFQ1BvcnQpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5GaWxsQnVmZmVyRG9uZShwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RW1wdHlCdWZmZXJEb25lKHBPTVhDb21wb25lbnQsIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XS5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9NRVNTQUdFKSk7CisgICAgICAgICAgICBtZXNzYWdlLT5wQ21kRGF0YSA9IHBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XS5idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBtZXNzYWdlLT5tZXNzYWdlVHlwZSA9IDA7CisgICAgICAgICAgICBtZXNzYWdlLT5tZXNzYWdlUGFyYW0gPSAtMTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1F1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSwgbWVzc2FnZSk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfQnVmZmVyUmVzZXQocE9NWENvbXBvbmVudCwgcG9ydEluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5zZWNfSW5wdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgICAgICBlbHNlIGlmIChwb3J0SW5kZXggPT0gT1VUUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX091dHB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgd2hpbGUgKFNFQ19PU0FMX0dldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRKSA8IHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoU0VDX09TQUxfR2V0RWxlbU51bSgmcFNFQ1BvcnQtPmJ1ZmZlclEpICE9IHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSkKKyAgICAgICAgICAgIFNFQ19PU0FMX1NldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRLCBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0pOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgIGludCBjbnQ7CisgICAgICAgICAgICBTRUNfT1NBTF9HZXRfU2VtYXBob3JlQ291bnQocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5idWZmZXJTZW1JRCwgJmNudCk7CisgICAgICAgICAgICBpZiAoY250ID09IDApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYnVmZmVyU2VtSUQpOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX1NldEVsZW1OdW0oJnBTRUNQb3J0LT5idWZmZXJRLCAwKTsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtwb3J0SW5kZXhdLmRhdGFMZW4gICAgICAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW3BvcnRJbmRleF0ubkZsYWdzICAgICAgICA9IDA7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbcG9ydEluZGV4XS5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtwb3J0SW5kZXhdLnRpbWVTdGFtcCAgICAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW3BvcnRJbmRleF0udXNlZERhdGFMZW4gICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9CdWZmZXJGbHVzaFByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmZsdXNoQnVmZmVyID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwT01YQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGNudCA9IChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYICkgPyBBTExfUE9SVF9OVU0gOiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlmIChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgcG9ydEluZGV4ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9ydEluZGV4ID0gblBvcnRJbmRleDsKKworICAgICAgICBTRUNfT1NBTF9TaWduYWxTZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisKKyAgICAgICAgZmx1c2hCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICByZXQgPSBTRUNfT01YX0ZsdXNoUG9ydChwT01YQ29tcG9uZW50LCBwb3J0SW5kZXgpOworICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhmbHVzaEJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworCisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydEZsdXNoZWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwiT01YX0NvbW1hbmRGbHVzaCBFdmVudENtZENvbXBsZXRlIik7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kRmx1c2gsIHBvcnRJbmRleCwgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9UUlVFOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wLCAtMTk3NzEwMDMsIHNpemVvZihPTVhfVElDS1MpICogTUFYX1RJTUVTVEFNUCk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+bkZsYWdzLCAwLCBzaXplb2YoT01YX1UzMikgKiBNQVhfRkxBR1MpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfSBlbHNlIGlmIChwb3J0SW5kZXggPT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlckZsdXNoUHJvY2Vzc05vRXZlbnQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmZsdXNoQnVmZmVyID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChwT01YQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGNudCA9IChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYICkgPyBBTExfUE9SVF9OVU0gOiAxOworCisgICAgZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlmIChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgcG9ydEluZGV4ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9ydEluZGV4ID0gblBvcnRJbmRleDsKKworICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJJc1BvcnRGbHVzaGVkID0gT01YX1RSVUU7CisKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsU2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworCisgICAgICAgIGZsdXNoQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soZmx1c2hCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9GbHVzaFBvcnQocE9NWENvbXBvbmVudCwgcG9ydEluZGV4KTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZmx1c2hCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJJc1BvcnRGbHVzaGVkID0gT01YX0ZBTFNFOworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX1RSVUU7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT50aW1lU3RhbXAsIC0xOTc3MTAwMywgc2l6ZW9mKE9NWF9USUNLUykgKiBNQVhfVElNRVNUQU1QKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgMCwgTlVMTCk7CisgICAgfQorCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0VuYWJsZVBvcnQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgcG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19BbGxvY2F0ZVR1bm5lbEJ1ZmZlcihwU0VDUG9ydCwgcG9ydEluZGV4KTsKKyAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgICAgIGZvciAoaT0wOyBpPHBTRUNQb3J0LT50dW5uZWxCdWZmZXJOdW07IGkrKykgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5idWZmZXJTZW1JRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmICFDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgfQorICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RW5hYmxlUHJvY2VzcyhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBuUG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwLCBjbnQgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBPTVhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgY250ID0gKG5Qb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVgpID8gQUxMX1BPUlRfTlVNIDogMTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IG5Qb3J0SW5kZXg7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9FbmFibGVQb3J0KHBPTVhDb21wb25lbnQsIHBvcnRJbmRleCk7CisgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudENtZENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwgcG9ydEluZGV4LCBOVUxMKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXQsIDAsIE5VTEwpOworICAgICAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0Rpc2FibGVQb3J0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfUzMyIHBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgaSA9IDAsIGVsZW1OdW0gPSAwOworICAgIFNFQ19PTVhfTUVTU0FHRSAgICAgICAqbWVzc2FnZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisKKyAgICBpZiAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUhPU9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgICAgICB3aGlsZSAoU0VDX09TQUxfR2V0RWxlbU51bSgmcFNFQ1BvcnQtPmJ1ZmZlclEpID4wICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFKilTRUNfT1NBTF9EZXF1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldCA9IHBTRUNDb21wb25lbnQtPnNlY19GcmVlVHVubmVsQnVmZmVyKHBTRUNQb3J0LCBwb3J0SW5kZXgpOworICAgICAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gcmV0KSB7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgICAgIH0gZWxzZSBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoU0VDX09TQUxfR2V0RWxlbU51bSgmcFNFQ1BvcnQtPmJ1ZmZlclEpID4wICkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOworICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX0ZBTFNFOworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RGlzYWJsZVByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IDA7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMCwgY250ID0gMDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgICAqZmx1c2hCdWZmZXIgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBPTVhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgY250ID0gKG5Qb3J0SW5kZXggPT0gQUxMX1BPUlRfSU5ERVggKSA/IEFMTF9QT1JUX05VTSA6IDE7CisKKyAgICAvKiBwb3J0IGZsdXNoKi8KKyAgICBmb3IoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBBTExfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IGk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBvcnRJbmRleCA9IG5Qb3J0SW5kZXg7CisKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XS5iSXNQb3J0Rmx1c2hlZCA9IE9NWF9UUlVFOworCisgICAgICAgIGZsdXNoQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soZmx1c2hCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9GbHVzaFBvcnQocE9NWENvbXBvbmVudCwgcG9ydEluZGV4KTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZmx1c2hCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdLmJJc1BvcnRGbHVzaGVkID0gT01YX0ZBTFNFOworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX1RSVUU7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT50aW1lU3RhbXAsIC0xOTc3MTAwMywgc2l6ZW9mKE9NWF9USUNLUykgKiBNQVhfVElNRVNUQU1QKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID0gT01YX0ZBTFNFOworICAgICAgICB9IGVsc2UgaWYgKHBvcnRJbmRleCA9PSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvcihpID0gMDsgaSA8IGNudDsgaSsrKSB7CisgICAgICAgIGlmIChuUG9ydEluZGV4ID09IEFMTF9QT1JUX0lOREVYKQorICAgICAgICAgICAgcG9ydEluZGV4ID0gaTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcG9ydEluZGV4ID0gblBvcnRJbmRleDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0Rpc2FibGVQb3J0KHBPTVhDb21wb25lbnQsIHBvcnRJbmRleCk7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF0uYklzUG9ydERpc2FibGVkID0gT01YX0ZBTFNFOworICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcihwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRDbWRDb21wbGV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnREaXNhYmxlLCBwb3J0SW5kZXgsIE5VTEwpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgcmV0LCAwLCBOVUxMKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0VtcHR5VGhpc0J1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgZmluZEJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgICAgKm1lc3NhZ2U7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBCdWZmZXItPm5JbnB1dFBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocEJ1ZmZlciwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVQYXVzZSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBpZiAoKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ1BvcnQpKSB8fAorICAgICAgICAoKENIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChwU0VDUG9ydCkgfHwgQ0hFQ0tfUE9SVF9CRUlOR19ESVNBQkxFRChwU0VDUG9ydCkpICYmCisgICAgICAgICghQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgfHwgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkpIHx8CisgICAgICAgICgocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSAmJgorICAgICAgICAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgIUNIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocEJ1ZmZlciA9PSBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldKSB7CisgICAgICAgICAgICBmaW5kQnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmaW5kQnVmZmVyID09IE9NWF9GQUxTRSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIG1lc3NhZ2UgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfTUVTU0FHRSkpOworICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIG1lc3NhZ2UtPm1lc3NhZ2VUeXBlID0gU0VDX09NWF9Db21tYW5kRW1wdHlCdWZmZXI7CisgICAgbWVzc2FnZS0+bWVzc2FnZVBhcmFtID0gKE9NWF9VMzIpIGk7CisgICAgbWVzc2FnZS0+cENtZERhdGEgPSAoT01YX1BUUilwQnVmZmVyOworCisgICAgU0VDX09TQUxfUXVldWUoJnBTRUNQb3J0LT5idWZmZXJRLCAodm9pZCAqKW1lc3NhZ2UpOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZpbGxUaGlzQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXIpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICBmaW5kQnVmZmVyID0gT01YX0ZBTFNFOworICAgIFNFQ19PTVhfTUVTU0FHRSAgICAgICAqbWVzc2FnZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocEJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocEJ1ZmZlci0+bk91dHB1dFBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBCdWZmZXIsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlUGF1c2UpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIGlmICgoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDUG9ydCkpIHx8CisgICAgICAgICgoQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHBTRUNQb3J0KSB8fCBDSEVDS19QT1JUX0JFSU5HX0RJU0FCTEVEKHBTRUNQb3J0KSkgJiYKKyAgICAgICAgKCFDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSB8fCAhQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSkgfHwKKyAgICAgICAgKChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9PSBTRUNfT01YX1RyYW5zU3RhdGVFeGVjdXRpbmdUb0lkbGUpICYmCisgICAgICAgIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiAhQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmIChwQnVmZmVyID09IHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0pIHsKKyAgICAgICAgICAgIGZpbmRCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZpbmRCdWZmZXIgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorCisgICAgbWVzc2FnZSA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9NRVNTQUdFKSk7CisgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgbWVzc2FnZS0+bWVzc2FnZVR5cGUgPSBTRUNfT01YX0NvbW1hbmRGaWxsQnVmZmVyOworICAgIG1lc3NhZ2UtPm1lc3NhZ2VQYXJhbSA9IChPTVhfVTMyKSBpOworICAgIG1lc3NhZ2UtPnBDbWREYXRhID0gKE9NWF9QVFIpcEJ1ZmZlcjsKKworICAgIFNFQ19PU0FMX1F1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSwgKHZvaWQgKiltZXNzYWdlKTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT5idWZmZXJTZW1JRCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ091dHB1dFBvcnQgPSBOVUxMOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0sIE9NWF9QT1JUX1BBUkFNX1RZUEUpOworICAgIHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMgPSBBTExfUE9SVF9OVU07CisgICAgcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5TdGFydFBvcnROdW1iZXIgPSBJTlBVVF9QT1JUX0lOREVYOworCisgICAgcFNFQ1BvcnQgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfQkFTRVBPUlQpICogQUxMX1BPUlRfTlVNKTsKKyAgICBpZiAocFNFQ1BvcnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydCwgMCwgc2l6ZW9mKFNFQ19PTVhfQkFTRVBPUlQpICogQUxMX1BPUlRfTlVNKTsKKyAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydCA9IHBTRUNQb3J0OworCisgICAgLyogSW5wdXQgUG9ydCAqLworICAgIHBTRUNJbnB1dFBvcnQgPSAmcFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBTRUNfT1NBTF9RdWV1ZUNyZWF0ZSgmcFNFQ0lucHV0UG9ydC0+YnVmZmVyUSk7CisKKyAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBNQVhfQlVGRkVSX05VTSk7CisgICAgaWYgKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKikgKiBNQVhfQlVGRkVSX05VTSk7CisKKyAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfVTMyKSAqIE1BWF9CVUZGRVJfTlVNKTsKKyAgICBpZiAocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSwgMCwgc2l6ZW9mKE9NWF9VMzIpICogTUFYX0JVRkZFUl9OVU0pOworCisgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU2VtSUQgPSBOVUxMOworICAgIHBTRUNJbnB1dFBvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID0gMDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0U3RhdGUgPSBPTVhfU3RhdGVNYXg7CisgICAgcFNFQ0lucHV0UG9ydC0+YklzUG9ydEZsdXNoZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0lucHV0UG9ydC0+YklzUG9ydERpc2FibGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNJbnB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50ID0gTlVMTDsKKyAgICBwU0VDSW5wdXRQb3J0LT50dW5uZWxlZFBvcnQgPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPnR1bm5lbEJ1ZmZlck51bSA9IDA7CisgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3VwcGxpZXIgPSBPTVhfQnVmZmVyU3VwcGx5VW5zcGVjaWZpZWQ7CisgICAgcFNFQ0lucHV0UG9ydC0+dHVubmVsRmxhZ3MgPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPmVDb250cm9sUmF0ZSA9IE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU7CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5idWZmZXJIZWFkZXIgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0KTsKKyAgICAgICAgcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbiwgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSk7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24ublBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZURpciA9IE9NWF9EaXJJbnB1dDsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IDA7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAwOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluTWF4OworICAgIHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKKyAgICBwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQWxpZ25tZW50ID0gMDsKKyAgICBwU0VDSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgcFNFQ0lucHV0UG9ydC0+bWFya1R5cGUucE1hcmtEYXRhID0gTlVMTDsKKyAgICBwU0VDSW5wdXRQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICBwU0VDSW5wdXRQb3J0LT5iU3RvcmVNZXRhRGF0YUluQnVmZmVyID0gT01YX0ZBTFNFOworCisgICAgLyogT3V0cHV0IFBvcnQgKi8KKyAgICBwU0VDT3V0cHV0UG9ydCA9ICZwU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBTRUNfT1NBTF9RdWV1ZUNyZWF0ZSgmcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclEpOworCisgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUqKSAqIE1BWF9CVUZGRVJfTlVNKTsKKyAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDSW5wdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyKTsKKyAgICAgICAgcFNFQ0lucHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydCk7CisgICAgICAgIHBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUqKSAqIE1BWF9CVUZGRVJfTlVNKTsKKworICAgIHBTRUNPdXRwdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfVTMyKSAqIE1BWF9CVUZGRVJfTlVNKTsKKyAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPnVubG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9CVUZGRVJfTlVNKTsKKworICAgIHBTRUNPdXRwdXRQb3J0LT5idWZmZXJTZW1JRCA9IE5VTEw7CisgICAgcFNFQ091dHB1dFBvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydFN0YXRlID0gT01YX1N0YXRlTWF4OworICAgIHBTRUNPdXRwdXRQb3J0LT5iSXNQb3J0Rmx1c2hlZCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDT3V0cHV0UG9ydC0+YklzUG9ydERpc2FibGVkID0gT01YX0ZBTFNFOworICAgIHBTRUNPdXRwdXRQb3J0LT50dW5uZWxlZENvbXBvbmVudCA9IE5VTEw7CisgICAgcFNFQ091dHB1dFBvcnQtPnR1bm5lbGVkUG9ydCA9IDA7CisgICAgcFNFQ091dHB1dFBvcnQtPnR1bm5lbEJ1ZmZlck51bSA9IDA7CisgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN1cHBsaWVyID0gT01YX0J1ZmZlclN1cHBseVVuc3BlY2lmaWVkOworICAgIHBTRUNPdXRwdXRQb3J0LT50dW5uZWxGbGFncyA9IDA7CisgICAgcFNFQ091dHB1dFBvcnQtPmVDb250cm9sUmF0ZSA9IE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU7CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDT3V0cHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNPdXRwdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPnVubG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcmV0ID0gU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCZwU0VDT3V0cHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwU0VDT3V0cHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNPdXRwdXRQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ091dHB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNPdXRwdXRQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDT3V0cHV0UG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+dW5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPnVubG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ0lucHV0UG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICBwU0VDSW5wdXRQb3J0LT5sb2FkZWRSZXNvdXJjZSA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0lucHV0UG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZSk7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlcik7CisgICAgICAgIHBTRUNJbnB1dFBvcnQtPmJ1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQpOworICAgICAgICBwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04oJnBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbiwgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSk7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5Qb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZURpciA9IE9NWF9EaXJPdXRwdXQ7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IDA7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IDA7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbk1heDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOworICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQWxpZ25tZW50ID0gMDsKKyAgICBwU0VDT3V0cHV0UG9ydC0+bWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBOVUxMOworICAgIHBTRUNPdXRwdXRQb3J0LT5tYXJrVHlwZS5wTWFya0RhdGEgPSBOVUxMOworICAgIHBTRUNPdXRwdXRQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICBwU0VDT3V0cHV0UG9ydC0+YlN0b3JlTWV0YURhdGFJbkJ1ZmZlciA9IE9NWF9GQUxTRTsKKworICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkQ2hlY2tTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5zdGFydFRpbWVTdGFtcCA9IDA7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAublN0YXJ0RmxhZ3MgPSAweDA7CisKKyAgICBwT01YQ29tcG9uZW50LT5FbXB0eVRoaXNCdWZmZXIgPSAmU0VDX09NWF9FbXB0eVRoaXNCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+RmlsbFRoaXNCdWZmZXIgID0gJlNFQ19PTVhfRmlsbFRoaXNCdWZmZXI7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1BvcnRfRGVzdHJ1Y3RvcihPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpbnQgaSA9IDA7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGZvciAoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtpXTsKKworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlID0gTlVMTDsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgcFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2UgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlKTsKKyAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGUgPSBOVUxMOworICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJIZWFkZXIpOworICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyID0gTlVMTDsKKworICAgICAgICBTRUNfT1NBTF9RdWV1ZVRlcm1pbmF0ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgIH0KKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0KTsKKyAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydCA9IE5VTEw7CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZXBvcnQuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9CYXNlcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0N2Y5NDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfQmFzZXBvcnQuaApAQCAtMCwwICsxLDk4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9CYXNlcG9ydC5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9CQVNFX1BPUlQKKyNkZWZpbmUgU0VDX09NWF9CQVNFX1BPUlQKKworCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKworCisjZGVmaW5lIEJVRkZFUl9TVEFURV9BTExPQ0FURUQgICgxIDw8IDApCisjZGVmaW5lIEJVRkZFUl9TVEFURV9BU1NJR05FRCAgICgxIDw8IDEpCisjZGVmaW5lIEhFQURFUl9TVEFURV9BTExPQ0FURUQgICgxIDw8IDIpCisjZGVmaW5lIEJVRkZFUl9TVEFURV9GUkVFICAgICAgICAwCisKKyNkZWZpbmUgTUFYX0JVRkZFUl9OVU0gICAgICAgICAgMjAKKworI2RlZmluZSBJTlBVVF9QT1JUX0lOREVYICAgIDAKKyNkZWZpbmUgT1VUUFVUX1BPUlRfSU5ERVggICAxCisjZGVmaW5lIEFMTF9QT1JUX0lOREVYICAgICAtMQorI2RlZmluZSBBTExfUE9SVF9OVU0gICAgICAgIDIKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQkFTRVBPUlQKK3sKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgICAgICAgICoqYnVmZmVySGVhZGVyOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXJTdGF0ZUFsbG9jYXRlOworICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICBwb3J0RGVmaW5pdGlvbjsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICAgICAgYnVmZmVyU2VtSUQ7CisgICAgU0VDX1FVRVVFICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclE7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkQnVmZmVyTnVtOworICAgIE9NWF9TVEFURVRZUEUgICAgICAgICAgICAgICAgICBwb3J0U3RhdGU7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgICAgIGxvYWRlZFJlc291cmNlOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgICB1bmxvYWRlZFJlc291cmNlOworCisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgICAgIGJJc1BvcnRGbHVzaGVkOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgICBiSXNQb3J0RGlzYWJsZWQ7CisgICAgT01YX01BUktUWVBFICAgICAgICAgICAgICAgICAgIG1hcmtUeXBlOworCisgICAgT01YX0NPTkZJR19SRUNUVFlQRSAgICAgICAgICAgIGNyb3BSZWN0YW5nbGU7CisKKyAgICAvKiBUdW5uZWwgSW5mbyAqLworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgICAgICB0dW5uZWxlZENvbXBvbmVudDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgdHVubmVsZWRQb3J0OworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICB0dW5uZWxCdWZmZXJOdW07CisgICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSAgICAgICAgIGJ1ZmZlclN1cHBsaWVyOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICB0dW5uZWxGbGFnczsKKworICAgIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgICAgICBlQ29udHJvbFJhdGU7CisKKyAgICAvKiBGb3IgQW5kcm9pZCBOYXRpdmUgQnVmZmVyICovCisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgICAgIGJVc2VBbmRyb2lkTmF0aXZlQnVmZmVyOworICAgIC8qIEZvciBBbmRyb2lkIFN0b3JlIE1ldGEgRGF0YSBpbkJ1ZmZlciAqLworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgICAgICBiU3RvcmVNZXRhRGF0YUluQnVmZmVyOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgICAgICBwSU1HR3JhbGxvY01vZHVsZTsKK30gU0VDX09NWF9CQVNFUE9SVDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RW5hYmxlUHJvY2VzcyhPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1MzMiBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Qb3J0RGlzYWJsZVByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQnVmZmVyRmx1c2hQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfUzMyIG5Qb3J0SW5kZXgpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlckZsdXNoUHJvY2Vzc05vRXZlbnQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9TMzIgblBvcnRJbmRleCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX1Jlc291cmNlbWFuYWdlci5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L2NvbW1vbi9TRUNfT01YX1Jlc291cmNlbWFuYWdlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNjczYWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmMKQEAgLTAsMCArMSwzODMgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT01YX1Jlc291cmNlbWFuYWdlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19STSIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCisjZGVmaW5lIE1BWF9SRVNPVVJDRV9WSURFTyA0CisKKy8qIE1heCBhbGxvd2FibGUgdmlkZW8gc2NoZWR1bGVyIGNvbXBvbmVudCBpbnN0YW5jZSAqLworc3RhdGljIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKmdwVmlkZW9STUNvbXBvbmVudExpc3QgPSBOVUxMOworc3RhdGljIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKmdwVmlkZW9STVdhaXRpbmdMaXN0ID0gTlVMTDsKK3N0YXRpYyBPTVhfSEFORExFVFlQRSBnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXggPSBOVUxMOworCisKK09NWF9FUlJPUlRZUEUgYWRkRWxlbWVudExpc3QoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqKnBwTGlzdCwgT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwVGVtcENvbXAgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAoKnBwTGlzdCAhPSBOVUxMKSB7CisgICAgICAgIHBUZW1wQ29tcCA9ICpwcExpc3Q7CisgICAgICAgIHdoaWxlIChwVGVtcENvbXAtPnBOZXh0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHBUZW1wQ29tcCA9IHBUZW1wQ29tcC0+cE5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcFRlbXBDb21wLT5wTmV4dCA9IChTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUKSk7CisgICAgICAgIGlmIChwVGVtcENvbXAtPnBOZXh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICAoKFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKikocFRlbXBDb21wLT5wTmV4dCkpLT5wTmV4dCA9IE5VTEw7CisgICAgICAgICgoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqKShwVGVtcENvbXAtPnBOZXh0KSktPnBPTVhTdGFuZENvbXAgPSBwT01YQ29tcG9uZW50OworICAgICAgICAoKFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKikocFRlbXBDb21wLT5wTmV4dCkpLT5ncm91cFByaW9yaXR5ID0gcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cFByaW9yaXR5OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnBwTGlzdCA9IChTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUKSk7CisgICAgICAgIGlmICgqcHBMaXN0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICBwVGVtcENvbXAgPSAqcHBMaXN0OworICAgICAgICBwVGVtcENvbXAtPnBOZXh0ID0gTlVMTDsKKyAgICAgICAgcFRlbXBDb21wLT5wT01YU3RhbmRDb21wID0gcE9NWENvbXBvbmVudDsKKyAgICAgICAgcFRlbXBDb21wLT5ncm91cFByaW9yaXR5ID0gcFNFQ0NvbXBvbmVudC0+Y29tcFByaW9yaXR5Lm5Hcm91cFByaW9yaXR5OworICAgIH0KKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIHJlbW92ZUVsZW1lbnRMaXN0KFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKipwcExpc3QsIE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcEN1cnJDb21wID0gTlVMTDsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwUHJldkNvbXAgPSBOVUxMOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgIGJEZXRlY3RDb21wID0gT01YX0ZBTFNFOworCisgICAgaWYgKCpwcExpc3QgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwQ3VyckNvbXAgPSAqcHBMaXN0OworICAgIHdoaWxlIChwQ3VyckNvbXAgIT0gTlVMTCkgeworICAgICAgICBpZiAocEN1cnJDb21wLT5wT01YU3RhbmRDb21wID09IHBPTVhDb21wb25lbnQpIHsKKyAgICAgICAgICAgIGlmICgqcHBMaXN0ID09IHBDdXJyQ29tcCkgeworICAgICAgICAgICAgICAgICpwcExpc3QgPSBwQ3VyckNvbXAtPnBOZXh0OworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocEN1cnJDb21wKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcFByZXZDb21wLT5wTmV4dCA9IHBDdXJyQ29tcC0+cE5leHQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwQ3VyckNvbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYkRldGVjdENvbXAgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFByZXZDb21wID0gcEN1cnJDb21wOworICAgICAgICAgICAgcEN1cnJDb21wID0gcEN1cnJDb21wLT5wTmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChiRGV0ZWN0Q29tcCA9PSBPTVhfRkFMU0UpCisgICAgICAgIHJldCA9IE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kOworICAgIGVsc2UKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitpbnQgc2VhcmNoTG93UHJpb3JpdHkoU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqUk1Db21wX2xpc3QsIGludCBpbkNvbXBfcHJpb3JpdHksIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKipvdXRMb3dDb21wKQoreworICAgIGludCByZXQgPSAwOworICAgIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKnBUZW1wQ29tcCA9IE5VTEw7CisgICAgU0VDX09NWF9STV9DT01QT05FTlRfTElTVCAqcENhbmRpZGF0ZUNvbXAgPSBOVUxMOworCisgICAgaWYgKFJNQ29tcF9saXN0ID09IE5VTEwpCisgICAgICAgIHJldCA9IC0xOworCisgICAgcFRlbXBDb21wID0gUk1Db21wX2xpc3Q7CisgICAgKm91dExvd0NvbXAgPSAwOworCisgICAgd2hpbGUgKHBUZW1wQ29tcCAhPSBOVUxMKSB7CisgICAgICAgIGlmIChwVGVtcENvbXAtPmdyb3VwUHJpb3JpdHkgPiBpbkNvbXBfcHJpb3JpdHkpIHsKKyAgICAgICAgICAgIGlmIChwQ2FuZGlkYXRlQ29tcCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHBDYW5kaWRhdGVDb21wLT5ncm91cFByaW9yaXR5IDwgcFRlbXBDb21wLT5ncm91cFByaW9yaXR5KQorICAgICAgICAgICAgICAgICAgICBwQ2FuZGlkYXRlQ29tcCA9IHBUZW1wQ29tcDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcENhbmRpZGF0ZUNvbXAgPSBwVGVtcENvbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwVGVtcENvbXAgPSBwVGVtcENvbXAtPnBOZXh0OworICAgIH0KKworICAgICpvdXRMb3dDb21wID0gcENhbmRpZGF0ZUNvbXA7CisgICAgaWYgKHBDYW5kaWRhdGVDb21wID09IE5VTEwpCisgICAgICAgIHJldCA9IDA7CisgICAgZWxzZQorICAgICAgICByZXQgPSAxOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgcmVtb3ZlQ29tcG9uZW50KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgIChwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICBPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yUmVzb3VyY2VzTG9zdCwgMCwgTlVMTCk7CisgICAgICAgIHJldCA9IE9NWF9TZW5kQ29tbWFuZChwT01YQ29tcG9uZW50LCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVMb2FkZWQsIE5VTEwpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpIHx8IChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpKSB7CisgICAgICAgIC8qIFRvZG8gKi8KKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9Jbml0KCkKK3sKKyAgICBGdW5jdGlvbkluKCk7CisgICAgU0VDX09TQUxfTXV0ZXhDcmVhdGUoJmdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9EZWluaXQoKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwQ3VyckNvbXBvbmVudDsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwTmV4dENvbXBvbmVudDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgaWYgKGdwVmlkZW9STUNvbXBvbmVudExpc3QpIHsKKyAgICAgICAgcEN1cnJDb21wb25lbnQgPSBncFZpZGVvUk1Db21wb25lbnRMaXN0OworICAgICAgICB3aGlsZSAocEN1cnJDb21wb25lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgcE5leHRDb21wb25lbnQgPSBwQ3VyckNvbXBvbmVudC0+cE5leHQ7CisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBDdXJyQ29tcG9uZW50KTsKKyAgICAgICAgICAgIHBDdXJyQ29tcG9uZW50ID0gcE5leHRDb21wb25lbnQ7CisgICAgICAgIH0KKyAgICAgICAgZ3BWaWRlb1JNQ29tcG9uZW50TGlzdCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKGdwVmlkZW9STVdhaXRpbmdMaXN0KSB7CisgICAgICAgIHBDdXJyQ29tcG9uZW50ID0gZ3BWaWRlb1JNV2FpdGluZ0xpc3Q7CisgICAgICAgIHdoaWxlIChwQ3VyckNvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwTmV4dENvbXBvbmVudCA9IHBDdXJyQ29tcG9uZW50LT5wTmV4dDsKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocEN1cnJDb21wb25lbnQpOworICAgICAgICAgICAgcEN1cnJDb21wb25lbnQgPSBwTmV4dENvbXBvbmVudDsKKyAgICAgICAgfQorICAgICAgICBncFZpZGVvUk1XYWl0aW5nTGlzdCA9IE5VTEw7CisgICAgfQorICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworICAgIGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCA9IE5VTEw7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0dldF9SZXNvdXJjZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfUk1fQ09NUE9ORU5UX0xJU1QgKnBDb21wb25lbnRUZW1wID0gTlVMTDsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwQ29tcG9uZW50Q2FuZGlkYXRlID0gTlVMTDsKKyAgICBpbnQgbnVtRWxlbSA9IDA7CisgICAgaW50IGxvd0NvbXBEZXRlY3QgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBDb21wb25lbnRUZW1wID0gZ3BWaWRlb1JNQ29tcG9uZW50TGlzdDsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0NPREVDKSB7CisgICAgICAgIGlmIChwQ29tcG9uZW50VGVtcCAhPSBOVUxMKSB7CisgICAgICAgICAgICB3aGlsZSAocENvbXBvbmVudFRlbXApIHsKKyAgICAgICAgICAgICAgICBudW1FbGVtKys7CisgICAgICAgICAgICAgICAgcENvbXBvbmVudFRlbXAgPSBwQ29tcG9uZW50VGVtcC0+cE5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBudW1FbGVtID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVtRWxlbSA+PSBNQVhfUkVTT1VSQ0VfVklERU8pIHsKKyAgICAgICAgICAgIGxvd0NvbXBEZXRlY3QgPSBzZWFyY2hMb3dQcmlvcml0eShncFZpZGVvUk1Db21wb25lbnRMaXN0LCBwU0VDQ29tcG9uZW50LT5jb21wUHJpb3JpdHkubkdyb3VwUHJpb3JpdHksICZwQ29tcG9uZW50Q2FuZGlkYXRlKTsKKyAgICAgICAgICAgIGlmIChsb3dDb21wRGV0ZWN0IDw9IDApIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXQgPSByZW1vdmVDb21wb25lbnQocENvbXBvbmVudENhbmRpZGF0ZS0+cE9NWFN0YW5kQ29tcCk7CisgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHJlbW92ZUVsZW1lbnRMaXN0KCZncFZpZGVvUk1Db21wb25lbnRMaXN0LCBwQ29tcG9uZW50Q2FuZGlkYXRlLT5wT01YU3RhbmRDb21wKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gYWRkRWxlbWVudExpc3QoJmdwVmlkZW9STUNvbXBvbmVudExpc3QsIHBPTVhDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IGFkZEVsZW1lbnRMaXN0KCZncFZpZGVvUk1Db21wb25lbnRMaXN0LCBwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1JlbGVhc2VfUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwQ29tcG9uZW50VGVtcCA9IE5VTEw7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICAqcE9NWFdhaXRDb21wb25lbnQgPSBOVUxMOworICAgIGludCBudW1FbGVtID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwQ29tcG9uZW50VGVtcCA9IGdwVmlkZW9STVdhaXRpbmdMaXN0OworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPT0gSFdfVklERU9fQ09ERUMpIHsKKyAgICAgICAgaWYgKGdwVmlkZW9STUNvbXBvbmVudExpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gcmVtb3ZlRWxlbWVudExpc3QoJmdwVmlkZW9STUNvbXBvbmVudExpc3QsIHBPTVhDb21wb25lbnQpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAocENvbXBvbmVudFRlbXApIHsKKyAgICAgICAgICAgIG51bUVsZW0rKzsKKyAgICAgICAgICAgIHBDb21wb25lbnRUZW1wID0gcENvbXBvbmVudFRlbXAtPnBOZXh0OworICAgICAgICB9CisgICAgICAgIGlmIChudW1FbGVtID4gMCkgeworICAgICAgICAgICAgcE9NWFdhaXRDb21wb25lbnQgPSBncFZpZGVvUk1XYWl0aW5nTGlzdC0+cE9NWFN0YW5kQ29tcDsKKyAgICAgICAgICAgIHJlbW92ZUVsZW1lbnRMaXN0KCZncFZpZGVvUk1XYWl0aW5nTGlzdCwgcE9NWFdhaXRDb21wb25lbnQpOworICAgICAgICAgICAgcmV0ID0gT01YX1NlbmRDb21tYW5kKHBPTVhXYWl0Q29tcG9uZW50LCBPTVhfQ29tbWFuZFN0YXRlU2V0LCBPTVhfU3RhdGVJZGxlLCBOVUxMKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGdoVmlkZW9STUNvbXBvbmVudExpc3RNdXRleCk7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0luX1dhaXRGb3JSZXNvdXJjZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0NPREVDKQorICAgICAgICByZXQgPSBhZGRFbGVtZW50TGlzdCgmZ3BWaWRlb1JNV2FpdGluZ0xpc3QsIHBPTVhDb21wb25lbnQpOworCisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfT3V0X1dhaXRGb3JSZXNvdXJjZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhnaFZpZGVvUk1Db21wb25lbnRMaXN0TXV0ZXgpOworCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID09IEhXX1ZJREVPX0NPREVDKQorICAgICAgICByZXQgPSByZW1vdmVFbGVtZW50TGlzdCgmZ3BWaWRlb1JNV2FpdGluZ0xpc3QsIHBPTVhDb21wb25lbnQpOworCisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZ2hWaWRlb1JNQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvY29tbW9uL1NFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1ODU3NQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC9jb21tb24vU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9SZXNvdXJjZW1hbmFnZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1JFU09VUkNFTUFOQUdFUgorI2RlZmluZSBTRUNfT01YX1JFU09VUkNFTUFOQUdFUgorCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKworCitzdHJ1Y3QgU0VDX09NWF9STV9DT01QT05FTlRfTElTVDsKK3R5cGVkZWYgc3RydWN0IF9TRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUCit7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICAqcE9NWFN0YW5kQ29tcDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBncm91cFByaW9yaXR5OworICAgIHN0cnVjdCBTRUNfT01YX1JNX0NPTVBPTkVOVF9MSVNUICpwTmV4dDsKK30gU0VDX09NWF9STV9DT01QT05FTlRfTElTVDsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9SZXNvdXJjZU1hbmFnZXJfSW5pdCgpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1Jlc291cmNlTWFuYWdlcl9EZWluaXQoKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRfUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1JlbGVhc2VfUmVzb3VyY2UoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0luX1dhaXRGb3JSZXNvdXJjZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfT3V0X1dhaXRGb3JSZXNvdXJjZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzJjNDc3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfVmRlYy5jCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJTRUNfT01YX1ZkZWMKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL3NlY19vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb214X2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZGVjCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChTRUNfT01YX1RPUCkvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9pbmNsdWRlCisKK2luY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL1NFQ19PTVhfVmRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYTFhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL1NFQ19PTVhfVmRlYy5jCkBAIC0wLDAgKzEsMTM4OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX1ZkZWMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIlNFQ19PTVhfTWFjcm9zLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRXZlbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX1ZkZWMuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9UaHJlYWQuaCIKKyNpbmNsdWRlICJjb2xvcl9zcGFjZV9jb252ZXJ0b3IuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX1ZJREVPX0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCitpbmxpbmUgdm9pZCBTRUNfVXBkYXRlRnJhbWVTaXplKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgaWYgKChzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoKSB8fAorICAgICAgICAoc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KSkgeworICAgICAgICBPTVhfVTMyIHdpZHRoID0gMCwgaGVpZ2h0ID0gMDsKKworICAgICAgICBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICB3aWR0aCA9IHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGU7CisgICAgICAgIGhlaWdodCA9IHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPQorICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0OworCisgICAgICAgIHN3aXRjaChzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0KQorICAgICAgICAgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0KQorICAgICAgICAgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gd2lkdGggKiBoZWlnaHQgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1VzZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcywKKyAgICBPTVhfSU4gT01YX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W25Qb3J0SW5kZXhdOworICAgIGlmIChuUG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHRlbXBfYnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworICAgIGlmICh0ZW1wX2J1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQodGVtcF9idWZmZXJIZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPT0gQlVGRkVSX1NUQVRFX0ZSRUUpIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gKEJVRkZFUl9TVEFURV9BU1NJR05FRCB8IEhFQURFUl9TVEFURV9BTExPQ0FURUQpOworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKHRlbXBfYnVmZmVySGVhZGVyLCBPTVhfQlVGRkVSSEVBREVSVFlQRSk7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEJ1ZmZlciAgICAgICAgPSBwQnVmZmVyOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5BbGxvY0xlbiAgICAgID0gblNpemVCeXRlczsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5wQXBwUHJpdmF0ZSAgICA9IHBBcHBQcml2YXRlOworICAgICAgICAgICAgaWYgKCBuUG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5JbnB1dFBvcnRJbmRleCA9IElOUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5PdXRwdXRQb3J0SW5kZXggPSBPVVRQVVRfUE9SVF9JTkRFWDsKKworICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKys7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBwQnVmZmVySGRyID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlckhlYWRlcik7CisgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVCdWZmZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgaENvbXBvbmVudCwKKyAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUgKipwcEJ1ZmZlciwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICAgICAgICAgICAgIHBBcHBQcml2YXRlLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5TaXplQnl0ZXMpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisgICAgaWYgKG5Qb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisvKgorICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUgKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorKi8KKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHRlbXBfYnVmZmVyID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfVTgpICogblNpemVCeXRlcyk7CisgICAgaWYgKHRlbXBfYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgdGVtcF9idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHRlbXBfYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlcik7CisgICAgICAgIHRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldCh0ZW1wX2J1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9PSBCVUZGRVJfU1RBVEVfRlJFRSkgeworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSAoQlVGRkVSX1NUQVRFX0FMTE9DQVRFRCB8IEhFQURFUl9TVEFURV9BTExPQ0FURUQpOworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKHRlbXBfYnVmZmVySGVhZGVyLCBPTVhfQlVGRkVSSEVBREVSVFlQRSk7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEJ1ZmZlciAgICAgICAgPSB0ZW1wX2J1ZmZlcjsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uQWxsb2NMZW4gICAgICA9IG5TaXplQnl0ZXM7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEFwcFByaXZhdGUgICAgPSBwQXBwUHJpdmF0ZTsKKyAgICAgICAgICAgIGlmICggblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uSW5wdXRQb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uT3V0cHV0UG9ydEluZGV4ID0gT1VUUFVUX1BPUlRfSU5ERVg7CisgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0rKzsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCkgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcHBCdWZmZXIgPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVySGVhZGVyKTsKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVyKTsKKyAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlckhkcikKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAqdGVtcF9idWZmZXIgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmICgocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUludmFsaWQpKSB7CisgICAgICAgICgqKHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcikpIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpT01YX0V2ZW50RXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBuUG9ydEluZGV4LCBOVUxMKTsKKyAgICB9CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmICgoKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldIHwgQlVGRkVSX1NUQVRFX0ZSRUUpICE9IDApICYmIChwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldICE9IE5VTEwpKSB7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlciA9PSBwQnVmZmVySGRyLT5wQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgQlVGRkVSX1NUQVRFX0FMTE9DQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0tPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlckhkci0+cEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSAmIEJVRkZFUl9TVEFURV9BU1NJR05FRCkgeworICAgICAgICAgICAgICAgICAgICA7IC8qIE5vbmUqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0tLTsKKyAgICAgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gJiBIRUFERVJfU1RBVEVfQUxMT0NBVEVEKSB7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSk7CisgICAgICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBwQnVmZmVySGRyID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSBCVUZGRVJfU1RBVEVfRlJFRTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBpZiAocmV0ID09IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgaWYgKCBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gMCApIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2Ugc2lnbmFsIHNldCIpOworICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXIoU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LCBPTVhfVTMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAgICAgICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICBwb3J0RGVmaW5pdGlvbjsKKworICAgIHJldCA9IE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkOworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcihTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCogcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiB0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiBidWZmZXJTaXplID0gMDsKKworICAgIHJldCA9IE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkOworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VHVubmVsUmVxdWVzdCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5Qb3J0LAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoVHVubmVsZWRDb21wLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBuVHVubmVsZWRQb3J0LAorICAgIE9NWF9JTk9VVCBPTVhfVFVOTkVMU0VUVVBUWVBFICpwVHVubmVsU2V0dXApCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgcmV0ID0gT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9CT09MIFNFQ19DaGVja19CdWZmZXJQcm9jZXNzX1N0YXRlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVFeGVjdXRpbmcpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXS5wb3J0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlICE9IFNFQ19PTVhfVHJhbnNTdGF0ZUV4ZWN1dGluZ1RvSWRsZSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlICE9IFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0V4ZWN1dGluZykpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgfQorfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfSW5wdXRCdWZmZXJSZXR1cm4oT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY09NWElucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY09NWE91dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGJ1ZmZlckhlYWRlciAhPSBOVUxMKSB7CisgICAgICAgIGlmIChzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50ICAgICAgPSBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50OworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5wTWFya0RhdGEgICAgICAgICAgICAgICAgID0gc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5wTWFya0RhdGE7CisgICAgICAgICAgICBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgICAgIHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUucE1hcmtEYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXJIZWFkZXItPmhNYXJrVGFyZ2V0Q29tcG9uZW50ID09IHBPTVhDb21wb25lbnQpIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRNYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBidWZmZXJIZWFkZXItPnBNYXJrRGF0YSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ID0gYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5wTWFya0RhdGEgPSBidWZmZXJIZWFkZXItPnBNYXJrRGF0YTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHNlY09NWElucHV0UG9ydCkpIHsKKyAgICAgICAgICAgIE9NWF9GaWxsVGhpc0J1ZmZlcihzZWNPTVhJbnB1dFBvcnQtPnR1bm5lbGVkQ29tcG9uZW50LCBidWZmZXJIZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gMDsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkVtcHR5QnVmZmVyRG9uZShwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgJiYKKyAgICAgICAgKCghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY09NWElucHV0UG9ydCkgJiYgIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhPdXRwdXRQb3J0KSkpKSB7CisgICAgICAgIFNFQ19PU0FMX1NpZ25hbFJlc2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICB9CisKKyAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgICAgID0gT01YX0ZBTFNFOworICAgIGRhdGFCdWZmZXItPmRhdGFMZW4gICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSAwOworICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuICAgPSAwOworICAgIGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlciAgPSBOVUxMOworICAgIGRhdGFCdWZmZXItPm5GbGFncyAgICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnRpbWVTdGFtcCAgICAgPSAwOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19JbnB1dEJ1ZmZlckdldFF1ZXVlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICpkYXRhQnVmZmVyID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UqICAgIG1lc3NhZ2UgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqaW5wdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0PSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVFeGVjdXRpbmcpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwU0VDUG9ydC0+YnVmZmVyU2VtSUQpOworICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgaWYgKGRhdGFCdWZmZXItPmRhdGFWYWxpZCAhPSBPTVhfVFJVRSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IChTRUNfT01YX01FU1NBR0UgKilTRUNfT1NBTF9EZXF1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikobWVzc2FnZS0+cENtZERhdGEpOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhTGVuID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IGRhdGFCdWZmZXItPmRhdGFMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPm5GbGFncyA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZsYWdzOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworCisgICAgICAgICAgICBpZiAoZGF0YUJ1ZmZlci0+YWxsb2NTaXplIDw9IGRhdGFCdWZmZXItPmRhdGFMZW4pCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfV0FSTklORywgIklucHV0IEJ1ZmZlciBGdWxsLCBDaGVjayBpbnB1dCBidWZmZXIgc2l6ZSEgYWxsb2NTaXplOiVkLCBkYXRhTGVuOiVkIiwgZGF0YUJ1ZmZlci0+YWxsb2NTaXplLCBkYXRhQnVmZmVyLT5kYXRhTGVuKTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19PdXRwdXRCdWZmZXJSZXR1cm4oT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY09NWElucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY09NWE91dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChidWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBidWZmZXJIZWFkZXItPm5GaWxsZWRMZW4gPSBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuOworICAgICAgICBidWZmZXJIZWFkZXItPm5PZmZzZXQgICAgPSAwOworICAgICAgICBidWZmZXJIZWFkZXItPm5GbGFncyAgICAgPSBkYXRhQnVmZmVyLT5uRmxhZ3M7CisgICAgICAgIGJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcCA9IGRhdGFCdWZmZXItPnRpbWVTdGFtcDsKKworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCA9IHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50OworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5wTWFya0RhdGEgPSBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5wTWFya0RhdGE7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5wTWFya0RhdGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ1ZmZlckhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50QnVmZmVyRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPVVRQVVRfUE9SVF9JTkRFWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJIZWFkZXItPm5GbGFncywgTlVMTCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChzZWNPTVhPdXRwdXRQb3J0KSkgeworICAgICAgICAgICAgT01YX0VtcHR5VGhpc0J1ZmZlcihzZWNPTVhPdXRwdXRQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkZpbGxCdWZmZXJEb25lKHBPTVhDb21wb25lbnQsIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSAmJgorICAgICAgICAoKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YSW5wdXRQb3J0KSAmJiAhQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY09NWE91dHB1dFBvcnQpKSkpIHsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgICAgIFNFQ19PU0FMX1NpZ25hbFdhaXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCwgREVGX01BWF9XQUlUX1RJTUUpOworICAgIH0KKworICAgIC8qIHJlc2V0IGRhdGFCdWZmZXIgKi8KKyAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgICAgID0gT01YX0ZBTFNFOworICAgIGRhdGFCdWZmZXItPmRhdGFMZW4gICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSAwOworICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuICAgPSAwOworICAgIGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlciAgPSBOVUxMOworICAgIGRhdGFCdWZmZXItPm5GbGFncyAgICAgICAgPSAwOworICAgIGRhdGFCdWZmZXItPnRpbWVTdGFtcCAgICAgPSAwOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PdXRwdXRCdWZmZXJHZXRRdWV1ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFICAgICptZXNzYWdlID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKm91dHB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBTRUNQb3J0PSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIGRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUV4ZWN1dGluZykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBTRUNQb3J0LT5idWZmZXJTZW1JRCk7CisgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgaWYgKGRhdGFCdWZmZXItPmRhdGFWYWxpZCAhPSBPTVhfVFJVRSkgeworICAgICAgICAgICAgbWVzc2FnZSA9IChTRUNfT01YX01FU1NBR0UgKilTRUNfT1NBTF9EZXF1ZXVlKCZwU0VDUG9ydC0+YnVmZmVyUSk7CisgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKG1lc3NhZ2UtPnBDbWREYXRhKTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmFsbG9jU2l6ZSA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiA9IDA7IC8vZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IGRhdGFCdWZmZXItPmRhdGFMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiA9IDA7IC8vZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uT2Zmc2V0OworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkID1PTVhfVFJVRTsKKyAgICAgICAgICAgIC8qIGRhdGFCdWZmZXItPm5GbGFncyA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZsYWdzOyAqLworICAgICAgICAgICAgLyogZGF0YUJ1ZmZlci0+blRpbWVTdGFtcCA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+blRpbWVTdGFtcDsgKi8KKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbT1VUUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworCisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX0J1ZmZlclJlc2V0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfVTMyIHBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIC8qIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsgKi8KKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOworICAgIC8qIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOyAqLworCisgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICAgICA9IE9NWF9GQUxTRTsKKyAgICBkYXRhQnVmZmVyLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgID0gTlVMTDsKKyAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgICAgID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19EYXRhUmVzZXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIE9NWF9VMzIgcG9ydEluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgLyogU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOyAqLworICAgIC8qIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW3BvcnRJbmRleF07ICovCisgICAgLyogT01YX0JVRkZFUkhFQURFUlRZUEUgICpidWZmZXJIZWFkZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXI7ICovCisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpwcm9jZXNzRGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtwb3J0SW5kZXhdOworCisgICAgcHJvY2Vzc0RhdGEtPmRhdGFMZW4gICAgICAgPSAwOworICAgIHByb2Nlc3NEYXRhLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPm5GbGFncyAgICAgICAgPSAwOworICAgIHByb2Nlc3NEYXRhLT50aW1lU3RhbXAgICAgID0gMDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9CT09MIFNFQ19QcmVwcm9jZXNzb3JfSW5wdXREYXRhKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICppbnB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjb3B5U2l6ZSA9IDA7CisgICAgT01YX0JZVEUgICAgICAgICAgICAgICBjaGVja0lucHV0U3RyZWFtID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNoZWNrSW5wdXRTdHJlYW1MZW4gPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY2hlY2tlZFNpemUgPSAwOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHByZXZpb3VzRnJhbWVFT0YgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaW5wdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9PSBPTVhfVFJVRSkgeworICAgICAgICBjaGVja0lucHV0U3RyZWFtID0gaW5wdXRVc2VCdWZmZXItPmJ1ZmZlckhlYWRlci0+cEJ1ZmZlciArIGlucHV0VXNlQnVmZmVyLT51c2VkRGF0YUxlbjsKKyAgICAgICAgY2hlY2tJbnB1dFN0cmVhbUxlbiA9IGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuOworCisgICAgICAgIGlmIChpbnB1dERhdGEtPmRhdGFMZW4gPT0gMCkgeworICAgICAgICAgICAgcHJldmlvdXNGcmFtZUVPRiA9IE9NWF9UUlVFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJldmlvdXNGcmFtZUVPRiA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAhKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRykpIHsKKyAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIGNoZWNrZWRTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX0ZBTFNFOworICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBwU0VDQ29tcG9uZW50LT5zZWNfY2hlY2tJbnB1dEZyYW1lKGNoZWNrSW5wdXRTdHJlYW0sIGNoZWNrSW5wdXRTdHJlYW1MZW4sIGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MsIHByZXZpb3VzRnJhbWVFT0YsICZmbGFnRU9GKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBjb3B5U2l6ZSA9IGNoZWNrZWRTaXplOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJzZWNfY2hlY2tJbnB1dEZyYW1lIDogT01YX1RSVUUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbjsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic2VjX2NoZWNrSW5wdXRGcmFtZSA6IE9NWF9GQUxTRSIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfVFJVRTsKKworICAgICAgICBpZiAoKChpbnB1dERhdGEtPmFsbG9jU2l6ZSkgLSAoaW5wdXREYXRhLT5kYXRhTGVuKSkgPj0gY29weVNpemUpIHsKKyAgICAgICAgICAgIGlmIChjb3B5U2l6ZSA+IDApCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KGlucHV0RGF0YS0+ZGF0YUJ1ZmZlciArIGlucHV0RGF0YS0+ZGF0YUxlbiwgY2hlY2tJbnB1dFN0cmVhbSwgY29weVNpemUpOworCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YUxlbiAtPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuIC09IGNvcHlTaXplOworICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPnVzZWREYXRhTGVuICs9IGNvcHlTaXplOworCisgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBpbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisKKyAgICAgICAgICAgIGlmIChwcmV2aW91c0ZyYW1lRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaW5wdXREYXRhLT50aW1lU3RhbXAgPSBpbnB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wOworICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gaW5wdXRVc2VCdWZmZXItPm5GbGFnczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gKGlucHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgoY2hlY2tlZFNpemUgPT0gY2hlY2tJbnB1dFN0cmVhbUxlbikgJiYgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKChpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGlucHV0RGF0YS0+ZGF0YUxlbiA9PSAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaW5wdXRVc2VCdWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIShpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5wdXREYXRhLT5kYXRhTGVuICE9IDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dERhdGEtPm5GbGFncyA9IChpbnB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzID0gKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoKChpbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSAmJgorICAgICAgICAgICAgICAgKGlucHV0RGF0YS0+ZGF0YUxlbiA8PSAwKSAmJiAoZmxhZ0VPRiA9PSBPTVhfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPmRhdGFMZW4gPSBpbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbjsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBpbnB1dERhdGEtPnByZXZpb3VzRGF0YUxlbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/IEVycm9yID8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/PyovCisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIElOUFVUX1BPUlRfSU5ERVgpOworICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9PSAwKQorICAgICAgICAgICAgU0VDX0lucHV0QnVmZmVyUmV0dXJuKHBPTVhDb21wb25lbnQpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID0gT01YX1RSVUU7CisgICAgfQorCisgICAgaWYgKGZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLnN0YXJ0VGltZVN0YW1wID0gaW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uU3RhcnRGbGFncyA9IGlucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZFNldFN0YXJ0VGltZVN0YW1wID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gT01YX1RSVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworICAgIH0KKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfUG9zdHByb2Nlc3NfT3V0cHV0RGF0YShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpvdXRwdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChvdXRwdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9PSBPTVhfVFJVRSkgeworICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPT0gb3V0cHV0RGF0YS0+dGltZVN0YW1wKSAmJgorICAgICAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uU3RhcnRGbGFncyA9PSBvdXRwdXREYXRhLT5uRmxhZ3MpKXsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5zdGFydFRpbWVTdGFtcCA9IC0xOTc2MTEyMzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uU3RhcnRGbGFncyA9IDB4MDsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19EYXRhUmVzZXQocE9NWENvbXBvbmVudCwgT1VUUFVUX1BPUlRfSU5ERVgpOworCisgICAgICAgICAgICAgICAgcmV0ID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPD0gKG91dHB1dFVzZUJ1ZmZlci0+YWxsb2NTaXplIC0gb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSkgeworICAgICAgICAgICAgY29weVNpemUgPSBvdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuOworICAgICAgICAgICAgb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuICs9IGNvcHlTaXplOworICAgICAgICAgICAgb3V0cHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuICs9IGNvcHlTaXplOworICAgICAgICAgICAgb3V0cHV0VXNlQnVmZmVyLT5uRmxhZ3MgPSBvdXRwdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnRpbWVTdGFtcCA9IG91dHB1dERhdGEtPnRpbWVTdGFtcDsKKworICAgICAgICAgICAgcmV0ID0gT01YX1RSVUU7CisKKyAgICAgICAgICAgIC8qIHJlc2V0IG91dHB1dERhdGEgKi8KKyAgICAgICAgICAgIFNFQ19EYXRhUmVzZXQocE9NWENvbXBvbmVudCwgT1VUUFVUX1BPUlRfSU5ERVgpOworCisgICAgICAgICAgICBpZiAoKG91dHB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA+IDApIHx8CisgICAgICAgICAgICAgICAgKG91dHB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkKKyAgICAgICAgICAgICAgICBTRUNfT3V0cHV0QnVmZmVyUmV0dXJuKHBPTVhDb21wb25lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJvdXRwdXQgYnVmZmVyIGlzIHNtYWxsZXIgdGhhbiBkZWNvZGVkIGRhdGEgc2l6ZSBPdXQgTGVuZ3RoIik7CisKKyAgICAgICAgICAgIGNvcHlTaXplID0gb3V0cHV0VXNlQnVmZmVyLT5hbGxvY1NpemUgLSBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW47CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPmRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gKz0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPm5GbGFncyA9IDA7CisgICAgICAgICAgICBvdXRwdXRVc2VCdWZmZXItPnRpbWVTdGFtcCA9IG91dHB1dERhdGEtPnRpbWVTdGFtcDsKKworICAgICAgICAgICAgcmV0ID0gT01YX0ZBTFNFOworCisgICAgICAgICAgICBvdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuIC09IGNvcHlTaXplOworICAgICAgICAgICAgb3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gKz0gY29weVNpemU7CisKKyAgICAgICAgICAgIFNFQ19PdXRwdXRCdWZmZXJSZXR1cm4ocE9NWENvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQnVmZmVyUHJvY2VzcyhPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnNlY091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqaW5wdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKm91dHB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEEgICAgICAgICAgKmlucHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEEgICAgICAgICAgKm91dHB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY29weVNpemUgPSAwOworCisgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHdoaWxlICghcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkKSB7CisgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgaWYgKCgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZVBhdXNlKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlID09IFNFQ19PTVhfVHJhbnNTdGF0ZUxvYWRlZFRvSWRsZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9PSBTRUNfT01YX1RyYW5zU3RhdGVFeGVjdXRpbmdUb0lkbGUpKSAmJgorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPnRyYW5zaWVudFN0YXRlICE9IFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0xvYWRlZCkmJgorICAgICAgICAgICAgKCghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY0lucHV0UG9ydCkgJiYgIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPdXRwdXRQb3J0KSkpKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxSZXNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NpZ25hbFdhaXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCwgREVGX01BWF9XQUlUX1RJTUUpOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKFNFQ19DaGVja19CdWZmZXJQcm9jZXNzX1N0YXRlKHBTRUNDb21wb25lbnQpICYmICFwU0VDQ29tcG9uZW50LT5iRXhpdEJ1ZmZlclByb2Nlc3NUaHJlYWQpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoMCk7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgIGlmICgob3V0cHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAgICAgKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT3V0cHV0UG9ydCkpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgcmV0ID0gU0VDX091dHB1dEJ1ZmZlckdldFF1ZXVlKHBTRUNDb21wb25lbnQpOworICAgICAgICAgICAgICAgIGlmICgocmV0ID09IE9NWF9FcnJvclVuZGVmaW5lZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgKHNlY0lucHV0UG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHx8CisgICAgICAgICAgICAgICAgICAgIChzZWNPdXRwdXRQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnJlSW5wdXREYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChTRUNfUHJlcHJvY2Vzc29yX0lucHV0RGF0YShwT01YQ29tcG9uZW50KSA9PSBPTVhfRkFMU0UpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNJbnB1dFBvcnQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gU0VDX0lucHV0QnVmZmVyR2V0UXVldWUocFNFQ0NvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgcmV0ID0gcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzKHBPTVhDb21wb25lbnQsIGlucHV0RGF0YSwgb3V0cHV0RGF0YSk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KQorICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICAgICAgaWYgKFNFQ19Qb3N0cHJvY2Vzc19PdXRwdXREYXRhKHBPTVhDb21wb25lbnQpID09IE9NWF9GQUxTRSkKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID0gT01YX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKworICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZUdldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIHsKKyAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydFBhcmFtLCBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnRQYXJhbS0+blBvcnRzICAgICAgICAgICA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7CisgICAgICAgIHBvcnRQYXJhbS0+blN0YXJ0UG9ydE51bWJlciA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uU3RhcnRQb3J0TnVtYmVyOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZvcm1hdCA9IChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydEZvcm1hdC0+blBvcnRJbmRleDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAgICA9IHBvcnRGb3JtYXQtPm5JbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICAqcG9ydERlZmluaXRpb24gPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSAwOyAvKiBzdXBwb3J0Rm9ybWF0TnVtID0gTi0xICovCisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0Rm9ybWF0LCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gSU5QVVRfUE9SVF9TVVBQT1JURk9STUFUX05VTV9NQVggLSAxOworICAgICAgICAgICAgaWYgKGluZGV4ID4gc3VwcG9ydEZvcm1hdE51bSkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0OworICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgIH0gZWxzZSBpZiAocG9ydEluZGV4ID09IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHN3aXRjaCAoaW5kZXgpIHsKKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8wOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjsvL09NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzE6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsvL09NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzI6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICAqdmlkZW9SYXRlQ29udHJvbCA9IChPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHZpZGVvUmF0ZUNvbnRyb2wtPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHZpZGVvUmF0ZUNvbnRyb2wtPmVDb250cm9sUmF0ZSA9IHBTRUNQb3J0LT5lQ29udHJvbFJhdGU7CisgICAgICAgICAgICB2aWRlb1JhdGVDb250cm9sLT5uVGFyZ2V0Qml0cmF0ZSA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgIGNhc2UgT01YX0luZGV4UGFyYW1HZXRBbmRyb2lkTmF0aXZlQnVmZmVyOgorICAgIHsKKyAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gY2hlY2tWZXJzaW9uQU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaWYgKE9VVFBVVF9QT1JUX0lOREVYICE9IGNoZWNrUG9ydEluZGV4QU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBnZXRBbmRyb2lkTmF0aXZlQnVmZmVyKGhDb21wb25lbnQsIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZgorICAgIGRlZmF1bHQ6CisgICAgeworICAgICAgICByZXQgPSBTRUNfT01YX0dldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuUGFyYW1JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0RlY29kZVNldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKnBvcnRGb3JtYXQgPSAoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBvcnRGb3JtYXQtPm5Qb3J0SW5kZXg7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggICAgPSBwb3J0Rm9ybWF0LT5uSW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICAgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gMDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnRGb3JtYXQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgICAgICAgPSBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQml0cmF0ZToKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAgKnZpZGVvUmF0ZUNvbnRyb2wgPSAoT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSB2aWRlb1JhdGVDb250cm9sLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBJTlBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgcFNFQ1BvcnQtPmVDb250cm9sUmF0ZSA9IHZpZGVvUmF0ZUNvbnRyb2wtPmVDb250cm9sUmF0ZTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSB2aWRlb1JhdGVDb250cm9sLT5uVGFyZ2V0Qml0cmF0ZTsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOgorICAgIHsKKyAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gY2hlY2tWZXJzaW9uQU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaWYgKE9VVFBVVF9QT1JUX0lOREVYICE9IGNoZWNrUG9ydEluZGV4QU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXIoaENvbXBvbmVudCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmJVc2VBbmRyb2lkTmF0aXZlQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCA9IEFORFJPSURfTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbiA9IEFORFJPSURfTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVhfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Vc2VBbmRyb2lkTmF0aXZlQnVmZmVyOgorICAgIHsKKyAgICAgICAgaWYgKE9NWF9FcnJvck5vbmUgIT0gY2hlY2tWZXJzaW9uQU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaWYgKE9VVFBVVF9QT1JUX0lOREVYICE9IGNoZWNrUG9ydEluZGV4QU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IHVzZUFuZHJvaWROYXRpdmVCdWZmZXIoaENvbXBvbmVudCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfQ29uc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAicmF3L3ZpZGVvIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gKDE1IDw8IDE2KTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVhfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSA2NDAwMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMTUgPDwgMTYpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgcE9NWENvbXBvbmVudC0+VXNlQnVmZmVyICAgICAgICAgICAgICA9ICZTRUNfT01YX1VzZUJ1ZmZlcjsKKyAgICBwT01YQ29tcG9uZW50LT5BbGxvY2F0ZUJ1ZmZlciAgICAgICAgID0gJlNFQ19PTVhfQWxsb2NhdGVCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+RnJlZUJ1ZmZlciAgICAgICAgICAgICA9ICZTRUNfT01YX0ZyZWVCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50VHVubmVsUmVxdWVzdCA9ICZTRUNfT01YX0NvbXBvbmVudFR1bm5lbFJlcXVlc3Q7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQWxsb2NhdGVUdW5uZWxCdWZmZXIgPSAmU0VDX09NWF9BbGxvY2F0ZVR1bm5lbEJ1ZmZlcjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfRnJlZVR1bm5lbEJ1ZmZlciAgICAgPSAmU0VDX09NWF9GcmVlVHVubmVsQnVmZmVyOworICAgIHBTRUNDb21wb25lbnQtPnNlY19CdWZmZXJQcm9jZXNzICAgICAgICA9ICZTRUNfT01YX0J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0J1ZmZlclJlc2V0ICAgICAgICAgID0gJlNFQ19CdWZmZXJSZXNldDsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfSW5wdXRCdWZmZXJSZXR1cm4gICAgPSAmU0VDX0lucHV0QnVmZmVyUmV0dXJuOworICAgIHBTRUNDb21wb25lbnQtPnNlY19PdXRwdXRCdWZmZXJSZXR1cm4gICA9ICZTRUNfT3V0cHV0QnVmZmVyUmV0dXJuOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUpOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0Rlc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihoQ29tcG9uZW50KTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvU0VDX09NWF9WZGVjLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL1NFQ19PTVhfVmRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTMwZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL1NFQ19PTVhfVmRlYy5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfVmRlYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgIEh5ZVllb24gQ2h1bmcgKGh5ZW9uLmNodW5nQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1ZJREVPX0RFQ09ERQorI2RlZmluZSBTRUNfT01YX1ZJREVPX0RFQ09ERQorCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisKKyNkZWZpbmUgTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTSAgICA1CisjZGVmaW5lIE1BWF9WSURFT19PVVRQVVRCVUZGRVJfTlVNICAgMgorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfV0lEVEggICAgICAgICAgMTc2CisjZGVmaW5lIERFRkFVTFRfRlJBTUVfSEVJR0hUICAgICAgICAgMTQ0CisKKyNkZWZpbmUgREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRSAgICAoKERFRkFVTFRfRlJBTUVfV0lEVEggKiBERUZBVUxUX0ZSQU1FX0hFSUdIVCkgKiAyKQorI2RlZmluZSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRSAgICgoREVGQVVMVF9GUkFNRV9XSURUSCAqIERFRkFVTFRfRlJBTUVfSEVJR0hUICogMykgLyAyKQorCisjZGVmaW5lIE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWCAgICAgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkUgICAgKCgxMjgwICogNzIwICogMykgLyAyKQorCisjZGVmaW5lIElOUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgIDEKKyNkZWZpbmUgT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYICAgMworCisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisjZGVmaW5lIEFORFJPSURfTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU0gICAxCisjZW5kaWYKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB2b2lkICpwQWRkclk7CisgICAgdm9pZCAqcEFkZHJDOworfSBNRkNfREVDX0FERFJfSU5GTzsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19NRkNfTkJERUNfVEhSRUFECit7CisgICAgT01YX0hBTkRMRVRZUEUgIGhOQkRlY29kZVRocmVhZDsKKyAgICBPTVhfSEFORExFVFlQRSAgaERlY0ZyYW1lU3RhcnQ7CisgICAgT01YX0hBTkRMRVRZUEUgIGhEZWNGcmFtZUVuZDsKKyAgICBPTVhfQk9PTCAgICAgICAgYkV4aXREZWNvZGVUaHJlYWQ7CisgICAgT01YX0JPT0wgICAgICAgIGJEZWNvZGVyUnVuOworCisgICAgT01YX1UzMiAgICAgICAgIG9uZUZyYW1lU2l6ZTsKK30gU0VDX01GQ19OQkRFQ19USFJFQUQ7CisKK3R5cGVkZWYgc3RydWN0IF9NRkNfREVDX0lOUFVUX0JVRkZFUgoreworICAgIHZvaWQgKlBoeUFkZHI7ICAgICAgLy8gcGh5c2ljYWwgYWRkcmVzcworICAgIHZvaWQgKlZpckFkZHI7ICAgICAgLy8gdmlydHVhbCBhZGRyZXNzCisgICAgaW50ICAgYnVmZmVyU2l6ZTsgICAvLyBpbnB1dCBidWZmZXIgYWxsb2Mgc2l6ZQorICAgIGludCAgIGRhdGFTaXplOyAgICAgLy8gRGF0YSBsZW5ndGgKK30gTUZDX0RFQ19JTlBVVF9CVUZGRVI7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1VzZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcywKKyAgICBPTVhfSU4gT01YX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmZmVyKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcyk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXJIZHIpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0FsbG9jYXRlVHVubmVsQnVmZmVyKAorICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwKKyAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlVHVubmVsQnVmZmVyKAorICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBPTVhCYXNlUG9ydCwKKyAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydEluZGV4KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0KAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICBuUG9ydCwKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhUdW5uZWxlZENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICBuVHVubmVsZWRQb3J0LAorICAgIE9NWF9JTk9VVCBPTVhfVFVOTkVMU0VUVVBUWVBFICpwVHVubmVsU2V0dXApOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3MoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVHZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvaDI2NGRlYy9BbmRyb2lkLm1rIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI0OGU1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvaDI2NGRlYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfSDI2NGRlYy5jIFwKKwlsaWJyYXJ5X3JlZ2lzdGVyLmMKKworCitMT0NBTF9NT0RVTEUgOj0gbGliT01YLlNFQy5BVkMuRGVjb2RlcgorCitMT0NBTF9DRkxBR1MgOj0KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliU0VDX09NWF9WZGVjIGxpYnNlY29zYWwgbGlic2VjYmFzZWNvbXBvbmVudCBcCisJCQkJCQlsaWJzZWNtZmNkZWNhcGkgbGlic2VjY3NjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMgbGliZGwgbGliY3V0aWxzIGxpYnV0aWxzIGxpYnVpIGxpYmhhcmR3YXJlCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbCBcCisJJChTRUNfT01YX1RPUCkvc2VjX29teF9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYworCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoU0VDX09NWF9UT1ApL3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjRkZWMvU0VDX09NWF9IMjY0ZGVjLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjRkZWMvU0VDX09NWF9IMjY0ZGVjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhYzdlYgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvaDI2NGRlYy9TRUNfT01YX0gyNjRkZWMuYwpAQCAtMCwwICsxLDE0NzkgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9IMjY0ZGVjLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PTVhfTWFjcm9zLmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlcG9ydC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfVmRlYy5oIgorI2luY2x1ZGUgImxpYnJhcnlfcmVnaXN0ZXIuaCIKKyNpbmNsdWRlICJTRUNfT01YX0gyNjRkZWMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKyNpbmNsdWRlICJjb2xvcl9zcGFjZV9jb252ZXJ0b3IuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0gyNjRfREVDIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisvLyNkZWZpbmUgQUREX1NQU19QUFNfSV9GUkFNRQorLy8jZGVmaW5lIEZVTExfRlJBTUVfU0VBUkNICisKKy8qIEguMjY0IERlY29kZXIgU3VwcG9ydGVkIExldmVscyAmIHByb2ZpbGVzICovCitTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCBzdXBwb3J0ZWRBVkNQcm9maWxlTGV2ZWxzW10gPXsKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDFifSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEzfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMzF9LAorCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDExfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzF9LAorCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDExfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMzF9fTsKKworCitzdGF0aWMgaW50IENoZWNrX0gyNjRfRnJhbWUoT01YX1U4ICpwSW5wdXRTdHJlYW0sIGludCBidWZmU2l6ZSwgT01YX1UzMiBmbGFnLCBPTVhfQk9PTCBiUHJldmlvdXNGcmFtZUVPRiwgT01YX0JPT0wgKnBiRW5kT2ZGcmFtZSkKK3sKKyAgICBPTVhfVTMyICBwcmVGb3VyQnl0ZSAgICAgICA9IChPTVhfVTMyKS0xOworICAgIGludCAgICAgIGFjY2Vzc1VuaXRTaXplICAgID0gMDsKKyAgICBpbnQgICAgICBmcmFtZVR5cGVCb3VuZGFyeSA9IDA7CisgICAgaW50ICAgICAgbmV4dE5hbHVTaXplICAgICAgPSAwOworICAgIGludCAgICAgIG5hbHVTdGFydCAgICAgICAgID0gMDsKKworICAgIGlmIChiUHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfVFJVRSkKKyAgICAgICAgbmFsdVN0YXJ0ID0gMDsKKyAgICBlbHNlCisgICAgICAgIG5hbHVTdGFydCA9IDE7CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpbnQgaW5wdXRPbmVCeXRlID0gMDsKKworICAgICAgICBpZiAoYWNjZXNzVW5pdFNpemUgPT0gYnVmZlNpemUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaW5wdXRPbmVCeXRlID0gKihwSW5wdXRTdHJlYW0rKyk7CisgICAgICAgIGFjY2Vzc1VuaXRTaXplICs9IDE7CisKKyAgICAgICAgaWYgKHByZUZvdXJCeXRlID09IDB4MDAwMDAwMDEgfHwgKHByZUZvdXJCeXRlIDw8IDgpID09IDB4MDAwMDAxMDApIHsKKyAgICAgICAgICAgIGludCBuYWx1VHlwZSA9IGlucHV0T25lQnl0ZSAmIDB4MUY7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTmFsdVR5cGUgOiAlZCIsIG5hbHVUeXBlKTsKKyAgICAgICAgICAgIGlmIChuYWx1U3RhcnQgPT0gMCkgeworI2lmZGVmIEFERF9TUFNfUFBTX0lfRlJBTUUKKyAgICAgICAgICAgICAgICBpZiAobmFsdVR5cGUgPT0gMSB8fCBuYWx1VHlwZSA9PSA1KQorI2Vsc2UKKyAgICAgICAgICAgICAgICBpZiAobmFsdVR5cGUgPT0gMSB8fCBuYWx1VHlwZSA9PSA1IHx8IG5hbHVUeXBlID09IDcgfHwgbmFsdVR5cGUgPT0gOCkKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICBuYWx1U3RhcnQgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBPTERfREVURUNUCisgICAgICAgICAgICAgICAgZnJhbWVUeXBlQm91bmRhcnkgPSAoOCAtIG5hbHVUeXBlKSAmIChuYWx1VHlwZSAtIDEwKTsgLy9BVUQoOSkKKyNlbHNlCisgICAgICAgICAgICAgICAgaWYgKG5hbHVUeXBlID09IDkpCisgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZUJvdW5kYXJ5ID0gLTI7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBpZiAobmFsdVR5cGUgPT0gMSB8fCBuYWx1VHlwZSA9PSA1KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0U2l6ZSA9PSBidWZmU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWNjZXNzVW5pdFNpemUtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnB1dE9uZUJ5dGUgPSAqcElucHV0U3RyZWFtKys7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXRTaXplICs9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0T25lQnl0ZSA+PSAweDgwKQorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUeXBlQm91bmRhcnkgPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lVHlwZUJvdW5kYXJ5IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBwcmVGb3VyQnl0ZSA9IChwcmVGb3VyQnl0ZSA8PCA4KSArIGlucHV0T25lQnl0ZTsKKyAgICB9CisKKyAgICAqcGJFbmRPZkZyYW1lID0gT01YX1RSVUU7CisgICAgbmV4dE5hbHVTaXplID0gLTU7CisgICAgaWYgKGZyYW1lVHlwZUJvdW5kYXJ5ID09IC0xKQorICAgICAgICBuZXh0TmFsdVNpemUgPSAtNjsKKyAgICBpZiAocHJlRm91ckJ5dGUgIT0gMHgwMDAwMDAwMSkKKyAgICAgICAgbmV4dE5hbHVTaXplKys7CisgICAgcmV0dXJuIChhY2Nlc3NVbml0U2l6ZSArIG5leHROYWx1U2l6ZSk7CisKK0VYSVQ6CisgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9GQUxTRTsKKworICAgIHJldHVybiBhY2Nlc3NVbml0U2l6ZTsKK30KKworT01YX0JPT0wgQ2hlY2tfSDI2NF9TdGFydENvZGUoT01YX1U4ICpwSW5wdXRTdHJlYW0sIE9NWF9VMzIgc3RyZWFtU2l6ZSkKK3sKKyAgICBpZiAoc3RyZWFtU2l6ZSA8IDQpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKKyAgICB9IGVsc2UgaWYgKChwSW5wdXRTdHJlYW1bMF0gPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKHBJbnB1dFN0cmVhbVsxXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzJdID09IDB4MDApICYmCisgICAgICAgICAgICAgIChwSW5wdXRTdHJlYW1bM10gIT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKChwSW5wdXRTdHJlYW1bM10gPj4gMykgPT0gMHgwMCkpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIH0gZWxzZSBpZiAoKHBJbnB1dFN0cmVhbVswXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzFdID09IDB4MDApICYmCisgICAgICAgICAgICAgIChwSW5wdXRTdHJlYW1bMl0gIT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgKChwSW5wdXRTdHJlYW1bMl0gPj4gMykgPT0gMHgwMCkpIHsKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgfQorfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19HZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjQVZDQ29tcG9uZW50ID0gJnBIMjY0RGVjLT5BVkNDb21wb25lbnRbcERzdEFWQ0NvbXBvbmVudC0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RBVkNDb21wb25lbnQsIHBTcmNBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUNfUk9MRSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwRHN0UHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7CisgICAgICAgIE9NWF9VMzIgbWF4UHJvZmlsZUxldmVsTnVtID0gMDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFByb2ZpbGVMZXZlbCA9IHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHM7CisgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IHNpemVvZihzdXBwb3J0ZWRBVkNQcm9maWxlTGV2ZWxzKSAvIHNpemVvZihTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCk7CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXggPj0gbWF4UHJvZmlsZUxldmVsTnVtKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsICs9IHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXg7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFByb2ZpbGVMZXZlbC0+cHJvZmlsZTsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFByb2ZpbGVMZXZlbC0+bGV2ZWw7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjQVZDQ29tcG9uZW50ID0gJnBIMjY0RGVjLT5BVkNDb21wb25lbnRbcERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwU3JjQVZDQ29tcG9uZW50LT5lUHJvZmlsZTsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFNyY0FWQ0NvbXBvbmVudC0+ZUxldmVsOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwSDI2NERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjREZWNfU2V0UGFyYW1ldGVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvQXZjOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBEc3RBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcFNyY0FWQ0NvbXBvbmVudCA9IChPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjQVZDQ29tcG9uZW50LCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0FWQ0NvbXBvbmVudC0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdEFWQ0NvbXBvbmVudCA9ICZwSDI2NERlYy0+QVZDQ29tcG9uZW50W3BTcmNBVkNDb21wb25lbnQtPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0QVZDQ29tcG9uZW50LCBwU3JjQVZDQ29tcG9uZW50LCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgeworICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBDb21wb25lbnRSb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU0VDX09TQUxfU3RyY21wKChjaGFyKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfREVDX1JPTEUpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcFBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwUG9ydERlZmluaXRpb24tPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0OworICAgICAgICBPTVhfVTMyIHdpZHRoLCBoZWlnaHQsIHNpemU7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwUG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYocFBvcnREZWZpbml0aW9uLT5uQnVmZmVyQ291bnRBY3R1YWwgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLCBwUG9ydERlZmluaXRpb24tPm5TaXplKTsKKworICAgICAgICB3aWR0aCA9ICgocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgaGVpZ2h0ID0gKChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgc2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAoc2l6ZSA+IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSkgPyBzaXplIDogcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplOworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKworICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICAgICAgICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXRBTkJZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJDb2xvciBmb3JtYXQgaXMgbm90IHN1cHBvcnQhISB1c2UgZGVmYXVsdCBZVVYgc2l6ZSEhIik7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBTcmNQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjUHJvZmlsZUxldmVsLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgZ290byBFWElUOworCisgICAgICAgIGlmIChwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworCisgICAgICAgIHBEc3RBVkNDb21wb25lbnQgPSAmcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgcERzdEFWQ0NvbXBvbmVudC0+ZVByb2ZpbGUgPSBwU3JjUHJvZmlsZUxldmVsLT5lUHJvZmlsZTsKKyAgICAgICAgcERzdEFWQ0NvbXBvbmVudC0+ZUxldmVsID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZUxldmVsOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICAgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwSDI2NERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX0dldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcDoKKyAgICB7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgKnBIMjY0RGVjID0gTlVMTDsKKyAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcFNyY1JlY3RUeXBlID0gTlVMTDsKKyAgICAgICAgT01YX0NPTkZJR19SRUNUVFlQRSAqcERzdFJlY3RUeXBlID0gTlVMTDsKKyAgICAgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworCisgICAgICAgIGlmIChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb3RSZWFkeTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcERzdFJlY3RUeXBlID0gKE9NWF9DT05GSUdfUkVDVFRZUEUgKilwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlOworCisgICAgICAgIGlmICgocERzdFJlY3RUeXBlLT5uUG9ydEluZGV4ICE9IElOUFVUX1BPUlRfSU5ERVgpICYmCisgICAgICAgICAgICAocERzdFJlY3RUeXBlLT5uUG9ydEluZGV4ICE9IE9VVFBVVF9QT1JUX0lOREVYKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcERzdFJlY3RUeXBlLT5uUG9ydEluZGV4XTsKKworICAgICAgICBwU3JjUmVjdFR5cGUgPSAmKHBTRUNQb3J0LT5jcm9wUmVjdGFuZ2xlKTsKKworICAgICAgICBwRHN0UmVjdFR5cGUtPm5Ub3AgPSBwU3JjUmVjdFR5cGUtPm5Ub3A7CisgICAgICAgIHBEc3RSZWN0VHlwZS0+bkxlZnQgPSBwU3JjUmVjdFR5cGUtPm5MZWZ0OworICAgICAgICBwRHN0UmVjdFR5cGUtPm5IZWlnaHQgPSBwU3JjUmVjdFR5cGUtPm5IZWlnaHQ7CisgICAgICAgIHBEc3RSZWN0VHlwZS0+bldpZHRoID0gcFNyY1JlY3RUeXBlLT5uV2lkdGg7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX0dldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX1NldENvbmZpZygKKyAgICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTkRFWFRZUEUgbkluZGV4LAorICAgIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmIChwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZToKKyAgICB7CisgICAgICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisKKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJUaHVtYm5haWxNb2RlID0gKigoT01YX0JPT0wgKilwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9TZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9USFVNQk5BSUwpID09IDApIHsKKyAgICAgICAgU0VDX0gyNjRERUNfSEFORExFICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICB9IGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9BTkIpID09IDApIHsKKwkgICAgaWYgKGlzVHZPdXRFbmFibGVkKCkpIHsKKwkgICAgICAgIC8vIFNhbXN1bmcgbm9ybWFsbHkgcHVzaGVzIEhXLWRlY29kZWQgZnJhbWVzIHRvIHRoZSBUViBPdXQgZHJpdmVyCisJICAgICAgICAvLyBidXQgaXQncyBoYXJkIGZvciB1cyB0byBkbyB0aGF0IHdpdGhvdXQgc291cmNlLCBzbyByZXR1cm4gYW4gZXJyb3IKKwkgICAgICAgIC8vIGFuZCBsZXQgQW5kcm9pZCBmYWxsYmFjayB0byBzb2Z0d2FyZSBkZWNvZGluZworCSAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCSAgICAgICAgZ290byBFWElUOworCSAgICB9CisKKyAgICAgICAgKnBJbmRleFR5cGUgPSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfUEFSQU1fR0VUX0FOQikgPT0gMCkgeworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleFBhcmFtR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlcjsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX1VTRV9BTkIpID09IDApIHsKKyAgICAgICAgKnBJbmRleFR5cGUgPSBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXI7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX0dldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RGVjX0NvbXBvbmVudFJvbGVFbnVtKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9VOCAqY1JvbGUsIE9NWF9VMzIgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ID09IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNLTEpKSB7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQ19ST0xFKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfRGVjb2RlVGhyZWFkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgKnBIMjY0RGVjID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisKKyAgICB3aGlsZSAocEgyNjREZWMtPk5CRGVjVGhyZWFkLmJFeGl0RGVjb2RlVGhyZWFkID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBIMjY0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBIMjY0RGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0RlY0V4ZShwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgcEgyNjREZWMtPk5CRGVjVGhyZWFkLm9uZUZyYW1lU2l6ZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBIMjY0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBJbml0ICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19Jbml0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX0gyNjRERUNfSEFORExFICAgICpwSDI2NERlYyA9IE5VTEw7CisKKyAgICBPTVhfUFRSIGhNRkNIYW5kbGUgICAgICAgPSBOVUxMOworICAgIE9NWF9QVFIgcFN0cmVhbUJ1ZmZlciAgICA9IE5VTEw7CisgICAgT01YX1BUUiBwU3RyZWFtUGh5QnVmZmVyID0gTlVMTDsKKworICAgIHBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgLyogTUZDKE11bHRpIEZ1bmN0aW9uIENvZGVjKSBkZWNvZGVyIGFuZCBDTU0oQ29kZWMgTWVtb3J5IE1hbmFnZW1lbnQpIGRyaXZlciBvcGVuICovCisgICAgU1NCSVBfTUZDX0JVRkZFUl9UWVBFIGJ1Zl90eXBlID0gQ0FDSEU7CisgICAgaE1GQ0hhbmRsZSA9IChPTVhfUFRSKVNzYlNpcE1mY0RlY09wZW4oJmJ1Zl90eXBlKTsKKyAgICBpZiAoaE1GQ0hhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSA9IGhNRkNIYW5kbGU7CisKKyAgICAvKiBBbGxvY2F0ZSBkZWNvZGVyJ3MgaW5wdXQgYnVmZmVyICovCisgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0dldEluQnVmKGhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSAqIE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWCk7CisgICAgaWYgKHBTdHJlYW1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkciA9IHBTdHJlYW1CdWZmZXI7CisgICAgcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlBoeUFkZHIgPSBwU3RyZWFtUGh5QnVmZmVyOworICAgIHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkU7CisgICAgcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmRhdGFTaXplID0gMDsKKyAgICBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uVmlyQWRkciA9ICh1bnNpZ25lZCBjaGFyICopcFN0cmVhbUJ1ZmZlciArIHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplOworICAgIHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5QaHlBZGRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3RyZWFtUGh5QnVmZmVyICsgcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLmJ1ZmZlclNpemU7CisgICAgcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmJ1ZmZlclNpemUgPSBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRTsKKyAgICBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uZGF0YVNpemUgPSAwOworICAgIHBIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyID0gMDsKKworICAgIHBIMjY0RGVjLT5iRmlyc3RGcmFtZSA9IE9NWF9UUlVFOworCisgICAgcEgyNjREZWMtPk5CRGVjVGhyZWFkLmJFeGl0RGVjb2RlVGhyZWFkID0gT01YX0ZBTFNFOworICAgIHBIMjY0RGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICBwSDI2NERlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gMDsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwSDI2NERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpKTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwSDI2NERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKSk7CisgICAgaWYgKE9NWF9FcnJvck5vbmUgPT0gU0VDX09TQUxfVGhyZWFkQ3JlYXRlKCZwSDI2NERlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19EZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBNRkNfUkVUX09LOworICAgIH0KKworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHI7CisgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkcjsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplICA9IHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplOworCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKyAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19UZXJtaW5hdGUoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgKnBIMjY0RGVjID0gTlVMTDsKKyAgICBPTVhfUFRSICAgICAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcEgyNjREZWMgPSAoU0VDX0gyNjRERUNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIGhNRkNIYW5kbGUgPSBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZTsKKworICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyICAgID0gTlVMTDsKKyAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gMDsKKworICAgIGlmIChwSDI2NERlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcEgyNjREZWMtPk5CRGVjVGhyZWFkLmJFeGl0RGVjb2RlVGhyZWFkID0gT01YX1RSVUU7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocEgyNjREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBIMjY0RGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQpOworICAgICAgICBwSDI2NERlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwSDI2NERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBIMjY0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICBwSDI2NERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwSDI2NERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocEgyNjREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcEgyNjREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaE1GQ0hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNzYlNpcE1mY0RlY0Nsb3NlKGhNRkNIYW5kbGUpOworICAgICAgICBoTUZDSGFuZGxlID0gcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUgPSBOVUxMOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRfRGVjb2RlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICAgKnBIMjY0RGVjID0gKFNFQ19IMjY0REVDX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgIFNTQlNJUF9NRkNfREVDX09VVFBVVF9JTkZPIG91dHB1dEluZm87CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgc2V0Q29uZlZhbCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYnVmV2lkdGggPSAwOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkhlaWdodCA9IDA7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU1NCU0lQX01GQ19DT0RFQ19UWVBFIGVDb2RlY1R5cGUgPSBIMjY0X0RFQzsKKworICAgICAgICBpZiAoKG9uZUZyYW1lU2l6ZSA8PSAwKSAmJiAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgc2V0Q29uZlZhbCA9IDA7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0VYVFJBX0JVRkZFUl9OVU0sICZzZXRDb25mVmFsKTsKKworICAgICAgICAvKiBEZWZhdWx0IG51bWJlciBpbiB0aGUgZHJpdmVyIGlzIG9wdGltaXplZCAqLworICAgICAgICBpZiAocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmJUaHVtYm5haWxNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBzZXRDb25mVmFsID0gMTsKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0RJU1BMQVlfREVMQVksICZzZXRDb25mVmFsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldENvbmZWYWwgPSA4OworICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRElTUExBWV9ERUxBWSwgJnNldENvbmZWYWwpOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjSW5pdChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgZUNvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICBTU0JTSVBfTUZDX0lNR19SRVNPTFVUSU9OIGltZ1Jlc29sOworICAgICAgICAgICAgU1NCU0lQX01GQ19DUk9QX0lORk9STUFUSU9OIGNyb3BJbmZvOworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqc2VjSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAqc2VjT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgICAgIFNzYlNpcE1mY0RlY0dldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0JVRl9XSURUSF9IRUlHSFQsICZpbWdSZXNvbCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInNldCB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyB3aWR0aCBoZWlnaHQgaW5mb3JtYXRpb24gOiAlZCwgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZ1Jlc29sLndpZHRoLCBpbWdSZXNvbC5oZWlnaHQpOworCisgICAgICAgICAgICBTc2JTaXBNZmNEZWNHZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9DUk9QX0lORk8sICZjcm9wSW5mbyk7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIm1mYyBjcm9wX3RvcCBjcm9wX2JvdHRvbSBjcm9wX2xlZnQgY3JvcF9yaWdodCA6ICAlZCwgJWQsICVkLCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcEluZm8uY3JvcF90b3Bfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0ICwgY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQpOworCisgICAgICAgICAgICBzZWNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5Ub3AgICAgPSBjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQ7CisgICAgICAgICAgICBzZWNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5MZWZ0ICAgPSBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0OworICAgICAgICAgICAgc2VjT3V0cHV0UG9ydC0+Y3JvcFJlY3RhbmdsZS5uV2lkdGggID0gaW1nUmVzb2wud2lkdGggLSBjcm9wSW5mby5jcm9wX2xlZnRfb2Zmc2V0IC0gY3JvcEluZm8uY3JvcF9yaWdodF9vZmZzZXQ7CisgICAgICAgICAgICBzZWNPdXRwdXRQb3J0LT5jcm9wUmVjdGFuZ2xlLm5IZWlnaHQgPSBpbWdSZXNvbC5oZWlnaHQgLSBjcm9wSW5mby5jcm9wX3RvcF9vZmZzZXQgLSBjcm9wSW5mby5jcm9wX2JvdHRvbV9vZmZzZXQ7CisKKyAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9UUlVFOworCisgICAgICAgICAgICAvKiogVXBkYXRlIEZyYW1lIFNpemUgKiovCisgICAgICAgICAgICBpZiAoKGNyb3BJbmZvLmNyb3BfbGVmdF9vZmZzZXQgIT0gMCkgfHwgKGNyb3BJbmZvLmNyb3BfcmlnaHRfb2Zmc2V0ICE9IDApIHx8CisgICAgICAgICAgICAgICAgKGNyb3BJbmZvLmNyb3BfdG9wX29mZnNldCAhPSAwKSB8fCAoY3JvcEluZm8uY3JvcF9ib3R0b21fb2Zmc2V0ICE9IDApKSB7CisgICAgICAgICAgICAgICAgLyogY2hhbmdlIHdpZHRoIGFuZCBoZWlnaHQgaW5mb3JtYXRpb24gKi8KKyAgICAgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IGltZ1Jlc29sLndpZHRoOworICAgICAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlICAgICAgPSAoKGltZ1Jlc29sLndpZHRoICsgMTUpICYgKH4xNSkpOworICAgICAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9ICgoaW1nUmVzb2wuaGVpZ2h0ICsgMTUpICYgKH4xNSkpOworCisgICAgICAgICAgICAgICAgU0VDX1VwZGF0ZUZyYW1lU2l6ZShwT01YQ29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8qKiBTZW5kIGNyb3AgaW5mbyBjYWxsIGJhY2sgKi8KKyAgICAgICAgICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKQorICAgICAgICAgICAgICAgICAgICAgIChwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudFBvcnRTZXR0aW5nc0NoYW5nZWQsIC8qIFRoZSBjb21tYW5kIHdhcyBjb21wbGV0ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgT01YX0Rpck91dHB1dCwgLyogVGhpcyBpcyB0aGUgcG9ydCBpbmRleCAqLworICAgICAgICAgICAgICAgICAgICAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRDcm9wLAorICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZigoc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gaW1nUmVzb2wud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCAhPSBpbWdSZXNvbC5oZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJjaGFuZ2Ugd2lkdGggaGVpZ2h0IGluZm9ybWF0aW9uIDogT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCIpOworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBpbWdSZXNvbC53aWR0aDsKKyAgICAgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBpbWdSZXNvbC5oZWlnaHQ7CisgICAgICAgICAgICAgICAgc2VjSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAoKGltZ1Jlc29sLmhlaWdodCArIDE1KSAmICh+MTUpKTsKKworICAgICAgICAgICAgICAgIFNFQ19VcGRhdGVGcmFtZVNpemUocE9NWENvbXBvbmVudCk7CisKKyAgICAgICAgICAgICAgICAvKiogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICovCisgICAgICAgICAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvKiBUaGUgY29tbWFuZCB3YXMgY29tcGxldGVkICovCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8qIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBBRERfU1BTX1BQU19JX0ZSQU1FCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisjZWxzZQorICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisjZW5kaWYKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck1GQ0luaXQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyNpZm5kZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKQorICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworI2VuZGlmCisKKyAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgIGlmICgocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spICYmCisgICAgICAgIChwSDI2NERlYy0+YkZpcnN0RnJhbWUgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgbWZjIGRlY29kZSBkb25lICovCisgICAgICAgIGlmIChwSDI2NERlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocEgyNjREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCk7CisgICAgICAgICAgICBwSDI2NERlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBTc2JTaXBNZmNEZWNHZXRPdXRCdWYocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgYnVmV2lkdGggID0gKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgIGJ1ZkhlaWdodCA9IChvdXRwdXRJbmZvLmltZ19oZWlnaHQgKyAxNSkgJiAofjE1KTsKKworICAgICAgICBpZiAoKFNzYlNpcE1mY0RlY0dldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19HRVRDT05GX0ZSQU1FX1RBRywgJmluZGV4VGltZXN0YW1wKSAhPSBNRkNfUkVUX09LKSB8fAorICAgICAgICAgICAgKCgoaW5kZXhUaW1lc3RhbXAgPCAwKSB8fCAoaW5kZXhUaW1lc3RhbXAgPj0gTUFYX1RJTUVTVEFNUCkpKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSAocElucHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBTRUNDb21wb25lbnQtPm5GbGFnc1tpbmRleFRpbWVzdGFtcF07CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ0aW1lc3RhbXAgJWxsZCB1cyAoJS4yZiBzZWNzKSIsIHBPdXRwdXREYXRhLT50aW1lU3RhbXAsIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgLyAxRTYpOworCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9ERUNPRElORykgfHwKKyAgICAgICAgICAgIChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX09OTFkpKSB7CisgICAgICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICBpZiAoKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisKKyAgICAgICAgaWYoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWSkgeworICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisjaWZkZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSkgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vc2V0Q29uZlZhbCA9IDE7CisgICAgICAgICAgICAvL1NzYlNpcE1mY0RlY1NldENvbmZpZyhwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0lTX0xBU1RfRlJBTUUsICZzZXRDb25mVmFsKTsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZSBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkgfHwKKyAgICAgICAgICAgIChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmICgocEgyNjREZWMtPmJGaXJzdEZyYW1lID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgPSAocElucHV0RGF0YS0+bkZsYWdzIHwgT01YX0JVRkZFUkZMQUdfRU9TKTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSAocE91dHB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgIH0KKworICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgLyogcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOyAqLworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgIHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwSDI2NERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgIHBIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyICU9IE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWDsKKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcEgyNjREZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyXS5WaXJBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcEgyNjREZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwSDI2NERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemU7CisgICAgICAgIC8vcElucHV0RGF0YS0+ZGF0YUxlbiA9IG9uZUZyYW1lU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgIH0KKworICAgIGlmICgoQ2hlY2tfSDI2NF9TdGFydENvZGUocElucHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcElucHV0RGF0YS0+ZGF0YUxlbikgPT0gT01YX1RSVUUpICYmCisgICAgICAgICgocE91dHB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgIT0gT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9GUkFNRV9UQUcsICYocEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCsrOworICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKworICAgICAgICBTc2JTaXBNZmNEZWNTZXRJbkJ1ZihwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUpOworCisgICAgICAgIHBIMjY0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwSDI2NERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgIHBIMjY0RGVjLT5OQkRlY1RocmVhZC5vbmVGcmFtZVNpemUgPSBvbmVGcmFtZVNpemU7CisKKyAgICAgICAgLyogbWZjIGRlY29kZSBzdGFydCAqLworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBIMjY0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgIHBIMjY0RGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9UUlVFOworICAgICAgICBwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBNRkNfUkVUX09LOworCisgICAgICAgIHBIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyICU9IE1GQ19JTlBVVF9CVUZGRVJfTlVNX01BWDsKKyAgICAgICAgcEgyNjREZWMtPmhNRkNIMjY0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcEgyNjREZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcEgyNjREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BIMjY0RGVjLT5pbmRleElucHV0QnVmZmVyXS5WaXJBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5hbGxvY1NpemUgPSBwSDI2NERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcEgyNjREZWMtPmluZGV4SW5wdXRCdWZmZXJdLmJ1ZmZlclNpemU7CisgICAgICAgIGlmICgoKHBIMjY0RGVjLT5oTUZDSDI2NEhhbmRsZS5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpICYmCisgICAgICAgICAgICAocEgyNjREZWMtPmJGaXJzdEZyYW1lID09IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgKG91dHB1dERhdGFWYWxpZCA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0KKyAgICAgICAgcEgyNjREZWMtPmJGaXJzdEZyYW1lID0gT01YX0ZBTFNFOworICAgIH0KKworICAgIC8qKiBGaWxsIE91dHB1dCBCdWZmZXIgKiovCisgICAgaWYgKG91dHB1dERhdGFWYWxpZCA9PSBPTVhfVFJVRSkgeworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgIHZvaWQgKnBPdXRwdXRCdWZbM107CisKKyAgICAgICAgaW50IGZyYW1lU2l6ZSA9IGJ1ZldpZHRoICogYnVmSGVpZ2h0OworICAgICAgICBpbnQgaW1hZ2VTaXplID0gb3V0cHV0SW5mby5pbWdfd2lkdGggKiBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisKKyAgICAgICAgaW50IGFjdHVhbFdpZHRoICA9IG91dHB1dEluZm8uaW1nX3dpZHRoOworICAgICAgICBpbnQgYWN0dWFsSGVpZ2h0ID0gb3V0cHV0SW5mby5pbWdfaGVpZ2h0OworICAgICAgICBpbnQgYWN0dWFsSW1hZ2VTaXplID0gaW1hZ2VTaXplOworCisgICAgICAgIHBPdXRwdXRCdWZbMF0gPSAodm9pZCAqKXBPdXRwdXREYXRhLT5kYXRhQnVmZmVyOworICAgICAgICBwT3V0cHV0QnVmWzFdID0gKHZvaWQgKilwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciArIGFjdHVhbEltYWdlU2l6ZTsKKyAgICAgICAgcE91dHB1dEJ1ZlsyXSA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgKyAoKGFjdHVhbEltYWdlU2l6ZSAqIDUpIC8gNCk7CisKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgT01YX1UzMiByZXRBTkIgPSAwOworICAgICAgICAgICAgdm9pZCAqcFZpckFkZHJzWzJdOworICAgICAgICAgICAgYWN0dWFsV2lkdGggID0gKG91dHB1dEluZm8uaW1nX3dpZHRoICsgMTUpICYgKH4xNSk7CisgICAgICAgICAgICBhY3R1YWxJbWFnZVNpemUgPSBhY3R1YWxXaWR0aCAqIGFjdHVhbEhlaWdodDsKKworICAgICAgICAgICAgcmV0QU5CID0gZ2V0VkFERFJmcm9tQU5CIChwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVmlyQWRkcnMpOworICAgICAgICAgICAgaWYgKHJldEFOQiAhPSAwKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJFcnJvciBnZXRWQUREUmZyb21BTkIsIEVycm9yIGNvZGU6JWQiLCByZXRBTkIpOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck92ZXJmbG93OworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBPdXRwdXRCdWZbMF0gPSBwVmlyQWRkcnNbMF07CisgICAgICAgICAgICBwT3V0cHV0QnVmWzFdID0gcFZpckFkZHJzWzFdOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKChwSDI2NERlYy0+aE1GQ0gyNjRIYW5kbGUuYlRodW1ibmFpbE1vZGUgPT0gT01YX0ZBTFNFKSAmJgorICAgICAgICAgICAgKHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBpZiB1c2UgUG9zdCBjb3B5IGFkZHJlc3Mgc3RydWN0dXJlICovCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocE91dHB1dEJ1ZlswXSwgJmZyYW1lU2l6ZSwgc2l6ZW9mKGZyYW1lU2l6ZSkpOworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBPdXRwdXRCdWZbMF0gKyBzaXplb2YoZnJhbWVTaXplKSwgJihvdXRwdXRJbmZvLllQaHlBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVBoeUFkZHIpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmWzBdICsgc2l6ZW9mKGZyYW1lU2l6ZSkgKyAoc2l6ZW9mKHZvaWQgKikgKiAxKSwgJihvdXRwdXRJbmZvLkNQaHlBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uQ1BoeUFkZHIpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmWzBdICsgc2l6ZW9mKGZyYW1lU2l6ZSkgKyAoc2l6ZW9mKHZvaWQgKikgKiAyKSwgJihvdXRwdXRJbmZvLllWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uWVZpckFkZHIpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmWzBdICsgc2l6ZW9mKGZyYW1lU2l6ZSkgKyAoc2l6ZW9mKHZvaWQgKikgKiAzKSwgJihvdXRwdXRJbmZvLkNWaXJBZGRyKSwgc2l6ZW9mKG91dHB1dEluZm8uQ1ZpckFkZHIpKTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gKGJ1ZldpZHRoICogYnVmSGVpZ2h0ICogMykgLyAyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwUCBvdXQiKTsKKyAgICAgICAgICAgICAgICBjc2NfdGlsZWRfdG9fbGluZWFyKAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWZbMF0sCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopb3V0cHV0SW5mby5ZVmlyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCk7CisgICAgICAgICAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcl9kZWludGVybGVhdmUoCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmWzJdLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKW91dHB1dEluZm8uQ1ZpckFkZHIsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBhY3R1YWxJbWFnZVNpemUgKiAzIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJZVVY0MjBTUCBvdXQiKTsKKyAgICAgICAgICAgICAgICBjc2NfdGlsZWRfdG9fbGluZWFyKAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWZbMF0sCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopb3V0cHV0SW5mby5ZVmlyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsV2lkdGgsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbEhlaWdodCk7CisgICAgICAgICAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcigKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmWzFdLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKW91dHB1dEluZm8uQ1ZpckFkZHIsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQgPj4gMSk7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBhY3R1YWxJbWFnZVNpemUgKiAzIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJVc2VBbmRyb2lkTmF0aXZlQnVmZmVyID09IE9NWF9UUlVFKQorICAgICAgICAgICAgcHV0VkFERFJ0b0FOQihwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlcik7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgRGVjb2RlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NERlY19idWZmZXJQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgZW5kT2ZGcmFtZSA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX0VOQUJMRUQocFNFQ091dHB1dFBvcnQpKSB8fAorICAgICAgICAgICAgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwU0VDSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwU0VDT3V0cHV0UG9ydCkpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKE9NWF9GQUxTRSA9PSBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX01GQ19IMjY0X0RlY29kZShwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLCBwT3V0cHV0RGF0YSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBDYWxsYmFja3MtPkV2ZW50SGFuZGxlcigoT01YX0hBTkRMRVRZUEUpcE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHJldCwgMCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5wdXREYXRhLT5wcmV2aW91c0RhdGFMZW4gPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiArPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbiAtIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5kYXRhTGVuIC09IHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19IMjY0REVDX0hBTkRMRSAgICAgICpwSDI2NERlYyA9IE5VTEw7CisgICAgaW50IGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChoQ29tcG9uZW50ID09IE5VTEwpIHx8IChjb21wb25lbnROYW1lID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JCYWRQYXJhbWV0ZXIsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQywgY29tcG9uZW50TmFtZSkgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBjb21wb25lbnROYW1lOiVzLCBMaW5lOiVkIiwgY29tcG9uZW50TmFtZSwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID0gSFdfVklERU9fQ09ERUM7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gKE9NWF9TVFJJTkcpU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCAwLCBNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkUpOworCisgICAgcEgyNjREZWMgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19IMjY0REVDX0hBTkRMRSkpOworICAgIGlmIChwSDI2NERlYyA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBIMjY0RGVjLCAwLCBzaXplb2YoU0VDX0gyNjRERUNfSEFORExFKSk7CisgICAgcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKXBIMjY0RGVjOworCisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfREVDKTsKKyAgICAvKiBTZXQgY29tcG9uZW50VmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NaW5vciA9IFZFUlNJT05NSU5PUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKyAgICAvKiBTZXQgc3BlY1ZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NaW5vciA9IFZFUlNJT05NSU5PUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworCisgICAgLyogQW5kcm9pZCBDYXBhYmlsaXR5RmxhZ3MgKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZCAgICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbElucHV0QnVmZmVyQWxsb2MgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsT3V0cHV0QnVmZmVyQWxsb2MgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzTW92YWJsZUlucHV0QnVmZmVycyAgICAgICA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzUGFydGlhbEZyYW1lcyAgICAgICAgICAgICA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50Q2FuSGFuZGxlSW5jb21wbGV0ZUZyYW1lcyAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzRnVsbEFWQ0ZyYW1lcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gREVGQVVMVF9GUkFNRV9XSURUSDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gREVGQVVMVF9GUkFNRV9IRUlHSFQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlID0gMDsgLypERUZBVUxUX0ZSQU1FX1dJRFRIOyovCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfVklERU9fSU5QVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nQVZDOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJ2aWRlby9hdmMiKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOyAvKkRFRkFVTFRfRlJBTUVfV0lEVEg7Ki8KKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID0gT01YX1RSVUU7CisKKyAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04oJnBIMjY0RGVjLT5BVkNDb21wb25lbnRbaV0sIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5uUG9ydEluZGV4ID0gaTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5lUHJvZmlsZSAgID0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZTsKKyAgICAgICAgcEgyNjREZWMtPkFWQ0NvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX0FWQ0xldmVsNDsKKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX0gyNjREZWNfR2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPlNldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfSDI2NERlY19TZXRQYXJhbWV0ZXI7CisgICAgcE9NWENvbXBvbmVudC0+R2V0Q29uZmlnICAgICAgICAgPSAmU0VDX01GQ19IMjY0RGVjX0dldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX0gyNjREZWNfU2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ID0gJlNFQ19NRkNfSDI2NERlY19HZXRFeHRlbnNpb25JbmRleDsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnRSb2xlRW51bSA9ICZTRUNfTUZDX0gyNjREZWNfQ29tcG9uZW50Um9sZUVudW07CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0ICAgPSAmU0VDX09NWF9Db21wb25lbnREZWluaXQ7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQgICAgICA9ICZTRUNfTUZDX0gyNjREZWNfSW5pdDsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudFRlcm1pbmF0ZSA9ICZTRUNfTUZDX0gyNjREZWNfVGVybWluYXRlOworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfYnVmZmVyUHJvY2VzcyAgICAgID0gJlNFQ19NRkNfSDI2NERlY19idWZmZXJQcm9jZXNzOworICAgIHBTRUNDb21wb25lbnQtPnNlY19jaGVja0lucHV0RnJhbWUgICAgICAgID0gJkNoZWNrX0gyNjRfRnJhbWU7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPSBPTVhfU3RhdGVMb2FkZWQ7CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50RGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfSDI2NERFQ19IQU5ETEUgICAgICAqcEgyNjREZWMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IE5VTEw7CisKKyAgICBwSDI2NERlYyA9IChTRUNfSDI2NERFQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgaWYgKHBIMjY0RGVjICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwSDI2NERlYyk7CisgICAgICAgIHBIMjY0RGVjID0gcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL1NFQ19PTVhfSDI2NGRlYy5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL1NFQ19PTVhfSDI2NGRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjhhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjRkZWMvU0VDX09NWF9IMjY0ZGVjLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIFNFQ19PTVhfSDI2NGRlYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX0gyNjRfREVDX0NPTVBPTkVOVAorI2RlZmluZSBTRUNfT01YX0gyNjRfREVDX0NPTVBPTkVOVAorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19NRkNfSDI2NERFQ19IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgcE1GQ1N0cmVhbUJ1ZmZlcjsKKyAgICBPTVhfUFRSIHBNRkNTdHJlYW1QaHlCdWZmZXI7CisgICAgT01YX1UzMiAgICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCBiQ29uZmlndXJlZE1GQzsKKyAgICBPTVhfQk9PTCBiVGh1bWJuYWlsTW9kZTsKKyAgICBPTVhfUzMyICByZXR1cm5Db2RlYzsKK30gU0VDX01GQ19IMjY0REVDX0hBTkRMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19IMjY0REVDX0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIEFWQ0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGVbQUxMX1BPUlRfTlVNXTsKKworICAgIC8qIFNFQyBNRkMgQ29kZWMgc3BlY2lmaWMgKi8KKyAgICBTRUNfTUZDX0gyNjRERUNfSEFORExFIGhNRkNIMjY0SGFuZGxlOworCisgICAgLyogRm9yIE5vbi1CbG9jayBtb2RlICovCisgICAgU0VDX01GQ19OQkRFQ19USFJFQUQgTkJEZWNUaHJlYWQ7CisgICAgT01YX0JPT0wgYkZpcnN0RnJhbWU7CisgICAgTUZDX0RFQ19JTlBVVF9CVUZGRVIgTUZDRGVjSW5wdXRCdWZmZXJbTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYXTsKKyAgICBPTVhfVTMyICBpbmRleElucHV0QnVmZmVyOworfSBTRUNfSDI2NERFQ19IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50RGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjRkZWMvbGlicmFyeV9yZWdpc3Rlci5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjNkNjcyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgbGlicmFyeV9yZWdpc3Rlci5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgImxpYnJhcnlfcmVnaXN0ZXIuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqc2VjQ29tcG9uZW50cykKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoc2VjQ29tcG9uZW50cyA9PSBOVUxMKQorICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAvKiBjb21wb25lbnQgMSAtIHZpZGVvIGRlY29kZXIgSC4yNjQgKi8KKyAgICBTRUNfT1NBTF9TdHJjcHkoc2VjQ29tcG9uZW50c1swXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUMpOworICAgIFNFQ19PU0FMX1N0cmNweShzZWNDb21wb25lbnRzWzBdLT5yb2xlc1swXSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUNfUk9MRSk7CisgICAgc2VjQ29tcG9uZW50c1swXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL2gyNjRkZWMvbGlicmFyeV9yZWdpc3Rlci5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZmN2ExCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9oMjY0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuaApAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9IMjY0X1JFRworI2RlZmluZSBTRUNfT01YX0gyNjRfUkVHCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oIgorCisKKyNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZGVmaW5lIE1BWF9DT01QT05FTlRfTlVNICAgICAgIDEKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVF9ST0xFX05VTSAgMQorCisvKiBILjI2NCAqLworI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0RFQyAiT01YLlNFQy5BVkMuRGVjb2RlciIKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2NF9ERUNfUk9MRSAidmlkZW9fZGVjb2Rlci5hdmMiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqc2VjQ29tcG9uZW50cyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfTsKKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9BbmRyb2lkLm1rIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlN2QxZTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9NcGVnNGRlYy5jIFwKKwlsaWJyYXJ5X3JlZ2lzdGVyLmMKKworCitMT0NBTF9NT0RVTEUgOj0gbGliT01YLlNFQy5NNFYuRGVjb2RlcgorCitMT0NBTF9DRkxBR1MgOj0KKworTE9DQUxfQVJNX01PREUgOj0gYXJtCisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGliU0VDX09NWF9WZGVjIGxpYnNlY29zYWwgbGlic2VjYmFzZWNvbXBvbmVudCBcCisJCQkJCQlsaWJzZWNtZmNkZWNhcGkgbGlic2VjY3NjCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmMgbGliZGwgbGliY3V0aWxzIGxpYnV0aWxzIGxpYnVpIGxpYmhhcmR3YXJlCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbCBcCisJJChTRUNfT01YX1RPUCkvc2VjX29teF9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYworCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoU0VDX09NWF9UT1ApL3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL1NFQ19PTVhfTXBlZzRkZWMuYyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9kZWMvbXBlZzRkZWMvU0VDX09NWF9NcGVnNGRlYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjc5ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL1NFQ19PTVhfTXBlZzRkZWMuYwpAQCAtMCwwICsxLDE2NTIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgIFNFQ19PTVhfTXBlZzRkZWMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZGVjLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfTXBlZzRkZWMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKyNpbmNsdWRlICJjb2xvcl9zcGFjZV9jb252ZXJ0b3IuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX01QRUc0X0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworLy8jZGVmaW5lIEZVTExfRlJBTUVfU0VBUkNICisKKy8qIE1QRUc0IERlY29kZXIgU3VwcG9ydGVkIExldmVscyAmIHByb2ZpbGVzICovCitTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCBzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDB9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0YX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDBifSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDR9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNX19OworCisvKiBILjI2MyBEZWNvZGVyIFN1cHBvcnRlZCBMZXZlbHMgJiBwcm9maWxlcyAqLworU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHNbXSA9IHsKKyAgICAvKiBCYXNlbGluZSAoUHJvZmlsZSAwKSAqLworICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDEwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwyMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMzB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDQwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw0NX0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNTB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDYwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw3MH0sCisgICAgLyogUHJvZmlsZSAxICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwxMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwyMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw0MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw0NX0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw2MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUgzMjBDb2RpbmcsIE9NWF9WSURFT19IMjYzTGV2ZWw3MH0sCisgICAgLyogUHJvZmlsZSAyICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDEwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsMjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDQwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsNDV9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSwgT01YX1ZJREVPX0gyNjNMZXZlbDYwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFja3dhcmRDb21wYXRpYmxlLCBPTVhfVklERU9fSDI2M0xldmVsNzB9LAorICAgIC8qIFByb2ZpbGUgMywgcmVzdHJpY3RlZCB1cCB0byBTRCByZXNvbHV0aW9uICovCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsMTB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDIwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsNDB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDQ1fSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyLCBPTVhfVklERU9fSDI2M0xldmVsNjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVJU1dWMiwgT01YX1ZJREVPX0gyNjNMZXZlbDcwfX07CisKK3N0YXRpYyBPTVhfSEFORExFVFlQRSBnaE1GQ0hhbmRsZSA9IE5VTEw7CitzdGF0aWMgT01YX0JPT0wgZ2JGSU1WMSA9IE9NWF9GQUxTRTsKKworc3RhdGljIGludCBDaGVja19NcGVnNF9GcmFtZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBidWZmU2l6ZSwgT01YX1UzMiBmbGFnLCBPTVhfQk9PTCBiUHJldmlvdXNGcmFtZUVPRiwgT01YX0JPT0wgKnBiRW5kT2ZGcmFtZSkKK3sKKyAgICBpbnQgbGVuLCByZWFkU3RyZWFtOworICAgIHVuc2lnbmVkIHN0YXJ0Q29kZTsKKyAgICBPTVhfQk9PTCBiRnJhbWVTdGFydDsKKworICAgIGxlbiA9IDA7CisgICAgYkZyYW1lU3RhcnQgPSBPTVhfRkFMU0U7CisKKyAgICBpZiAoZmxhZyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSB7CisgICAgICAgIGlmICgqcElucHV0U3RyZWFtID09IDB4MDMpIHsgLyogRklNVjEgKi8KKyAgICAgICAgICAgIGlmIChnaE1GQ0hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQml0bWFwSW5mb0hociAqcEluZm9IZWFkZXI7CisgICAgICAgICAgICAgICAgU1NCU0lQX01GQ19JTUdfUkVTT0xVVElPTiBpbWdSZXNvbHV0aW9uOworCisgICAgICAgICAgICAgICAgcEluZm9IZWFkZXIgPSAoQml0bWFwSW5mb0hociAqKShwSW5wdXRTdHJlYW0gKyAxKTsKKyAgICAgICAgICAgICAgICBpbWdSZXNvbHV0aW9uLndpZHRoID0gcEluZm9IZWFkZXItPkJpV2lkdGg7CisgICAgICAgICAgICAgICAgaW1nUmVzb2x1dGlvbi5oZWlnaHQgPSBwSW5mb0hlYWRlci0+QmlIZWlnaHQ7CisgICAgICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKGdoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRklNVjFfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2x1dGlvbik7CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIndpZHRoKCVkKSwgaGVpZ2h0KCVkKSIsIGltZ1Jlc29sdXRpb24ud2lkdGgsIGltZ1Jlc29sdXRpb24uaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBnYkZJTVYxID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldHVybiBidWZmU2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnYkZJTVYxKSB7CisgICAgICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfVFJVRTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZTaXplOworICAgIH0KKworICAgIGlmIChiUHJldmlvdXNGcmFtZUVPRiA9PSBPTVhfRkFMU0UpCisgICAgICAgIGJGcmFtZVN0YXJ0ID0gT01YX1RSVUU7CisKKyAgICBzdGFydENvZGUgPSAweEZGRkZGRkZGOworICAgIGlmIChiRnJhbWVTdGFydCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgLyogZmluZCBWT1Agc3RhcnQgY29kZSAqLworICAgICAgICB3aGlsZShzdGFydENvZGUgIT0gMHgxQjYpIHsKKyAgICAgICAgICAgIHJlYWRTdHJlYW0gPSAqKHBJbnB1dFN0cmVhbSArIGxlbik7CisgICAgICAgICAgICBzdGFydENvZGUgPSAoc3RhcnRDb2RlIDw8IDgpIHwgcmVhZFN0cmVhbTsKKyAgICAgICAgICAgIGxlbisrOworICAgICAgICAgICAgaWYgKGxlbiA+IGJ1ZmZTaXplKQorICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIGZpbmQgbmV4dCBWT1Agc3RhcnQgY29kZSAqLworICAgIHN0YXJ0Q29kZSA9IDB4RkZGRkZGRkY7CisgICAgd2hpbGUgKChzdGFydENvZGUgIT0gMHgxQjYpKSB7CisgICAgICAgIHJlYWRTdHJlYW0gPSAqKHBJbnB1dFN0cmVhbSArIGxlbik7CisgICAgICAgIHN0YXJ0Q29kZSA9IChzdGFydENvZGUgPDwgOCkgfCByZWFkU3RyZWFtOworICAgICAgICBsZW4rKzsKKyAgICAgICAgaWYgKGxlbiA+IGJ1ZmZTaXplKQorICAgICAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfVFJVRTsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiMS4gQ2hlY2tfTXBlZzRfRnJhbWUgcmV0dXJuZWQgRU9GID0gJWQsIGxlbiA9ICVkLCBidWZmU2l6ZSA9ICVkIiwgKnBiRW5kT2ZGcmFtZSwgbGVuIC0gNCwgYnVmZlNpemUpOworCisgICAgcmV0dXJuIGxlbiAtIDQ7CisKK0VYSVQgOgorICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfRkFMU0U7CisKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIjIuIENoZWNrX01wZWc0X0ZyYW1lIHJldHVybmVkIEVPRiA9ICVkLCBsZW4gPSAlZCwgYnVmZlNpemUgPSAlZCIsICpwYkVuZE9mRnJhbWUsIGxlbiAtIDEsIGJ1ZmZTaXplKTsKKworICAgIHJldHVybiAtLWxlbjsKK30KKworc3RhdGljIGludCBDaGVja19IMjYzX0ZyYW1lKE9NWF9VOCAqcElucHV0U3RyZWFtLCBPTVhfVTMyIGJ1ZmZTaXplLCBPTVhfVTMyIGZsYWcsIE9NWF9CT09MIGJQcmV2aW91c0ZyYW1lRU9GLCBPTVhfQk9PTCAqcGJFbmRPZkZyYW1lKQoreworICAgIGludCBsZW4sIHJlYWRTdHJlYW07CisgICAgdW5zaWduZWQgc3RhcnRDb2RlOworICAgIE9NWF9CT09MIGJGcmFtZVN0YXJ0ID0gMDsKKyAgICB1bnNpZ25lZCBwVHlwZU1hc2sgPSAweDAzOworICAgIHVuc2lnbmVkIHBUeXBlID0gMDsKKworICAgIGxlbiA9IDA7CisgICAgYkZyYW1lU3RhcnQgPSBPTVhfRkFMU0U7CisKKyAgICBpZiAoYlByZXZpb3VzRnJhbWVFT0YgPT0gT01YX0ZBTFNFKQorICAgICAgICBiRnJhbWVTdGFydCA9IE9NWF9UUlVFOworCisgICAgc3RhcnRDb2RlID0gMHhGRkZGRkZGRjsKKyAgICBpZiAoYkZyYW1lU3RhcnQgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIC8qIGZpbmQgUFNDKFBpY3R1cmUgU3RhcnQgQ29kZSkgOiAwMDAwIDAwMDAgMDAwMCAwMDAwIDEwMDAgMDAgKi8KKyAgICAgICAgd2hpbGUgKCgoc3RhcnRDb2RlIDw8IDggPj4gMTApICE9IDB4MjApIHx8IChwVHlwZSAhPSAweDAyKSkgeworICAgICAgICAgICAgcmVhZFN0cmVhbSA9ICoocElucHV0U3RyZWFtICsgbGVuKTsKKyAgICAgICAgICAgIHN0YXJ0Q29kZSA9IChzdGFydENvZGUgPDwgOCkgfCByZWFkU3RyZWFtOworCisgICAgICAgICAgICByZWFkU3RyZWFtID0gKihwSW5wdXRTdHJlYW0gKyBsZW4gKyAxKTsKKyAgICAgICAgICAgIHBUeXBlID0gcmVhZFN0cmVhbSAmIHBUeXBlTWFzazsKKworICAgICAgICAgICAgbGVuKys7CisgICAgICAgICAgICBpZiAobGVuID4gYnVmZlNpemUpCisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZmluZCBuZXh0IFBTQyAqLworICAgIHN0YXJ0Q29kZSA9IDB4RkZGRkZGRkY7CisgICAgcFR5cGUgPSAwOworICAgIHdoaWxlICgoKHN0YXJ0Q29kZSA8PCA4ID4+IDEwKSAhPSAweDIwKSB8fCAocFR5cGUgIT0gMHgwMikpIHsKKyAgICAgICAgcmVhZFN0cmVhbSA9ICoocElucHV0U3RyZWFtICsgbGVuKTsKKyAgICAgICAgc3RhcnRDb2RlID0gKHN0YXJ0Q29kZSA8PCA4KSB8IHJlYWRTdHJlYW07CisKKyAgICAgICAgcmVhZFN0cmVhbSA9ICoocElucHV0U3RyZWFtICsgbGVuICsgMSk7CisgICAgICAgIHBUeXBlID0gcmVhZFN0cmVhbSAmIHBUeXBlTWFzazsKKworICAgICAgICBsZW4rKzsKKyAgICAgICAgaWYgKGxlbiA+IGJ1ZmZTaXplKQorICAgICAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgICpwYkVuZE9mRnJhbWUgPSBPTVhfVFJVRTsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiMS4gQ2hlY2tfSDI2M19GcmFtZSByZXR1cm5lZCBFT0YgPSAlZCwgbGVuID0gJWQsIGlCdWZmU2l6ZSA9ICVkIiwgKnBiRW5kT2ZGcmFtZSwgbGVuIC0gMywgYnVmZlNpemUpOworCisgICAgcmV0dXJuIGxlbiAtIDM7CisKK0VYSVQgOgorCisgICAgKnBiRW5kT2ZGcmFtZSA9IE9NWF9GQUxTRTsKKworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiMi4gQ2hlY2tfSDI2M19GcmFtZSByZXR1cm5lZCBFT0YgPSAlZCwgbGVuID0gJWQsIGlCdWZmU2l6ZSA9ICVkIiwgKnBiRW5kT2ZGcmFtZSwgbGVuIC0gMSwgYnVmZlNpemUpOworCisgICAgcmV0dXJuIC0tbGVuOworfQorCitPTVhfQk9PTCBDaGVja19TdHJlYW1fUHJlZml4Q29kZShPTVhfVTggKnBJbnB1dFN0cmVhbSwgT01YX1UzMiBzdHJlYW1TaXplLCBDT0RFQ19UWVBFIGNvZGVjVHlwZSkKK3sKKyAgICBzd2l0Y2ggKGNvZGVjVHlwZSkgeworICAgIGNhc2UgQ09ERUNfVFlQRV9NUEVHNDoKKyAgICAgICAgaWYgKGdiRklNVjEpIHsKKyAgICAgICAgICAgIHJldHVybiBPTVhfVFJVRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1TaXplIDwgMykgeworICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKChwSW5wdXRTdHJlYW1bMF0gPT0gMHgwMCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgKHBJbnB1dFN0cmVhbVsxXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAocElucHV0U3RyZWFtWzJdID09IDB4MDEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQ09ERUNfVFlQRV9IMjYzOgorICAgICAgICBpZiAoc3RyZWFtU2l6ZSA+IDApCisgICAgICAgICAgICByZXR1cm4gT01YX1RSVUU7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldHVybiBPTVhfRkFMU0U7CisgICAgZGVmYXVsdDoKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfV0FSTklORywgIiVzOiB1bmRlZmluZWQgY29kZWMgdHlwZSAoJWQpIiwgX19GVU5DVElPTl9fLCBjb2RlY1R5cGUpOworICAgICAgICByZXR1cm4gT01YX0ZBTFNFOworICAgIH0KK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX0dldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gICAgT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuUGFyYW1JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb01wZWc0OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcERzdE1wZWc0UGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKnBTcmNNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0TXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdE1wZWc0UGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY01wZWc0UGFyYW0gPSAmcE1wZWc0RGVjLT5tcGVnNENvbXBvbmVudFtwRHN0TXBlZzRQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RNcGVnNFBhcmFtLCBwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICpwRHN0SDI2M1BhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RIMjYzUGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdEgyNjNQYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwU3JjSDI2M1BhcmFtID0gJnBNcGVnNERlYy0+aDI2M0NvbXBvbmVudFtwRHN0SDI2M1BhcmFtLT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEgyNjNQYXJhbSwgcFNyY0gyNjNQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9TMzIgY29kZWNUeXBlOworICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBDb21wb25lbnRSb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGNvZGVjVHlwZSA9ICgoU0VDX01QRUc0X0hBTkRMRSAqKShwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICAgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KQorICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUNfUk9MRSk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUNfUk9MRSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwRHN0UHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgICAgICAgKnBQcm9maWxlTGV2ZWwgPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHJvZmlsZUxldmVsTnVtID0gMDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgY29kZWNUeXBlID0gKChTRUNfTVBFRzRfSEFORExFICopKHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwgPSBzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICBtYXhQcm9maWxlTGV2ZWxOdW0gPSBzaXplb2Yoc3VwcG9ydGVkTVBFRzRQcm9maWxlTGV2ZWxzKSAvIHNpemVvZihTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUHJvZmlsZUxldmVsID0gc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICBtYXhQcm9maWxlTGV2ZWxOdW0gPSBzaXplb2Yoc3VwcG9ydGVkSDI2M1Byb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4ID49IG1heFByb2ZpbGVMZXZlbE51bSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFByb2ZpbGVMZXZlbCArPSBwRHN0UHJvZmlsZUxldmVsLT5uUHJvZmlsZUluZGV4OworICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IHBQcm9maWxlTGV2ZWwtPnByb2ZpbGU7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBQcm9maWxlTGV2ZWwtPmxldmVsOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwRHN0UHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAgICAgICAgKnBTcmNNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICAgICAgICAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIGNvZGVjVHlwZSA9IHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICAgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICBwU3JjTXBlZzRQYXJhbSA9ICZwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W3BEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworICAgICAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwU3JjTXBlZzRQYXJhbS0+ZVByb2ZpbGU7CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwU3JjTXBlZzRQYXJhbS0+ZUxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNyY0gyNjNQYXJhbSA9ICZwTXBlZzREZWMtPmgyNjNDb21wb25lbnRbcERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IHBTcmNIMjYzUGFyYW0tPmVQcm9maWxlOworICAgICAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFNyY0gyNjNQYXJhbS0+ZUxldmVsOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9FcnJvckNvcnJlY3Rpb246CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSAoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBNcGVnNERlYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVEYXRhUGFydGl0aW9uaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJWTEM7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1ZpZGVvRGVjb2RlR2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5QYXJhbUluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX1NldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgbkluZGV4LAorICAgIE9NWF9JTiBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCB8fCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb01wZWc0OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcERzdE1wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICpwU3JjTXBlZzRQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNNcGVnNFBhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjTXBlZzRQYXJhbS0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0TXBlZzRQYXJhbSA9ICZwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W3BTcmNNcGVnNFBhcmFtLT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdE1wZWc0UGFyYW0sIHBTcmNNcGVnNFBhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvSDI2MzoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqcERzdEgyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqcFNyY0gyNjNQYXJhbSA9IChPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgKnBNcGVnNERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNIMjYzUGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdEgyNjNQYXJhbSA9ICZwTXBlZzREZWMtPmgyNjNDb21wb25lbnRbcFNyY0gyNjNQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RIMjYzUGFyYW0sIHBTcmNIMjYzUGFyYW0sIHNpemVvZihPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1TdGFuZGFyZENvbXBvbmVudFJvbGU6CisgICAgeworICAgICAgICBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKnBDb21wb25lbnRSb2xlID0gKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZVdhaXRGb3JSZXNvdXJjZXMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghU0VDX09TQUxfU3RyY21wKChjaGFyKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0RFQ19ST0xFKSkgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF0ucG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKKyAgICAgICAgICAgIC8vKChTRUNfTVBFRzRfSEFORExFICopKHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID0gQ09ERUNfVFlQRV9NUEVHNDsKKyAgICAgICAgfSBlbHNlIGlmICghU0VDX09TQUxfU3RyY21wKChjaGFyKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDX1JPTEUpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgICAgICAvLygoU0VDX01QRUc0X0hBTkRMRSAqKShwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9IENPREVDX1RZUEVfSDI2MzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcFBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwUG9ydERlZmluaXRpb24tPm5Qb3J0SW5kZXg7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgICAgKnBTRUNQb3J0OworICAgICAgICBPTVhfVTMyIHdpZHRoLCBoZWlnaHQsIHNpemU7CisKKyAgICAgICAgaWYgKHBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwUG9ydERlZmluaXRpb24sIHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsKKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBQb3J0RGVmaW5pdGlvbi0+bkJ1ZmZlckNvdW50QWN0dWFsIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudE1pbikgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZwU0VDUG9ydC0+cG9ydERlZmluaXRpb24sIHBQb3J0RGVmaW5pdGlvbiwgcFBvcnREZWZpbml0aW9uLT5uU2l6ZSk7CisKKyAgICAgICAgd2lkdGggPSAoKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggKyAxNSkgJiAofjE1KSk7CisgICAgICAgIGhlaWdodCA9ICgocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgKyAxNSkgJiAofjE1KSk7CisgICAgICAgIHNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHNpemUgPiBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUpID8gc2l6ZSA6IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZTsKKworICAgICAgICBpZiAocG9ydEluZGV4ID09IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICAgICAgICAgIHN3aXRjaCAocFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3M6CisgICAgICAgICAgICBjYXNlIE9NWF9TRUNfQ09MT1JfRm9ybWF0QU5CWVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAod2lkdGggKiBoZWlnaHQgKiAzKSAvIDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiQ29sb3IgZm9ybWF0IGlzIG5vdCBzdXBwb3J0ISEgdXNlIGRlZmF1bHQgWVVWIHNpemUhISIpOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwU3JjUHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAgICAgICAgKnBEc3RNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICAgICAgICAgKnBEc3RIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAgICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisKKyAgICAgICAgaWYgKHBTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgY29kZWNUeXBlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUbyBkbzogQ2hlY2sgdmFsaWRpdHkgb2YgcHJvZmlsZSAmIGxldmVsIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBwRHN0TXBlZzRQYXJhbSA9ICZwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W3BTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworICAgICAgICAgICAgcERzdE1wZWc0UGFyYW0tPmVQcm9maWxlID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZVByb2ZpbGU7CisgICAgICAgICAgICBwRHN0TXBlZzRQYXJhbS0+ZUxldmVsID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZUxldmVsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFRvIGRvOiBDaGVjayB2YWxpZGl0eSBvZiBwcm9maWxlICYgbGV2ZWwgcGFyYW1ldGVycworICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIHBEc3RIMjYzUGFyYW0gPSAmcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W3BTcmNQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworICAgICAgICAgICAgcERzdEgyNjNQYXJhbS0+ZVByb2ZpbGUgPSBwU3JjUHJvZmlsZUxldmVsLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RIMjYzUGFyYW0tPmVMZXZlbCA9IHBTcmNQcm9maWxlTGV2ZWwtPmVMZXZlbDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUgKnBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gTlVMTDsKKyAgICAgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgICAgICAgICAgICAgKnBNcGVnNERlYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUG9ydEluZGV4ICE9IElOUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9ICZwTXBlZzREZWMtPmVycm9yQ29ycmVjdGlvblR5cGVbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZVNldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfU2V0Q29uZmlnKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZToKKyAgICB7CisgICAgICAgIFNFQ19NUEVHNF9IQU5ETEUgICpwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKworICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iVGh1bWJuYWlsTW9kZSA9ICooKE9NWF9CT09MICopcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSBTRUNfT01YX1NldENvbmZpZyhoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNERlY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9USFVNQk5BSUwpID09IDApIHsKKyAgICAgICAgU0VDX01QRUc0X0hBTkRMRSAqcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4VmVuZG9yVGh1bWJuYWlsTW9kZTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICB9IGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9BTkIpID09IDApIHsKKwkgICAgaWYgKGlzVHZPdXRFbmFibGVkKCkpIHsKKwkgICAgICAgIC8vIFNhbXN1bmcgbm9ybWFsbHkgcHVzaGVzIEhXLWRlY29kZWQgZnJhbWVzIHRvIHRoZSBUViBPdXQgZHJpdmVyCisJICAgICAgICAvLyBidXQgaXQncyBoYXJkIGZvciB1cyB0byBkbyB0aGF0IHdpdGhvdXQgc291cmNlLCBzbyByZXR1cm4gYW4gZXJyb3IKKwkgICAgICAgIC8vIGFuZCBsZXQgQW5kcm9pZCBmYWxsYmFjayB0byBzb2Z0d2FyZSBkZWNvZGluZworCSAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCSAgICAgICAgZ290byBFWElUOworCSAgICB9CisKKyAgICAgICAgKnBJbmRleFR5cGUgPSBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfUEFSQU1fR0VUX0FOQikgPT0gMCkgeworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleFBhcmFtR2V0QW5kcm9pZE5hdGl2ZUJ1ZmZlcjsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX1VTRV9BTkIpID09IDApIHsKKyAgICAgICAgKnBJbmRleFR5cGUgPSBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXI7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX0dldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNERlY19Db21wb25lbnRSb2xlRW51bSgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX09VVCBPTVhfVTggICAgICAgICpjUm9sZSwKKyAgICBPTVhfSU4gIE9NWF9VMzIgICAgICAgIG5JbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICBjb2RlY1R5cGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ICE9IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNIC0gMSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9Nb3JlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBjb2RlY1R5cGUgPSAoKFNFQ19NUEVHNF9IQU5ETEUgKikocFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKiljUm9sZSwgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDX1JPTEUpOworICAgIGVsc2UKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopY1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDX1JPTEUpOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfRGVjb2RlVGhyZWFkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfTVBFRzRfSEFORExFICAgICAgKnBNcGVnNERlYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisKKyAgICB3aGlsZSAocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlV2FpdChwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKworICAgICAgICBpZiAocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRGVjRXhlKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUsIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBJbml0ICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfSW5pdChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworICAgIE9NWF9QVFIgICAgICAgICAgICAgICAgcFN0cmVhbUJ1ZmZlciA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBwU3RyZWFtUGh5QnVmZmVyID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIE1GQyhNdWx0aSBGb3JtYXQgQ29kZWMpIGRlY29kZXIgYW5kIENNTShDb2RlYyBNZW1vcnkgTWFuYWdlbWVudCkgZHJpdmVyIG9wZW4gKi8KKyAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX3R5cGUgPSBDQUNIRTsKKyAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRGVjT3BlbigmYnVmX3R5cGUpOworICAgIGlmIChoTUZDSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGdoTUZDSGFuZGxlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSA9IGhNRkNIYW5kbGU7CisKKyAgICAvKiBBbGxvY2F0ZSBkZWNvZGVyJ3MgaW5wdXQgYnVmZmVyICovCisgICAgcFN0cmVhbUJ1ZmZlciA9IFNzYlNpcE1mY0RlY0dldEluQnVmKGhNRkNIYW5kbGUsICZwU3RyZWFtUGh5QnVmZmVyLCBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRSk7CisgICAgaWYgKHBTdHJlYW1CdWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHIgPSBwU3RyZWFtQnVmZmVyOworICAgIHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uUGh5QWRkciA9IHBTdHJlYW1QaHlCdWZmZXI7CisgICAgcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplID0gREVGQVVMVF9NRkNfSU5QVVRfQlVGRkVSX1NJWkU7CisgICAgcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5kYXRhU2l6ZSA9IDA7CisgICAgcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclsxXS5WaXJBZGRyID0gKHVuc2lnbmVkIGNoYXIgKilwU3RyZWFtQnVmZmVyICsgcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplOworICAgIHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMV0uUGh5QWRkciA9ICh1bnNpZ25lZCBjaGFyICopcFN0cmVhbVBoeUJ1ZmZlciArIHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uYnVmZmVyU2l6ZTsKKyAgICBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmJ1ZmZlclNpemUgPSBERUZBVUxUX01GQ19JTlBVVF9CVUZGRVJfU0laRTsKKyAgICBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzFdLmRhdGFTaXplID0gMDsKKyAgICBwTXBlZzREZWMtPmluZGV4SW5wdXRCdWZmZXIgPSAwOworCisgICAgcE1wZWc0RGVjLT5iRmlyc3RGcmFtZSA9IE9NWF9UUlVFOworCisgICAgcE1wZWc0RGVjLT5OQkRlY1RocmVhZC5iRXhpdERlY29kZVRocmVhZCA9IE9NWF9GQUxTRTsKKyAgICBwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gMDsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCYocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBNcGVnNERlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19EZWNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgfQorCisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciAgICA9IHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbMF0uVmlyQWRkcjsKKyAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5wTUZDU3RyZWFtUGh5QnVmZmVyID0gcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5QaHlBZGRyOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyWzBdLlZpckFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlclswXS5idWZmZXJTaXplOworCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgPSAwOworICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzREZWNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICpwTXBlZzREZWMgPSBOVUxMOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBoTUZDSGFuZGxlID0gcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZTsKKworICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBOVUxMOworICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1QaHlCdWZmZXIgPSBOVUxMOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmRhdGFCdWZmZXIgPSBOVUxMOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IDA7CisKKyAgICBpZiAocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5oTkJEZWNvZGVUaHJlYWQgIT0gTlVMTCkgeworICAgICAgICBwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmJFeGl0RGVjb2RlVGhyZWFkID0gT01YX1RSVUU7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocE1wZWc0RGVjLT5OQkRlY1RocmVhZC5oRGVjRnJhbWVTdGFydCk7CisgICAgICAgIFNFQ19PU0FMX1RocmVhZFRlcm1pbmF0ZShwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhOQkRlY29kZVRocmVhZCk7CisgICAgICAgIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQuaE5CRGVjb2RlVGhyZWFkID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVRlcm1pbmF0ZShwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZUVuZCk7CisgICAgICAgIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0ICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBNcGVnNERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lU3RhcnQpOworICAgICAgICBwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0ID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAoaE1GQ0hhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNzYlNpcE1mY0RlY0Nsb3NlKGhNRkNIYW5kbGUpOworICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNF9EZWNvZGUoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgICAqcE1wZWc0RGVjID0gKFNFQ19NUEVHNF9IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICAgaE1GQ0hhbmRsZSA9IHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGU7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICBTU0JTSVBfTUZDX0RFQ19PVVRQVVRfSU5GTyBvdXRwdXRJbmZvOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1ZhbHVlID0gMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICBidWZXaWR0aCA9IDA7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgYnVmSGVpZ2h0ID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgICAgICBvdXRwdXREYXRhVmFsaWQgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNTQlNJUF9NRkNfQ09ERUNfVFlQRSBNRkNDb2RlY1R5cGU7CisgICAgICAgIGlmIChwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgaWYgKGdiRklNVjEpCisgICAgICAgICAgICAgICAgTUZDQ29kZWNUeXBlID0gRklNVjFfREVDOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIE1GQ0NvZGVjVHlwZSA9IE1QRUc0X0RFQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE1GQ0NvZGVjVHlwZSA9IEgyNjNfREVDOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChvbmVGcmFtZVNpemUgPD0gMCkgJiYgKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIGV4dHJhIGJ1ZmZlciB0byBwcmV2ZW50IHRlYXJpbmcgKi8KKyAgICAgICAgY29uZmlnVmFsdWUgPSAwOworICAgICAgICBTc2JTaXBNZmNEZWNTZXRDb25maWcoaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0VYVFJBX0JVRkZFUl9OVU0sICZjb25maWdWYWx1ZSk7CisKKyAgICAgICAgLyogU2V0IG1wZWc0IGRlYmxvY2tpbmcgZmlsdGVyIGVuYWJsZSAqLworICAgICAgICBjb25maWdWYWx1ZSA9IDE7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfUE9TVF9FTkFCTEUsICZjb25maWdWYWx1ZSk7CisKKyAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmJUaHVtYm5haWxNb2RlID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBjb25maWdWYWx1ZSA9IDE7ICAgIC8vIHRoZSBudW1iZXIgdGhhdCB5b3Ugd2FudCB0byBkZWxheQorICAgICAgICAgICAgU3NiU2lwTWZjRGVjU2V0Q29uZmlnKGhNRkNIYW5kbGUsIE1GQ19ERUNfU0VUQ09ORl9ESVNQTEFZX0RFTEFZLCAmY29uZmlnVmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNEZWNJbml0KGhNRkNIYW5kbGUsIE1GQ0NvZGVjVHlwZSwgb25lRnJhbWVTaXplKTsKKyAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIFNTQlNJUF9NRkNfSU1HX1JFU09MVVRJT04gaW1nUmVzb2w7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgICAgICBpZiAoU3NiU2lwTWZjRGVjR2V0Q29uZmlnKGhNRkNIYW5kbGUsIE1GQ19ERUNfR0VUQ09ORl9CVUZfV0lEVEhfSEVJR0hULCAmaW1nUmVzb2wpICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0RlY0dldENvbmZpZyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIFVwZGF0ZSBGcmFtZSBTaXplICoqLworICAgICAgICAgICAgaWYgKChwSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggIT0gaW1nUmVzb2wud2lkdGgpIHx8CisgICAgICAgICAgICAgICAgKHBJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0gaW1nUmVzb2wuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIC8qIGNoYW5nZSB3aWR0aCBhbmQgaGVpZ2h0IGluZm9ybWF0aW9uICovCisgICAgICAgICAgICAgICAgcElucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gaW1nUmVzb2wud2lkdGg7CisgICAgICAgICAgICAgICAgcElucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IGltZ1Jlc29sLmhlaWdodDsKKyAgICAgICAgICAgICAgICBwSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSAgICAgID0gKChpbWdSZXNvbC53aWR0aCArIDE1KSAmICh+MTUpKTsKKyAgICAgICAgICAgICAgICBwSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gKChpbWdSZXNvbC5oZWlnaHQgKyAxNSkgJiAofjE1KSk7CisKKyAgICAgICAgICAgICAgICBTRUNfVXBkYXRlRnJhbWVTaXplKHBPTVhDb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgLyogU2VuZCBQb3J0IFNldHRpbmdzIGNoYW5nZWQgY2FsbCBiYWNrICovCisgICAgICAgICAgICAgICAgKCoocFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvLyBUaGUgY29tbWFuZCB3YXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgIE9NWF9EaXJPdXRwdXQsIC8vIFRoaXMgaXMgdGhlIHBvcnQgaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibkZyYW1lV2lkdGgoJWQpIG5GcmFtZUhlaWdodCglZCksIG5TdHJpZGUoJWQpLCBuU2xpY2VIZWlnaHQoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgcElucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLCAgcElucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgcElucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUsIHBJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQpOworCisgICAgICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9UUlVFOworICAgICAgICAgICAgaWYgKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gMDsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTc2JTaXBNZmNEZWNJbml0IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JNRkNJbml0OyAgICAvKiBPTVhfRXJyb3JVbmRlZmluZWQgKi8KKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworI2lmbmRlZiBGVUxMX0ZSQU1FX1NFQVJDSAorICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID09IE9NWF9GQUxTRSkpCisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisjZW5kaWYKKworICAgIHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcF0gPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgcFNFQ0NvbXBvbmVudC0+bkZsYWdzW3BNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgIGlmICgocE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPT0gTUZDX1JFVF9PSykgJiYKKyAgICAgICAgKHBNcGVnNERlYy0+YkZpcnN0RnJhbWUgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBTU0JTSVBfTUZDX0RFQ19PVVRCVUZfU1RBVFVTIHN0YXR1czsKKyAgICAgICAgT01YX1MzMiBpbmRleFRpbWVzdGFtcCA9IDA7CisKKyAgICAgICAgLyogd2FpdCBmb3IgbWZjIGRlY29kZSBkb25lICovCisgICAgICAgIGlmIChwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmJEZWNvZGVyUnVuID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBNcGVnNERlYy0+TkJEZWNUaHJlYWQuaERlY0ZyYW1lRW5kKTsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQuYkRlY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBTc2JTaXBNZmNEZWNHZXRPdXRCdWYoaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBidWZXaWR0aCA9ICAob3V0cHV0SW5mby5pbWdfd2lkdGggKyAxNSkgJiAofjE1KTsKKyAgICAgICAgYnVmSGVpZ2h0ID0gIChvdXRwdXRJbmZvLmltZ19oZWlnaHQgKyAxNSkgJiAofjE1KTsKKworICAgICAgICBpZiAoKFNzYlNpcE1mY0RlY0dldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX0dFVENPTkZfRlJBTUVfVEFHLCAmaW5kZXhUaW1lc3RhbXApICE9IE1GQ19SRVRfT0spIHx8CisgICAgICAgICAgICAoKChpbmRleFRpbWVzdGFtcCA8IDApIHx8IChpbmRleFRpbWVzdGFtcCA+PSBNQVhfVElNRVNUQU1QKSkpKSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IChwSW5wdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcFtpbmRleFRpbWVzdGFtcF07CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcFNFQ0NvbXBvbmVudC0+bkZsYWdzW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInRpbWVzdGFtcCAlbGxkIHVzICglLjJmIHNlY3MpIiwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCwgcE91dHB1dERhdGEtPnRpbWVTdGFtcCAvIDFFNik7CisKKyAgICAgICAgaWYgKChzdGF0dXMgPT0gTUZDX0dFVE9VVEJVRl9ESVNQTEFZX0RFQ09ESU5HKSB8fAorICAgICAgICAgICAgKHN0YXR1cyA9PSBNRkNfR0VUT1VUQlVGX0RJU1BMQVlfT05MWSkpIHsKKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICB9CisgICAgICAgIGlmIChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgb3V0cHV0RGF0YVZhbGlkID0gT01YX0ZBTFNFOworCisgICAgICAgIGlmICgoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfRElTUExBWV9PTkxZKSB8fAorICAgICAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSkKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKworICAgICAgICBpZiAoc3RhdHVzID09IE1GQ19HRVRPVVRCVUZfREVDT0RJTkdfT05MWSkgeworICAgICAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAgICAgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8IChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkpKSB7CisgICAgICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisjaWZkZWYgRlVMTF9GUkFNRV9TRUFSQ0gKKyAgICAgICAgaWYgKCgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpICYmCisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSkgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQ7CisgICAgICAgIH0gZWxzZQorI2VuZGlmCisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIC8vY29uZmlnVmFsdWUgPSAxOworICAgICAgICAgICAgLy9Tc2JTaXBNZmNEZWNTZXRDb25maWcocE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSwgTUZDX0RFQ19TRVRDT05GX0lTX0xBU1RfRlJBTUUsICZjb25maWdWYWx1ZSk7CisgICAgICAgICAgICBwSW5wdXREYXRhLT5uRmxhZ3MgPSAocE91dHB1dERhdGEtPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9IGVsc2UgaWYgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgaWYgKChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpIHx8CisgICAgICAgICAgICAocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19FT1M7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBNcGVnNERlYy0+YkZpcnN0RnJhbWUgPT0gT01YX1RSVUUpICYmCisgICAgICAgICAgICAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwSW5wdXREYXRhLT5uRmxhZ3MgfCBPTVhfQlVGRkVSRkxBR19FT1MpOworICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgfQorCisgICAgICAgIG91dHB1dERhdGFWYWxpZCA9IE9NWF9GQUxTRTsKKworICAgICAgICAvKiByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7ICovCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKworICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0KSB7CisgICAgICAgIHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyXS5kYXRhU2l6ZSA9IG9uZUZyYW1lU2l6ZTsKKyAgICAgICAgcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwTXBlZzREZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyXS5idWZmZXJTaXplOworICAgICAgICBvbmVGcmFtZVNpemUgPSBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemU7CisgICAgICAgIC8vcElucHV0RGF0YS0+ZGF0YUxlbiA9IG9uZUZyYW1lU2l6ZTsKKyAgICAgICAgLy9wSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gb25lRnJhbWVTaXplOworICAgIH0KKworICAgIGlmICgoQ2hlY2tfU3RyZWFtX1ByZWZpeENvZGUocElucHV0RGF0YS0+ZGF0YUJ1ZmZlciwgcElucHV0RGF0YS0+ZGF0YUxlbiwgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlKSA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSAhPSBPTVhfQlVGRkVSRkxBR19FT1MpKSB7CisgICAgICAgIFNzYlNpcE1mY0RlY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfREVDX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKys7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wICU9IE1BWF9USU1FU1RBTVA7CisKKyAgICAgICAgU3NiU2lwTWZjRGVjU2V0SW5CdWYocE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplKTsKKworICAgICAgICBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uZGF0YVNpemUgPSBvbmVGcmFtZVNpemU7CisgICAgICAgIHBNcGVnNERlYy0+TkJEZWNUaHJlYWQub25lRnJhbWVTaXplID0gb25lRnJhbWVTaXplOworCisgICAgICAgIC8qIG1mYyBkZWNvZGUgc3RhcnQgKi8KKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwTXBlZzREZWMtPk5CRGVjVGhyZWFkLmhEZWNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcE1wZWc0RGVjLT5OQkRlY1RocmVhZC5iRGVjb2RlclJ1biA9IE9NWF9UUlVFOworICAgICAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisKKyAgICAgICAgcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyKys7CisgICAgICAgIHBNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLnBNRkNTdHJlYW1CdWZmZXIgICAgPSBwTXBlZzREZWMtPk1GQ0RlY0lucHV0QnVmZmVyW3BNcGVnNERlYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uVmlyQWRkcjsKKyAgICAgICAgcE1wZWc0RGVjLT5oTUZDTXBlZzRIYW5kbGUucE1GQ1N0cmVhbVBoeUJ1ZmZlciA9IHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyXS5QaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gcE1wZWc0RGVjLT5NRkNEZWNJbnB1dEJ1ZmZlcltwTXBlZzREZWMtPmluZGV4SW5wdXRCdWZmZXJdLlZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLmFsbG9jU2l6ZSA9IHBNcGVnNERlYy0+TUZDRGVjSW5wdXRCdWZmZXJbcE1wZWc0RGVjLT5pbmRleElucHV0QnVmZmVyXS5idWZmZXJTaXplOworICAgICAgICBpZiAoKChwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5iVGh1bWJuYWlsTW9kZSA9PSBPTVhfVFJVRSkgfHwgKHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9PSBPTVhfVFJVRSkpICYmCisgICAgICAgICAgICAocE1wZWc0RGVjLT5iRmlyc3RGcmFtZSA9PSBPTVhfVFJVRSkgJiYKKyAgICAgICAgICAgIChvdXRwdXREYXRhVmFsaWQgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRGVjb2RlWWV0OworICAgICAgICB9CisgICAgICAgIHBNcGVnNERlYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisgICAgfQorCisgICAgLyoqIEZpbGwgT3V0cHV0IEJ1ZmZlciAqKi8KKyAgICBpZiAob3V0cHV0RGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgdm9pZCAqcE91dHB1dEJ1ZlszXTsKKworICAgICAgICBpbnQgZnJhbWVTaXplID0gYnVmV2lkdGggKiBidWZIZWlnaHQ7CisgICAgICAgIGludCBpbWFnZVNpemUgPSBvdXRwdXRJbmZvLmltZ193aWR0aCAqIG91dHB1dEluZm8uaW1nX2hlaWdodDsKKworICAgICAgICBpbnQgYWN0dWFsV2lkdGggID0gb3V0cHV0SW5mby5pbWdfd2lkdGg7CisgICAgICAgIGludCBhY3R1YWxIZWlnaHQgPSBvdXRwdXRJbmZvLmltZ19oZWlnaHQ7CisgICAgICAgIGludCBhY3R1YWxJbWFnZVNpemUgPSBpbWFnZVNpemU7CisKKyAgICAgICAgcE91dHB1dEJ1ZlswXSA9ICh2b2lkICopcE91dHB1dERhdGEtPmRhdGFCdWZmZXI7CisgICAgICAgIHBPdXRwdXRCdWZbMV0gPSAodm9pZCAqKXBPdXRwdXREYXRhLT5kYXRhQnVmZmVyICsgYWN0dWFsSW1hZ2VTaXplOworICAgICAgICBwT3V0cHV0QnVmWzJdID0gKHZvaWQgKilwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciArICgoYWN0dWFsSW1hZ2VTaXplICogNSkgLyA0KTsKKworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgICAgICBpZiAocFNFQ091dHB1dFBvcnQtPmJVc2VBbmRyb2lkTmF0aXZlQnVmZmVyID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBPTVhfVTMyIHJldEFOQiA9IDA7CisgICAgICAgICAgICB2b2lkICpwVmlyQWRkcnNbMl07CisgICAgICAgICAgICBhY3R1YWxXaWR0aCAgPSAob3V0cHV0SW5mby5pbWdfd2lkdGggKyAxNSkgJiAofjE1KTsKKyAgICAgICAgICAgIGFjdHVhbEltYWdlU2l6ZSA9IGFjdHVhbFdpZHRoICogYWN0dWFsSGVpZ2h0OworCisgICAgICAgICAgICAgcmV0QU5CID0gZ2V0VkFERFJmcm9tQU5CKHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKXBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX1UzMilwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWaXJBZGRycyk7CisgICAgICAgICAgICBpZiAocmV0QU5CICE9IDApIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkVycm9yIGdldFZBRERSZnJvbUFOQiwgRXJyb3IgY29kZTolZCIsIHJldEFOQik7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yT3ZlcmZsb3c7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcE91dHB1dEJ1ZlswXSA9IHBWaXJBZGRyc1swXTsKKyAgICAgICAgICAgIHBPdXRwdXRCdWZbMV0gPSBwVmlyQWRkcnNbMV07CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoKHBNcGVnNERlYy0+aE1GQ01wZWc0SGFuZGxlLmJUaHVtYm5haWxNb2RlID09IE9NWF9GQUxTRSkgJiYKKyAgICAgICAgICAgIChwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogaWYgdXNlIFBvc3QgY29weSBhZGRyZXNzIHN0cnVjdHVyZSAqLworICAgICAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBPdXRwdXRCdWZbMF0sICZmcmFtZVNpemUsIHNpemVvZihmcmFtZVNpemUpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShwT3V0cHV0QnVmWzBdICsgc2l6ZW9mKGZyYW1lU2l6ZSksICYob3V0cHV0SW5mby5ZUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLllQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocE91dHB1dEJ1ZlswXSArIHNpemVvZihmcmFtZVNpemUpICsgKHNpemVvZih2b2lkICopICogMSksICYob3V0cHV0SW5mby5DUGh5QWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNQaHlBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocE91dHB1dEJ1ZlswXSArIHNpemVvZihmcmFtZVNpemUpICsgKHNpemVvZih2b2lkICopICogMiksICYob3V0cHV0SW5mby5ZVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLllWaXJBZGRyKSk7CisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkocE91dHB1dEJ1ZlswXSArIHNpemVvZihmcmFtZVNpemUpICsgKHNpemVvZih2b2lkICopICogMyksICYob3V0cHV0SW5mby5DVmlyQWRkciksIHNpemVvZihvdXRwdXRJbmZvLkNWaXJBZGRyKSk7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IChidWZXaWR0aCAqIGJ1ZkhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN3aXRjaCAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIllVVjQyMFAgb3V0Iik7CisgICAgICAgICAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcigKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmWzBdLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKW91dHB1dEluZm8uWVZpckFkZHIsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQpOworICAgICAgICAgICAgICAgIGNzY190aWxlZF90b19saW5lYXJfZGVpbnRlcmxlYXZlKAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKXBPdXRwdXRCdWZbMV0sCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZlsyXSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilvdXRwdXRJbmZvLkNWaXJBZGRyLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID4+IDEpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gYWN0dWFsSW1hZ2VTaXplICogMyAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICAgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiWVVWNDIwU1Agb3V0Iik7CisgICAgICAgICAgICAgICAgY3NjX3RpbGVkX3RvX2xpbmVhcigKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilwT3V0cHV0QnVmWzBdLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgY2hhciAqKW91dHB1dEluZm8uWVZpckFkZHIsCisgICAgICAgICAgICAgICAgICAgIGFjdHVhbFdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxIZWlnaHQpOworICAgICAgICAgICAgICAgIGNzY190aWxlZF90b19saW5lYXIoCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBjaGFyICopcE91dHB1dEJ1ZlsxXSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGNoYXIgKilvdXRwdXRJbmZvLkNWaXJBZGRyLAorICAgICAgICAgICAgICAgICAgICBhY3R1YWxXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsSGVpZ2h0ID4+IDEpOworICAgICAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gYWN0dWFsSW1hZ2VTaXplICogMyAvIDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICAgICAgaWYgKHBTRUNPdXRwdXRQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9PSBPTVhfVFJVRSkKKyAgICAgICAgICAgIHB1dFZBRERSdG9BTkIocE91dHB1dERhdGEtPmRhdGFCdWZmZXIpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIERlY29kZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RGVjX2J1ZmZlclByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX01QRUc0X0hBTkRMRSAgICAgICAgKnBNcGVnNERlYyA9IChTRUNfTVBFRzRfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICpwT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICAgIGJDaGVja1ByZWZpeCA9IE9NWF9GQUxTRTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoIUNIRUNLX1BPUlRfRU5BQkxFRChwSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX0VOQUJMRUQocE91dHB1dFBvcnQpKSB8fAorICAgICAgICAgICAgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwT3V0cHV0UG9ydCkpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKE9NWF9GQUxTRSA9PSBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX01GQ19NcGVnNF9EZWNvZGUocE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YURlY29kZVlldCkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCByZXQsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcElucHV0RGF0YS0+cHJldmlvdXNEYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gKz0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBJbnB1dERhdGEtPmRhdGFMZW4gLSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+ZGF0YUxlbiAtPSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPU0NMX0VYUE9SVF9SRUYgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudEluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1NUUklORyBjb21wb25lbnROYW1lKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfTVBFRzRfSEFORExFICAgICAgICAqcE1wZWc0RGVjID0gTlVMTDsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgY29kZWNUeXBlID0gLTE7CisgICAgaW50IGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKChoQ29tcG9uZW50ID09IE5VTEwpIHx8IChjb21wb25lbnROYW1lID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogcGFyYW1ldGVycyBhcmUgbnVsbCwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0RFQywgY29tcG9uZW50TmFtZSkgPT0gMCkgeworICAgICAgICBjb2RlY1R5cGUgPSBDT0RFQ19UWVBFX01QRUc0OworICAgIH0gZWxzZSBpZiAoU0VDX09TQUxfU3RyY21wKFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDLCBjb21wb25lbnROYW1lKSA9PSAwKSB7CisgICAgICAgIGNvZGVjVHlwZSA9IENPREVDX1RZUEVfSDI2MzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IGNvbXBvbmVudE5hbWUoJXMpIGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnRJbml0IGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29kZWNUeXBlID0gSFdfVklERU9fQ09ERUM7CisKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gKE9NWF9TVFJJTkcpU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRGVjb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IGNvbXBvbmVudE5hbWUgYWxsb2MgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSk7CisKKyAgICBwTXBlZzREZWMgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19NUEVHNF9IQU5ETEUpKTsKKyAgICBpZiAocE1wZWc0RGVjID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTRUNfTVBFRzRfSEFORExFIGFsbG9jIGVycm9yLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwTXBlZzREZWMsIDAsIHNpemVvZihTRUNfTVBFRzRfSEFORExFKSk7CisgICAgcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKXBNcGVnNERlYzsKKyAgICBwTXBlZzREZWMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPSBjb2RlY1R5cGU7CisKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUMpOworICAgIGVsc2UKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDKTsKKworICAgIC8qIFNldCBjb21wb25lbnRWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublN0ZXAgICAgICAgICA9IFNURVBfTlVNQkVSOworICAgIC8qIFNldCBzcGVjVmVyc2lvbiAqLworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1pbm9yID0gVkVSU0lPTk1JTk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5SZXZpc2lvbiAgICAgPSBSRVZJU0lPTl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisKKyAgICAvKiBBbmRyb2lkIENhcGFiaWxpdHlGbGFncyAqLworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pSXNPTVhDb21wb25lbnRNdWx0aVRocmVhZGVkICAgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYyAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxPdXRwdXRCdWZmZXJBbGxvYyA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNQYXJ0aWFsRnJhbWVzICAgICAgICAgICAgID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc05BTFN0YXJ0Q29kZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFVzZXNGdWxsQVZDRnJhbWVzICAgICAgICAgICAgICAgICA9IE9NWF9UUlVFOworCisgICAgLyogSW5wdXQgcG9ydCAqLworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX0lOUFVUX0JVRkZFUl9TSVpFOworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKKyAgICAgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgICAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJ2aWRlby9tcGVnNCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vaDI2MyIpOworICAgIH0KKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKTsKKyAgICAgICAgICAgIHBNcGVnNERlYy0+bXBlZzRDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgICAgICBwTXBlZzREZWMtPm1wZWc0Q29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOworICAgICAgICAgICAgcE1wZWc0RGVjLT5tcGVnNENvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX01QRUc0TGV2ZWwzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIElOSVRfU0VUX1NJWkVfVkVSU0lPTigmcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUpOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLm5Qb3J0SW5kZXggPSBpOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSB8IE9NWF9WSURFT19IMjYzUHJvZmlsZUlTV1YyOworICAgICAgICAgICAgcE1wZWc0RGVjLT5oMjYzQ29tcG9uZW50W2ldLmVMZXZlbCAgICAgPSBPTVhfVklERU9fSDI2M0xldmVsNDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50LT5HZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0dldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRQYXJhbWV0ZXIgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX1NldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0dldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5TZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX1NldENvbmZpZzsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRFeHRlbnNpb25JbmRleCA9ICZTRUNfTUZDX01wZWc0RGVjX0dldEV4dGVuc2lvbkluZGV4OworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFJvbGVFbnVtID0gJlNFQ19NRkNfTXBlZzREZWNfQ29tcG9uZW50Um9sZUVudW07CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0ICAgPSAmU0VDX09NWF9Db21wb25lbnREZWluaXQ7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudEluaXQgICAgICA9ICZTRUNfTUZDX01wZWc0RGVjX0luaXQ7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19jb21wb25lbnRUZXJtaW5hdGUgPSAmU0VDX01GQ19NcGVnNERlY19UZXJtaW5hdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzICAgICAgPSAmU0VDX01GQ19NcGVnNERlY19idWZmZXJQcm9jZXNzOworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSA9ICZDaGVja19NcGVnNF9GcmFtZTsKKyAgICBlbHNlCisgICAgICAgIHBTRUNDb21wb25lbnQtPnNlY19jaGVja0lucHV0RnJhbWUgPSAmQ2hlY2tfSDI2M19GcmFtZTsKKworICAgIHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9IE9NWF9TdGF0ZUxvYWRlZDsKKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnREZWluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19NUEVHNF9IQU5ETEUgICAgICAgICpwTXBlZzREZWMgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIFNFQ19PU0FMX0ZyZWUocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSk7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IE5VTEw7CisKKyAgICBwTXBlZzREZWMgPSAoU0VDX01QRUc0X0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBpZiAocE1wZWc0RGVjICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwTXBlZzREZWMpOworICAgICAgICBwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUgPSBOVUxMOworICAgIH0KKworICAgIHJldCA9IFNFQ19PTVhfVmlkZW9EZWNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9TRUNfT01YX01wZWc0ZGVjLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL1NFQ19PTVhfTXBlZzRkZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWYwNGUzCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9TRUNfT01YX01wZWc0ZGVjLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX01wZWc0ZGVjLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01QRUc0X0RFQ19DT01QT05FTlQKKyNkZWZpbmUgU0VDX09NWF9NUEVHNF9ERUNfQ09NUE9ORU5UCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKworCit0eXBlZGVmIGVudW0gX0NPREVDX1RZUEUKK3sKKyAgICBDT0RFQ19UWVBFX0gyNjMsCisgICAgQ09ERUNfVFlQRV9NUEVHNAorfSBDT0RFQ19UWVBFOworCisvKgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdGhlIHNhbWUgYXMgQml0bWFwSW5mb0hociBzdHJ1Y3QgaW4gcHZfYXZpZmlsZV90eXBlZGVmcy5oIGZpbGUKKyAqLwordHlwZWRlZiBzdHJ1Y3QgX0JpdG1hcEluZm9IaHIKK3sKKyAgICBPTVhfVTMyICAgIEJpU2l6ZTsKKyAgICBPTVhfVTMyICAgIEJpV2lkdGg7CisgICAgT01YX1UzMiAgICBCaUhlaWdodDsKKyAgICBPTVhfVTE2ICAgIEJpUGxhbmVzOworICAgIE9NWF9VMTYgICAgQmlCaXRDb3VudDsKKyAgICBPTVhfVTMyICAgIEJpQ29tcHJlc3Npb247CisgICAgT01YX1UzMiAgICBCaVNpemVJbWFnZTsKKyAgICBPTVhfVTMyICAgIEJpWFBlbHNQZXJNZXRlcjsKKyAgICBPTVhfVTMyICAgIEJpWVBlbHNQZXJNZXRlcjsKKyAgICBPTVhfVTMyICAgIEJpQ2xyVXNlZDsKKyAgICBPTVhfVTMyICAgIEJpQ2xySW1wb3J0YW50OworfSBCaXRtYXBJbmZvSGhyOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19NUEVHNF9IQU5ETEUKK3sKKyAgICBPTVhfSEFORExFVFlQRSBoTUZDSGFuZGxlOworICAgIE9NWF9QVFIgICAgICAgIHBNRkNTdHJlYW1CdWZmZXI7CisgICAgT01YX1BUUiAgICAgICAgcE1GQ1N0cmVhbVBoeUJ1ZmZlcjsKKyAgICBPTVhfVTMyICAgICAgICBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCAgICAgICBiQ29uZmlndXJlZE1GQzsKKyAgICBPTVhfQk9PTCAgICAgICBiVGh1bWJuYWlsTW9kZTsKKyAgICBDT0RFQ19UWVBFICAgICBjb2RlY1R5cGU7CisgICAgT01YX1MzMiAgICAgICAgcmV0dXJuQ29kZWM7Cit9IFNFQ19NRkNfTVBFRzRfSEFORExFOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01QRUc0X0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgaDI2M0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgbXBlZzRDb21wb25lbnRbQUxMX1BPUlRfTlVNXTsKKyAgICBPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSBlcnJvckNvcnJlY3Rpb25UeXBlW0FMTF9QT1JUX05VTV07CisKKyAgICAvKiBTRUMgTUZDIENvZGVjIHNwZWNpZmljICovCisgICAgU0VDX01GQ19NUEVHNF9IQU5ETEUgICAgICBoTUZDTXBlZzRIYW5kbGU7CisKKyAgICAvKiBGb3IgTm9uLUJsb2NrIG1vZGUgKi8KKyAgICBTRUNfTUZDX05CREVDX1RIUkVBRCBOQkRlY1RocmVhZDsKKyAgICBPTVhfQk9PTCBiRmlyc3RGcmFtZTsKKyAgICBNRkNfREVDX0lOUFVUX0JVRkZFUiBNRkNEZWNJbnB1dEJ1ZmZlcltNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVhdOworICAgIE9NWF9VMzIgIGluZGV4SW5wdXRCdWZmZXI7Cit9IFNFQ19NUEVHNF9IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9saWJyYXJ5X3JlZ2lzdGVyLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmQ4ZDM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9saWJyYXJ5X3JlZ2lzdGVyLmMKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBsaWJyYXJ5X3JlZ2lzdGVyLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorI2luY2x1ZGUgImxpYnJhcnlfcmVnaXN0ZXIuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX01QRUc0X0RFQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqcHBTRUNDb21wb25lbnQpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHBwU0VDQ29tcG9uZW50ID09IE5VTEwpCisgICAgICAgIGdvdG8gRVhJVDsKKworICAgIC8qIGNvbXBvbmVudCAxIC0gdmlkZW8gZGVjb2RlciBNUEVHNCAqLworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFswXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfTVBFRzRfREVDKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMF0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUNfUk9MRSk7CisgICAgcHBTRUNDb21wb25lbnRbMF0tPnRvdGFsUm9sZU51bSA9IE1BWF9DT01QT05FTlRfUk9MRV9OVU07CisKKyAgICAvKiBjb21wb25lbnQgMiAtIHZpZGVvIGRlY29kZXIgSC4yNjMgKi8KKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMV0tPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfREVDKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocHBTRUNDb21wb25lbnRbMV0tPnJvbGVzWzBdLCBTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0RFQ19ST0xFKTsKKyAgICBwcFNFQ0NvbXBvbmVudFsxXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworICAgIHJldHVybiBNQVhfQ09NUE9ORU5UX05VTTsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9saWJyYXJ5X3JlZ2lzdGVyLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZGVjL21wZWc0ZGVjL2xpYnJhcnlfcmVnaXN0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2U1YjljCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2RlYy9tcGVnNGRlYy9saWJyYXJ5X3JlZ2lzdGVyLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBsaWJyYXJ5X3JlZ2lzdGVyLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX01QRUc0X0RFQ19SRUcKKyNkZWZpbmUgU0VDX09NWF9NUEVHNF9ERUNfUkVHCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9Db21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oIgorCisKKyNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImRlZmF1bHQiKSkpCisjZGVmaW5lIE1BWF9DT01QT05FTlRfTlVNICAgICAgICAgICAgICAyCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gICAgMQorCisvKiBNUEVHNCAqLworI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUMgICAgICAgICAiT01YLlNFQy5NUEVHNC5EZWNvZGVyIgorI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9ERUNfUk9MRSAgICAidmlkZW9fZGVjb2Rlci5tcGVnNCIKKworLyogSC4yNjMgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2M19ERUMgICAgICAgICAgIk9NWC5TRUMuSDI2My5EZWNvZGVyIgorI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0RFQ19ST0xFICAgICAidmlkZW9fZGVjb2Rlci5oMjYzIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnBwU0VDQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL0FuZHJvaWQubWsgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE2NzFmOAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDIwIEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlTRUNfT01YX1ZlbmMuYworCitMT0NBTF9NT0RVTEUgOj0gbGliU0VDX09NWF9WZW5jCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbCBcCisJJChTRUNfT01YX1RPUCkvc2VjX29teF9jb3JlIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS9jb21tb24gXAorCSQoU0VDX09NWF9DT01QT05FTlQpL3ZpZGVvL2RlYworCitMT0NBTF9DX0lOQ0xVREVTICs9ICQoU0VDX09NWF9UT1ApL3NlY19jb2RlY3MvdmlkZW8vbWZjX2MxMTAvaW5jbHVkZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9TRUNfT01YX1ZlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWUzM2RlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9TRUNfT01YX1ZlbmMuYwpAQCAtMCwwICsxLDE0NjcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09NWF9WZW5jLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0V2ZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZW5jLmgiCisjaW5jbHVkZSAiU0VDX09NWF9CYXNlY29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisjaW5jbHVkZSAiY29sb3Jfc3BhY2VfY29udmVydG9yLmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19WSURFT19FTkMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworaW5saW5lIHZvaWQgU0VDX1VwZGF0ZUZyYW1lU2l6ZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmICgoc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoICE9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCkgfHwKKyAgICAgICAgKHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgIT0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCkpIHsKKyAgICAgICAgT01YX1UzMiB3aWR0aCA9IDAsIGhlaWdodCA9IDA7CisKKyAgICAgICAgc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgd2lkdGggPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9CisgICAgICAgICAgICBzZWNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU3RyaWRlOworICAgICAgICBoZWlnaHQgPSBzZWNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0KKyAgICAgICAgICAgIHNlY0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodDsKKworICAgICAgICBzd2l0Y2goc2VjT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0KQorICAgICAgICAgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAod2lkdGggJiYgaGVpZ2h0KQorICAgICAgICAgICAgICAgIHNlY091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gd2lkdGggKiBoZWlnaHQgKiAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgcmV0dXJuIDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1VzZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcywKKyAgICBPTVhfSU4gT01YX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpICAgIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W25Qb3J0SW5kZXhdOworICAgIGlmIChuUG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDUG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChwU0VDUG9ydCkgJiYgQ0hFQ0tfUE9SVF9CVUZGRVJfU1VQUExJRVIocFNFQ1BvcnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHRlbXBfYnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopU0VDX09TQUxfTWFsbG9jKHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworICAgIGlmICh0ZW1wX2J1ZmZlckhlYWRlciA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQodGVtcF9idWZmZXJIZWFkZXIsIDAsIHNpemVvZihPTVhfQlVGRkVSSEVBREVSVFlQRSkpOworCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPT0gQlVGRkVSX1NUQVRFX0ZSRUUpIHsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0gPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gKEJVRkZFUl9TVEFURV9BU1NJR05FRCB8IEhFQURFUl9TVEFURV9BTExPQ0FURUQpOworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKHRlbXBfYnVmZmVySGVhZGVyLCBPTVhfQlVGRkVSSEVBREVSVFlQRSk7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+cEJ1ZmZlciAgICAgICAgPSBwQnVmZmVyOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5BbGxvY0xlbiAgICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgICAgICA9IHBBcHBQcml2YXRlOworICAgICAgICAgICAgaWYgKG5Qb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bklucHV0UG9ydEluZGV4ID0gSU5QVVRfUE9SVF9JTkRFWDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bk91dHB1dFBvcnRJbmRleCA9IE9VVFBVVF9QT1JUX0lOREVYOworCisgICAgICAgICAgICBwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0rKzsKKyAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbCkgeworICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwU0VDUG9ydC0+bG9hZGVkUmVzb3VyY2UpOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcHBCdWZmZXJIZHIgPSB0ZW1wX2J1ZmZlckhlYWRlcjsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVySGVhZGVyKTsKKyAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9BbGxvY2F0ZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcykKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAqdGVtcF9idWZmZXIgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICAgICAgICAgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtuUG9ydEluZGV4XTsKKyAgICBpZiAoblBvcnRJbmRleCA+PSBwU0VDQ29tcG9uZW50LT5wb3J0UGFyYW0ublBvcnRzKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKy8qCisgICAgaWYgKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisqLworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgdGVtcF9idWZmZXIgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9VOCkgKiBuU2l6ZUJ5dGVzKTsKKyAgICBpZiAodGVtcF9idWZmZXIgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICB0ZW1wX2J1ZmZlckhlYWRlciA9IChPTVhfQlVGRkVSSEVBREVSVFlQRSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKyAgICBpZiAodGVtcF9idWZmZXJIZWFkZXIgPT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHRlbXBfYnVmZmVyKTsKKyAgICAgICAgdGVtcF9idWZmZXIgPSBOVUxMOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHRlbXBfYnVmZmVySGVhZGVyLCAwLCBzaXplb2YoT01YX0JVRkZFUkhFQURFUlRZUEUpKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsOyBpKyspIHsKKyAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID09IEJVRkZFUl9TVEFURV9GUkVFKSB7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9IChCVUZGRVJfU1RBVEVfQUxMT0NBVEVEIHwgSEVBREVSX1NUQVRFX0FMTE9DQVRFRCk7CisgICAgICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04odGVtcF9idWZmZXJIZWFkZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5wQnVmZmVyICAgICAgICA9IHRlbXBfYnVmZmVyOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPm5BbGxvY0xlbiAgICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgICAgICA9IHBBcHBQcml2YXRlOworICAgICAgICAgICAgaWYgKG5Qb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkKKyAgICAgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bklucHV0UG9ydEluZGV4ID0gSU5QVVRfUE9SVF9JTkRFWDsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bk91dHB1dFBvcnRJbmRleCA9IE9VVFBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtKys7CisgICAgICAgICAgICBpZiAocFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtID09IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4TG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocFNFQ1BvcnQtPmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleFVubG9jayhwU0VDQ29tcG9uZW50LT5jb21wTXV0ZXgpOyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnBwQnVmZmVyID0gdGVtcF9idWZmZXJIZWFkZXI7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlckhlYWRlcik7CisgICAgU0VDX09TQUxfRnJlZSh0ZW1wX2J1ZmZlcik7CisgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZUJ1ZmZlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX0JVRkZFUkhFQURFUlRZUEUgKnBCdWZmZXJIZHIpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKnRlbXBfYnVmZmVySGVhZGVyID0gTlVMTDsKKyAgICBPTVhfVTggICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W25Qb3J0SW5kZXhdOworCisgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQocFNFQ1BvcnQpICYmIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBTRUNQb3J0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlTG9hZGVkKSAmJiAocFNFQ1BvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJbnZhbGlkKSkgeworICAgICAgICAoKihwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIpKSAocE9NWENvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfVTMyKU9NWF9FdmVudEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9VMzIpT01YX0Vycm9yUG9ydFVucG9wdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCwgTlVMTCk7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWw7IGkrKykgeworICAgICAgICBpZiAoKChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSB8IEJVRkZFUl9TVEFURV9GUkVFKSAhPSAwKSAmJiAocFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSAhPSBOVUxMKSkgeworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0tPnBCdWZmZXIgPT0gcEJ1ZmZlckhkci0+cEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSAmIEJVRkZFUl9TVEFURV9BTExPQ0FURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXS0+cEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgIHBCdWZmZXJIZHItPnBCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gJiBCVUZGRVJfU1RBVEVfQVNTSUdORUQpIHsKKyAgICAgICAgICAgICAgICAgICAgOyAvKiBOb25lKi8KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPmFzc2lnbmVkQnVmZmVyTnVtLS07CisgICAgICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldICYgSEVBREVSX1NUQVRFX0FMTE9DQVRFRCkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBTRUNQb3J0LT5idWZmZXJIZWFkZXJbaV0pOworICAgICAgICAgICAgICAgICAgICBwU0VDUG9ydC0+YnVmZmVySGVhZGVyW2ldID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgcEJ1ZmZlckhkciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBTRUNQb3J0LT5idWZmZXJTdGF0ZUFsbG9jYXRlW2ldID0gQlVGRkVSX1NUQVRFX0ZSRUU7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YXNzaWduZWRCdWZmZXJOdW0gPT0gMCApIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicFNFQ1BvcnQtPnVubG9hZGVkUmVzb3VyY2Ugc2lnbmFsIHNldCIpOworICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhMb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT51bmxvYWRlZFJlc291cmNlKTsKKyAgICAgICAgICAgIC8qIFNFQ19PU0FMX011dGV4VW5sb2NrKHBTRUNDb21wb25lbnQtPmNvbXBNdXRleCk7ICovCisgICAgICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXIoU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LCBPTVhfVTMyIG5Qb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICAgICAgICAqdGVtcF9idWZmZXJIZWFkZXIgPSBOVUxMOworICAgIE9NWF9VOCAgICAgICAgICAgICAgICAgICAgICAgKnRlbXBfYnVmZmVyID0gTlVMTDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICBwb3J0RGVmaW5pdGlvbjsKKworICAgIHJldCA9IE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkOworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfRnJlZVR1bm5lbEJ1ZmZlcihTRUNfT01YX0JBU0VQT1JUICpwT01YQmFzZVBvcnQsIE9NWF9VMzIgblBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCogcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFKiB0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgT01YX1U4ICp0ZW1wX2J1ZmZlciA9IE5VTEw7CisgICAgT01YX1UzMiBidWZmZXJTaXplID0gMDsKKyAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIHBvcnREZWZpbml0aW9uOworCisgICAgcmV0ID0gT01YX0Vycm9yVHVubmVsaW5nVW5zdXBwb3J0ZWQ7CitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRUdW5uZWxSZXF1ZXN0KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgblBvcnQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhUdW5uZWxlZENvbXAsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgIG5UdW5uZWxlZFBvcnQsCisgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBUdW5uZWxTZXR1cCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICByZXQgPSBPTVhfRXJyb3JUdW5uZWxpbmdVbnN1cHBvcnRlZDsKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0JPT0wgU0VDX0NoZWNrX0J1ZmZlclByb2Nlc3NfU3RhdGUoU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUV4ZWN1dGluZykgJiYKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdLnBvcnRTdGF0ZSA9PSBPTVhfU3RhdGVJZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgIT0gU0VDX09NWF9UcmFuc1N0YXRlSWRsZVRvRXhlY3V0aW5nKSkKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKK30KKworc3RhdGljIE9NWF9FUlJPUlRZUEUgU0VDX0lucHV0QnVmZmVyUmV0dXJuKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChidWZmZXJIZWFkZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAgICAgID0gc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhICAgICAgICAgICAgICAgICA9IHNlY09NWElucHV0UG9ydC0+bWFya1R5cGUucE1hcmtEYXRhOworICAgICAgICAgICAgc2VjT01YSW5wdXRQb3J0LT5tYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IE5VTEw7CisgICAgICAgICAgICBzZWNPTVhJbnB1dFBvcnQtPm1hcmtUeXBlLnBNYXJrRGF0YSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVySGVhZGVyLT5oTWFya1RhcmdldENvbXBvbmVudCA9PSBwT01YQ29tcG9uZW50KSB7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50TWFyaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgYnVmZmVySGVhZGVyLT5wTWFya0RhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudCA9IGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQ7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhID0gYnVmZmVySGVhZGVyLT5wTWFya0RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoQ0hFQ0tfUE9SVF9UVU5ORUxFRChzZWNPTVhJbnB1dFBvcnQpKSB7CisgICAgICAgICAgICBPTVhfRmlsbFRoaXNCdWZmZXIoc2VjT01YSW5wdXRQb3J0LT50dW5uZWxlZENvbXBvbmVudCwgYnVmZmVySGVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbiA9IDA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FbXB0eUJ1ZmZlckRvbmUocE9NWENvbXBvbmVudCwgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLCBidWZmZXJIZWFkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlUGF1c2UpICYmCisgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT01YT3V0cHV0UG9ydCkpKSkgeworICAgICAgICBTRUNfT1NBTF9TaWduYWxSZXNldChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50KTsKKyAgICAgICAgU0VDX09TQUxfU2lnbmFsV2FpdChwU0VDQ29tcG9uZW50LT5wYXVzZUV2ZW50LCBERUZfTUFYX1dBSVRfVElNRSk7CisgICAgfQorCisgICAgZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICAgICA9IE9NWF9GQUxTRTsKKyAgICBkYXRhQnVmZmVyLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gMDsKKyAgICBkYXRhQnVmZmVyLT51c2VkRGF0YUxlbiAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgID0gTlVMTDsKKyAgICBkYXRhQnVmZmVyLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgICAgID0gMDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfSW5wdXRCdWZmZXJHZXRRdWV1ZShTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqZGF0YUJ1ZmZlciA9IE5VTEw7CisgICAgU0VDX09NWF9NRVNTQUdFKiAgICBtZXNzYWdlID0gTlVMTDsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwU0VDUG9ydD0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIGRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltJTlBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIGlmIChkYXRhQnVmZmVyLT5kYXRhVmFsaWQgIT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIG1lc3NhZ2UgPSAoU0VDX09NWF9NRVNTQUdFICopU0VDX09TQUxfRGVxdWV1ZSgmcFNFQ1BvcnQtPmJ1ZmZlclEpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyID0gKE9NWF9CVUZGRVJIRUFERVJUWVBFICopKG1lc3NhZ2UtPnBDbWREYXRhKTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmFsbG9jU2l6ZSA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkFsbG9jTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bkZpbGxlZExlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnJlbWFpbkRhdGFMZW4gPSBkYXRhQnVmZmVyLT5kYXRhTGVuOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gPSAwOyAvL2RhdGFCdWZmZXItPmJ1ZmZlckhlYWRlci0+bk9mZnNldDsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT50aW1lU3RhbXAgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5UaW1lU3RhbXA7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5kYXRhQnVmZmVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uYWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfT3V0cHV0QnVmZmVyUmV0dXJuKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPTVhPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICpidWZmZXJIZWFkZXIgPSBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXI7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoYnVmZmVySGVhZGVyICE9IE5VTEwpIHsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uRmlsbGVkTGVuID0gZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbjsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uT2Zmc2V0ICAgID0gMDsKKyAgICAgICAgYnVmZmVySGVhZGVyLT5uRmxhZ3MgICAgID0gZGF0YUJ1ZmZlci0+bkZsYWdzOworICAgICAgICBidWZmZXJIZWFkZXItPm5UaW1lU3RhbXAgPSBkYXRhQnVmZmVyLT50aW1lU3RhbXA7CisKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPnByb3BhZ2F0ZU1hcmtUeXBlLmhNYXJrVGFyZ2V0Q29tcG9uZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+aE1hcmtUYXJnZXRDb21wb25lbnQgPSBwU0VDQ29tcG9uZW50LT5wcm9wYWdhdGVNYXJrVHlwZS5oTWFya1RhcmdldENvbXBvbmVudDsKKyAgICAgICAgICAgIGJ1ZmZlckhlYWRlci0+cE1hcmtEYXRhID0gcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUuaE1hcmtUYXJnZXRDb21wb25lbnQgPSBOVUxMOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvcGFnYXRlTWFya1R5cGUucE1hcmtEYXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJIZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKHBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2FsbGJhY2tEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEJ1ZmZlckZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1VUUFVUX1BPUlRfSU5ERVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySGVhZGVyLT5uRmxhZ3MsIE5VTEwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKENIRUNLX1BPUlRfVFVOTkVMRUQoc2VjT01YT3V0cHV0UG9ydCkpIHsKKyAgICAgICAgICAgIE9NWF9FbXB0eVRoaXNCdWZmZXIoc2VjT01YT3V0cHV0UG9ydC0+dHVubmVsZWRDb21wb25lbnQsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5GaWxsQnVmZmVyRG9uZShwT01YQ29tcG9uZW50LCBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsIGJ1ZmZlckhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgJiYKKyAgICAgICAgKCghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY09NWElucHV0UG9ydCkgJiYgIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNPTVhPdXRwdXRQb3J0KSkpKSB7CisgICAgICAgIFNFQ19PU0FMX1NpZ25hbFJlc2V0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQpOworICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICB9CisgICAgCisgICAgLyogcmVzZXQgZGF0YUJ1ZmZlciAqLworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX091dHB1dEJ1ZmZlckdldFF1ZXVlKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICpkYXRhQnVmZmVyID0gTlVMTDsKKyAgICBTRUNfT01YX01FU1NBR0UgICAgKm1lc3NhZ2UgPSBOVUxMOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcFNFQ1BvcnQ9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgZGF0YUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlRXhlY3V0aW5nKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocFNFQ1BvcnQtPmJ1ZmZlclNlbUlEKTsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICBpZiAoZGF0YUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBtZXNzYWdlID0gKFNFQ19PTVhfTUVTU0FHRSAqKVNFQ19PU0FMX0RlcXVldWUoJnBTRUNQb3J0LT5idWZmZXJRKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkYXRhQnVmZmVyLT5idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKikobWVzc2FnZS0+cENtZERhdGEpOworICAgICAgICAgICAgZGF0YUJ1ZmZlci0+YWxsb2NTaXplID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uQWxsb2NMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5GaWxsZWRMZW47CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5yZW1haW5EYXRhTGVuID0gZGF0YUJ1ZmZlci0+ZGF0YUxlbjsKKyAgICAgICAgICAgIGRhdGFCdWZmZXItPnVzZWREYXRhTGVuID0gMDsgLy9kYXRhQnVmZmVyLT5idWZmZXJIZWFkZXItPm5PZmZzZXQ7CisgICAgICAgICAgICBkYXRhQnVmZmVyLT5kYXRhVmFsaWQgPU9NWF9UUlVFOworICAgICAgICAgICAgLyogZGF0YUJ1ZmZlci0+bkZsYWdzID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uRmxhZ3M7ICovCisgICAgICAgICAgICAvKiBkYXRhQnVmZmVyLT5uVGltZVN0YW1wID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5uVGltZVN0YW1wOyAqLworICAgICAgICAgICAgU0VDX09TQUxfRnJlZShtZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworCit9CisKK3N0YXRpYyBPTVhfRVJST1JUWVBFIFNFQ19CdWZmZXJSZXNldChPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgT01YX1UzMiBwb3J0SW5kZXgpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICAvKiBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07ICovCisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpkYXRhQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbcG9ydEluZGV4XTsKKyAgICAvKiBPTVhfQlVGRkVSSEVBREVSVFlQRSAgKmJ1ZmZlckhlYWRlciA9IGRhdGFCdWZmZXItPmJ1ZmZlckhlYWRlcjsgKi8KKworICAgIGRhdGFCdWZmZXItPmRhdGFWYWxpZCAgICAgPSBPTVhfRkFMU0U7CisgICAgZGF0YUJ1ZmZlci0+ZGF0YUxlbiAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dXNlZERhdGFMZW4gICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyICA9IE5VTEw7CisgICAgZGF0YUJ1ZmZlci0+bkZsYWdzICAgICAgICA9IDA7CisgICAgZGF0YUJ1ZmZlci0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgT01YX0VSUk9SVFlQRSBTRUNfRGF0YVJlc2V0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBPTVhfVTMyIHBvcnRJbmRleCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIC8qIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbcG9ydEluZGV4XTsgKi8KKyAgICAvKiBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmRhdGFCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltwb3J0SW5kZXhdOyAqLworICAgIC8qIE9NWF9CVUZGRVJIRUFERVJUWVBFICAqYnVmZmVySGVhZGVyID0gZGF0YUJ1ZmZlci0+YnVmZmVySGVhZGVyOyAqLworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqcHJvY2Vzc0RhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbcG9ydEluZGV4XTsKKworICAgIHByb2Nlc3NEYXRhLT5kYXRhTGVuICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+cmVtYWluRGF0YUxlbiA9IDA7CisgICAgcHJvY2Vzc0RhdGEtPnVzZWREYXRhTGVuICAgPSAwOworICAgIHByb2Nlc3NEYXRhLT5uRmxhZ3MgICAgICAgID0gMDsKKyAgICBwcm9jZXNzRGF0YS0+dGltZVN0YW1wICAgICA9IDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBTRUNfUHJlcHJvY2Vzc29yX0lucHV0RGF0YShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCkKK3sKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICppbnB1dFVzZUJ1ZmZlciA9ICZwU0VDQ29tcG9uZW50LT5zZWNEYXRhQnVmZmVyW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqaW5wdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgY29weVNpemUgPSAwOworICAgIE9NWF9CWVRFICAgICAgICAgICAgICAgY2hlY2tJbnB1dFN0cmVhbSA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gMDsKKyAgICBPTVhfQk9PTCAgICAgICAgICAgICAgIGZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgcHJldmlvdXNGcmFtZUVPRiA9IE9NWF9GQUxTRTsKKworICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkID09IE9NWF9UUlVFKSB7CisgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gPSBpbnB1dFVzZUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyICsgaW5wdXRVc2VCdWZmZXItPnVzZWREYXRhTGVuOworICAgICAgICBjaGVja0lucHV0U3RyZWFtTGVuID0gaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW47CisKKyAgICAgICAgaWYgKChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0RGF0YS0+ZGF0YUxlbiA9PSAwKSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX1RSVUU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lRU9GID0gT01YX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgY2hlY2tlZFNpemUgPSBjaGVja0lucHV0U3RyZWFtTGVuOworICAgICAgICAgICAgaWYgKGNoZWNrZWRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgICAgICBpbnQgd2lkdGggPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiA9IGlucHV0VXNlQnVmZmVyLT5kYXRhTGVuID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gY2hlY2tJbnB1dFN0cmVhbUxlbiA9IGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuOworICAgICAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU9TOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgICAgICBmbGFnRU9TID0gT01YX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIGludCB3aWR0aCA9IHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgICAgICAgICBpbnQgaGVpZ2h0ID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgICAgICAgICBpbnQgb25lRnJhbWVTaXplID0gMDsKKworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKQorICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9ICh3aWR0aCAqIGhlaWdodCAqIDMpIC8gMjsKKyAgICAgICAgICAgIGVsc2UgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpCisgICAgICAgICAgICAgICAgb25lRnJhbWVTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgZWxzZSBpZiAocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hcikKKyAgICAgICAgICAgICAgICBvbmVGcmFtZVNpemUgPSB3aWR0aCAqIGhlaWdodCAqIDI7CisKKyAgICAgICAgICAgIGlmIChwcmV2aW91c0ZyYW1lRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRTdHJlYW1MZW4gPj0gb25lRnJhbWVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gb25lRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChjaGVja0lucHV0U3RyZWFtTGVuID49IChvbmVGcmFtZVNpemUgLSBpbnB1dERhdGEtPmRhdGFMZW4pKSB7CisgICAgICAgICAgICAgICAgICAgIGNoZWNrZWRTaXplID0gb25lRnJhbWVTaXplIC0gaW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICAgICAgICAgICAgICBmbGFnRU9GID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgoZmxhZ0VPRiA9PSBPTVhfRkFMU0UpICYmIChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICAgICAgICAgIGZsYWdFT0YgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBmbGFnRU9TID0gT01YX1RSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZ0VPRiA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgY29weVNpemUgPSBjaGVja2VkU2l6ZTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAic2VjX2NoZWNrSW5wdXRGcmFtZSA6IE9NWF9UUlVFIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb3B5U2l6ZSA9IGNoZWNrSW5wdXRTdHJlYW1MZW47CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInNlY19jaGVja0lucHV0RnJhbWUgOiBPTVhfRkFMU0UiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKQorICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID0gT01YX1RSVUU7CisKKyAgICAgICAgaWYgKCgoaW5wdXREYXRhLT5hbGxvY1NpemUpIC0gKGlucHV0RGF0YS0+ZGF0YUxlbikpID49IGNvcHlTaXplKSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgICAgICAgICAgaWYgKChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCAhPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSAmJgorICAgICAgICAgICAgICAgIChwU0VDUG9ydC0+YlN0b3JlTWV0YURhdGFJbkJ1ZmZlciA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX1UzMiB3aWR0aCwgaGVpZ2h0OworCisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJpbnB1dERhdGEtPnNwZWNpZmljQnVmZmVySGVhZGVyLllWaXJBZGRyIDogMHgleCIsIGlucHV0RGF0YS0+c3BlY2lmaWNCdWZmZXJIZWFkZXIuWVZpckFkZHIpOworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImlucHV0RGF0YS0+c3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1ZpckFkZHIgOiAweCV4IiwgaW5wdXREYXRhLT5zcGVjaWZpY0J1ZmZlckhlYWRlci5DVmlyQWRkcik7CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJ3aWR0aDolZCwgaGVpZ2h0OiVkLCBZc2l6ZTolZCIsIHdpZHRoLCBoZWlnaHQsIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKHdpZHRoKSAqIEFMSUdOX1RPXzMyQihoZWlnaHQpKSk7CisgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAid2lkdGg6JWQsIGhlaWdodDolZCwgQ3NpemU6JWQiLCB3aWR0aCwgaGVpZ2h0LCBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4Qih3aWR0aCkgKiBBTElHTl9UT18zMkIoaGVpZ2h0IC8gMikpKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlYWwgWVVWNDIwUCBEYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICBjc2NfbGluZWFyX3RvX3RpbGVkKGlucHV0RGF0YS0+c3BlY2lmaWNCdWZmZXJIZWFkZXIuWVZpckFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja0lucHV0U3RyZWFtLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNzY19saW5lYXJfdG9fdGlsZWRfaW50ZXJsZWF2ZShpbnB1dERhdGEtPnNwZWNpZmljQnVmZmVySGVhZGVyLkNWaXJBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gKyAod2lkdGggKiBoZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrSW5wdXRTdHJlYW0gKyAoKCh3aWR0aCAqIGhlaWdodCkgKiA1KSAvIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQgPj4gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShpbnB1dERhdGEtPnNwZWNpZmljQnVmZmVySGVhZGVyLllWaXJBZGRyLCBjaGVja0lucHV0U3RyZWFtLCAod2lkdGggKiBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX01lbWNweShpbnB1dERhdGEtPnNwZWNpZmljQnVmZmVySGVhZGVyLkNWaXJBZGRyLCBjaGVja0lucHV0U3RyZWFtICsgKHdpZHRoICogaGVpZ2h0KSwgKHdpZHRoICogaGVpZ2h0IC8gMikpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5kYXRhTGVuIC09IGNvcHlTaXplOworICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gLT0gY29weVNpemU7CisgICAgICAgICAgICBpbnB1dFVzZUJ1ZmZlci0+dXNlZERhdGFMZW4gKz0gY29weVNpemU7CisKKyAgICAgICAgICAgIGlucHV0RGF0YS0+ZGF0YUxlbiArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIGlucHV0RGF0YS0+cmVtYWluRGF0YUxlbiArPSBjb3B5U2l6ZTsKKworICAgICAgICAgICAgaWYgKHByZXZpb3VzRnJhbWVFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBpbnB1dERhdGEtPnRpbWVTdGFtcCA9IGlucHV0VXNlQnVmZmVyLT50aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgPSBpbnB1dFVzZUJ1ZmZlci0+bkZsYWdzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+YlNhdmVGbGFnRU9TID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKGNoZWNrZWRTaXplID09IGNoZWNrSW5wdXRTdHJlYW1MZW4pICYmIChwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPT0gT01YX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VPUzsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ0VPRiA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXREYXRhLT5uRmxhZ3MgPSAoaW5wdXRVc2VCdWZmZXItPm5GbGFncyAmICh+T01YX0JVRkZFUkZMQUdfRU9TKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyo/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8gRXJyb3IgPz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Pz8/Ki8KKyAgICAgICAgICAgIFNFQ19EYXRhUmVzZXQocE9NWENvbXBvbmVudCwgSU5QVVRfUE9SVF9JTkRFWCk7CisgICAgICAgICAgICBmbGFnRU9GID0gT01YX0ZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlucHV0VXNlQnVmZmVyLT5yZW1haW5EYXRhTGVuID09IDApIHsKKyAgICAgICAgICAgIGlmKGZsYWdFT0YgPT0gT01YX0ZBTFNFKQorICAgICAgICAgICAgICAgIFNFQ19JbnB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlucHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPSBPTVhfVFJVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmbGFnRU9GID09IE9NWF9UUlVFKSB7CisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID0gT01YX1RSVUU7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5zdGFydFRpbWVTdGFtcCA9IGlucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAublN0YXJ0RmxhZ3MgPSBpbnB1dERhdGEtPm5GbGFnczsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IE9NWF9UUlVFOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0JPT0wgU0VDX1Bvc3Rwcm9jZXNzX091dHB1dERhdGEoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0JPT0wgICAgICAgICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfREFUQUJVRkZFUiAgICAqb3V0cHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfREFUQSAgICAgICAgICAqb3V0cHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBjb3B5U2l6ZSA9IDA7CisKKyAgICBpZiAob3V0cHV0VXNlQnVmZmVyLT5kYXRhVmFsaWQgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRDaGVja1N0YXJ0VGltZVN0YW1wID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAuc3RhcnRUaW1lU3RhbXAgPT0gb3V0cHV0RGF0YS0+dGltZVN0YW1wKXsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5zdGFydFRpbWVTdGFtcCA9IC0xOTc2MTEyMzsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uU3RhcnRGbGFncyA9IDB4MDsKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jaGVja1RpbWVTdGFtcC5uZWVkU2V0U3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Y2hlY2tUaW1lU3RhbXAubmVlZENoZWNrU3RhcnRUaW1lU3RhbXAgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFNFQ19EYXRhUmVzZXQocE9NWENvbXBvbmVudCwgT1VUUFVUX1BPUlRfSU5ERVgpOworCisgICAgICAgICAgICAgICAgcmV0ID0gT01YX1RSVUU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBTRUNDb21wb25lbnQtPmNoZWNrVGltZVN0YW1wLm5lZWRTZXRTdGFydFRpbWVTdGFtcCA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgU0VDX0RhdGFSZXNldChwT01YQ29tcG9uZW50LCBPVVRQVVRfUE9SVF9JTkRFWCk7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9UUlVFOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPD0gKG91dHB1dFVzZUJ1ZmZlci0+YWxsb2NTaXplIC0gb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSkgeworICAgICAgICAgICAgY29weVNpemUgPSBvdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuOworICAgICAgICAgICAgaWYgKGNvcHlTaXplID4gMCkKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyICsgb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgKG91dHB1dERhdGEtPmRhdGFCdWZmZXIgKyBvdXRwdXREYXRhLT51c2VkRGF0YUxlbiksCisgICAgICAgICAgICAgICAgICAgICBjb3B5U2l6ZSk7CisKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+ZGF0YUxlbiArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+bkZsYWdzID0gb3V0cHV0RGF0YS0+bkZsYWdzOworICAgICAgICAgICAgb3V0cHV0VXNlQnVmZmVyLT50aW1lU3RhbXAgPSBvdXRwdXREYXRhLT50aW1lU3RhbXA7CisKKyAgICAgICAgICAgIHJldCA9IE9NWF9UUlVFOworCisgICAgICAgICAgICAvKiByZXNldCBvdXRwdXREYXRhICovCisgICAgICAgICAgICBTRUNfRGF0YVJlc2V0KHBPTVhDb21wb25lbnQsIE9VVFBVVF9QT1JUX0lOREVYKTsKKworICAgICAgICAgICAgaWYgKChvdXRwdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gPiAwKSB8fAorICAgICAgICAgICAgICAgIChvdXRwdXRVc2VCdWZmZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpCisgICAgICAgICAgICAgICAgU0VDX091dHB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAib3V0cHV0IGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gZW5jb2RlZCBkYXRhIHNpemUgT3V0IExlbmd0aCIpOworCisgICAgICAgICAgICBjb3B5U2l6ZSA9IG91dHB1dFVzZUJ1ZmZlci0+YWxsb2NTaXplIC0gb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuOworCisgICAgICAgICAgICBTRUNfT1NBTF9NZW1jcHkoKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVySGVhZGVyLT5wQnVmZmVyICsgb3V0cHV0VXNlQnVmZmVyLT5kYXRhTGVuKSwKKyAgICAgICAgICAgICAgICAgICAgKG91dHB1dERhdGEtPmRhdGFCdWZmZXIgKyBvdXRwdXREYXRhLT51c2VkRGF0YUxlbiksCisgICAgICAgICAgICAgICAgICAgICBjb3B5U2l6ZSk7CisKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+ZGF0YUxlbiArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+cmVtYWluRGF0YUxlbiArPSBjb3B5U2l6ZTsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+bkZsYWdzID0gMDsKKyAgICAgICAgICAgIG91dHB1dFVzZUJ1ZmZlci0+dGltZVN0YW1wID0gb3V0cHV0RGF0YS0+dGltZVN0YW1wOworCisgICAgICAgICAgICByZXQgPSBPTVhfRkFMU0U7CisKKyAgICAgICAgICAgIG91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gLT0gY29weVNpemU7CisgICAgICAgICAgICBvdXRwdXREYXRhLT51c2VkRGF0YUxlbiArPSBjb3B5U2l6ZTsKKworICAgICAgICAgICAgU0VDX091dHB1dEJ1ZmZlclJldHVybihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9GQUxTRTsKKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0J1ZmZlclByb2Nlc3MoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpzZWNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0RBVEFCVUZGRVIgICAgKmlucHV0VXNlQnVmZmVyID0gJnBTRUNDb21wb25lbnQtPnNlY0RhdGFCdWZmZXJbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBQlVGRkVSICAgICpvdXRwdXRVc2VCdWZmZXIgPSAmcFNFQ0NvbXBvbmVudC0+c2VjRGF0YUJ1ZmZlcltPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICppbnB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9EQVRBICAgICAgICAgICpvdXRwdXREYXRhID0gJnBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgIGNvcHlTaXplID0gMDsKKworICAgIHBTRUNDb21wb25lbnQtPnJlbWFpbk91dHB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfRkFMU0U7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICB3aGlsZSAoIXBTRUNDb21wb25lbnQtPmJFeGl0QnVmZmVyUHJvY2Vzc1RocmVhZCkgeworICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworCisgICAgICAgIGlmICgoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVQYXVzZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSWRsZSkgfHwKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSA9PSBTRUNfT01YX1RyYW5zU3RhdGVMb2FkZWRUb0lkbGUpIHx8CisgICAgICAgICAgICAocFNFQ0NvbXBvbmVudC0+dHJhbnNpZW50U3RhdGUgPT0gU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlKSkgJiYKKyAgICAgICAgICAgIChwU0VDQ29tcG9uZW50LT50cmFuc2llbnRTdGF0ZSAhPSBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9Mb2FkZWQpJiYKKyAgICAgICAgICAgICgoIUNIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChzZWNJbnB1dFBvcnQpICYmICFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjT3V0cHV0UG9ydCkpKSkgeworICAgICAgICAgICAgU0VDX09TQUxfU2lnbmFsUmVzZXQocFNFQ0NvbXBvbmVudC0+cGF1c2VFdmVudCk7CisgICAgICAgICAgICBTRUNfT1NBTF9TaWduYWxXYWl0KHBTRUNDb21wb25lbnQtPnBhdXNlRXZlbnQsIERFRl9NQVhfV0FJVF9USU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSAmJiAhcFNFQ0NvbXBvbmVudC0+YkV4aXRCdWZmZXJQcm9jZXNzVGhyZWFkKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9TbGVlcE1pbGxpc2VjKDApOworCisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICBpZiAoKG91dHB1dFVzZUJ1ZmZlci0+ZGF0YVZhbGlkICE9IE9NWF9UUlVFKSAmJgorICAgICAgICAgICAgICAgICghQ0hFQ0tfUE9SVF9CRUlOR19GTFVTSEVEKHNlY091dHB1dFBvcnQpKSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKG91dHB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgIHJldCA9IFNFQ19PdXRwdXRCdWZmZXJHZXRRdWV1ZShwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoKHJldCA9PSBPTVhfRXJyb3JVbmRlZmluZWQpIHx8CisgICAgICAgICAgICAgICAgICAgIChzZWNJbnB1dFBvcnQtPnBvcnRTdGF0ZSAhPSBPTVhfU3RhdGVJZGxlKSB8fAorICAgICAgICAgICAgICAgICAgICAoc2VjT3V0cHV0UG9ydC0+cG9ydFN0YXRlICE9IE9NWF9TdGF0ZUlkbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhMb2NrKGlucHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoU0VDX1ByZXByb2Nlc3Nvcl9JbnB1dERhdGEocE9NWENvbXBvbmVudCkgPT0gT01YX0ZBTFNFKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKCFDSEVDS19QT1JUX0JFSU5HX0ZMVVNIRUQoc2VjSW5wdXRQb3J0KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jayhpbnB1dFVzZUJ1ZmZlci0+YnVmZmVyTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IFNFQ19JbnB1dEJ1ZmZlckdldFF1ZXVlKHBTRUNDb21wb25lbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9NdXRleExvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgcmV0ID0gcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzKHBPTVhDb21wb25lbnQsIGlucHV0RGF0YSwgb3V0cHV0RGF0YSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXRVc2VCdWZmZXItPnJlbWFpbkRhdGFMZW4gPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgU0VDX0lucHV0QnVmZmVyUmV0dXJuKHBPTVhDb21wb25lbnQpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRVc2VCdWZmZXItPmRhdGFWYWxpZCA9IE9NWF9UUlVFOworCisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soaW5wdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICAgICAgICAgIGlmIChyZXQgPT0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0KQorICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZUlucHV0RGF0YSA9IE9NWF9UUlVFOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVJbnB1dERhdGEgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jayhvdXRwdXRVc2VCdWZmZXItPmJ1ZmZlck11dGV4KTsKKworICAgICAgICAgICAgaWYgKFNFQ19Qb3N0cHJvY2Vzc19PdXRwdXREYXRhKHBPTVhDb21wb25lbnQpID09IE9NWF9GQUxTRSkKKyAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5yZW1haW5PdXRwdXREYXRhID0gT01YX1RSVUU7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cmVtYWluT3V0cHV0RGF0YSA9IE9NWF9GQUxTRTsKKworICAgICAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2sob3V0cHV0VXNlQnVmZmVyLT5idWZmZXJNdXRleCk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZUdldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0OgorICAgIHsKKyAgICAgICAgT01YX1BPUlRfUEFSQU1fVFlQRSAqcG9ydFBhcmFtID0gKE9NWF9QT1JUX1BBUkFNX1RZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydFBhcmFtLCBzaXplb2YoT01YX1BPUlRfUEFSQU1fVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBvcnRQYXJhbS0+blBvcnRzICAgICAgICAgICA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHM7CisgICAgICAgIHBvcnRQYXJhbS0+blN0YXJ0UG9ydE51bWJlciA9IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uU3RhcnRQb3J0TnVtYmVyOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUG9ydEZvcm1hdDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqcG9ydEZvcm1hdCA9IChPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gcG9ydEZvcm1hdC0+blBvcnRJbmRleDsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCAgICA9IHBvcnRGb3JtYXQtPm5JbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgICAqcG9ydERlZmluaXRpb24gPSBOVUxMOworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRGb3JtYXROdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocG9ydEZvcm1hdCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworCisgICAgICAgIGlmIChwb3J0SW5kZXggPT0gSU5QVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IElOUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uID0gJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbjsKKworICAgICAgICAgICAgc3dpdGNoIChpbmRleCkgeworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzA6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHN1cHBvcnRGb3JtYXRfMToKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb2xvckZvcm1hdCAgICAgICA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBzdXBwb3J0Rm9ybWF0XzI6CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKyAgICAgICAgICAgICAgICBwb3J0Rm9ybWF0LT5lQ29sb3JGb3JtYXQgICAgICAgPSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOworICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPnhGcmFtZXJhdGUgICAgICAgICA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICAgICAgICAgIGNhc2Ugc3VwcG9ydEZvcm1hdF8zOgorICAgICAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWU7CisgICAgICAgICAgICAgICAgcG9ydEZvcm1hdC0+eEZyYW1lcmF0ZSAgICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby54RnJhbWVyYXRlOworICAgICAgICAgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocG9ydEluZGV4ID09IE9VVFBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBzdXBwb3J0Rm9ybWF0TnVtID0gT1VUUFVUX1BPUlRfU1VQUE9SVEZPUk1BVF9OVU1fTUFYIC0gMTsKKyAgICAgICAgICAgIGlmIChpbmRleCA+IHN1cHBvcnRGb3JtYXROdW0pIHsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHBvcnRGb3JtYXQtPmVDb21wcmVzc2lvbkZvcm1hdCA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0OworICAgICAgICAgICAgcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0ICAgICAgID0gcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQ7CisgICAgICAgICAgICBwb3J0Rm9ybWF0LT54RnJhbWVyYXRlICAgICAgICAgPSBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGU6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgICp2aWRlb1JhdGVDb250cm9sID0gKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gdmlkZW9SYXRlQ29udHJvbC0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gTlVMTDsKKworICAgICAgICBpZiAoKHBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHZpZGVvUmF0ZUNvbnRyb2wtPmVDb250cm9sUmF0ZSA9IHBTRUNQb3J0LT5lQ29udHJvbFJhdGU7CisgICAgICAgICAgICB2aWRlb1JhdGVDb250cm9sLT5uVGFyZ2V0Qml0cmF0ZSA9IHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKnBvcnREZWZpbml0aW9uID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgIHBvcnRJbmRleCA9IHBvcnREZWZpbml0aW9uLT5uUG9ydEluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICpwU0VDUG9ydDsKKworICAgICAgICBpZiAocG9ydEluZGV4ID49IHBTRUNDb21wb25lbnQtPnBvcnRQYXJhbS5uUG9ydHMpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBvcnREZWZpbml0aW9uLCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgIFNFQ19PU0FMX01lbWNweShwb3J0RGVmaW5pdGlvbiwgJnBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbiwgcG9ydERlZmluaXRpb24tPm5TaXplKTsKKworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgICAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgcFNFQ1BvcnQtPmJTdG9yZU1ldGFEYXRhSW5CdWZmZXIgPT0gT01YX1RSVUUpIHsKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5uQnVmZmVyU2l6ZSA9IE1BWF9JTlBVVF9NRVRBREFUQV9CVUZGRVJfU0laRTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgIHsKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVTZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQgKSB7CisgICAgICAgIHJldCA9IE9NWF9TdGF0ZUludmFsaWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qb3J0Rm9ybWF0OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICpwb3J0Rm9ybWF0ID0gKE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0SW5kZXggPSBwb3J0Rm9ybWF0LT5uUG9ydEluZGV4OworICAgICAgICBPTVhfVTMyICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICAgID0gcG9ydEZvcm1hdC0+bkluZGV4OworICAgICAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAgICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydEZvcm1hdE51bSA9IDA7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwb3J0Rm9ybWF0LCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BvcnRJbmRleF07CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbiA9ICZwU0VDUG9ydC0+cG9ydERlZmluaXRpb247CisKKyAgICAgICAgICAgIHBvcnREZWZpbml0aW9uLT5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ICAgICAgID0gcG9ydEZvcm1hdC0+ZUNvbG9yRm9ybWF0OworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBwb3J0Rm9ybWF0LT5lQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgICAgICAgICBwb3J0RGVmaW5pdGlvbi0+Zm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgICAgICAgICA9IHBvcnRGb3JtYXQtPnhGcmFtZXJhdGU7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0JpdHJhdGU6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgICp2aWRlb1JhdGVDb250cm9sID0gKE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1UzMiAgICAgICAgICAgICAgICAgICAgICAgcG9ydEluZGV4ID0gdmlkZW9SYXRlQ29udHJvbC0+blBvcnRJbmRleDsKKyAgICAgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwb3J0RGVmaW5pdGlvbiA9IE5VTEw7CisKKyAgICAgICAgaWYgKChwb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwb3J0SW5kZXhdOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24gPSAmcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uOworCisgICAgICAgICAgICBwU0VDUG9ydC0+ZUNvbnRyb2xSYXRlID0gdmlkZW9SYXRlQ29udHJvbC0+ZUNvbnRyb2xSYXRlOworICAgICAgICAgICAgcG9ydERlZmluaXRpb24tPmZvcm1hdC52aWRlby5uQml0cmF0ZSA9IHZpZGVvUmF0ZUNvbnRyb2wtPm5UYXJnZXRCaXRyYXRlOworICAgICAgICB9CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtUG9ydERlZmluaXRpb246CisgICAgeworICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwUG9ydERlZmluaXRpb24gPQorICAgICAgICAgICAgICAgIChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX1NldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuSW5kZXgsIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBQb3J0RGVmaW5pdGlvbi0+blBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKSB7CisgICAgICAgICAgICBTRUNfT01YX0JBU0VQT1JUICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgICAgICAgICAgT01YX1UzMiB3aWR0aCA9IHBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICAgICAgICAgIE9NWF9VMzIgaGVpZ2h0ID0gcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICAgICAgICAgIFNFQ19PTVhfQkFTRVBPUlQgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSB3aWR0aDsKKyAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gKHdpZHRoICogaGVpZ2h0ICogMykgLyAyOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemU6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorICAgICAgICBicmVhazsKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RvcmVNZXRhRGF0YUJ1ZmZlcjoKKyAgICB7CisgICAgICAgIGlmIChPTVhfRXJyb3JOb25lICE9IGNoZWNrVmVyc2lvbkFOQihDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpKQorICAgICAgICAgICAgZ290byBFWElUOworCisgICAgICAgIGlmIChJTlBVVF9QT1JUX0lOREVYICE9IGNoZWNrUG9ydEluZGV4QU5CKENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IGVuYWJsZVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoaENvbXBvbmVudCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgZGVmYXVsdDoKKyAgICB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0UGFyYW1ldGVyKGhDb21wb25lbnQsIG5JbmRleCwgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50SW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfQ29uc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0NvbnN0cnVjdG9yKHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIElucHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsID0gTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlID0gU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAicmF3L3ZpZGVvIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlUmVuZGVyID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmJGbGFnRXJyb3JDb25jZWFsbWVudCA9IE9NWF9GQUxTRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdVbnVzZWQ7CisKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodD0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5TdHJpZGUgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublNsaWNlSGVpZ2h0ID0gMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlID0gKDE1IDw8IDE2KTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRVbnVzZWQ7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5wTmF0aXZlV2luZG93ID0gTlVMTDsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyQ291bnRBY3R1YWwgPSBNQVhfVklERU9fT1VUUFVUQlVGRkVSX05VTTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50TWluID0gTUFYX1ZJREVPX09VVFBVVEJVRkZFUl9OVU07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19PVVRQVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworCisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUgPSBTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ1VudXNlZDsKKworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSA2NDAwMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUgPSAoMTUgPDwgMTYpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVXaW5kb3cgPSBOVUxMOworCisgICAgcE9NWENvbXBvbmVudC0+VXNlQnVmZmVyICAgICAgICAgICAgICA9ICZTRUNfT01YX1VzZUJ1ZmZlcjsKKyAgICBwT01YQ29tcG9uZW50LT5BbGxvY2F0ZUJ1ZmZlciAgICAgICAgID0gJlNFQ19PTVhfQWxsb2NhdGVCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+RnJlZUJ1ZmZlciAgICAgICAgICAgICA9ICZTRUNfT01YX0ZyZWVCdWZmZXI7CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50VHVubmVsUmVxdWVzdCA9ICZTRUNfT01YX0NvbXBvbmVudFR1bm5lbFJlcXVlc3Q7CisKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfQWxsb2NhdGVUdW5uZWxCdWZmZXIgPSAmU0VDX09NWF9BbGxvY2F0ZVR1bm5lbEJ1ZmZlcjsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfRnJlZVR1bm5lbEJ1ZmZlciAgICAgPSAmU0VDX09NWF9GcmVlVHVubmVsQnVmZmVyOworICAgIHBTRUNDb21wb25lbnQtPnNlY19CdWZmZXJQcm9jZXNzICAgICAgICA9ICZTRUNfT01YX0J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX0J1ZmZlclJlc2V0ICAgICAgICAgID0gJlNFQ19CdWZmZXJSZXNldDsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfSW5wdXRCdWZmZXJSZXR1cm4gICAgPSAmU0VDX0lucHV0QnVmZmVyUmV0dXJuOworICAgIHBTRUNDb21wb25lbnQtPnNlY19PdXRwdXRCdWZmZXJSZXR1cm4gICA9ICZTRUNfT3V0cHV0QnVmZmVyUmV0dXJuOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnREZWluaXQoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgIGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbaV07CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUpOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9Qb3J0X0Rlc3RydWN0b3IocE9NWENvbXBvbmVudCk7CisKKyAgICByZXQgPSBTRUNfT01YX0Jhc2VDb21wb25lbnRfRGVzdHJ1Y3RvcihoQ29tcG9uZW50KTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvU0VDX09NWF9WZW5jLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjRlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL1NFQ19PTVhfVmVuYy5oCkBAIC0wLDAgKzEsMTM3IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfVmVuYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX1ZJREVPX0VOQ09ERQorI2RlZmluZSBTRUNfT01YX1ZJREVPX0VOQ09ERQorCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfUXVldWUuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisKKyNkZWZpbmUgTUFYX1ZJREVPX0lOUFVUQlVGRkVSX05VTSAgICA1CisjZGVmaW5lIE1BWF9WSURFT19PVVRQVVRCVUZGRVJfTlVNICAgNAorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfV0lEVEggICAgICAgICAgMTc2CisjZGVmaW5lIERFRkFVTFRfRlJBTUVfSEVJR0hUICAgICAgICAgMTQ0CisKKyNkZWZpbmUgREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRSAgICBBTElHTl9UT184S0IoQUxJR05fVE9fMTI4QihERUZBVUxUX0ZSQU1FX1dJRFRIKSAqIEFMSUdOX1RPXzMyQihERUZBVUxUX0ZSQU1FX0hFSUdIVCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIEFMSUdOX1RPXzhLQihBTElHTl9UT18xMjhCKERFRkFVTFRfRlJBTUVfV0lEVEgpICogQUxJR05fVE9fMzJCKERFRkFVTFRfRlJBTUVfSEVJR0hUIC8gMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogKERFRkFVTFRfRlJBTUVfV0lEVEggKiBERUZBVUxUX0ZSQU1FX0hFSUdIVCAqIDMpIC8gMiAqLworI2RlZmluZSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRSAgIERFRkFVTFRfVklERU9fSU5QVVRfQlVGRkVSX1NJWkUKKworI2RlZmluZSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVggICAgICAgICAgICAyCisKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyNkZWZpbmUgSU5QVVRfUE9SVF9TVVBQT1JURk9STUFUX05VTV9NQVggICAgNAorI2Vsc2UKKyNkZWZpbmUgSU5QVVRfUE9SVF9TVVBQT1JURk9STUFUX05VTV9NQVggICAgMworI2VuZGlmCisjZGVmaW5lIE9VVFBVVF9QT1JUX1NVUFBPUlRGT1JNQVRfTlVNX01BWCAgIDEKKworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorLy8gVGhlIGxhcmdlc3QgbWV0YWRhdGEgYnVmZmVyIHNpemUgYWR2ZXJ0aXNlZAorLy8gd2hlbiBtZXRhZGF0YSBidWZmZXIgbW9kZSBpcyB1c2VkIGZvciB2aWRlbyBlbmNvZGluZworI2RlZmluZSAgTUFYX0lOUFVUX01FVEFEQVRBX0JVRkZFUl9TSVpFICg2NCkKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdAoreworICAgIHZvaWQgKnBBZGRyWTsKKyAgICB2b2lkICpwQWRkckM7Cit9IE1GQ19FTkNfQUREUl9JTkZPOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19OQkVOQ19USFJFQUQKK3sKKyAgICBPTVhfSEFORExFVFlQRSAgaE5CRW5jb2RlVGhyZWFkOworICAgIE9NWF9IQU5ETEVUWVBFICBoRW5jRnJhbWVTdGFydDsKKyAgICBPTVhfSEFORExFVFlQRSAgaEVuY0ZyYW1lRW5kOworICAgIE9NWF9CT09MICAgICAgICBiRXhpdEVuY29kZVRocmVhZDsKKyAgICBPTVhfQk9PTCAgICAgICAgYkVuY29kZXJSdW47Cit9IFNFQ19NRkNfTkJFTkNfVEhSRUFEOworCit0eXBlZGVmIHN0cnVjdCBfTUZDX0VOQ19JTlBVVF9CVUZGRVIKK3sKKyAgICB2b2lkICpZUGh5QWRkcjsgLy8gcGh5c2ljYWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1BoeUFkZHI7IC8vIHBoeXNpY2FsIGFkZHJlc3Mgb2YgQ2JDcgorICAgIHZvaWQgKllWaXJBZGRyOyAvLyB2aXJ0dWFsIGFkZHJlc3Mgb2YgWQorICAgIHZvaWQgKkNWaXJBZGRyOyAvLyB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDcgorICAgIGludCBZQnVmZmVyU2l6ZTsgLy8gaW5wdXQgYnVmZmVyIGFsbG9jIHNpemUgb2YgWQorICAgIGludCBDQnVmZmVyU2l6ZTsgLy8gaW5wdXQgYnVmZmVyIGFsbG9jIHNpemUgb2YgQ2JDcgorICAgIGludCBZRGF0YVNpemU7ICAvLyBpbnB1dCBzaXplIG9mIFkgZGF0YQorICAgIGludCBDRGF0YVNpemU7ICAvLyBpbnB1dCBzaXplIG9mIENiQ3IgZGF0YQorfSBNRkNfRU5DX0lOUFVUX0JVRkZFUjsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVXNlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBCdWZmZXJIZHIsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBwQXBwUHJpdmF0ZSwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuU2l6ZUJ5dGVzLAorICAgIE9NWF9JTiBPTVhfVTggICAgICAgICAgICAgICAgICAgKnBCdWZmZXIpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0FsbG9jYXRlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgICAgICAgICAgIGhDb21wb25lbnQsCisgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqcHBCdWZmZXIsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblBvcnRJbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgICAgICAgICAgICBwQXBwUHJpdmF0ZSwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgICAgICAgICAgICBuU2l6ZUJ5dGVzKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9GcmVlQnVmZmVyKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICBuUG9ydEluZGV4LAorICAgIE9NWF9JTiBPTVhfQlVGRkVSSEVBREVSVFlQRSAqcEJ1ZmZlckhkcik7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQWxsb2NhdGVUdW5uZWxCdWZmZXIoCisgICAgU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LAorICAgIE9NWF9VMzIgICAgICAgICAgIG5Qb3J0SW5kZXgpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0ZyZWVUdW5uZWxCdWZmZXIoCisgICAgU0VDX09NWF9CQVNFUE9SVCAqcE9NWEJhc2VQb3J0LAorICAgIE9NWF9VMzIgICAgICAgICAgIG5Qb3J0SW5kZXgpOworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudFR1bm5lbFJlcXVlc3QoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFICBoQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgIG5Qb3J0LAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaFR1bm5lbGVkQ29tcCwKKyAgICBPTVhfSU4gT01YX1UzMiAgICAgICAgIG5UdW5uZWxlZFBvcnQsCisgICAgT01YX0lOT1VUIE9NWF9UVU5ORUxTRVRVUFRZUEUgKnBUdW5uZWxTZXR1cCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQnVmZmVyUHJvY2VzcyhPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZUdldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfVmlkZW9FbmNvZGVTZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL0FuZHJvaWQubWsgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjRlbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGM1OWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMCBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQoraW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCisKK0xPQ0FMX1NSQ19GSUxFUyA6PSBcCisJU0VDX09NWF9IMjY0ZW5jLmMgXAorCWxpYnJhcnlfcmVnaXN0ZXIuYworCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJPTVguU0VDLkFWQy5FbmNvZGVyCisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJTRUNfT01YX1ZlbmMgbGlic2Vjb3NhbCBsaWJzZWNiYXNlY29tcG9uZW50IFwKKwkJCQkJCWxpYnNlY21mY2VuY2FwaSBsaWJzZWNjc2MKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJkbCBsaWJjdXRpbHMgbGlidXRpbHMgbGlidWkgbGliaGFyZHdhcmUKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL3NlY19vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb214X2NvcmUgXAorCSQoU0VDX09NWF9DT01QT05FTlQpL2NvbW1vbiBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvdmlkZW8vZW5jCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gJChTRUNfT01YX1RPUCkvc2VjX2NvZGVjcy92aWRlby9tZmNfYzExMC9pbmNsdWRlCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvaDI2NGVuYy9TRUNfT01YX0gyNjRlbmMuYyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvaDI2NGVuYy9TRUNfT01YX0gyNjRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGJiYzdhCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL1NFQ19PTVhfSDI2NGVuYy5jCkBAIC0wLDAgKzEsMTMwNyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT01YX0gyNjRlbmMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZW5jLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfSDI2NGVuYy5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorI2luY2x1ZGUgImNvbG9yX3NwYWNlX2NvbnZlcnRvci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfSDI2NF9FTkMiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworLyogSC4yNjQgRW5jb2RlciBTdXBwb3J0ZWQgTGV2ZWxzICYgcHJvZmlsZXMgKi8KK1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMIHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHNbXSA9eworICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwxMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0FWQ0xldmVsNH0sCisKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxYn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMTF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDEyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwxM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMjF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDIyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluLCBPTVhfVklERU9fQVZDTGV2ZWwzMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlTWFpbiwgT01YX1ZJREVPX0FWQ0xldmVsMzJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZU1haW4sIE9NWF9WSURFT19BVkNMZXZlbDR9LAorCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMX0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMWJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDExfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwxMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMTN9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDIxfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWwyMn0sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsM30sCisgICAge09NWF9WSURFT19BVkNQcm9maWxlSGlnaCwgT01YX1ZJREVPX0FWQ0xldmVsMzF9LAorICAgIHtPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2gsIE9NWF9WSURFT19BVkNMZXZlbDMyfSwKKyAgICB7T01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoLCBPTVhfVklERU9fQVZDTGV2ZWw0fX07CisKKworT01YX1UzMiBPTVhBVkNQcm9maWxlVG9Qcm9maWxlSURDKE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRSBwcm9maWxlKQoreworICAgIE9NWF9VMzIgcmV0ID0gMDsgLy9kZWZhdWx0IE9NWF9WSURFT19BVkNQcm9maWxlTWFpbgorCisgICAgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVNYWluKQorICAgICAgICByZXQgPSAwOworICAgIGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoKQorICAgICAgICByZXQgPSAxOworICAgIGVsc2UgaWYgKHByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVCYXNlbGluZSkKKyAgICAgICAgcmV0ID0gMjsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9VMzIgT01YQVZDTGV2ZWxUb0xldmVsSURDKE9NWF9WSURFT19BVkNMRVZFTFRZUEUgbGV2ZWwpCit7CisgICAgT01YX1UzMiByZXQgPSA0MDsgLy9kZWZhdWx0IE9NWF9WSURFT19BVkNMZXZlbDQKKworICAgIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxKQorICAgICAgICByZXQgPSAxMDsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxYikKKyAgICAgICAgcmV0ID0gOTsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwxMSkKKyAgICAgICAgcmV0ID0gMTE7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsMTIpCisgICAgICAgIHJldCA9IDEyOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDEzKQorICAgICAgICByZXQgPSAxMzsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwyKQorICAgICAgICByZXQgPSAyMDsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwyMSkKKyAgICAgICAgcmV0ID0gMjE7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsMjIpCisgICAgICAgIHJldCA9IDIyOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDMpCisgICAgICAgIHJldCA9IDMwOworICAgIGVsc2UgaWYgKGxldmVsID09IE9NWF9WSURFT19BVkNMZXZlbDMxKQorICAgICAgICByZXQgPSAzMTsKKyAgICBlbHNlIGlmIChsZXZlbCA9PSBPTVhfVklERU9fQVZDTGV2ZWwzMikKKyAgICAgICAgcmV0ID0gMzI7CisgICAgZWxzZSBpZiAobGV2ZWwgPT0gT01YX1ZJREVPX0FWQ0xldmVsNCkKKyAgICAgICAgcmV0ID0gNDA7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfVTggKkZpbmREZWxpbWl0ZXIoT01YX1U4ICpwQnVmZmVyLCBPTVhfVTMyIHNpemUpCit7CisgICAgaW50IGk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAtIDM7IGkrKykgeworICAgICAgICBpZiAoKHBCdWZmZXJbaV0gPT0gMHgwMCkgICAmJgorICAgICAgICAgICAgKHBCdWZmZXJbaSsxXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKHBCdWZmZXJbaSsyXSA9PSAweDAwKSAmJgorICAgICAgICAgICAgKHBCdWZmZXJbaSszXSA9PSAweDAxKSkKKyAgICAgICAgICAgIHJldHVybiAocEJ1ZmZlciArIGkpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIEgyNjRQcmludFBhcmFtcyhTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNIGgyNjRBcmcpCit7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTb3VyY2VXaWR0aCAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLlNvdXJjZVdpZHRoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZUhlaWdodCAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuU291cmNlSGVpZ2h0KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlByb2ZpbGVJREMgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuUHJvZmlsZUlEQyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMZXZlbElEQyAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLkxldmVsSURDKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIklEUlBlcmlvZCAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuSURSUGVyaW9kKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk51bWJlclJlZmVyZW5jZUZyYW1lcyAgIDogJWRcbiIsIGgyNjRBcmcuTnVtYmVyUmVmZXJlbmNlRnJhbWVzKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk51bWJlclJlZkZvclBmcmFtZXMgICAgIDogJWRcbiIsIGgyNjRBcmcuTnVtYmVyUmVmRm9yUGZyYW1lcyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbGljZU1vZGUgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLlNsaWNlTW9kZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbGljZUFyZ3VtZW50ICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLlNsaWNlQXJndW1lbnQpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTnVtYmVyQkZyYW1lcyAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5OdW1iZXJCRnJhbWVzKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkxvb3BGaWx0ZXJEaXNhYmxlICAgICAgIDogJWRcbiIsIGgyNjRBcmcuTG9vcEZpbHRlckRpc2FibGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTG9vcEZpbHRlckFscGhhQzBPZmZzZXQgOiAlZFxuIiwgaDI2NEFyZy5Mb29wRmlsdGVyQWxwaGFDME9mZnNldCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJMb29wRmlsdGVyQmV0YU9mZnNldCAgICA6ICVkXG4iLCBoMjY0QXJnLkxvb3BGaWx0ZXJCZXRhT2Zmc2V0KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlN5bWJvbE1vZGUgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuU3ltYm9sTW9kZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQaWN0dXJlSW50ZXJsYWNlICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLlBpY3R1cmVJbnRlcmxhY2UpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVHJhbnNmb3JtOHg4TW9kZSAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5UcmFuc2Zvcm04eDhNb2RlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlJhbmRvbUludHJhTUJSZWZyZXNoICAgIDogJWRcbiIsIGgyNjRBcmcuUmFuZG9tSW50cmFNQlJlZnJlc2gpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUGFkQ29udHJvbE9uICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5QYWRDb250cm9sT24pOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTHVtYVBhZFZhbCAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5MdW1hUGFkVmFsKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNiUGFkVmFsICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuQ2JQYWRWYWwpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ3JQYWRWYWwgICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5DclBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJFbmFibGVGUk1SYXRlQ29udHJvbCAgICA6ICVkXG4iLCBoMjY0QXJnLkVuYWJsZUZSTVJhdGVDb250cm9sKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkVuYWJsZU1CUmF0ZUNvbnRyb2wgICAgIDogJWRcbiIsIGgyNjRBcmcuRW5hYmxlTUJSYXRlQ29udHJvbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVJhdGUgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLkZyYW1lUmF0ZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJCaXRyYXRlICAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLkJpdHJhdGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRnJhbWVRcCAgICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5GcmFtZVFwKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1heCAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuUVNDb2RlTWF4KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1pbiAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuUVNDb2RlTWluKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNCUlBlcmlvZFJmICAgICAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuQ0JSUGVyaW9kUmYpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRGFya0Rpc2FibGUgICAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5EYXJrRGlzYWJsZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTbW9vdGhEaXNhYmxlICAgICAgICAgICA6ICVkXG4iLCBoMjY0QXJnLlNtb290aERpc2FibGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU3RhdGljRGlzYWJsZSAgICAgICAgICAgOiAlZFxuIiwgaDI2NEFyZy5TdGF0aWNEaXNhYmxlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkFjdGl2aXR5RGlzYWJsZSAgICAgICAgIDogJWRcbiIsIGgyNjRBcmcuQWN0aXZpdHlEaXNhYmxlKTsKK30KKwordm9pZCBTZXRfSDI2NEVOQ19QYXJhbShTU0JTSVBfTUZDX0VOQ19IMjY0X1BBUkFNICpwSDI2NEFyZywgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBwSDI2NEFyZy0+Y29kZWNUeXBlICAgID0gSDI2NF9FTkM7CisgICAgcEgyNjRBcmctPlNvdXJjZVdpZHRoICA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGg7CisgICAgcEgyNjRBcmctPlNvdXJjZUhlaWdodCA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0OworICAgIHBIMjY0QXJnLT5JRFJQZXJpb2QgICAgPSBwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyArIDE7CisgICAgcEgyNjRBcmctPlNsaWNlTW9kZSAgICA9IDA7CisgICAgcEgyNjRBcmctPlJhbmRvbUludHJhTUJSZWZyZXNoID0gMDsKKyAgICBwSDI2NEFyZy0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAxOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTogRnJhbWUgbGV2ZWwgUkMKKyAgICBwSDI2NEFyZy0+Qml0cmF0ZSAgICAgID0gcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uQml0cmF0ZTsKKyAgICBwSDI2NEFyZy0+RnJhbWVRcCAgICAgID0gMjA7CisgICAgcEgyNjRBcmctPkZyYW1lUXBfUCAgICA9IDIwOworICAgIHBIMjY0QXJnLT5RU0NvZGVNYXggICAgPSAzMDsKKyAgICBwSDI2NEFyZy0+UVNDb2RlTWluICAgID0gMTA7CisgICAgcEgyNjRBcmctPkNCUlBlcmlvZFJmICA9IDEwMDsKKyAgICBwSDI2NEFyZy0+UGFkQ29udHJvbE9uID0gMDsgICAgICAgICAgICAgLy8gMDogZGlzYWJsZSwgMTogZW5hYmxlCisgICAgcEgyNjRBcmctPkx1bWFQYWRWYWwgICA9IDA7CisgICAgcEgyNjRBcmctPkNiUGFkVmFsICAgICA9IDA7CisgICAgcEgyNjRBcmctPkNyUGFkVmFsICAgICA9IDA7CisKKyAgICBwSDI2NEFyZy0+UHJvZmlsZUlEQyAgID0gT01YQVZDUHJvZmlsZVRvUHJvZmlsZUlEQyhwSDI2NEVuYy0+QVZDQ29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5lUHJvZmlsZSk7IC8vMDsgIC8vKE9NWF9WSURFT19BVkNQcm9maWxlTWFpbikKKyAgICBwSDI2NEFyZy0+TGV2ZWxJREMgICAgID0gT01YQVZDTGV2ZWxUb0xldmVsSURDKHBIMjY0RW5jLT5BVkNDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLmVMZXZlbCk7ICAgICAgIC8vNDA7IC8vKE9NWF9WSURFT19BVkNMZXZlbDQpCisgICAgcEgyNjRBcmctPkZyYW1lUXBfQiAgICA9IDIwOworICAgIHBIMjY0QXJnLT5GcmFtZVJhdGUgICAgPSAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUpID4+IDE2OworICAgIHBIMjY0QXJnLT5TbGljZUFyZ3VtZW50ID0gMDsgICAgICAgICAgLy8gU2xpY2UgbWIvYnl0ZSBzaXplIG51bWJlcgorICAgIHBIMjY0QXJnLT5OdW1iZXJCRnJhbWVzID0gMDsgICAgICAgICAgICAvLyAwIH4gMgorICAgIHBIMjY0QXJnLT5OdW1iZXJSZWZlcmVuY2VGcmFtZXMgPSAxOworICAgIHBIMjY0QXJnLT5OdW1iZXJSZWZGb3JQZnJhbWVzICAgPSAxOworICAgIHBIMjY0QXJnLT5Mb29wRmlsdGVyRGlzYWJsZSAgICAgPSAxOyAgICAvLyAxOiBMb29wIEZpbHRlciBEaXNhYmxlLCAwOiBGaWx0ZXIgRW5hYmxlCisgICAgcEgyNjRBcmctPkxvb3BGaWx0ZXJBbHBoYUMwT2Zmc2V0ID0gMDsKKyAgICBwSDI2NEFyZy0+TG9vcEZpbHRlckJldGFPZmZzZXQgICAgPSAwOworICAgIHBIMjY0QXJnLT5TeW1ib2xNb2RlICAgICAgID0gMDsgICAgICAgICAvLyAwOiBDQVZMQywgMTogQ0FCQUMKKyAgICBwSDI2NEFyZy0+UGljdHVyZUludGVybGFjZSA9IDA7CisgICAgcEgyNjRBcmctPlRyYW5zZm9ybTh4OE1vZGUgPSAwOyAgICAgICAgIC8vIDA6IDR4NCwgMTogYWxsb3cgOHg4CisgICAgcEgyNjRBcmctPkVuYWJsZU1CUmF0ZUNvbnRyb2wgPSAwOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTpNQiBsZXZlbCBSQworICAgIHBIMjY0QXJnLT5EYXJrRGlzYWJsZSAgICAgPSAxOworICAgIHBIMjY0QXJnLT5TbW9vdGhEaXNhYmxlICAgPSAxOworICAgIHBIMjY0QXJnLT5TdGF0aWNEaXNhYmxlICAgPSAxOworICAgIHBIMjY0QXJnLT5BY3Rpdml0eURpc2FibGUgPSAxOworCisgICAgc3dpdGNoICgoU0VDX09NWF9DT0xPUl9GT1JNQVRUWVBFKXBTRUNJbnB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQpIHsKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBwSDI2NEFyZy0+RnJhbWVNYXAgPSBOVjEyX0xJTkVBUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzOgorICAgIGRlZmF1bHQ6CisgICAgICAgIHBIMjY0QXJnLT5GcmFtZU1hcCA9IE5WMTJfVElMRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisgICAgaWYgKHBTRUNJbnB1dFBvcnQtPmJTdG9yZU1ldGFEYXRhSW5CdWZmZXIgIT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgaWYoaXNNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIpID09IE9NWF9UUlVFKQorICAgICAgICAgICAgcEgyNjRBcmctPkZyYW1lTWFwID0gTlYxMl9MSU5FQVI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHBIMjY0QXJnLT5GcmFtZU1hcCA9IE5WMTJfVElMRTsKKyAgICB9CisjZW5kaWYKKworLyoKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBTRUNQb3J0LT5lQ29udHJvbFJhdGU6IDB4JXgiLCBwU0VDT3V0cHV0UG9ydC0+ZUNvbnRyb2xSYXRlKTsKKyAgICBzd2l0Y2ggKHBTRUNPdXRwdXRQb3J0LT5lQ29udHJvbFJhdGUpIHsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZVZhcmlhYmxlOgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBWQlIiKTsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMDsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sICA9IDA7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOk1CIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5DQlJQZXJpb2RSZiAgPSAxMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQ6CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVmlkZW8gRW5jb2RlIENCUiIpOworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAxOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTogRnJhbWUgbGV2ZWwgUkMKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZU1CUmF0ZUNvbnRyb2wgID0gMTsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6TUIgbGV2ZWwgUkMKKyAgICAgICAgcEgyNjRBcmctPkNCUlBlcmlvZFJmICA9IDEwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGU6CisgICAgZGVmYXVsdDogLy9BbmRyb2lkIGRlZmF1bHQKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7CisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sICA9IDA7CisgICAgICAgIHBIMjY0QXJnLT5DQlJQZXJpb2RSZiAgPSAxMDA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyovCisgICAgSDI2NFByaW50UGFyYW1zKCpwSDI2NEFyZyk7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RW5jX0dldFBhcmFtZXRlcigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX0lOREVYVFlQRSAgblBhcmFtSW5kZXgsCisgICAgT01YX0lOT1VUIE9NWF9QVFIgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuUGFyYW1JbmRleCkgeworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0F2YzoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwRHN0QVZDQ29tcG9uZW50ID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBTcmNBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAqcEgyNjRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEFWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RBVkNDb21wb25lbnQtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNBVkNDb21wb25lbnQgPSAmcEgyNjRFbmMtPkFWQ0NvbXBvbmVudFtwRHN0QVZDQ29tcG9uZW50LT5uUG9ydEluZGV4XTsKKworICAgICAgICBTRUNfT1NBTF9NZW1jcHkocERzdEFWQ0NvbXBvbmVudCwgcFNyY0FWQ0NvbXBvbmVudCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQ19ST0xFKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMICpwUHJvZmlsZUxldmVsID0gTlVMTDsKKyAgICAgICAgT01YX1UzMiBtYXhQcm9maWxlTGV2ZWxOdW0gPSAwOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsID0gc3VwcG9ydGVkQVZDUHJvZmlsZUxldmVsczsKKyAgICAgICAgbWF4UHJvZmlsZUxldmVsTnVtID0gc2l6ZW9mKHN1cHBvcnRlZEFWQ1Byb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleCA+PSBtYXhQcm9maWxlTGV2ZWxOdW0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vTW9yZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBQcm9maWxlTGV2ZWwgKz0gcERzdFByb2ZpbGVMZXZlbC0+blByb2ZpbGVJbmRleDsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZVByb2ZpbGUgPSBwUHJvZmlsZUxldmVsLT5wcm9maWxlOworICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwUHJvZmlsZUxldmVsLT5sZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQ6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqcERzdFByb2ZpbGVMZXZlbCA9IChPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBTcmNBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0UHJvZmlsZUxldmVsLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY0FWQ0NvbXBvbmVudCA9ICZwSDI2NEVuYy0+QVZDQ29tcG9uZW50W3BEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXhdOworCisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFNyY0FWQ0NvbXBvbmVudC0+ZVByb2ZpbGU7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBTcmNBVkNDb21wb25lbnQtPmVMZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0RU5DX0hBTkRMRSAgICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUgPSAmcEgyNjRFbmMtPmVycm9yQ29ycmVjdGlvblR5cGVbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVHZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgblBhcmFtSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NEVuY19TZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9BdmM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSAqcERzdEFWQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICpwU3JjQVZDQ29tcG9uZW50ID0gKE9NWF9WSURFT19QQVJBTV9BVkNUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjQVZDQ29tcG9uZW50LT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgICAgICBwRHN0QVZDQ29tcG9uZW50ID0gJnBIMjY0RW5jLT5BVkNDb21wb25lbnRbcFNyY0FWQ0NvbXBvbmVudC0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RBVkNDb21wb25lbnQsIHBTcmNBVkNDb21wb25lbnQsIHNpemVvZihPTVhfVklERU9fUEFSQU1fQVZDVFlQRSkpOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZToKKyAgICB7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocENvbXBvbmVudFJvbGUsIHNpemVvZihPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVMb2FkZWQpICYmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgIT0gT01YX1N0YXRlV2FpdEZvclJlc291cmNlcykpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluY29ycmVjdFN0YXRlT3BlcmF0aW9uOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2NF9FTkNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwU3JjUHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKnBEc3RBVkNDb21wb25lbnQgPSBOVUxMOworICAgICAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjUHJvZmlsZUxldmVsLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleCA+PSBBTExfUE9SVF9OVU0pIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKworICAgICAgICBwRHN0QVZDQ29tcG9uZW50ID0gJnBIMjY0RW5jLT5BVkNDb21wb25lbnRbcFNyY1Byb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQtPmVQcm9maWxlID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZVByb2ZpbGU7CisgICAgICAgIHBEc3RBVkNDb21wb25lbnQtPmVMZXZlbCA9IHBTcmNQcm9maWxlTGV2ZWwtPmVMZXZlbDsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19IMjY0RU5DX0hBTkRMRSAgICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPm5Qb3J0SW5kZXggIT0gT1VUUFVUX1BPUlRfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBvcnRJbmRleDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUgPSAmcEgyNjRFbmMtPmVycm9yQ29ycmVjdGlvblR5cGVbT1VUUFVUX1BPUlRfSU5ERVhdOworCisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlSEVDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUmVzeW5jID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmM7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blJlc3luY2hNYXJrZXJTcGFjaW5nOworICAgICAgICBwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZURhdGFQYXJ0aXRpb25pbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlUlZMQzsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVTZXRQYXJhbWV0ZXIoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NEVuY19TZXRDb25maWcoCisgICAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfSU5ERVhUWVBFIG5JbmRleCwKKyAgICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9TZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NEVuY19HZXRFeHRlbnNpb25JbmRleCgKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9TVFJJTkcgICAgICBjUGFyYW1ldGVyTmFtZSwKKyAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUgKnBJbmRleFR5cGUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBpZiAoKGNQYXJhbWV0ZXJOYW1lID09IE5VTEwpIHx8IChwSW5kZXhUeXBlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID09IE9NWF9TdGF0ZUludmFsaWQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZFN0YXRlOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisgICAgaWYgKFNFQ19PU0FMX1N0cmNtcChjUGFyYW1ldGVyTmFtZSwgU0VDX0lOREVYX1BBUkFNX1NUT1JFX01FVEFEQVRBX0JVRkZFUikgPT0gMCkgeworICAgICAgICAqcEluZGV4VHlwZSA9IE9NWF9JbmRleFBhcmFtU3RvcmVNZXRhRGF0YUJ1ZmZlcjsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBTRUNfT01YX0dldEV4dGVuc2lvbkluZGV4KGhDb21wb25lbnQsIGNQYXJhbWV0ZXJOYW1lLCBwSW5kZXhUeXBlKTsKKyAgICB9CisjZWxzZQorICAgIHJldCA9IFNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworI2VuZGlmCisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RW5jX0NvbXBvbmVudFJvbGVFbnVtKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9VOCAqY1JvbGUsIE9NWF9VMzIgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNSb2xlID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAobkluZGV4ID09IChNQVhfQ09NUE9ORU5UX1JPTEVfTlVNLTEpKSB7CisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQ19ST0xFKTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfRW5jb2RlVGhyZWFkKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisKKyAgICB3aGlsZSAocEgyNjRFbmMtPk5CRW5jVGhyZWFkLmJFeGl0RW5jb2RlVGhyZWFkID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCk7CisKKyAgICAgICAgaWYgKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5iRXhpdEVuY29kZVRocmVhZCA9PSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0V4ZShwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpOworICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisgICAgU0VDX09TQUxfVGhyZWFkRXhpdChOVUxMKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBJbml0ICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfSDI2NEVuY19Jbml0KE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAgICpwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgcmV0dXJuQ29kZWMgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5iQ29uZmlndXJlZE1GQyA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9GQUxTRTsKKyAgICBwU0VDQ29tcG9uZW50LT5iU2F2ZUZsYWdFT1MgPSBPTVhfRkFMU0U7CisKKyAgICAvKiBNRkMoTXVsdGkgRnVuY3Rpb24gQ29kZWMpIGVuY29kZXIgYW5kIENNTShDb2RlYyBNZW1vcnkgTWFuYWdlbWVudCkgZHJpdmVyIG9wZW4gKi8KKyAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX3R5cGUgPSBDQUNIRTsKKyAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbigmYnVmX3R5cGUpOworICAgIGlmIChoTUZDSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlID0gaE1GQ0hhbmRsZTsKKworICAgIFNzYlNpcE1mY0VuY1NldFNpemUoaE1GQ0hhbmRsZSwgSDI2NF9FTkMsCisgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQpOworCisgICAgLyogQWxsb2NhdGUgZW5jb2RlcidzIGlucHV0IGJ1ZmZlciAqLworICAgIHJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0SW5CdWYoaE1GQ0hhbmRsZSwgJihwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvKSk7CisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZUGh5QWRkciA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uWVBoeUFkZHI7CisgICAgcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNQaHlBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DUGh5QWRkcjsKKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWVZpckFkZHIgPSBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyOworICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DVmlyQWRkciA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHI7CisgICAgcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZU2l6ZTsKKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ0J1ZmZlclNpemUgPSBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLkNTaXplOworICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZRGF0YVNpemUgPSAwOworICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DRGF0YVNpemUgPSAwOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkciA6IDB4JXgiLCBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIgOiAweCV4IiwgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkcik7CisKKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldEluQnVmKGhNRkNIYW5kbGUsICYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mbykpOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWVBoeUFkZHIgPSBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLllQaHlBZGRyOworICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5DUGh5QWRkciA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1BoeUFkZHI7CisgICAgcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllWaXJBZGRyID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcjsKKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uQ1ZpckFkZHIgPSBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLkNWaXJBZGRyOworICAgIHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5ZQnVmZmVyU2l6ZSA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uWVNpemU7CisgICAgcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNCdWZmZXJTaXplID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5DU2l6ZTsKKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWURhdGFTaXplID0gMDsKKyAgICBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uQ0RhdGFTaXplID0gMDsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uWVZpckFkZHIgOiAweCV4IiwgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvLkNWaXJBZGRyIDogMHgleCIsIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIpOworCisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVBoeUFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWVBoeUFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1BoeUFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ1BoeUFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVZpckFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWVZpckFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1ZpckFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ1ZpckFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVNpemUgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWUJ1ZmZlclNpemU7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1NpemUgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ0J1ZmZlclNpemU7CisKKyAgICBwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlciA9IDA7CisgICAgcEgyNjRFbmMtPmJGaXJzdEZyYW1lID0gT01YX1RSVUU7CisKKyAgICBwSDI2NEVuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPSBPTVhfRkFMU0U7CisgICAgcEgyNjRFbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuID0gT01YX0ZBTFNFOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCkpOworICAgIFNFQ19PU0FMX1NlbWFwaG9yZUNyZWF0ZSgmKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBIMjY0RW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUNfTUZDX0VuY29kZVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPTVhDb21wb25lbnQpKSB7CisgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgfQorCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wID0gMDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyogTUZDIFRlcm1pbmF0ZSAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX0gyNjRFbmNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICpwSDI2NEVuYyA9IE5VTEw7CisgICAgT01YX1BUUiAgICAgICAgICAgICAgICBoTUZDSGFuZGxlID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKworICAgIGlmIChwSDI2NEVuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgcEgyNjRFbmMtPk5CRW5jVGhyZWFkLmJFeGl0RW5jb2RlVGhyZWFkID0gT01YX1RSVUU7CisgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocEgyNjRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICAgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQpOworICAgICAgICBwSDI2NEVuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwSDI2NEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpOworICAgICAgICBwSDI2NEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kID0gTlVMTDsKKyAgICB9CisKKyAgICBpZihwSDI2NEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocEgyNjRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICAgICAgcEgyNjRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0ID0gTlVMTDsKKyAgICB9CisKKyAgICBoTUZDSGFuZGxlID0gcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGU7CisgICAgaWYgKGhNRkNIYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBTc2JTaXBNZmNFbmNDbG9zZShoTUZDSGFuZGxlKTsKKyAgICAgICAgaE1GQ0hhbmRsZSA9IHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0X0VuY29kZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAgICpwSDI2NEVuYyA9IChTRUNfSDI2NEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAqcElucHV0SW5mbyA9ICZwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5wdXRJbmZvOworICAgIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPIG91dHB1dEluZm87CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE1GQ19FTkNfQUREUl9JTkZPICAgICAgICAgIGFkZHJJbmZvOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID09IE9NWF9GQUxTRSkgeworICAgICAgICBTZXRfSDI2NEVOQ19QYXJhbSgmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5tZmNWaWRlb0F2YyksIHBTRUNDb21wb25lbnQpOworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNJbml0KHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCAmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5tZmNWaWRlb0F2YykpOworICAgICAgICBpZiAocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldE91dEJ1ZihwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaE1GQ0hhbmRsZSwgJm91dHB1dEluZm8pOworICAgICAgICBpZiAocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spCisgICAgICAgIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiJXMgLSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYgRmFpbGVkXG4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaGFyICpwID0gTlVMTDsKKyAgICAgICAgICAgIGludCBpU3BzU2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgaVBwc1NpemUgPSAwOworCisgICAgICAgICAgICBwID0gRmluZERlbGltaXRlcigoT01YX1U4ICopb3V0cHV0SW5mby5TdHJtVmlyQWRkciArIDQsIG91dHB1dEluZm8uaGVhZGVyU2l6ZSAtIDQpOworCisgICAgICAgICAgICBpU3BzU2l6ZSA9ICh1bnNpZ25lZCBpbnQpcCAtICh1bnNpZ25lZCBpbnQpb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgICAgIHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oZWFkZXJEYXRhLnBIZWFkZXJTUFMgPSAoT01YX1BUUilvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhlYWRlckRhdGEuU1BTTGVuID0gaVNwc1NpemU7CisKKyAgICAgICAgICAgIGlQcHNTaXplID0gb3V0cHV0SW5mby5oZWFkZXJTaXplIC0gaVNwc1NpemU7CisgICAgICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaGVhZGVyRGF0YS5wSGVhZGVyUFBTID0gb3V0cHV0SW5mby5TdHJtVmlyQWRkciArIGlTcHNTaXplOworICAgICAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhlYWRlckRhdGEuUFBTTGVuID0gaVBwc1NpemU7CisgICAgICAgIH0KKworICAgICAgICAvKiBTRUNfT1NBTF9NZW1jcHkoKHZvaWQqKShwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciksIChjb25zdCB2b2lkKikob3V0cHV0SW5mby5TdHJtVmlyQWRkciksIG91dHB1dEluZm8uaGVhZGVyU2l6ZSk7ICovCisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyID0gb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uaGVhZGVyU2l6ZTsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBvdXRwdXRJbmZvLmhlYWRlclNpemU7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSAwOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisKKyAgICAgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX1RSVUU7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FTkRPRkZSQU1FKSAmJgorICAgICAgICAocFNFQ0NvbXBvbmVudC0+YlVzZUZsYWdFT0YgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9IE9NWF9UUlVFOworICAgIH0KKworICAgIGlmIChvbmVGcmFtZVNpemUgPD0gMCkgeworICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcElucHV0RGF0YS0+dGltZVN0YW1wOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBpZiAoKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgfHwKKyAgICAgICAgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSl7CisgICAgICAgIC8qIER1bW15IGlucHV0IGRhdGEgZm9yIGdldCBvdXQgZW5jb2RlZCBsYXN0IGZyYW1lICovCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BIMjY0RW5jLT5pbmRleElucHV0QnVmZmVyXS5ZUGh5QWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcEgyNjRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVZpckFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNWaXJBZGRyID0gcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BIMjY0RW5jLT5pbmRleElucHV0QnVmZmVyXS5DVmlyQWRkcjsKKyAgICB9IGVsc2UgaWYgKHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID09IE9NWF9TRUNfQ09MT1JfRm9ybWF0TlYxMlRQaHlzaWNhbEFkZHJlc3MpIHsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkclksIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHNpemVvZihhZGRySW5mby5wQWRkclkpKTsKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KCZhZGRySW5mby5wQWRkckMsIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIgKyBzaXplb2YoYWRkckluZm8ucEFkZHJZKSwgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyQykpOworICAgICAgICBwSW5wdXRJbmZvLT5ZUGh5QWRkciA9IGFkZHJJbmZvLnBBZGRyWTsKKyAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBhZGRySW5mby5wQWRkckM7CisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisgICAgfSBlbHNlIGlmIChwU0VDUG9ydC0+YlN0b3JlTWV0YURhdGFJbkJ1ZmZlciAhPSBPTVhfRkFMU0UpIHsKKyAgICAgICAgcmV0ID0gcHJlcHJvY2Vzc01ldGFEYXRhSW5CdWZmZXJzKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEtPmRhdGFCdWZmZXIsIHBJbnB1dEluZm8pOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpCisgICAgICAgICAgICBnb3RvIEVYSVQ7CisjZW5kaWYKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBSZWFsIGlucHV0IGRhdGEgKi8KKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5ZUGh5QWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1BoeUFkZHIgPSBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5DUGh5QWRkcjsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50LT50aW1lU3RhbXBbcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPm5GbGFnczsKKworICAgIGlmICgocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spICYmCisgICAgICAgIChwSDI2NEVuYy0+YkZpcnN0RnJhbWUgPT0gT01YX0ZBTFNFKSkgeworICAgICAgICBPTVhfUzMyIGluZGV4VGltZXN0YW1wID0gMDsKKworICAgICAgICAvKiB3YWl0IGZvciBtZmMgZW5jb2RlIGRvbmUgKi8KKyAgICAgICAgaWYgKHBIMjY0RW5jLT5OQkVuY1RocmVhZC5iRW5jb2RlclJ1biAhPSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocEgyNjRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZUVuZCk7CisgICAgICAgICAgICBwSDI2NEVuYy0+TkJFbmNUaHJlYWQuYkVuY29kZXJSdW4gPSBPTVhfRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRPdXRCdWYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgaWYgKChTc2JTaXBNZmNFbmNHZXRDb25maWcocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIE1GQ19FTkNfR0VUQ09ORl9GUkFNRV9UQUcsICZpbmRleFRpbWVzdGFtcCkgIT0gTUZDX1JFVF9PSykgfHwKKyAgICAgICAgICAgICgoKGluZGV4VGltZXN0YW1wIDwgMCkgfHwgKGluZGV4VGltZXN0YW1wID49IE1BWF9USU1FU1RBTVApKSkpeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICAvKiogRmlsbCBPdXRwdXQgQnVmZmVyICoqLworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFCdWZmZXIgPSBvdXRwdXRJbmZvLlN0cm1WaXJBZGRyOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IG91dHB1dEluZm8uZGF0YVNpemU7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisgICAgICAgICAgICBpZiAob3V0cHV0SW5mby5mcmFtZVR5cGUgPT0gTUZDX0ZSQU1FX1RZUEVfSV9GUkFNRSkKKyAgICAgICAgICAgICAgICAgICAgcE91dHB1dERhdGEtPm5GbGFncyB8PSBPTVhfQlVGRkVSRkxBR19TWU5DRlJBTUU7CisKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTUZDIEVuY29kZSBPSyEhISEhISEhISEhISEhISEhISEhISEhISEhISEhXG4iKTsKKworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0VuY0dldE91dEJ1ZiBmYWlsZWQsIHJldDolZCIsIF9fRlVOQ1RJT05fXywgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU0VDQ29tcG9uZW50LT5nZXRBbGxEZWxheUJ1ZmZlciA9PSBPTVhfVFJVRSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0OworICAgICAgICB9CisgICAgICAgIGlmICgocElucHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBJbnB1dERhdGEtPm5GbGFncyA9IChwT3V0cHV0RGF0YS0+bkZsYWdzICYgKH5PTVhfQlVGRkVSRkxBR19FT1MpKTsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX1RSVUU7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwT3V0cHV0RGF0YS0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSA9PSBPTVhfQlVGRkVSRkxBR19FT1MpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID0gT01YX0ZBTFNFOworICAgICAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSAwOworICAgICAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiT01YX0JVRkZFUkZMQUdfRU9TISEhIik7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgICAgICB9CisgICAgfQorICAgIGlmIChwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIkluICVzIDogU3NiU2lwTWZjRW5jRXhlIEZhaWxlZCEhIVxuIiwgX19mdW5jX18pOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgfQorCisgICAgcEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jU2V0SW5CdWYocEgyNjRFbmMtPmhNRkNIMjY0SGFuZGxlLmhNRkNIYW5kbGUsIHBJbnB1dEluZm8pOworICAgIGlmIChwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUucmV0dXJuQ29kZWMgIT0gTUZDX1JFVF9PSykgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkVycm9yIDogU3NiU2lwTWZjRW5jU2V0SW5CdWYoKSBcbiIpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9IGVsc2UgeworICAgICAgICBwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcisrOworICAgICAgICBwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlciAlPSBNRkNfSU5QVVRfQlVGRkVSX05VTV9NQVg7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLllQaHlBZGRyID0gcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BIMjY0RW5jLT5pbmRleElucHV0QnVmZmVyXS5ZUGh5QWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1BoeUFkZHIgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcEgyNjRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5ZVmlyQWRkciA9IHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVZpckFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLkNWaXJBZGRyID0gcEgyNjRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BIMjY0RW5jLT5pbmRleElucHV0QnVmZmVyXS5DVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVNpemUgPSBwSDI2NEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcEgyNjRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLllCdWZmZXJTaXplOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5DU2l6ZSA9IHBIMjY0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwSDI2NEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ0J1ZmZlclNpemU7CisgICAgfQorCisgICAgU3NiU2lwTWZjRW5jU2V0Q29uZmlnKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5oTUZDSGFuZGxlLCBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBIMjY0RW5jLT5oTUZDSDI2NEhhbmRsZS5pbmRleFRpbWVzdGFtcCkpOworCisgICAgLyogbWZjIGVuY29kZSBzdGFydCAqLworICAgIFNFQ19PU0FMX1NlbWFwaG9yZVBvc3QocEgyNjRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICBwSDI2NEVuYy0+TkJFbmNUaHJlYWQuYkVuY29kZXJSdW4gPSBPTVhfVFJVRTsKKyAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICBwSDI2NEVuYy0+aE1GQ0gyNjRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgJT0gTUFYX1RJTUVTVEFNUDsKKyAgICBwSDI2NEVuYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBFbmNvZGUgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19IMjY0RW5jX2J1ZmZlclByb2Nlc3MoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQsIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSwgU0VDX09NWF9EQVRBICpwT3V0cHV0RGF0YSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gKFNFQ19IMjY0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBlbmRPZkZyYW1lID0gT01YX0ZBTFNFOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICBmbGFnRU9TID0gT01YX0ZBTFNFOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKCghQ0hFQ0tfUE9SVF9FTkFCTEVEKHBTRUNJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfRU5BQkxFRChwU0VDT3V0cHV0UG9ydCkpIHx8CisgICAgICAgICAgICAoIUNIRUNLX1BPUlRfUE9QVUxBVEVEKHBTRUNJbnB1dFBvcnQpKSB8fCAoIUNIRUNLX1BPUlRfUE9QVUxBVEVEKHBTRUNPdXRwdXRQb3J0KSkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAoT01YX0ZBTFNFID09IFNFQ19DaGVja19CdWZmZXJQcm9jZXNzX1N0YXRlKHBTRUNDb21wb25lbnQpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfTUZDX0gyNjRfRW5jb2RlKHBPTVhDb21wb25lbnQsIHBJbnB1dERhdGEsIHBPdXRwdXREYXRhKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgaWYgKHJldCA9PSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQpIHsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBPdXRwdXREYXRhLT5kYXRhTGVuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+cENhbGxiYWNrcy0+RXZlbnRIYW5kbGVyKChPTVhfSEFORExFVFlQRSlwT01YQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5jYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9FdmVudEVycm9yLCByZXQsIDAsIE5VTEwpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gKz0gcElucHV0RGF0YS0+ZGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+cmVtYWluRGF0YUxlbiA9IHBJbnB1dERhdGEtPmRhdGFMZW4gLSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+ZGF0YUxlbiAtPSBwSW5wdXREYXRhLT51c2VkRGF0YUxlbjsKKyAgICAgICAgcElucHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworCisgICAgICAgIC8qIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7ICovCisgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW4gLSBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW47CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPU0NMX0VYUE9SVF9SRUYgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudEluaXQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1NUUklORyBjb21wb25lbnROYW1lKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfSDI2NEVOQ19IQU5ETEUgICAgICAqcEgyNjRFbmMgPSBOVUxMOworICAgIGludCBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY29tcG9uZW50TmFtZSA9PSBOVUxMKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9yQmFkUGFyYW1ldGVyLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2NF9FTkMsIGNvbXBvbmVudE5hbWUpICE9IDApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckJhZFBhcmFtZXRlciwgY29tcG9uZW50TmFtZTolcywgTGluZTolZCIsIGNvbXBvbmVudE5hbWUsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnRJbml0KHBPTVhDb21wb25lbnQpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTRUNDb21wb25lbnQtPmNvZGVjVHlwZSA9IEhXX1ZJREVPX0NPREVDOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9IChPTVhfU1RSSU5HKVNFQ19PU0FMX01hbGxvYyhNQVhfT01YX0NPTVBPTkVOVF9OQU1FX1NJWkUpOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID09IE5VTEwpIHsKKyAgICAgICAgU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcywgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBIMjY0RW5jID0gU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNfSDI2NEVOQ19IQU5ETEUpKTsKKyAgICBpZiAocEgyNjRFbmMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzLCBMaW5lOiVkIiwgX19MSU5FX18pOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldChwSDI2NEVuYywgMCwgc2l6ZW9mKFNFQ19IMjY0RU5DX0hBTkRMRSkpOworICAgIHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSA9IChPTVhfSEFORExFVFlQRSlwSDI2NEVuYzsKKworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9IMjY0X0VOQyk7CisgICAgLyogU2V0IGNvbXBvbmVudFZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisgICAgLyogU2V0IHNwZWNWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKworICAgIC8qIEFuZHJvaWQgQ2FwYWJpbGl0eUZsYWdzICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlJc09NWENvbXBvbmVudE11bHRpVGhyZWFkZWQgICAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxJbnB1dEJ1ZmZlckFsbG9jICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c01vdmFibGVJbnB1dEJ1ZmZlcnMgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXMgICAgICAgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzTkFMU3RhcnRDb2RlcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudENhbkhhbmRsZUluY29tcGxldGVGcmFtZXMgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc0Z1bGxBVkNGcmFtZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisKKyAgICAvKiBJbnB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfVklERU9fSU5QVVRfQlVGRkVSX1NJWkU7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJyYXcvdmlkZW8iKTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworCisgICAgLyogT3V0cHV0IHBvcnQgKi8KKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ublN0cmlkZSA9IDA7IC8qREVGQVVMVF9GUkFNRV9XSURUSDsqLworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5uQnVmZmVyU2l6ZSA9IERFRkFVTFRfVklERU9fT1VUUFVUX0JVRkZFUl9TSVpFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0FWQzsKKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsIDAsIE1BWF9PTVhfTUlNRVRZUEVfU0laRSk7CisgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vYXZjIik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29sb3JGb3JtYXQgPSBPTVhfQ09MT1JfRm9ybWF0VW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5iRW5hYmxlZCA9IE9NWF9UUlVFOworCisgICAgZm9yKGkgPSAwOyBpIDwgQUxMX1BPUlRfTlVNOyBpKyspIHsKKyAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwSDI2NEVuYy0+QVZDQ29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fQVZDVFlQRSk7CisgICAgICAgIHBIMjY0RW5jLT5BVkNDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgIHBIMjY0RW5jLT5BVkNDb21wb25lbnRbaV0uZVByb2ZpbGUgICA9IE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmU7CisgICAgICAgIHBIMjY0RW5jLT5BVkNDb21wb25lbnRbaV0uZUxldmVsICAgICA9IE9NWF9WSURFT19BVkNMZXZlbDMxOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQtPkdldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfSDI2NEVuY19HZXRQYXJhbWV0ZXI7CisgICAgcE9NWENvbXBvbmVudC0+U2V0UGFyYW1ldGVyICAgICAgPSAmU0VDX01GQ19IMjY0RW5jX1NldFBhcmFtZXRlcjsKKyAgICBwT01YQ29tcG9uZW50LT5HZXRDb25maWcgICAgICAgICA9ICZTRUNfTUZDX0gyNjRFbmNfR2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPlNldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfSDI2NEVuY19TZXRDb25maWc7CisgICAgcE9NWENvbXBvbmVudC0+R2V0RXh0ZW5zaW9uSW5kZXggPSAmU0VDX01GQ19IMjY0RW5jX0dldEV4dGVuc2lvbkluZGV4OworICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudFJvbGVFbnVtID0gJlNFQ19NRkNfSDI2NEVuY19Db21wb25lbnRSb2xlRW51bTsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgICA9ICZTRUNfT01YX0NvbXBvbmVudERlaW5pdDsKKworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50SW5pdCAgICAgID0gJlNFQ19NRkNfSDI2NEVuY19Jbml0OworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50VGVybWluYXRlID0gJlNFQ19NRkNfSDI2NEVuY19UZXJtaW5hdGU7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX21mY19idWZmZXJQcm9jZXNzICAgICAgPSAmU0VDX01GQ19IMjY0RW5jX2J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSAgICAgICAgPSBOVUxMOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX0gyNjRFTkNfSEFORExFICAgICAgKnBIMjY0RW5jID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisKKyAgICBTRUNfT1NBTF9GcmVlKHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSBOVUxMOworCisgICAgcEgyNjRFbmMgPSAoU0VDX0gyNjRFTkNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIGlmIChwSDI2NEVuYyAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocEgyNjRFbmMpOworICAgICAgICBwSDI2NEVuYyA9IHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjRlbmMvU0VDX09NWF9IMjY0ZW5jLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjRlbmMvU0VDX09NWF9IMjY0ZW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvaDI2NGVuYy9TRUNfT01YX0gyNjRlbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfSDI2NGVuYy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX0gyNjRfRU5DX0NPTVBPTkVOVAorI2RlZmluZSBTRUNfT01YX0gyNjRfRU5DX0NPTVBPTkVOVAorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiT01YX1ZpZGVvLmgiCisjaW5jbHVkZSAiU3NiU2lwTWZjQXBpLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX0VYVFJBX0RBVEEKK3sKKyAgICBPTVhfUFRSIHBIZWFkZXJTUFM7CisgICAgT01YX1UzMiBTUFNMZW47CisgICAgT01YX1BUUiBwSGVhZGVyUFBTOworICAgIE9NWF9VMzIgUFBTTGVuOworfSBFWFRSQV9EQVRBOworCit0eXBlZGVmIHN0cnVjdCBfU0VDX01GQ19IMjY0RU5DX0hBTkRMRQoreworICAgIE9NWF9IQU5ETEVUWVBFIGhNRkNIYW5kbGU7CisgICAgU1NCU0lQX01GQ19FTkNfSDI2NF9QQVJBTSBtZmNWaWRlb0F2YzsKKyAgICBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPIGlucHV0SW5mbzsKKy8qICAgIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPIG91dHB1dEluZm87ICovCisgICAgT01YX1UzMiBpbmRleFRpbWVzdGFtcDsKKyAgICBPTVhfQk9PTCBiQ29uZmlndXJlZE1GQzsKKyAgICBFWFRSQV9EQVRBIGhlYWRlckRhdGE7CisgICAgT01YX1MzMiByZXR1cm5Db2RlYzsKK30gU0VDX01GQ19IMjY0RU5DX0hBTkRMRTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19IMjY0RU5DX0hBTkRMRQoreworICAgIC8qIE9NWCBDb2RlYyBzcGVjaWZpYyAqLworICAgIE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIEFWQ0NvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGVbQUxMX1BPUlRfTlVNXTsKKworICAgIC8qIFNFQyBNRkMgQ29kZWMgc3BlY2lmaWMgKi8KKyAgICBTRUNfTUZDX0gyNjRFTkNfSEFORExFIGhNRkNIMjY0SGFuZGxlOworCisgICAgLyogRm9yIE5vbi1CbG9jayBtb2RlICovCisgICAgU0VDX01GQ19OQkVOQ19USFJFQUQgTkJFbmNUaHJlYWQ7CisgICAgT01YX0JPT0wgYkZpcnN0RnJhbWU7CisgICAgTUZDX0VOQ19JTlBVVF9CVUZGRVIgTUZDRW5jSW5wdXRCdWZmZXJbTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYXTsKKyAgICBPTVhfVTMyICBpbmRleElucHV0QnVmZmVyOworfSBTRUNfSDI2NEVOQ19IQU5ETEU7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50RGVpbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL2gyNjRlbmMvbGlicmFyeV9yZWdpc3Rlci5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdiMzhiCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuYwpAQCAtMCwwICsxLDU1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9FVEMuaCIKKyNpbmNsdWRlICJsaWJyYXJ5X3JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHMpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKHNlY0NvbXBvbmVudHMgPT0gTlVMTCkKKyAgICAgICAgZ290byBFWElUOworCisgICAgLyogY29tcG9uZW50IDEgLSB2aWRlbyBkZWNvZGVyIEguMjY0ICovCisgICAgU0VDX09TQUxfU3RyY3B5KHNlY0NvbXBvbmVudHNbMF0tPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRU5DKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkoc2VjQ29tcG9uZW50c1swXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRU5DX1JPTEUpOworICAgIHNlY0NvbXBvbmVudHNbMF0tPnRvdGFsUm9sZU51bSA9IE1BWF9DT01QT05FTlRfUk9MRV9OVU07CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiBNQVhfQ09NUE9ORU5UX05VTTsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9oMjY0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvaDI2NGVuYy9saWJyYXJ5X3JlZ2lzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNzZhZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvaDI2NGVuYy9saWJyYXJ5X3JlZ2lzdGVyLmgKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBsaWJyYXJ5X3JlZ2lzdGVyLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfSDI2NF9SRUcKKyNkZWZpbmUgU0VDX09NWF9IMjY0X1JFRworCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaCIKKworCisjZGVmaW5lIE9TQ0xfRVhQT1JUX1JFRiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorI2RlZmluZSBNQVhfQ09NUE9ORU5UX05VTSAgICAgICAxCisjZGVmaW5lIE1BWF9DT01QT05FTlRfUk9MRV9OVU0gIDEKKworLyogSC4yNjQgKi8KKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfSDI2NF9FTkMgIk9NWC5TRUMuQVZDLkVuY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjRfRU5DX1JPTEUgInZpZGVvX2VuY29kZXIuYXZjIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT1NDTF9FWFBPUlRfUkVGIGludCBTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHMpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzRlbmMvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzRlbmMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGVmZWM2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNGVuYy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gXAorCVNFQ19PTVhfTXBlZzRlbmMuYyBcCisJbGlicmFyeV9yZWdpc3Rlci5jCisKKworTE9DQUxfTU9EVUxFIDo9IGxpYk9NWC5TRUMuTTRWLkVuY29kZXIKKworTE9DQUxfQ0ZMQUdTIDo9CisKK0xPQ0FMX0FSTV9NT0RFIDo9IGFybQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYlNFQ19PTVhfVmVuYyBsaWJzZWNvc2FsIGxpYnNlY2Jhc2Vjb21wb25lbnQgXAorCQkJCQkJbGlic2VjbWZjZW5jYXBpIGxpYnNlY2NzYworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJjIGxpYmRsIGxpYmN1dGlscyBsaWJ1dGlscyBsaWJ1aSBsaWJoYXJkd2FyZQorCitMT0NBTF9DX0lOQ0xVREVTIDo9ICQoU0VDX09NWF9JTkMpL2tocm9ub3MgXAorCSQoU0VDX09NWF9JTkMpL3NlYyBcCisJJChTRUNfT01YX1RPUCkvc2VjX29zYWwgXAorCSQoU0VDX09NWF9UT1ApL3NlY19vbXhfY29yZSBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvY29tbW9uIFwKKwkkKFNFQ19PTVhfQ09NUE9ORU5UKS92aWRlby9lbmMKKworTE9DQUxfQ19JTkNMVURFUyArPSAkKFNFQ19PTVhfVE9QKS9zZWNfY29kZWNzL3ZpZGVvL21mY19jMTEwL2luY2x1ZGUKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNGVuYy9TRUNfT01YX01wZWc0ZW5jLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL1NFQ19PTVhfTXBlZzRlbmMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjEzNTIyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNGVuYy9TRUNfT01YX01wZWc0ZW5jLmMKQEAgLTAsMCArMSwxNTE2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfTXBlZzRlbmMuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vjb21wb25lbnQuaCIKKyNpbmNsdWRlICJTRUNfT01YX0Jhc2Vwb3J0LmgiCisjaW5jbHVkZSAiU0VDX09NWF9WZW5jLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfTXBlZzRlbmMuaCIKKyNpbmNsdWRlICJTc2JTaXBNZmNBcGkuaCIKKyNpbmNsdWRlICJjb2xvcl9zcGFjZV9jb252ZXJ0b3IuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX01QRUc0X0VOQyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCisvKiBNUEVHNCBFbmNvZGVyIFN1cHBvcnRlZCBMZXZlbHMgJiBwcm9maWxlcyAqLworU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwgc3VwcG9ydGVkTVBFRzRQcm9maWxlTGV2ZWxzW10gPXsKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwYn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMX0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNH0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsNGF9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsMH0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwwYn0sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWwxfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDJ9LAorICAgIHtPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUsIE9NWF9WSURFT19NUEVHNExldmVsM30sCisgICAge09NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSwgT01YX1ZJREVPX01QRUc0TGV2ZWw0fSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDRhfSwKKyAgICB7T01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlLCBPTVhfVklERU9fTVBFRzRMZXZlbDV9fTsKKworLyogSC4yNjMgRW5jb2RlciBTdXBwb3J0ZWQgTGV2ZWxzICYgcHJvZmlsZXMgKi8KK1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMIHN1cHBvcnRlZEgyNjNQcm9maWxlTGV2ZWxzW10gPSB7CisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsMTB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDIwfSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWwzMH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNDB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDQ1fSwKKyAgICB7T01YX1ZJREVPX0gyNjNQcm9maWxlQmFzZWxpbmUsIE9NWF9WSURFT19IMjYzTGV2ZWw1MH0sCisgICAge09NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lLCBPTVhfVklERU9fSDI2M0xldmVsNjB9LAorICAgIHtPTVhfVklERU9fSDI2M1Byb2ZpbGVCYXNlbGluZSwgT01YX1ZJREVPX0gyNjNMZXZlbDcwfX07CisKK09NWF9VMzIgT01YTXBlZzRQcm9maWxlVG9NRkNQcm9maWxlKE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIHByb2ZpbGUpCit7CisgICAgT01YX1UzMiByZXQ7CisKKyAgICBzd2l0Y2ggKHByb2ZpbGUpIHsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGU6CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOgorICAgICAgICByZXQgPSAxOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXQgPSAwOworICAgIH07CisKKyAgICByZXR1cm4gcmV0OworfQorT01YX1UzMiBPTVhNcGVnNExldmVsVG9NRkNMZXZlbChPTVhfVklERU9fTVBFRzRMRVZFTFRZUEUgbGV2ZWwpCit7CisgICAgT01YX1UzMiByZXQ7CisKKyAgICBzd2l0Y2ggKGxldmVsKSB7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDA6CisgICAgICAgIHJldCA9IDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwwYjoKKyAgICAgICAgcmV0ID0gOTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDE6CisgICAgICAgIHJldCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1ZJREVPX01QRUc0TGV2ZWwyOgorICAgICAgICByZXQgPSAyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsMzoKKyAgICAgICAgcmV0ID0gMzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDQ6CisgICAgY2FzZSBPTVhfVklERU9fTVBFRzRMZXZlbDRhOgorICAgICAgICByZXQgPSA0OworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WSURFT19NUEVHNExldmVsNToKKyAgICAgICAgcmV0ID0gNTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gMDsKKyAgICB9OworCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBNcGVnNFByaW50UGFyYW1zKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNIG1wZWc0UGFyYW0pCit7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTb3VyY2VXaWR0aCAgICAgICAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLlNvdXJjZVdpZHRoKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZUhlaWdodCAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uU291cmNlSGVpZ2h0KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIklEUlBlcmlvZCAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uSURSUGVyaW9kKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNsaWNlTW9kZSAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uU2xpY2VNb2RlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlJhbmRvbUludHJhTUJSZWZyZXNoICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uUmFuZG9tSW50cmFNQlJlZnJlc2gpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRW5hYmxlRlJNUmF0ZUNvbnRyb2wgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5FbmFibGVGUk1SYXRlQ29udHJvbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJCaXRyYXRlICAgICAgICAgICAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLkJpdHJhdGUpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRnJhbWVRcCAgICAgICAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5GcmFtZVFwKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lUXBfUCAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uRnJhbWVRcF9QKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1heCAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uUVNDb2RlTWF4KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlFTQ29kZU1pbiAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uUVNDb2RlTWluKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNCUlBlcmlvZFJmICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uQ0JSUGVyaW9kUmYpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUGFkQ29udHJvbE9uICAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5QYWRDb250cm9sT24pOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTHVtYVBhZFZhbCAgICAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5MdW1hUGFkVmFsKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNiUGFkVmFsICAgICAgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uQ2JQYWRWYWwpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiQ3JQYWRWYWwgICAgICAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5DclBhZFZhbCk7CisKKyAgICAvKiBNUEVHNCBzcGVjaWZpYyBwYXJhbWV0ZXJzICovCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQcm9maWxlSURDICAgICAgICAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLlByb2ZpbGVJREMpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiTGV2ZWxJREMgICAgICAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5MZXZlbElEQyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJGcmFtZVFwX0IgICAgICAgICAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLkZyYW1lUXBfQik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJUaW1lSW5jcmVhbWVudFJlcyAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLlRpbWVJbmNyZWFtZW50UmVzKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZvcFRpbWVJbmNyZWFtZW50ICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uVm9wVGltZUluY3JlYW1lbnQpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU2xpY2VBcmd1bWVudCAgICAgICAgICAgOiAlZFxuIiwgbXBlZzRQYXJhbS5TbGljZUFyZ3VtZW50KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIk51bWJlckJGcmFtZXMgICAgICAgICAgIDogJWRcbiIsIG1wZWc0UGFyYW0uTnVtYmVyQkZyYW1lcyk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJEaXNhYmxlUXBlbE1FICAgICAgICAgICA6ICVkXG4iLCBtcGVnNFBhcmFtLkRpc2FibGVRcGVsTUUpOworfQorCit2b2lkIEgyNjNQcmludFBhcmFtcyhTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNIGgyNjNQYXJhbSkKK3sKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNvdXJjZVdpZHRoICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5Tb3VyY2VXaWR0aCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJTb3VyY2VIZWlnaHQgICAgICAgICAgICA6ICVkXG4iLCBoMjYzUGFyYW0uU291cmNlSGVpZ2h0KTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIklEUlBlcmlvZCAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5JRFJQZXJpb2QpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU2xpY2VNb2RlICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2M1BhcmFtLlNsaWNlTW9kZSk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJSYW5kb21JbnRyYU1CUmVmcmVzaCAgICA6ICVkXG4iLCBoMjYzUGFyYW0uUmFuZG9tSW50cmFNQlJlZnJlc2gpOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRW5hYmxlRlJNUmF0ZUNvbnRyb2wgICAgOiAlZFxuIiwgaDI2M1BhcmFtLkVuYWJsZUZSTVJhdGVDb250cm9sKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkJpdHJhdGUgICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5CaXRyYXRlKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lUXAgICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5GcmFtZVFwKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkZyYW1lUXBfUCAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5GcmFtZVFwX1ApOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiUVNDb2RlTWF4ICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2M1BhcmFtLlFTQ29kZU1heCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJRU0NvZGVNaW4gICAgICAgICAgICAgICA6ICVkXG4iLCBoMjYzUGFyYW0uUVNDb2RlTWluKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNCUlBlcmlvZFJmICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5DQlJQZXJpb2RSZik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJQYWRDb250cm9sT24gICAgICAgICAgICA6ICVkXG4iLCBoMjYzUGFyYW0uUGFkQ29udHJvbE9uKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkx1bWFQYWRWYWwgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5MdW1hUGFkVmFsKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNiUGFkVmFsICAgICAgICAgICAgICAgIDogJWRcbiIsIGgyNjNQYXJhbS5DYlBhZFZhbCk7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJDclBhZFZhbCAgICAgICAgICAgICAgICA6ICVkXG4iLCBoMjYzUGFyYW0uQ3JQYWRWYWwpOworCisgICAgLyogSC4yNjMgc3BlY2lmaWMgcGFyYW1ldGVycyAqLworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiRnJhbWVSYXRlICAgICAgICAgICAgICAgOiAlZFxuIiwgaDI2M1BhcmFtLkZyYW1lUmF0ZSk7Cit9CisKK3ZvaWQgU2V0X01wZWc0RW5jX1BhcmFtKFNTQlNJUF9NRkNfRU5DX01QRUc0X1BBUkFNICpwTXBlZzRQYXJhbSwgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50KQoreworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgKnBTRUNJbnB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgKnBTRUNPdXRwdXRQb3J0ID0gTlVMTDsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgcFNFQ0lucHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICBwU0VDT3V0cHV0UG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICBwTXBlZzRQYXJhbS0+Y29kZWNUeXBlICAgICAgICAgICAgPSBNUEVHNF9FTkM7CisgICAgcE1wZWc0UGFyYW0tPlNvdXJjZVdpZHRoICAgICAgICAgID0gcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aDsKKyAgICBwTXBlZzRQYXJhbS0+U291cmNlSGVpZ2h0ICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKKyAgICBwTXBlZzRQYXJhbS0+SURSUGVyaW9kICAgICAgICAgICAgPSBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5uUEZyYW1lcyArIDE7CisgICAgcE1wZWc0UGFyYW0tPlNsaWNlTW9kZSAgICAgICAgICAgID0gMDsKKyAgICBwTXBlZzRQYXJhbS0+UmFuZG9tSW50cmFNQlJlZnJlc2ggPSAwOworICAgIHBNcGVnNFBhcmFtLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDE7ICAgIC8qIDA6IGRpc2FibGUsIDE6IGVuYWJsZSAqLworICAgIHBNcGVnNFBhcmFtLT5CaXRyYXRlICAgICAgICAgICAgICA9IHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGU7CisgICAgcE1wZWc0UGFyYW0tPkZyYW1lUXAgICAgICAgICAgICAgID0gMjA7CisgICAgcE1wZWc0UGFyYW0tPkZyYW1lUXBfUCAgICAgICAgICAgID0gMjA7CisgICAgcE1wZWc0UGFyYW0tPlFTQ29kZU1heCAgICAgICAgICAgID0gMzA7CisgICAgcE1wZWc0UGFyYW0tPlFTQ29kZU1pbiAgICAgICAgICAgID0gMTA7CisgICAgcE1wZWc0UGFyYW0tPkNCUlBlcmlvZFJmICAgICAgICAgID0gMTA7CisgICAgcE1wZWc0UGFyYW0tPlBhZENvbnRyb2xPbiAgICAgICAgID0gMDsgICAgLyogMDogVXNlIGJvdW5kYXJ5IHBpeGVsLCAxOiBVc2UgdGhlIGJlbG93IHNldHRpbmcgdmFsdWUgKi8KKyAgICBwTXBlZzRQYXJhbS0+THVtYVBhZFZhbCAgICAgICAgICAgPSAwOworICAgIHBNcGVnNFBhcmFtLT5DYlBhZFZhbCAgICAgICAgICAgICA9IDA7CisgICAgcE1wZWc0UGFyYW0tPkNyUGFkVmFsICAgICAgICAgICAgID0gMDsKKworICAgIHBNcGVnNFBhcmFtLT5Qcm9maWxlSURDICAgICAgICAgICA9IE9NWE1wZWc0UHJvZmlsZVRvTUZDUHJvZmlsZShwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W09VVFBVVF9QT1JUX0lOREVYXS5lUHJvZmlsZSk7CisgICAgcE1wZWc0UGFyYW0tPkxldmVsSURDICAgICAgICAgICAgID0gT01YTXBlZzRMZXZlbFRvTUZDTGV2ZWwocE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtPVVRQVVRfUE9SVF9JTkRFWF0uZUxldmVsKTsKKyAgICBwTXBlZzRQYXJhbS0+RnJhbWVRcF9CICAgICAgICAgICAgPSAyMDsKKyAgICBwTXBlZzRQYXJhbS0+VGltZUluY3JlYW1lbnRSZXMgICAgPSAocFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGUpID4+IDE2OworICAgIHBNcGVnNFBhcmFtLT5Wb3BUaW1lSW5jcmVhbWVudCAgICA9IDE7CisgICAgcE1wZWc0UGFyYW0tPlNsaWNlQXJndW1lbnQgICAgICAgID0gMDsgICAgLyogTUIgbnVtYmVyIG9yIGJ5dGUgbnVtYmVyICovCisgICAgcE1wZWc0UGFyYW0tPk51bWJlckJGcmFtZXMgICAgICAgID0gMDsgICAgLyogMChub3QgdXNlZCkgfiAyICovCisgICAgcE1wZWc0UGFyYW0tPkRpc2FibGVRcGVsTUUgICAgICAgID0gMTsKKworICAgIHN3aXRjaCAoKFNFQ19PTVhfQ09MT1JfRk9STUFUVFlQRSlwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0KSB7CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgcE1wZWc0UGFyYW0tPkZyYW1lTWFwID0gTlYxMl9MSU5FQVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICBkZWZhdWx0OgorICAgICAgICBwTXBlZzRQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgICAgIGJyZWFrOworICAgIH0KKworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgIGlmIChwU0VDSW5wdXRQb3J0LT5iU3RvcmVNZXRhRGF0YUluQnVmZmVyICE9IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEgPSAmcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgICAgIGlmKGlzTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZShwSW5wdXREYXRhLT5kYXRhQnVmZmVyKSA9PSBPTVhfVFJVRSkKKyAgICAgICAgICAgIHBNcGVnNFBhcmFtLT5GcmFtZU1hcCA9IE5WMTJfTElORUFSOworICAgICAgICBlbHNlCisgICAgICAgICAgICBwTXBlZzRQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgfQorI2VuZGlmCisKKy8qCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwU0VDUG9ydC0+ZUNvbnRyb2xSYXRlOiAweCV4IiwgcFNFQ091dHB1dFBvcnQtPmVDb250cm9sUmF0ZSk7CisgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+ZUNvbnRyb2xSYXRlKSB7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZToKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOiBGcmFtZSBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlTUJSYXRlQ29udHJvbCAgPSAwOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTpNQiBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBDQlIiKTsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMTsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sICA9IDE7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOk1CIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5DQlJQZXJpb2RSZiAgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlOgorICAgIGRlZmF1bHQ6IC8vQW5kcm9pZCBkZWZhdWx0CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVmlkZW8gRW5jb2RlIFZCUiIpOworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAwOworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlTUJSYXRlQ29udHJvbCAgPSAwOworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICB9CisqLworICAgIE1wZWc0UHJpbnRQYXJhbXMoKnBNcGVnNFBhcmFtKTsKK30KKwordm9pZCBTZXRfSDI2M0VuY19QYXJhbShTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICpwSDI2M1BhcmFtLCBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQpCit7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAqcFNFQ0lucHV0UG9ydCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAqcFNFQ091dHB1dFBvcnQgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBwU0VDSW5wdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIHBIMjYzUGFyYW0tPmNvZGVjVHlwZSAgICAgICAgICAgID0gSDI2M19FTkM7CisgICAgcEgyNjNQYXJhbS0+U291cmNlV2lkdGggICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOworICAgIHBIMjYzUGFyYW0tPlNvdXJjZUhlaWdodCAgICAgICAgID0gcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ7CisgICAgcEgyNjNQYXJhbS0+SURSUGVyaW9kICAgICAgICAgICAgPSBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbT1VUUFVUX1BPUlRfSU5ERVhdLm5QRnJhbWVzICsgMTsKKyAgICBwSDI2M1BhcmFtLT5TbGljZU1vZGUgICAgICAgICAgICA9IDA7CisgICAgcEgyNjNQYXJhbS0+UmFuZG9tSW50cmFNQlJlZnJlc2ggPSAwOworICAgIHBIMjYzUGFyYW0tPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMTsgICAgLyogMDogZGlzYWJsZSwgMTogZW5hYmxlICovCisgICAgcEgyNjNQYXJhbS0+Qml0cmF0ZSAgICAgICAgICAgICAgPSBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlOworICAgIHBIMjYzUGFyYW0tPkZyYW1lUXAgICAgICAgICAgICAgID0gMjA7CisgICAgcEgyNjNQYXJhbS0+RnJhbWVRcF9QICAgICAgICAgICAgPSAyMDsKKyAgICBwSDI2M1BhcmFtLT5RU0NvZGVNYXggICAgICAgICAgICA9IDMwOworICAgIHBIMjYzUGFyYW0tPlFTQ29kZU1pbiAgICAgICAgICAgID0gMTA7CisgICAgcEgyNjNQYXJhbS0+Q0JSUGVyaW9kUmYgICAgICAgICAgPSAxMDsKKyAgICBwSDI2M1BhcmFtLT5QYWRDb250cm9sT24gICAgICAgICA9IDA7ICAgIC8qIDA6IFVzZSBib3VuZGFyeSBwaXhlbCwgMTogVXNlIHRoZSBiZWxvdyBzZXR0aW5nIHZhbHVlICovCisgICAgcEgyNjNQYXJhbS0+THVtYVBhZFZhbCAgICAgICAgICAgPSAwOworICAgIHBIMjYzUGFyYW0tPkNiUGFkVmFsICAgICAgICAgICAgID0gMDsKKyAgICBwSDI2M1BhcmFtLT5DclBhZFZhbCAgICAgICAgICAgICA9IDA7CisKKyAgICBwSDI2M1BhcmFtLT5GcmFtZVJhdGUgICAgICAgICAgICA9IChwU0VDSW5wdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ueEZyYW1lcmF0ZSkgPj4gMTY7CisKKyAgICBzd2l0Y2ggKChTRUNfT01YX0NPTE9SX0ZPUk1BVFRZUEUpcFNFQ0lucHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgIHBIMjYzUGFyYW0tPkZyYW1lTWFwID0gTlYxMl9MSU5FQVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzczoKKyAgICBkZWZhdWx0OgorICAgICAgICBwSDI2M1BhcmFtLT5GcmFtZU1hcCA9IE5WMTJfVElMRTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCisgICAgaWYgKHBTRUNJbnB1dFBvcnQtPmJTdG9yZU1ldGFEYXRhSW5CdWZmZXIgIT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PTVhfREFUQSAqcElucHV0RGF0YSA9ICZwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXTsKKyAgICAgICAgaWYoaXNNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKHBJbnB1dERhdGEtPmRhdGFCdWZmZXIpID09IE9NWF9UUlVFKQorICAgICAgICAgICAgcEgyNjNQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX0xJTkVBUjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcEgyNjNQYXJhbS0+RnJhbWVNYXAgPSBOVjEyX1RJTEU7CisgICAgfQorI2VuZGlmCisKKy8qCisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwU0VDUG9ydC0+ZUNvbnRyb2xSYXRlOiAweCV4IiwgcFNFQ091dHB1dFBvcnQtPmVDb250cm9sUmF0ZSk7CisgICAgc3dpdGNoIChwU0VDT3V0cHV0UG9ydC0+ZUNvbnRyb2xSYXRlKSB7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVWYXJpYWJsZToKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJWaWRlbyBFbmNvZGUgVkJSIik7CisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVGUk1SYXRlQ29udHJvbCA9IDA7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOiBGcmFtZSBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlTUJSYXRlQ29udHJvbCAgPSAwOyAgICAgICAgLy8gMDogRGlzYWJsZSwgMTpNQiBsZXZlbCBSQworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50OgorICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlZpZGVvIEVuY29kZSBDQlIiKTsKKyAgICAgICAgcEgyNjRBcmctPkVuYWJsZUZSTVJhdGVDb250cm9sID0gMTsgICAgICAgIC8vIDA6IERpc2FibGUsIDE6IEZyYW1lIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5FbmFibGVNQlJhdGVDb250cm9sICA9IDE7ICAgICAgICAvLyAwOiBEaXNhYmxlLCAxOk1CIGxldmVsIFJDCisgICAgICAgIHBIMjY0QXJnLT5DQlJQZXJpb2RSZiAgPSAxMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfVmlkZW9fQ29udHJvbFJhdGVEaXNhYmxlOgorICAgIGRlZmF1bHQ6IC8vQW5kcm9pZCBkZWZhdWx0CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiVmlkZW8gRW5jb2RlIFZCUiIpOworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlRlJNUmF0ZUNvbnRyb2wgPSAwOworICAgICAgICBwSDI2NEFyZy0+RW5hYmxlTUJSYXRlQ29udHJvbCAgPSAwOworICAgICAgICBwSDI2NEFyZy0+Q0JSUGVyaW9kUmYgID0gMTAwOworICAgICAgICBicmVhazsKKyAgICB9CisqLworICAgIEgyNjNQcmludFBhcmFtcygqcEgyNjNQYXJhbSk7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNEVuY19HZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOICAgIE9NWF9JTkRFWFRZUEUgIG5QYXJhbUluZGV4LAorICAgIE9NWF9JTk9VVCBPTVhfUFRSICAgICAgICBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAoblBhcmFtSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKnBEc3RNcGVnNFBhcmFtID0gKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICpwU3JjTXBlZzRQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwRHN0TXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocERzdE1wZWc0UGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcFNyY01wZWc0UGFyYW0gPSAmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtwRHN0TXBlZzRQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RNcGVnNFBhcmFtLCBwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICpwRHN0SDI2M1BhcmFtID0gKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAgKnBTcmNIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEgyNjNQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0SDI2M1BhcmFtLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNIMjYzUGFyYW0gPSAmcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W3BEc3RIMjYzUGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0SDI2M1BhcmFtLCBwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1MzMiBjb2RlY1R5cGU7CisgICAgICAgIE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqcENvbXBvbmVudFJvbGUgPSAoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBDb21wb25lbnRSb2xlLCBzaXplb2YoT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgY29kZWNUeXBlID0gKChTRUNfTVBFRzRFTkNfSEFORExFICopKHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSkpLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKilwQ29tcG9uZW50Um9sZS0+Y1JvbGUsIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQ19ST0xFKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KChjaGFyICopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0VOQ19ST0xFKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbFF1ZXJ5U3VwcG9ydGVkOgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBTRUNfT01YX1ZJREVPX1BST0ZJTEVMRVZFTCAgICAgICAqcFByb2ZpbGVMZXZlbCA9IE5VTEw7CisgICAgICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQcm9maWxlTGV2ZWxOdW0gPSAwOworICAgICAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBjb2RlY1R5cGUgPSAoKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikocFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGU7CisgICAgICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgcFByb2ZpbGVMZXZlbCA9IHN1cHBvcnRlZE1QRUc0UHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IHNpemVvZihzdXBwb3J0ZWRNUEVHNFByb2ZpbGVMZXZlbHMpIC8gc2l6ZW9mKFNFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBQcm9maWxlTGV2ZWwgPSBzdXBwb3J0ZWRIMjYzUHJvZmlsZUxldmVsczsKKyAgICAgICAgICAgIG1heFByb2ZpbGVMZXZlbE51bSA9IHNpemVvZihzdXBwb3J0ZWRIMjYzUHJvZmlsZUxldmVscykgLyBzaXplb2YoU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUwpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXggPj0gbWF4UHJvZmlsZUxldmVsTnVtKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwUHJvZmlsZUxldmVsICs9IHBEc3RQcm9maWxlTGV2ZWwtPm5Qcm9maWxlSW5kZXg7CisgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFByb2ZpbGVMZXZlbC0+cHJvZmlsZTsKKyAgICAgICAgcERzdFByb2ZpbGVMZXZlbC0+ZUxldmVsID0gcFByb2ZpbGVMZXZlbC0+bGV2ZWw7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxDdXJyZW50OgorICAgIHsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKnBEc3RQcm9maWxlTGV2ZWwgPSAoT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgKilwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgICAgICBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICAgICAgICAqcFNyY01wZWc0UGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgICAgICAgICAqcFNyY0gyNjNQYXJhbSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgICAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNUeXBlOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdFByb2ZpbGVMZXZlbCwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFKSk7CisgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBEc3RQcm9maWxlTGV2ZWwtPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgY29kZWNUeXBlID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlOworICAgICAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgICAgIHBTcmNNcGVnNFBhcmFtID0gJnBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbcERzdFByb2ZpbGVMZXZlbC0+blBvcnRJbmRleF07CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lUHJvZmlsZSA9IHBTcmNNcGVnNFBhcmFtLT5lUHJvZmlsZTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVMZXZlbCA9IHBTcmNNcGVnNFBhcmFtLT5lTGV2ZWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU3JjSDI2M1BhcmFtID0gJnBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtwRHN0UHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBEc3RQcm9maWxlTGV2ZWwtPmVQcm9maWxlID0gcFNyY0gyNjNQYXJhbS0+ZVByb2ZpbGU7CisgICAgICAgICAgICBwRHN0UHJvZmlsZUxldmVsLT5lTGV2ZWwgPSBwU3JjSDI2M1BhcmFtLT5lTGV2ZWw7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgICAgICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocERzdEVycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZS0+blBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBNcGVnNEVuYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUdldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuUGFyYW1JbmRleCwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNEVuY19TZXRQYXJhbWV0ZXIoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOIE9NWF9JTkRFWFRZUEUgIG5JbmRleCwKKyAgICBPTVhfSU4gT01YX1BUUiAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwgfHwgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBPTVhDb21wb25lbnQsIHNpemVvZihPTVhfQ09NUE9ORU5UVFlQRSkpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkICkgeworICAgICAgICByZXQgPSBPTVhfU3RhdGVJbnZhbGlkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgc3dpdGNoIChuSW5kZXgpIHsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtVmlkZW9NcGVnNDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUgKnBEc3RNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqcFNyY01wZWc0UGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAocFNyY01wZWc0UGFyYW0tPm5Qb3J0SW5kZXggPj0gQUxMX1BPUlRfTlVNKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICAgICAgcERzdE1wZWc0UGFyYW0gPSAmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtwU3JjTXBlZzRQYXJhbS0+blBvcnRJbmRleF07CisKKyAgICAgICAgU0VDX09TQUxfTWVtY3B5KHBEc3RNcGVnNFBhcmFtLCBwU3JjTXBlZzRQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEUpKTsKKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0gyNjM6CisgICAgeworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKnBEc3RIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEUgKnBTcmNIMjYzUGFyYW0gPSAoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocFNyY0gyNjNQYXJhbSwgc2l6ZW9mKE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjSDI2M1BhcmFtLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RIMjYzUGFyYW0gPSAmcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W3BTcmNIMjYzUGFyYW0tPm5Qb3J0SW5kZXhdOworCisgICAgICAgIFNFQ19PU0FMX01lbWNweShwRHN0SDI2M1BhcmFtLCBwU3JjSDI2M1BhcmFtLCBzaXplb2YoT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFKSk7CisgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIE9NWF9JbmRleFBhcmFtU3RhbmRhcmRDb21wb25lbnRSb2xlOgorICAgIHsKKyAgICAgICAgT01YX1BBUkFNX0NPTVBPTkVOVFJPTEVUWVBFICpwQ29tcG9uZW50Um9sZSA9IChPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICAgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwQ29tcG9uZW50Um9sZSwgc2l6ZW9mKE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgocFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlICE9IE9NWF9TdGF0ZUxvYWRlZCkgJiYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSAhPSBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5jb3JyZWN0U3RhdGVPcGVyYXRpb247CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIVNFQ19PU0FMX1N0cmNtcCgoY2hhciopcENvbXBvbmVudFJvbGUtPmNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ01QRUc0OworICAgICAgICAgICAgLy8oKFNFQ19NUEVHNEVOQ19IQU5ETEUgKikocFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlKSktPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPSBDT0RFQ19UWVBFX01QRUc0OworICAgICAgICB9IGVsc2UgaWYgKCFTRUNfT1NBTF9TdHJjbXAoKGNoYXIqKXBDb21wb25lbnRSb2xlLT5jUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSkpIHsKKyAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXS5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgICAgICAvLygoU0VDX01QRUc0RU5DX0hBTkRMRSAqKShwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9IENPREVDX1RZUEVfSDI2MzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVZpZGVvUHJvZmlsZUxldmVsQ3VycmVudDoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICpwU3JjUHJvZmlsZUxldmVsID0gKE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICopcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSAgICAgICAgKnBEc3RNcGVnNFBhcmFtID0gTlVMTDsKKyAgICAgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICAgICAgICAgKnBEc3RIMjYzUGFyYW0gPSBOVUxMOworICAgICAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICAgICAgICAqcE1wZWc0RW5jID0gTlVMTDsKKyAgICAgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgICAgICByZXQgPSBTRUNfT01YX0NoZWNrX1NpemVWZXJzaW9uKHBTcmNQcm9maWxlTGV2ZWwsIHNpemVvZihPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4ID49IEFMTF9QT1JUX05VTSkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIGNvZGVjVHlwZSA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICAgICAgaWYgKGNvZGVjVHlwZSA9PSBDT0RFQ19UWVBFX01QRUc0KSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVG8gZG86IENoZWNrIHZhbGlkaXR5IG9mIHByb2ZpbGUgJiBsZXZlbCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgcERzdE1wZWc0UGFyYW0gPSAmcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBEc3RNcGVnNFBhcmFtLT5lUHJvZmlsZSA9IHBTcmNQcm9maWxlTGV2ZWwtPmVQcm9maWxlOworICAgICAgICAgICAgcERzdE1wZWc0UGFyYW0tPmVMZXZlbCA9IHBTcmNQcm9maWxlTGV2ZWwtPmVMZXZlbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUbyBkbzogQ2hlY2sgdmFsaWRpdHkgb2YgcHJvZmlsZSAmIGxldmVsIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBwRHN0SDI2M1BhcmFtID0gJnBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtwU3JjUHJvZmlsZUxldmVsLT5uUG9ydEluZGV4XTsKKyAgICAgICAgICAgIHBEc3RIMjYzUGFyYW0tPmVQcm9maWxlID0gcFNyY1Byb2ZpbGVMZXZlbC0+ZVByb2ZpbGU7CisgICAgICAgICAgICBwRHN0SDI2M1BhcmFtLT5lTGV2ZWwgPSBwU3JjUHJvZmlsZUxldmVsLT5lTGV2ZWw7CisgICAgICAgIH0KKyAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgT01YX0luZGV4UGFyYW1WaWRlb0Vycm9yQ29ycmVjdGlvbjoKKyAgICB7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZSA9IChPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSAqKXBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisgICAgICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICpwRHN0RXJyb3JDb3JyZWN0aW9uVHlwZSA9IE5VTEw7CisgICAgICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICAgICAgICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworCisgICAgICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocFNyY0Vycm9yQ29ycmVjdGlvblR5cGUsIHNpemVvZihPTVhfVklERU9fUEFSQU1fRVJST1JDT1JSRUNUSU9OVFlQRSkpOworICAgICAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+blBvcnRJbmRleCAhPSBPVVRQVVRfUE9SVF9JTkRFWCkgeworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgcE1wZWc0RW5jID0gKFNFQ19NUEVHNEVOQ19IQU5ETEUgKilwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGU7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlID0gJnBNcGVnNEVuYy0+ZXJyb3JDb3JyZWN0aW9uVHlwZVtPVVRQVVRfUE9SVF9JTkRFWF07CisKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVIRUMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZUhFQzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSZXN5bmMgPSBwU3JjRXJyb3JDb3JyZWN0aW9uVHlwZS0+YkVuYWJsZVJlc3luYzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPm5SZXN5bmNoTWFya2VyU3BhY2luZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5uUmVzeW5jaE1hcmtlclNwYWNpbmc7CisgICAgICAgIHBEc3RFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZyA9IHBTcmNFcnJvckNvcnJlY3Rpb25UeXBlLT5iRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICAgICAgcERzdEVycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDID0gcFNyY0Vycm9yQ29ycmVjdGlvblR5cGUtPmJFbmFibGVSVkxDOworICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZVNldFBhcmFtZXRlcihoQ29tcG9uZW50LCBuSW5kZXgsIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworICAgICAgICBicmVhazsKKyAgICB9CitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfR2V0Q29uZmlnKAorICAgIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgT01YX1BUUiBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgaWYgKHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNDb21wb25lbnQtPmN1cnJlbnRTdGF0ZSA9PSBPTVhfU3RhdGVJbnZhbGlkKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRTdGF0ZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHN3aXRjaCAobkluZGV4KSB7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0ID0gU0VDX09NWF9HZXRDb25maWcoaENvbXBvbmVudCwgbkluZGV4LCBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfU2V0Q29uZmlnKAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgIE9NWF9JTiBPTVhfSU5ERVhUWVBFICBuSW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMIHx8IHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG5JbmRleCkgeworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldCA9IFNFQ19PTVhfU2V0Q29uZmlnKGhDb21wb25lbnQsIG5JbmRleCwgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RW5jX0dldEV4dGVuc2lvbkluZGV4KAorICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSAgaENvbXBvbmVudCwKKyAgICBPTVhfSU4gT01YX1NUUklORyAgICAgIGNQYXJhbWV0ZXJOYW1lLAorICAgIE9NWF9PVVQgT01YX0lOREVYVFlQRSAqcEluZGV4VHlwZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAqcE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIHJldCA9IFNFQ19PTVhfQ2hlY2tfU2l6ZVZlcnNpb24ocE9NWENvbXBvbmVudCwgc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKworICAgIGlmICgoY1BhcmFtZXRlck5hbWUgPT0gTlVMTCkgfHwgKHBJbmRleFR5cGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyNpZmRlZiBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKyAgICBpZiAoU0VDX09TQUxfU3RyY21wKGNQYXJhbWV0ZXJOYW1lLCBTRUNfSU5ERVhfUEFSQU1fU1RPUkVfTUVUQURBVEFfQlVGRkVSKSA9PSAwKSB7CisgICAgICAgICpwSW5kZXhUeXBlID0gT01YX0luZGV4UGFyYW1TdG9yZU1ldGFEYXRhQnVmZmVyOworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IFNFQ19PTVhfR2V0RXh0ZW5zaW9uSW5kZXgoaENvbXBvbmVudCwgY1BhcmFtZXRlck5hbWUsIHBJbmRleFR5cGUpOworICAgIH0KKyNlbHNlCisgICAgcmV0ID0gU0VDX09NWF9HZXRFeHRlbnNpb25JbmRleChoQ29tcG9uZW50LCBjUGFyYW1ldGVyTmFtZSwgcEluZGV4VHlwZSk7CisjZW5kaWYKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RW5jX0NvbXBvbmVudFJvbGVFbnVtKAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICBPTVhfT1VUIE9NWF9VOCAgICAgICAgKmNSb2xlLAorICAgIE9NWF9JTiAgT01YX1UzMiAgICAgICAgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgT01YX1MzMiAgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoaENvbXBvbmVudCA9PSBOVUxMKSB8fCAoY1JvbGUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChuSW5kZXggIT0gKE1BWF9DT01QT05FTlRfUk9MRV9OVU0gLSAxKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgcmV0ID0gU0VDX09NWF9DaGVja19TaXplVmVyc2lvbihwT01YQ29tcG9uZW50LCBzaXplb2YoT01YX0NPTVBPTkVOVFRZUEUpKTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIGlmIChwU0VDQ29tcG9uZW50LT5jdXJyZW50U3RhdGUgPT0gT01YX1N0YXRlSW52YWxpZCApIHsKKyAgICAgICAgcmV0ID0gT01YX1N0YXRlSW52YWxpZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGNvZGVjVHlwZSA9ICgoU0VDX01QRUc0RU5DX0hBTkRMRSAqKShwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUpKS0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZTsKKyAgICBpZiAoY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpCisgICAgICAgIFNFQ19PU0FMX1N0cmNweSgoY2hhciAqKWNSb2xlLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkNfUk9MRSk7CisgICAgZWxzZQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKGNoYXIgKiljUm9sZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkNfUk9MRSk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX01GQ19FbmNvZGVUaHJlYWQoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAqcE1wZWc0RW5jID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKworICAgIHdoaWxlIChwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmJFeGl0RW5jb2RlVGhyZWFkID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVXYWl0KHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQpOworCisgICAgICAgIGlmIChwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmJFeGl0RW5jb2RlVGhyZWFkID09IE9NWF9GQUxTRSkgeworICAgICAgICAgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNFeGUocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworICAgIFNFQ19PU0FMX1RocmVhZEV4aXQoTlVMTCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgSW5pdCAqLworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0RW5jX0luaXQoT01YX0NPTVBPTkVOVFRZUEUgKnBPTVhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAgICpwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ091dHB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAgICAgKnBTRUNQb3J0ID0gTlVMTDsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgIGhNRkNIYW5kbGUgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICAgIHJldHVybkNvZGVjID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmJDb25maWd1cmVkTUZDID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX0ZBTFNFOworICAgIHBTRUNDb21wb25lbnQtPmJTYXZlRmxhZ0VPUyA9IE9NWF9GQUxTRTsKKworICAgIC8qIE1GQyhNdWx0aSBGb3JtYXQgQ29kZWMpIGVuY29kZXIgYW5kIENNTShDb2RlYyBNZW1vcnkgTWFuYWdlbWVudCkgZHJpdmVyIG9wZW4gKi8KKyAgICBTU0JJUF9NRkNfQlVGRkVSX1RZUEUgYnVmX3R5cGUgPSBDQUNIRTsKKyAgICBoTUZDSGFuZGxlID0gKE9NWF9QVFIpU3NiU2lwTWZjRW5jT3BlbigmYnVmX3R5cGUpOworICAgIGlmIChoTUZDSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUgPSBoTUZDSGFuZGxlOworCisgICAgLyogc2V0IE1GQyBFTkMgVklERU8gUEFSQU0gYW5kIGluaXRpYWxpemUgTUZDIGVuY29kZXIgaW5zdGFuY2UgKi8KKyAgICBpZiAocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuY29kZWNUeXBlID09IENPREVDX1RZUEVfTVBFRzQpIHsKKyAgICAgICAgU3NiU2lwTWZjRW5jU2V0U2l6ZShoTUZDSGFuZGxlLCBNUEVHNF9FTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNFQ091dHB1dFBvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgU3NiU2lwTWZjRW5jU2V0U2l6ZShoTUZDSGFuZGxlLCBIMjYzX0VOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU0VDT3V0cHV0UG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNPdXRwdXRQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKiBhbGxvY2F0ZSBlbmNvZGVyJ3MgaW5wdXQgYnVmZmVyICovCisgICAgcmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNHZXRJbkJ1ZihoTUZDSGFuZGxlLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mbykpOworICAgIGlmIChyZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllQaHlBZGRyID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllQaHlBZGRyOworICAgIHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ1BoeUFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1BoeUFkZHI7CisgICAgcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZVmlyQWRkciA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcjsKKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNWaXJBZGRyID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNWaXJBZGRyOworICAgIHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWUJ1ZmZlclNpemUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVNpemU7CisgICAgcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DQnVmZmVyU2l6ZSA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DU2l6ZTsKKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllEYXRhU2l6ZSA9IDA7CisgICAgcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DRGF0YVNpemUgPSAwOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAicE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyIDogMHgleCIsIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZVmlyQWRkcik7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIgOiAweCV4IiwgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNWaXJBZGRyKTsKKworICAgIC8qIGFsbG9jYXRlIGVuY29kZXIncyBpbnB1dCBidWZmZXIgKi8KKyAgICByZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldEluQnVmKGhNRkNIYW5kbGUsICYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvKSk7CisgICAgaWYgKHJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWVBoeUFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVBoeUFkZHI7CisgICAgcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5DUGh5QWRkciA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DUGh5QWRkcjsKKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLllWaXJBZGRyID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyOworICAgIHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uQ1ZpckFkZHIgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHI7CisgICAgcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclsxXS5ZQnVmZmVyU2l6ZSA9IHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5ZU2l6ZTsKKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNCdWZmZXJTaXplID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLkNTaXplOworICAgIHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMV0uWURhdGFTaXplID0gMDsKKyAgICBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzFdLkNEYXRhU2l6ZSA9IDA7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uWVZpckFkZHIgOiAweCV4IiwgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5wdXRJbmZvLllWaXJBZGRyKTsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgInBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmlucHV0SW5mby5DVmlyQWRkciA6IDB4JXgiLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8uQ1ZpckFkZHIpOworCisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVBoeUFkZHIgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLllQaHlBZGRyOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLkNQaHlBZGRyID0gcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5DUGh5QWRkcjsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5ZVmlyQWRkciA9IHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uWVZpckFkZHI7CisgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1ZpckFkZHIgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyWzBdLkNWaXJBZGRyOworICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLllTaXplID0gcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlclswXS5ZQnVmZmVyU2l6ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5DU2l6ZSA9IHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbMF0uQ0J1ZmZlclNpemU7CisKKyAgICBwTXBlZzRFbmMtPmluZGV4SW5wdXRCdWZmZXIgPSAwOworICAgIHBNcGVnNEVuYy0+YkZpcnN0RnJhbWUgPSBPTVhfVFJVRTsKKworICAgIHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPSBPTVhfRkFMU0U7CisgICAgcE1wZWc0RW5jLT5OQkVuY1RocmVhZC5iRW5jb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoJihwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KSk7CisgICAgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKCYocE1wZWc0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpKTsKKyAgICBpZiAoT01YX0Vycm9yTm9uZSA9PSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoJnBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VDX01GQ19FbmNvZGVUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT01YQ29tcG9uZW50KSkgeworICAgICAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IE1GQ19SRVRfT0s7CisgICAgfQorCisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNDb21wb25lbnQtPnRpbWVTdGFtcCwgLTE5NzcxMDAzLCBzaXplb2YoT01YX1RJQ0tTKSAqIE1BWF9USU1FU1RBTVApOworICAgIFNFQ19PU0FMX01lbXNldChwU0VDQ29tcG9uZW50LT5uRmxhZ3MsIDAsIHNpemVvZihPTVhfVTMyKSAqIE1BWF9GTEFHUyk7CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXAgPSAwOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBNRkMgVGVybWluYXRlICovCitPTVhfRVJST1JUWVBFIFNFQ19NRkNfTXBlZzRFbmNfVGVybWluYXRlKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgaE1GQ0hhbmRsZSA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKworICAgIGlmIChwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmhOQkVuY29kZVRocmVhZCAhPSBOVUxMKSB7CisgICAgICAgIHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuYkV4aXRFbmNvZGVUaHJlYWQgPSBPTVhfVFJVRTsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICAgICAgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaE5CRW5jb2RlVGhyZWFkKTsKKyAgICAgICAgcE1wZWc0RW5jLT5OQkVuY1RocmVhZC5oTkJFbmNvZGVUaHJlYWQgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kICE9IE5VTEwpIHsKKyAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lRW5kKTsKKyAgICAgICAgcE1wZWc0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQgPSBOVUxMOworICAgIH0KKworICAgIGlmKHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUocE1wZWc0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVTdGFydCk7CisgICAgICAgIHBNcGVnNEVuYy0+TkJFbmNUaHJlYWQuaEVuY0ZyYW1lU3RhcnQgPSBOVUxMOworICAgIH0KKworICAgIGhNRkNIYW5kbGUgPSBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oTUZDSGFuZGxlOworICAgIGlmIChoTUZDSGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgU3NiU2lwTWZjRW5jQ2xvc2UoaE1GQ0hhbmRsZSk7CisgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmhNRkNIYW5kbGUgPSBOVUxMOworICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfTUZDX01wZWc0X0VuY29kZShPTVhfQ09NUE9ORU5UVFlQRSAqcE9NWENvbXBvbmVudCwgU0VDX09NWF9EQVRBICpwSW5wdXREYXRhLCBTRUNfT01YX0RBVEEgKnBPdXRwdXREYXRhKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgICAqcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBTRUNfTVBFRzRFTkNfSEFORExFICAgICAgICpwTXBlZzRFbmMgPSAoU0VDX01QRUc0RU5DX0hBTkRMRSAqKXBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZTsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgICAgICAgICBoTUZDSGFuZGxlID0gcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaE1GQ0hhbmRsZTsKKyAgICBTU0JTSVBfTUZDX0VOQ19JTlBVVF9JTkZPICpwSW5wdXRJbmZvID0gJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbnB1dEluZm8pOworICAgIFNTQlNJUF9NRkNfRU5DX09VVFBVVF9JTkZPIG91dHB1dEluZm87CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE1GQ19FTkNfQUREUl9JTkZPICAgICAgICAgIGFkZHJJbmZvOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgIG9uZUZyYW1lU2l6ZSA9IHBJbnB1dERhdGEtPmRhdGFMZW47CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIC8qIHNldCBNRkMgRU5DIFZJREVPIFBBUkFNIGFuZCBpbml0aWFsaXplIE1GQyBlbmNvZGVyIGluc3RhbmNlICovCisgICAgICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5jb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICAgICAgU2V0X01wZWc0RW5jX1BhcmFtKCYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUubXBlZzRNRkNQYXJhbSksIHBTRUNDb21wb25lbnQpOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMgPSBTc2JTaXBNZmNFbmNJbml0KGhNRkNIYW5kbGUsICYocE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUubXBlZzRNRkNQYXJhbSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU2V0X0gyNjNFbmNfUGFyYW0oJihwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5oMjYzTUZDUGFyYW0pLCBwU0VDQ29tcG9uZW50KTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jSW5pdChoTUZDSGFuZGxlLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmgyNjNNRkNQYXJhbSkpOworICAgICAgICB9CisgICAgICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKworICAgICAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY0dldE91dEJ1ZihoTUZDSGFuZGxlLCAmb3V0cHV0SW5mbyk7CisgICAgICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKQorICAgICAgICB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBTc2JTaXBNZmNFbmNHZXRPdXRCdWYgZmFpbGVkLCByZXQ6JWQiLCBfX0ZVTkNUSU9OX18sIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhQnVmZmVyID0gb3V0cHV0SW5mby5TdHJtVmlyQWRkcjsKKyAgICAgICAgcE91dHB1dERhdGEtPmFsbG9jU2l6ZSA9IG91dHB1dEluZm8uaGVhZGVyU2l6ZTsKKyAgICAgICAgcE91dHB1dERhdGEtPmRhdGFMZW4gPSBvdXRwdXRJbmZvLmhlYWRlclNpemU7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSAwOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHOworICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUU7CisKKyAgICAgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuYkNvbmZpZ3VyZWRNRkMgPSBPTVhfVFJVRTsKKworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VORE9GRlJBTUUpICYmCisgICAgICAgIChwU0VDQ29tcG9uZW50LT5iVXNlRmxhZ0VPRiA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgIHBTRUNDb21wb25lbnQtPmJVc2VGbGFnRU9GID0gT01YX1RSVUU7CisgICAgfQorCisgICAgaWYgKG9uZUZyYW1lU2l6ZSA8PSAwKSB7CisgICAgICAgIHBPdXRwdXREYXRhLT50aW1lU3RhbXAgPSBwSW5wdXREYXRhLT50aW1lU3RhbXA7CisgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W0lOUFVUX1BPUlRfSU5ERVhdOworICAgIGlmICgoKHBJbnB1dERhdGEtPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykgPT0gT01YX0JVRkZFUkZMQUdfRU9TKSB8fAorICAgICAgICAocFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPT0gT01YX1RSVUUpKXsKKyAgICAgICAgLyogRHVtbXkgaW5wdXQgZGF0YSBmb3IgZ2V0IG91dCBlbmNvZGVkIGxhc3QgZnJhbWUgKi8KKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BNcGVnNEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwTXBlZzRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNQaHlBZGRyOworICAgICAgICBwSW5wdXRJbmZvLT5ZVmlyQWRkciA9IHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcE1wZWc0RW5jLT5pbmRleElucHV0QnVmZmVyXS5ZVmlyQWRkcjsKKyAgICAgICAgcElucHV0SW5mby0+Q1ZpckFkZHIgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BNcGVnNEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1ZpckFkZHI7CisgICAgfSBlbHNlIGlmIChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9PSBPTVhfU0VDX0NPTE9SX0Zvcm1hdE5WMTJUUGh5c2ljYWxBZGRyZXNzKSB7CisgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJZLCBwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBzaXplb2YoYWRkckluZm8ucEFkZHJZKSk7CisgICAgICAgIFNFQ19PU0FMX01lbWNweSgmYWRkckluZm8ucEFkZHJDLCBwSW5wdXREYXRhLT5kYXRhQnVmZmVyICsgc2l6ZW9mKGFkZHJJbmZvLnBBZGRyWSksIHNpemVvZihhZGRySW5mby5wQWRkckMpKTsKKyAgICAgICAgcElucHV0SW5mby0+WVBoeUFkZHIgPSBhZGRySW5mby5wQWRkclk7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gYWRkckluZm8ucEFkZHJDOworI2lmZGVmIFVTRV9BTkRST0lEX0VYVEVOU0lPTgorICAgIH0gZWxzZSBpZiAocFNFQ1BvcnQtPmJTdG9yZU1ldGFEYXRhSW5CdWZmZXIgIT0gT01YX0ZBTFNFKSB7CisgICAgICAgIHJldCA9IHByZXByb2Nlc3NNZXRhRGF0YUluQnVmZmVycyhwT01YQ29tcG9uZW50LCBwSW5wdXREYXRhLT5kYXRhQnVmZmVyLCBwSW5wdXRJbmZvKTsKKyAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICAgICAgZ290byBFWElUOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLyogUmVhbCBpbnB1dCBkYXRhICovCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1BoeUFkZHI7CisgICAgfQorCisgICAgcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW3BNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wXSA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXBdID0gcElucHV0RGF0YS0+bkZsYWdzOworCisgICAgaWYgKChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9PSBNRkNfUkVUX09LKSAmJgorICAgICAgICAocE1wZWc0RW5jLT5iRmlyc3RGcmFtZSA9PSBPTVhfRkFMU0UpKSB7CisgICAgICAgIE9NWF9TMzIgaW5kZXhUaW1lc3RhbXAgPSAwOworCisgICAgICAgIC8qIHdhaXQgZm9yIG1mYyBlbmNvZGUgZG9uZSAqLworICAgICAgICBpZiAocE1wZWc0RW5jLT5OQkVuY1RocmVhZC5iRW5jb2RlclJ1biAhPSBPTVhfRkFMU0UpIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1NlbWFwaG9yZVdhaXQocE1wZWc0RW5jLT5OQkVuY1RocmVhZC5oRW5jRnJhbWVFbmQpOworICAgICAgICAgICAgcE1wZWc0RW5jLT5OQkVuY1RocmVhZC5iRW5jb2RlclJ1biA9IE9NWF9GQUxTRTsKKyAgICAgICAgfQorCisgICAgICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID0gU3NiU2lwTWZjRW5jR2V0T3V0QnVmKGhNRkNIYW5kbGUsICZvdXRwdXRJbmZvKTsKKyAgICAgICAgaWYgKChTc2JTaXBNZmNFbmNHZXRDb25maWcoaE1GQ0hhbmRsZSwgTUZDX0VOQ19HRVRDT05GX0ZSQU1FX1RBRywgJmluZGV4VGltZXN0YW1wKSAhPSBNRkNfUkVUX09LKSB8fAorICAgICAgICAgICAgKCgoaW5kZXhUaW1lc3RhbXAgPCAwKSB8fCAoaW5kZXhUaW1lc3RhbXAgPj0gTUFYX1RJTUVTVEFNUCkpKSkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnRpbWVTdGFtcCA9IHBJbnB1dERhdGEtPnRpbWVTdGFtcDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwSW5wdXREYXRhLT5uRmxhZ3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dGltZVN0YW1wID0gcFNFQ0NvbXBvbmVudC0+dGltZVN0YW1wW2luZGV4VGltZXN0YW1wXTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgPSBwU0VDQ29tcG9uZW50LT5uRmxhZ3NbaW5kZXhUaW1lc3RhbXBdOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjID09IE1GQ19SRVRfT0spIHsKKyAgICAgICAgICAgIC8qKiBGaWxsIE91dHB1dCBCdWZmZXIgKiovCisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUJ1ZmZlciA9IG91dHB1dEluZm8uU3RybVZpckFkZHI7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+YWxsb2NTaXplID0gb3V0cHV0SW5mby5kYXRhU2l6ZTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5kYXRhTGVuID0gb3V0cHV0SW5mby5kYXRhU2l6ZTsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5uRmxhZ3MgfD0gT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRJbmZvLmZyYW1lVHlwZSA9PSBNRkNfRlJBTUVfVFlQRV9JX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICBwT3V0cHV0RGF0YS0+bkZsYWdzIHw9IE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRTsKKworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0VuY0dldE91dEJ1ZiBmYWlsZWQsIHJldDolZCIsIF9fRlVOQ1RJT05fXywgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUucmV0dXJuQ29kZWMpOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBTRUNDb21wb25lbnQtPmdldEFsbERlbGF5QnVmZmVyID09IE9NWF9UUlVFKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnB1dERhdGFFbmNvZGVZZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChwSW5wdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcElucHV0RGF0YS0+bkZsYWdzID0gKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiAofk9NWF9CVUZGRVJGTEFHX0VPUykpOworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHBPdXRwdXREYXRhLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpID09IE9NWF9CVUZGRVJGTEFHX0VPUykgeworICAgICAgICAgICAgcFNFQ0NvbXBvbmVudC0+Z2V0QWxsRGVsYXlCdWZmZXIgPSBPTVhfRkFMU0U7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+ZGF0YUxlbiA9IDA7CisgICAgICAgICAgICBwT3V0cHV0RGF0YS0+dXNlZERhdGFMZW4gPSAwOworICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJPTVhfQlVGRkVSRkxBR19FT1MhISEiKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLnJldHVybkNvZGVjICE9IE1GQ19SRVRfT0spIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU3NiU2lwTWZjRW5jRXhlIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICB9CisKKyAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyA9IFNzYlNpcE1mY0VuY1NldEluQnVmKGhNRkNIYW5kbGUsIHBJbnB1dEluZm8pOworICAgIGlmIChwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyAhPSBNRkNfUkVUX09LKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNzYlNpcE1mY0VuY1NldEluQnVmIGZhaWxlZCwgcmV0OiVkIiwgX19GVU5DVElPTl9fLCBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5yZXR1cm5Db2RlYyk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIHBNcGVnNEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcisrOworICAgICAgICBwTXBlZzRFbmMtPmluZGV4SW5wdXRCdWZmZXIgJT0gTUZDX0lOUFVUX0JVRkZFUl9OVU1fTUFYOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5ZUGh5QWRkciA9IHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcE1wZWc0RW5jLT5pbmRleElucHV0QnVmZmVyXS5ZUGh5QWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1BoeUFkZHIgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BNcGVnNEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uQ1BoeUFkZHI7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLllWaXJBZGRyID0gcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwTXBlZzRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLllWaXJBZGRyOworICAgICAgICBwU0VDQ29tcG9uZW50LT5wcm9jZXNzRGF0YVtJTlBVVF9QT1JUX0lOREVYXS5zcGVjaWZpY0J1ZmZlckhlYWRlci5DVmlyQWRkciA9IHBNcGVnNEVuYy0+TUZDRW5jSW5wdXRCdWZmZXJbcE1wZWc0RW5jLT5pbmRleElucHV0QnVmZmVyXS5DVmlyQWRkcjsKKyAgICAgICAgcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVNpemUgPSBwTXBlZzRFbmMtPk1GQ0VuY0lucHV0QnVmZmVyW3BNcGVnNEVuYy0+aW5kZXhJbnB1dEJ1ZmZlcl0uWUJ1ZmZlclNpemU7CisgICAgICAgIHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLkNTaXplID0gcE1wZWc0RW5jLT5NRkNFbmNJbnB1dEJ1ZmZlcltwTXBlZzRFbmMtPmluZGV4SW5wdXRCdWZmZXJdLkNCdWZmZXJTaXplOworICAgIH0KKworICAgIFNzYlNpcE1mY0VuY1NldENvbmZpZyhoTUZDSGFuZGxlLCBNRkNfRU5DX1NFVENPTkZfRlJBTUVfVEFHLCAmKHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmluZGV4VGltZXN0YW1wKSk7CisKKyAgICAvKiBtZmMgZW5jb2RlIHN0YXJ0ICovCisgICAgU0VDX09TQUxfU2VtYXBob3JlUG9zdChwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmhFbmNGcmFtZVN0YXJ0KTsKKyAgICBwTXBlZzRFbmMtPk5CRW5jVGhyZWFkLmJFbmNvZGVyUnVuID0gT01YX1RSVUU7CisgICAgcE1wZWc0RW5jLT5oTUZDTXBlZzRIYW5kbGUuaW5kZXhUaW1lc3RhbXArKzsKKyAgICBwTXBlZzRFbmMtPmhNRkNNcGVnNEhhbmRsZS5pbmRleFRpbWVzdGFtcCAlPSBNQVhfVElNRVNUQU1QOworICAgIHBNcGVnNEVuYy0+YkZpcnN0RnJhbWUgPSBPTVhfRkFMU0U7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIE1GQyBFbmNvZGUgKi8KK09NWF9FUlJPUlRZUEUgU0VDX01GQ19NcGVnNEVuY19idWZmZXJQcm9jZXNzKE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50LCBTRUNfT01YX0RBVEEgKnBJbnB1dERhdGEsIFNFQ19PTVhfREFUQSAqcE91dHB1dERhdGEpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9CQVNFQ09NUE9ORU5UICAgKnBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBJbnB1dFBvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICAgKnBPdXRwdXRQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W09VVFBVVF9QT1JUX0lOREVYXTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICgoIUNIRUNLX1BPUlRfRU5BQkxFRChwSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX0VOQUJMRUQocE91dHB1dFBvcnQpKSB8fAorICAgICAgICAgICAgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwSW5wdXRQb3J0KSkgfHwgKCFDSEVDS19QT1JUX1BPUFVMQVRFRChwT3V0cHV0UG9ydCkpKSB7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKE9NWF9GQUxTRSA9PSBTRUNfQ2hlY2tfQnVmZmVyUHJvY2Vzc19TdGF0ZShwU0VDQ29tcG9uZW50KSkgeworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX01GQ19NcGVnNF9FbmNvZGUocE9NWENvbXBvbmVudCwgcElucHV0RGF0YSwgcE91dHB1dERhdGEpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBpZiAocmV0ID09IE9NWF9FcnJvcklucHV0RGF0YUVuY29kZVlldCkgeworICAgICAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgICAgIHBPdXRwdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcE91dHB1dERhdGEtPmRhdGFMZW47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwU0VDQ29tcG9uZW50LT5wQ2FsbGJhY2tzLT5FdmVudEhhbmRsZXIoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTRUNDb21wb25lbnQtPmNhbGxiYWNrRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01YX0V2ZW50RXJyb3IsIHJldCwgMCwgTlVMTCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiArPSBwSW5wdXREYXRhLT5kYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5yZW1haW5EYXRhTGVuID0gcElucHV0RGF0YS0+ZGF0YUxlbiAtIHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT5kYXRhTGVuIC09IHBJbnB1dERhdGEtPnVzZWREYXRhTGVuOworICAgICAgICBwSW5wdXREYXRhLT51c2VkRGF0YUxlbiA9IDA7CisKKyAgICAgICAgcE91dHB1dERhdGEtPnVzZWREYXRhTGVuID0gMDsKKyAgICAgICAgcE91dHB1dERhdGEtPnJlbWFpbkRhdGFMZW4gPSBwT3V0cHV0RGF0YS0+ZGF0YUxlbjsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09TQ0xfRVhQT1JUX1JFRiBPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50SW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfU1RSSU5HIGNvbXBvbmVudE5hbWUpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAgICpwU0VDQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VQT1JUICAgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIFNFQ19NUEVHNEVOQ19IQU5ETEUgICAgICpwTXBlZzRFbmMgPSBOVUxMOworICAgIE9NWF9TMzIgICAgICAgICAgICAgICAgICBjb2RlY1R5cGUgPSAtMTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoKGhDb21wb25lbnQgPT0gTlVMTCkgfHwgKGNvbXBvbmVudE5hbWUgPT0gTlVMTCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIiVzOiBwYXJhbWV0ZXJzIGFyZSBudWxsLCByZXQ6ICVYIiwgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfTVBFRzRfRU5DLCBjb21wb25lbnROYW1lKSA9PSAwKSB7CisgICAgICAgIGNvZGVjVHlwZSA9IENPREVDX1RZUEVfTVBFRzQ7CisgICAgfSBlbHNlIGlmIChTRUNfT1NBTF9TdHJjbXAoU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkMsIGNvbXBvbmVudE5hbWUpID09IDApIHsKKyAgICAgICAgY29kZWNUeXBlID0gQ09ERUNfVFlQRV9IMjYzOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogY29tcG9uZW50TmFtZSglcykgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIGNvbXBvbmVudE5hbWUsIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICByZXQgPSBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50SW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogU0VDX09NWF9WaWRlb0RlY29kZUNvbXBvbmVudEluaXQgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb2RlY1R5cGUgPSBIV19WSURFT19DT0RFQzsKKworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUgPSAoT01YX1NUUklORylTRUNfT1NBTF9NYWxsb2MoTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKyAgICBpZiAocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSA9PSBOVUxMKSB7CisgICAgICAgIFNFQ19PTVhfVmlkZW9FbmNvZGVDb21wb25lbnREZWluaXQocE9NWENvbXBvbmVudCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICIlczogY29tcG9uZW50TmFtZSBhbGxvYyBlcnJvciwgcmV0OiAlWCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9NZW1zZXQocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgMCwgTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFKTsKKworICAgIHBNcGVnNEVuYyA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX01QRUc0RU5DX0hBTkRMRSkpOworICAgIGlmIChwTXBlZzRFbmMgPT0gTlVMTCkgeworICAgICAgICBTRUNfT01YX1ZpZGVvRW5jb2RlQ29tcG9uZW50RGVpbml0KHBPTVhDb21wb25lbnQpOworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiJXM6IFNFQ19NUEVHNEVOQ19IQU5ETEUgYWxsb2MgZXJyb3IsIHJldDogJVgiLCBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgU0VDX09TQUxfTWVtc2V0KHBNcGVnNEVuYywgMCwgc2l6ZW9mKFNFQ19NUEVHNEVOQ19IQU5ETEUpKTsKKyAgICBwU0VDQ29tcG9uZW50LT5oQ29kZWNIYW5kbGUgPSAoT01YX0hBTkRMRVRZUEUpcE1wZWc0RW5jOworICAgIHBNcGVnNEVuYy0+aE1GQ01wZWc0SGFuZGxlLmNvZGVjVHlwZSA9IGNvZGVjVHlwZTsKKworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQyk7CisgICAgZWxzZQorICAgICAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkMpOworCisgICAgLyogU2V0IGNvbXBvbmVudFZlcnNpb24gKi8KKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnRWZXJzaW9uLnMublZlcnNpb25NYWpvciA9IFZFUlNJT05NQUpPUl9OVU1CRVI7CisgICAgcFNFQ0NvbXBvbmVudC0+Y29tcG9uZW50VmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uUmV2aXNpb24gICAgID0gUkVWSVNJT05fTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPmNvbXBvbmVudFZlcnNpb24ucy5uU3RlcCAgICAgICAgID0gU1RFUF9OVU1CRVI7CisgICAgLyogU2V0IHNwZWNWZXJzaW9uICovCisgICAgcFNFQ0NvbXBvbmVudC0+c3BlY1ZlcnNpb24ucy5uVmVyc2lvbk1ham9yID0gVkVSU0lPTk1BSk9SX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5WZXJzaW9uTWlub3IgPSBWRVJTSU9OTUlOT1JfTlVNQkVSOworICAgIHBTRUNDb21wb25lbnQtPnNwZWNWZXJzaW9uLnMublJldmlzaW9uICAgICA9IFJFVklTSU9OX05VTUJFUjsKKyAgICBwU0VDQ29tcG9uZW50LT5zcGVjVmVyc2lvbi5zLm5TdGVwICAgICAgICAgPSBTVEVQX05VTUJFUjsKKworICAgIC8qIEFuZHJvaWQgQ2FwYWJpbGl0eUZsYWdzICovCisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlJc09NWENvbXBvbmVudE11bHRpVGhyZWFkZWQgICAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudFN1cHBvcnRzRXh0ZXJuYWxJbnB1dEJ1ZmZlckFsbG9jICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jID0gT01YX1RSVUU7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c01vdmFibGVJbnB1dEJ1ZmZlcnMgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXMgICAgICAgICAgICAgPSBPTVhfRkFMU0U7CisgICAgcFNFQ0NvbXBvbmVudC0+Y2FwYWJpbGl0eUZsYWdzLmlPTVhDb21wb25lbnRVc2VzTkFMU3RhcnRDb2RlcyAgICAgICAgICAgICAgICAgPSBPTVhfVFJVRTsKKyAgICBwU0VDQ29tcG9uZW50LT5jYXBhYmlsaXR5RmxhZ3MuaU9NWENvbXBvbmVudENhbkhhbmRsZUluY29tcGxldGVGcmFtZXMgICAgICAgICA9IE9NWF9UUlVFOworICAgIHBTRUNDb21wb25lbnQtPmNhcGFiaWxpdHlGbGFncy5pT01YQ29tcG9uZW50VXNlc0Z1bGxBVkNGcmFtZXMgICAgICAgICAgICAgICAgID0gT01YX1RSVUU7CisKKyAgICAvKiBJbnB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbSU5QVVRfUE9SVF9JTkRFWF07CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IERFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQ9IERFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkJpdHJhdGUgPSA2NDAwMDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnhGcmFtZXJhdGU9ICgxNSA8PCAxNik7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5lQ29tcHJlc3Npb25Gb3JtYXQgPSBPTVhfVklERU9fQ29kaW5nVW51c2VkOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ucE5hdGl2ZVJlbmRlciA9IDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5iRmxhZ0Vycm9yQ29uY2VhbG1lbnQgPSBPTVhfRkFMU0U7CisgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgIFNFQ19PU0FMX1N0cmNweShwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgInJhdy92aWRlbyIpOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJTaXplID0gREVGQVVMVF9WSURFT19JTlBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIC8qIE91dHB1dCBwb3J0ICovCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbT1VUUFVUX1BPUlRfSU5ERVhdOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0PSBERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLm5CaXRyYXRlID0gNjQwMDA7CisgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby54RnJhbWVyYXRlPSAoMTUgPDwgMTYpOworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb21wcmVzc2lvbkZvcm1hdCA9IE9NWF9WSURFT19Db2RpbmdNUEVHNDsKKyAgICAgICAgU0VDX09TQUxfTWVtc2V0KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAwLCBNQVhfT01YX01JTUVUWVBFX1NJWkUpOworICAgICAgICBTRUNfT1NBTF9TdHJjcHkocFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmZvcm1hdC52aWRlby5jTUlNRVR5cGUsICJ2aWRlby9tcGVnNCIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbXByZXNzaW9uRm9ybWF0ID0gT01YX1ZJREVPX0NvZGluZ0gyNjM7CisgICAgICAgIFNFQ19PU0FMX01lbXNldChwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmNNSU1FVHlwZSwgMCwgTUFYX09NWF9NSU1FVFlQRV9TSVpFKTsKKyAgICAgICAgU0VDX09TQUxfU3RyY3B5KHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uY01JTUVUeXBlLCAidmlkZW8vaDI2MyIpOworICAgIH0KKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLnBOYXRpdmVSZW5kZXIgPSAwOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uYkZsYWdFcnJvckNvbmNlYWxtZW50ID0gT01YX0ZBTFNFOworICAgIHBTRUNQb3J0LT5wb3J0RGVmaW5pdGlvbi5mb3JtYXQudmlkZW8uZUNvbG9yRm9ybWF0ID0gT01YX0NPTE9SX0Zvcm1hdFVudXNlZDsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlclNpemUgPSBERUZBVUxUX1ZJREVPX09VVFBVVF9CVUZGRVJfU0laRTsKKyAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uYkVuYWJsZWQgPSBPTVhfVFJVRTsKKworICAgIGlmIChjb2RlY1R5cGUgPT0gQ09ERUNfVFlQRV9NUEVHNCkgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFKTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLmVQcm9maWxlICAgPSBPTVhfVklERU9fTVBFRzRQcm9maWxlU2ltcGxlOworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5lTGV2ZWwgICAgID0gT01YX1ZJREVPX01QRUc0TGV2ZWw0OworCisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLm5QRnJhbWVzID0gMTA7CisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLm5CRnJhbWVzID0gMDsgICAgICAgICAgLyogTm8gc3VwcG9ydCBmb3IgQiBmcmFtZXMgKi8KKyAgICAgICAgICAgIHBNcGVnNEVuYy0+bXBlZzRDb21wb25lbnRbaV0ubk1heFBhY2tldFNpemUgPSAyNTY7ICAvKiBEZWZhdWx0IHZhbHVlICovCisgICAgICAgICAgICBwTXBlZzRFbmMtPm1wZWc0Q29tcG9uZW50W2ldLm5BbGxvd2VkUGljdHVyZVR5cGVzID0gIE9NWF9WSURFT19QaWN0dXJlVHlwZUkgfCBPTVhfVklERU9fUGljdHVyZVR5cGVQOworICAgICAgICAgICAgcE1wZWc0RW5jLT5tcGVnNENvbXBvbmVudFtpXS5iR292ID0gT01YX0ZBTFNFOworCisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IoaSA9IDA7IGkgPCBBTExfUE9SVF9OVU07IGkrKykgeworICAgICAgICAgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKCZwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0sIE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSk7CisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0ublBvcnRJbmRleCA9IGk7CisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0uZVByb2ZpbGUgICA9IE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLmVMZXZlbCAgICAgPSBPTVhfVklERU9fSDI2M0xldmVsNDU7CisKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5uUEZyYW1lcyA9IDIwOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLm5CRnJhbWVzID0gMDsgICAgICAgICAgLyogTm8gc3VwcG9ydCBmb3IgQiBmcmFtZXMgKi8KKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5iUExVU1BUWVBFQWxsb3dlZCA9IE9NWF9GQUxTRTsKKyAgICAgICAgICAgIHBNcGVnNEVuYy0+aDI2M0NvbXBvbmVudFtpXS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9IE9NWF9WSURFT19QaWN0dXJlVHlwZUkgfCBPTVhfVklERU9fUGljdHVyZVR5cGVQOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLmJGb3JjZVJvdW5kaW5nVHlwZVRvWmVybyA9IE9NWF9UUlVFOworICAgICAgICAgICAgcE1wZWc0RW5jLT5oMjYzQ29tcG9uZW50W2ldLm5QaWN0dXJlSGVhZGVyUmVwZXRpdGlvbiA9IDA7CisgICAgICAgICAgICBwTXBlZzRFbmMtPmgyNjNDb21wb25lbnRbaV0ubkdPQkhlYWRlckludGVydmFsID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBPTVhDb21wb25lbnQtPkdldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfTXBlZzRFbmNfR2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPlNldFBhcmFtZXRlciAgICAgID0gJlNFQ19NRkNfTXBlZzRFbmNfU2V0UGFyYW1ldGVyOworICAgIHBPTVhDb21wb25lbnQtPkdldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfTXBlZzRFbmNfR2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPlNldENvbmZpZyAgICAgICAgID0gJlNFQ19NRkNfTXBlZzRFbmNfU2V0Q29uZmlnOworICAgIHBPTVhDb21wb25lbnQtPkdldEV4dGVuc2lvbkluZGV4ID0gJlNFQ19NRkNfTXBlZzRFbmNfR2V0RXh0ZW5zaW9uSW5kZXg7CisgICAgcE9NWENvbXBvbmVudC0+Q29tcG9uZW50Um9sZUVudW0gPSAmU0VDX01GQ19NcGVnNEVuY19Db21wb25lbnRSb2xlRW51bTsKKyAgICBwT01YQ29tcG9uZW50LT5Db21wb25lbnREZUluaXQgICA9ICZTRUNfT01YX0NvbXBvbmVudERlaW5pdDsKKworICAgIHBTRUNDb21wb25lbnQtPnNlY19tZmNfY29tcG9uZW50SW5pdCAgICAgID0gJlNFQ19NRkNfTXBlZzRFbmNfSW5pdDsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2NvbXBvbmVudFRlcm1pbmF0ZSA9ICZTRUNfTUZDX01wZWc0RW5jX1Rlcm1pbmF0ZTsKKyAgICBwU0VDQ29tcG9uZW50LT5zZWNfbWZjX2J1ZmZlclByb2Nlc3MgICAgICA9ICZTRUNfTUZDX01wZWc0RW5jX2J1ZmZlclByb2Nlc3M7CisgICAgcFNFQ0NvbXBvbmVudC0+c2VjX2NoZWNrSW5wdXRGcmFtZSAgICAgICAgPSBOVUxMOworCisgICAgcFNFQ0NvbXBvbmVudC0+Y3VycmVudFN0YXRlID0gT01YX1N0YXRlTG9hZGVkOworCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICAgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgICAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX01QRUc0RU5DX0hBTkRMRSAgICAgKnBNcGVnNEVuYyA9IE5VTEw7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgU0VDX09TQUxfRnJlZShwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lKTsKKyAgICBwU0VDQ29tcG9uZW50LT5jb21wb25lbnROYW1lID0gTlVMTDsKKworICAgIHBNcGVnNEVuYyA9IChTRUNfTVBFRzRFTkNfSEFORExFICopcFNFQ0NvbXBvbmVudC0+aENvZGVjSGFuZGxlOworICAgIGlmIChwTXBlZzRFbmMgIT0gTlVMTCkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBNcGVnNEVuYyk7CisgICAgICAgIHBNcGVnNEVuYyA9IHBTRUNDb21wb25lbnQtPmhDb2RlY0hhbmRsZSA9IE5VTEw7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09NWF9WaWRlb0VuY29kZUNvbXBvbmVudERlaW5pdChwT01YQ29tcG9uZW50KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL1NFQ19PTVhfTXBlZzRlbmMuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzRlbmMvU0VDX09NWF9NcGVnNGVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZTAyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL1NFQ19PTVhfTXBlZzRlbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PTVhfTXBlZzRlbmMuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfTVBFRzRfRU5DX0NPTVBPTkVOVAorI2RlZmluZSBTRUNfT01YX01QRUc0X0VOQ19DT01QT05FTlQKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNzYlNpcE1mY0FwaS5oIgorCisKK3R5cGVkZWYgZW51bSBfQ09ERUNfVFlQRQoreworICAgIENPREVDX1RZUEVfSDI2MywKKyAgICBDT0RFQ19UWVBFX01QRUc0Cit9IENPREVDX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTUZDX01QRUc0RU5DX0hBTkRMRQoreworICAgIE9NWF9IQU5ETEVUWVBFICAgICAgICAgICAgIGhNRkNIYW5kbGU7CisgICAgU1NCU0lQX01GQ19FTkNfTVBFRzRfUEFSQU0gbXBlZzRNRkNQYXJhbTsKKyAgICBTU0JTSVBfTUZDX0VOQ19IMjYzX1BBUkFNICBoMjYzTUZDUGFyYW07CisgICAgU1NCU0lQX01GQ19FTkNfSU5QVVRfSU5GTyAgaW5wdXRJbmZvOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgIGluZGV4VGltZXN0YW1wOworICAgIE9NWF9CT09MICAgICAgICAgICAgICAgICAgIGJDb25maWd1cmVkTUZDOworICAgIENPREVDX1RZUEUgICAgICAgICAgICAgICAgIGNvZGVjVHlwZTsKKyAgICBPTVhfUzMyICAgICAgICAgICAgICAgICAgICByZXR1cm5Db2RlYzsKK30gU0VDX01GQ19NUEVHNEVOQ19IQU5ETEU7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfTVBFRzRFTkNfSEFORExFCit7CisgICAgLyogT01YIENvZGVjIHNwZWNpZmljICovCisgICAgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFICBoMjYzQ29tcG9uZW50W0FMTF9QT1JUX05VTV07CisgICAgT01YX1ZJREVPX1BBUkFNX01QRUc0VFlQRSBtcGVnNENvbXBvbmVudFtBTExfUE9SVF9OVU1dOworICAgIE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIGVycm9yQ29ycmVjdGlvblR5cGVbQUxMX1BPUlRfTlVNXTsKKworICAgIC8qIFNFQyBNRkMgQ29kZWMgc3BlY2lmaWMgKi8KKyAgICBTRUNfTUZDX01QRUc0RU5DX0hBTkRMRSAgIGhNRkNNcGVnNEhhbmRsZTsKKworICAgIC8qIEZvciBOb24tQmxvY2sgbW9kZSAqLworICAgIFNFQ19NRkNfTkJFTkNfVEhSRUFEIE5CRW5jVGhyZWFkOworICAgIE9NWF9CT09MIGJGaXJzdEZyYW1lOworICAgIE1GQ19FTkNfSU5QVVRfQlVGRkVSIE1GQ0VuY0lucHV0QnVmZmVyW01GQ19JTlBVVF9CVUZGRVJfTlVNX01BWF07CisgICAgT01YX1UzMiAgaW5kZXhJbnB1dEJ1ZmZlcjsKK30gU0VDX01QRUc0RU5DX0hBTkRMRTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworT1NDTF9FWFBPUlRfUkVGIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRJbml0KE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9TVFJJTkcgY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgT01YX0VSUk9SVFlQRSBTRUNfT01YX0NvbXBvbmVudERlaW5pdChPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNGVuYy9saWJyYXJ5X3JlZ2lzdGVyLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjdlYmEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29tcG9uZW50L3ZpZGVvL2VuYy9tcGVnNGVuYy9saWJyYXJ5X3JlZ2lzdGVyLmMKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBsaWJyYXJ5X3JlZ2lzdGVyLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAibGlicmFyeV9yZWdpc3Rlci5oIgorCisjdW5kZWYgIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTVBFRzRfRU5DIgorI2RlZmluZSBTRUNfTE9HX09GRgorI2luY2x1ZGUgIlNFQ19PU0FMX0xvZy5oIgorCisKK09TQ0xfRVhQT1JUX1JFRiBpbnQgU0VDX09NWF9DT01QT05FTlRfTGlicmFyeV9SZWdpc3RlcihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKipwcFNFQ0NvbXBvbmVudCkKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAocHBTRUNDb21wb25lbnQgPT0gTlVMTCkKKyAgICAgICAgZ290byBFWElUOworCisgICAgLyogY29tcG9uZW50IDEgLSB2aWRlbyBlbmNvZGVyIE1QRUc0ICovCisgICAgU0VDX09TQUxfU3RyY3B5KHBwU0VDQ29tcG9uZW50WzBdLT5jb21wb25lbnROYW1lLCBTRUNfT01YX0NPTVBPTkVOVF9NUEVHNF9FTkMpOworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFswXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQ19ST0xFKTsKKyAgICBwcFNFQ0NvbXBvbmVudFswXS0+dG90YWxSb2xlTnVtID0gTUFYX0NPTVBPTkVOVF9ST0xFX05VTTsKKworICAgIC8qIGNvbXBvbmVudCAyIC0gdmlkZW8gZW5jb2RlciBILjI2MyAqLworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+Y29tcG9uZW50TmFtZSwgU0VDX09NWF9DT01QT05FTlRfSDI2M19FTkMpOworICAgIFNFQ19PU0FMX1N0cmNweShwcFNFQ0NvbXBvbmVudFsxXS0+cm9sZXNbMF0sIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfRU5DX1JPTEUpOworICAgIHBwU0VDQ29tcG9uZW50WzFdLT50b3RhbFJvbGVOdW0gPSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisgICAgcmV0dXJuIE1BWF9DT01QT05FTlRfTlVNOworfQorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvbXBvbmVudC92aWRlby9lbmMvbXBlZzRlbmMvbGlicmFyeV9yZWdpc3Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNzJkNTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb21wb25lbnQvdmlkZW8vZW5jL21wZWc0ZW5jL2xpYnJhcnlfcmVnaXN0ZXIuaApAQCAtMCwwICsxLDU5IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIGxpYnJhcnlfcmVnaXN0ZXIuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfTVBFRzRfRU5DX1JFRworI2RlZmluZSBTRUNfT01YX01QRUc0X0VOQ19SRUcKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmgiCisKKworI2RlZmluZSBPU0NMX0VYUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNkZWZpbmUgTUFYX0NPTVBPTkVOVF9OVU0gICAgICAgMgorI2RlZmluZSBNQVhfQ09NUE9ORU5UX1JPTEVfTlVNICAxCisKKy8qIE1QRUc0ICovCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQyAgICAgICAgICJPTVguU0VDLk1QRUc0LkVuY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX01QRUc0X0VOQ19ST0xFICAgICJ2aWRlb19lbmNvZGVyLm1wZWc0IgorCisvKiBILjI2MyAqLworI2RlZmluZSBTRUNfT01YX0NPTVBPTkVOVF9IMjYzX0VOQyAgICAgICAgICAiT01YLlNFQy5IMjYzLkVuY29kZXIiCisjZGVmaW5lIFNFQ19PTVhfQ09NUE9ORU5UX0gyNjNfRU5DX1JPTEUgICAgICJ2aWRlb19lbmNvZGVyLmgyNjMiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPU0NMX0VYUE9SVF9SRUYgaW50IFNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlICoqcHBTRUNDb21wb25lbnQpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmMwODExCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29yZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjUgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorCitMT0NBTF9TUkNfRklMRVMgOj0gU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuYyBcCisJU0VDX09NWF9Db3JlLmMKKworCitMT0NBTF9NT0RVTEUgOj0gbGliU0VDX09NWF9Db3JlCisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9BUk1fTU9ERSA6PSBhcm0KKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJzZWNvc2FsIGxpYnNlY2Jhc2Vjb21wb25lbnQKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYyBsaWJkbCBsaWJjdXRpbHMgbGlidXRpbHMKKworTE9DQUxfQ19JTkNMVURFUyA6PSAkKFNFQ19PTVhfSU5DKS9raHJvbm9zIFwKKwkkKFNFQ19PTVhfSU5DKS9zZWMgXAorCSQoU0VDX09NWF9UT1ApL3NlY19vc2FsIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb214X2NvbXBvbmVudC9jb21tb24KKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ2NDM5NwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuYwpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgIFNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmMKKyAqIEBicmllZiAgICAgIFNFQyBPcGVuTUFYIElMIENvbXBvbmVudCBSZWdpc3RlcgorICogQGF1dGhvciAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJPTVhfQ29tcG9uZW50LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRVRDLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTGlicmFyeS5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmgiCisjaW5jbHVkZSAiU0VDX09NWF9NYWNyb3MuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0NPTVBfUkVHUyIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCisjZGVmaW5lIFJFR0lTVFJZX0ZJTEVOQU1FICJzZWNvbXhyZWdpc3RyeSIKKworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKipjb21wTGlzdCwgT01YX1UzMiAqY29tcE51bSkKK3sKKyAgICBPTVhfRVJST1JUWVBFICByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIGludCAgICAgICAgICAgIGNvbXBvbmVudE51bSA9IDAsIHJvbGVOdW0gPSAwLCB0b3RhbENvbXBOdW0gPSAwOworICAgIGludCAgICAgICAgICAgIHJlYWQ7CisgICAgY2hhciAgICAgICAgICAqb214cmVnaXN0cnlmaWxlID0gTlVMTDsKKyAgICBjaGFyICAgICAgICAgICpsaW5lID0gTlVMTDsKKyAgICBjaGFyICAgICAgICAgICpsaWJOYW1lOworICAgIEZJTEUgICAgICAgICAgKm9teHJlZ2lzdHJ5ZnA7CisgICAgc2l6ZV90ICAgICAgICAgbGVuOworICAgIE9NWF9IQU5ETEVUWVBFIHNvSGFuZGxlOworICAgIGNvbnN0IGNoYXIgICAgKmVycm9yTXNnOworICAgIGludCAoKlNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIpKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHMpOworICAgIFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSAqKnNlY0NvbXBvbmVudHNUZW1wOworICAgIFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKmNvbXBvbmVudExpc3Q7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBvbXhyZWdpc3RyeWZpbGUgPSBTRUNfT1NBTF9NYWxsb2Moc3RybGVuKCIvc3lzdGVtL2V0Yy8iKSArIHN0cmxlbihSRUdJU1RSWV9GSUxFTkFNRSkgKyAyKTsKKyAgICBTRUNfT1NBTF9TdHJjcHkob214cmVnaXN0cnlmaWxlLCAiL3N5c3RlbS9ldGMvIik7CisgICAgU0VDX09TQUxfU3RyY2F0KG9teHJlZ2lzdHJ5ZmlsZSwgUkVHSVNUUllfRklMRU5BTUUpOworCisgICAgb214cmVnaXN0cnlmcCA9IGZvcGVuKG9teHJlZ2lzdHJ5ZmlsZSwgInIiKTsKKyAgICBpZiAob214cmVnaXN0cnlmcCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9GcmVlKG9teHJlZ2lzdHJ5ZmlsZSk7CisKKyAgICBmc2VlayhvbXhyZWdpc3RyeWZwLCAwLCAwKTsKKyAgICBjb21wb25lbnRMaXN0ID0gKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QpICogTUFYX09NWF9DT01QT05FTlRfTlVNKTsKKyAgICBTRUNfT1NBTF9NZW1zZXQoY29tcG9uZW50TGlzdCwgMCwgc2l6ZW9mKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QpICogTUFYX09NWF9DT01QT05FTlRfTlVNKTsKKyAgICBsaWJOYW1lID0gU0VDX09TQUxfTWFsbG9jKE1BWF9PTVhfQ09NUE9ORU5UX0xJQk5BTUVfU0laRSk7CisKKyAgICB3aGlsZSAoKHJlYWQgPSBnZXRsaW5lKCZsaW5lLCAmbGVuLCBvbXhyZWdpc3RyeWZwKSkgIT0gLTEpIHsKKyAgICAgICAgaWYgKCgqbGluZSA9PSAnbCcpICYmICgqKGxpbmUgKyAxKSA9PSAnaScpICYmICgqKGxpbmUgKyAyKSA9PSAnYicpICYmCisgICAgICAgICAgICAoKihsaW5lICsgMykgPT0gJ08nKSAmJiAoKihsaW5lICsgNCkgPT0gJ00nKSAmJiAoKihsaW5lICsgNSkgPT0gJ1gnKSkgeworICAgICAgICAgICAgU0VDX09TQUxfTWVtc2V0KGxpYk5hbWUsIDAsIE1BWF9PTVhfQ09NUE9ORU5UX0xJQk5BTUVfU0laRSk7CisgICAgICAgICAgICBTRUNfT1NBTF9TdHJuY3B5KGxpYk5hbWUsIGxpbmUsIFNFQ19PU0FMX1N0cmxlbihsaW5lKS0xKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAibGliTmFtZSA6ICVzIiwgbGliTmFtZSk7CisKKyAgICAgICAgICAgIGlmICgoc29IYW5kbGUgPSBTRUNfT1NBTF9kbG9wZW4obGliTmFtZSwgUlRMRF9OT1cpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfZGxlcnJvcigpOyAgICAvKiBjbGVhciBlcnJvciovCisgICAgICAgICAgICAgICAgaWYgKChTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyID0gU0VDX09TQUxfZGxzeW0oc29IYW5kbGUsICJTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyIikpICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwLCBqID0gMDsKKworICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROdW0gPSAoKlNFQ19PTVhfQ09NUE9ORU5UX0xpYnJhcnlfUmVnaXN0ZXIpKE5VTEwpOworICAgICAgICAgICAgICAgICAgICBzZWNDb21wb25lbnRzVGVtcCA9IChTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUgKiopU0VDX09TQUxfTWFsbG9jKHNpemVvZihTRUNSZWdpc3RlckNvbXBvbmVudFR5cGUqKSAqIGNvbXBvbmVudE51bSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBjb21wb25lbnROdW07IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgc2VjQ29tcG9uZW50c1RlbXBbaV0gPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ1JlZ2lzdGVyQ29tcG9uZW50VHlwZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfTWVtc2V0KHNlY0NvbXBvbmVudHNUZW1wW2ldLCAwLCBzaXplb2YoU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKCpTRUNfT01YX0NPTVBPTkVOVF9MaWJyYXJ5X1JlZ2lzdGVyKShzZWNDb21wb25lbnRzVGVtcCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbXBvbmVudE51bTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoY29tcG9uZW50TGlzdFt0b3RhbENvbXBOdW1dLmNvbXBvbmVudC5jb21wb25lbnROYW1lLCBzZWNDb21wb25lbnRzVGVtcFtpXS0+Y29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgc2VjQ29tcG9uZW50c1RlbXBbaV0tPnRvdGFsUm9sZU51bTsgaisrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweShjb21wb25lbnRMaXN0W3RvdGFsQ29tcE51bV0uY29tcG9uZW50LnJvbGVzW2pdLCBzZWNDb21wb25lbnRzVGVtcFtpXS0+cm9sZXNbal0pOworICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50TGlzdFt0b3RhbENvbXBOdW1dLmNvbXBvbmVudC50b3RhbFJvbGVOdW0gPSBzZWNDb21wb25lbnRzVGVtcFtpXS0+dG90YWxSb2xlTnVtOworCisgICAgICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoY29tcG9uZW50TGlzdFt0b3RhbENvbXBOdW1dLmxpYk5hbWUsIGxpYk5hbWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbENvbXBOdW0rKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29tcG9uZW50TnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUoc2VjQ29tcG9uZW50c1RlbXBbaV0pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShzZWNDb21wb25lbnRzVGVtcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlcnJvck1zZyA9IFNFQ19PU0FMX2RsZXJyb3IoKSkgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1dBUk5JTkcsICJkbHN5bSBmYWlsZWQ6ICVzIiwgZXJyb3JNc2cpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9kbGNsb3NlKHNvSGFuZGxlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfV0FSTklORywgImRsb3BlbiBmYWlsZWQ6ICVzIiwgU0VDX09TQUxfZGxlcnJvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIG5vdCBhIGNvbXBvbmVudCBuYW1lIGxpbmUuIHNraXAgKi8KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZShsaWJOYW1lKTsKKyAgICBmY2xvc2Uob214cmVnaXN0cnlmcCk7CisKKyAgICAqY29tcExpc3QgPSBjb21wb25lbnRMaXN0OworICAgICpjb21wTnVtID0gdG90YWxDb21wTnVtOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1VucmVnaXN0ZXIoU0VDX09NWF9DT01QT05FTlRfUkVHTElTVCAqY29tcG9uZW50TGlzdCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBTRUNfT1NBTF9NZW1zZXQoY29tcG9uZW50TGlzdCwgMCwgc2l6ZW9mKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QpICogTUFYX09NWF9DT01QT05FTlRfTlVNKTsKKyAgICBTRUNfT1NBTF9GcmVlKGNvbXBvbmVudExpc3QpOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRBUElDaGVjayhPTVhfQ09NUE9ORU5UVFlQRSBjb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgaWYgKChOVUxMID09IGNvbXBvbmVudC5HZXRDb21wb25lbnRWZXJzaW9uKSAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuU2VuZENvbW1hbmQpICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LkdldFBhcmFtZXRlcikgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC5TZXRQYXJhbWV0ZXIpICAgICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuR2V0Q29uZmlnKSAgICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LlNldENvbmZpZykgICAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC5HZXRFeHRlbnNpb25JbmRleCkgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuR2V0U3RhdGUpICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LkNvbXBvbmVudFR1bm5lbFJlcXVlc3QpIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC5Vc2VCdWZmZXIpICAgICAgICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuQWxsb2NhdGVCdWZmZXIpICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LkZyZWVCdWZmZXIpICAgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC5FbXB0eVRoaXNCdWZmZXIpICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuRmlsbFRoaXNCdWZmZXIpICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LlNldENhbGxiYWNrcykgICAgICAgICAgIHx8CisgICAgICAgIChOVUxMID09IGNvbXBvbmVudC5Db21wb25lbnREZUluaXQpICAgICAgICB8fAorICAgICAgICAoTlVMTCA9PSBjb21wb25lbnQuVXNlRUdMSW1hZ2UpICAgICAgICAgICAgfHwKKyAgICAgICAgKE5VTEwgPT0gY29tcG9uZW50LkNvbXBvbmVudFJvbGVFbnVtKSkKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudDsKKyAgICBlbHNlCisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50TG9hZChTRUNfT01YX0NPTVBPTkVOVCAqc2VjX2NvbXBvbmVudCkKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfSEFORExFVFlQRSAgICAgbGliSGFuZGxlOworICAgIE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50OworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgT01YX0VSUk9SVFlQRSAoKlNFQ19PTVhfQ29tcG9uZW50SW5pdCkoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1NUUklORyBjb21wb25lbnROYW1lKTsKKworICAgIGxpYkhhbmRsZSA9IFNFQ19PU0FMX2Rsb3BlbihzZWNfY29tcG9uZW50LT5saWJOYW1lLCBSVExEX05PVyk7CisgICAgaWYgKCFsaWJIYW5kbGUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWU7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW52YWxpZENvbXBvbmVudE5hbWUsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT01YX0NvbXBvbmVudEluaXQgPSBTRUNfT1NBTF9kbHN5bShsaWJIYW5kbGUsICJTRUNfT01YX0NvbXBvbmVudEluaXQiKTsKKyAgICBpZiAoIVNFQ19PTVhfQ29tcG9uZW50SW5pdCkgeworICAgICAgICBTRUNfT1NBTF9kbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9DT01QT05FTlRUWVBFKSk7CisgICAgSU5JVF9TRVRfU0laRV9WRVJTSU9OKHBPTVhDb21wb25lbnQsIE9NWF9DT01QT05FTlRUWVBFKTsKKyAgICByZXQgPSAoKlNFQ19PTVhfQ29tcG9uZW50SW5pdCkoKE9NWF9IQU5ETEVUWVBFKXBPTVhDb21wb25lbnQsIHNlY19jb21wb25lbnQtPmNvbXBvbmVudE5hbWUpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKHBPTVhDb21wb25lbnQpOworICAgICAgICBTRUNfT1NBTF9kbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAiT01YX0Vycm9ySW52YWxpZENvbXBvbmVudCwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChTRUNfT01YX0NvbXBvbmVudEFQSUNoZWNrKCpwT01YQ29tcG9uZW50KSAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKHBPTVhDb21wb25lbnQpOworICAgICAgICAgICAgU0VDX09TQUxfZGxjbG9zZShsaWJIYW5kbGUpOworICAgICAgICAgICAgaWYgKE5VTEwgIT0gcE9NWENvbXBvbmVudC0+Q29tcG9uZW50RGVJbml0KQorICAgICAgICAgICAgICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvckludmFsaWRDb21wb25lbnQ7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvckludmFsaWRDb21wb25lbnQsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgc2VjX2NvbXBvbmVudC0+bGliSGFuZGxlID0gbGliSGFuZGxlOworICAgICAgICBzZWNfY29tcG9uZW50LT5wT01YQ29tcG9uZW50ID0gcE9NWENvbXBvbmVudDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09NWF9Db21wb25lbnRVbmxvYWQoU0VDX09NWF9DT01QT05FTlQgKnNlY19jb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworICAgIE9NWF9DT01QT05FTlRUWVBFICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmICghc2VjX2NvbXBvbmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBwT01YQ29tcG9uZW50ID0gc2VjX2NvbXBvbmVudC0+cE9NWENvbXBvbmVudDsKKyAgICBpZiAocE9NWENvbXBvbmVudCAhPSBOVUxMKSB7CisgICAgICAgIHBPTVhDb21wb25lbnQtPkNvbXBvbmVudERlSW5pdChwT01YQ29tcG9uZW50KTsKKyAgICAgICAgU0VDX09TQUxfRnJlZShwT01YQ29tcG9uZW50KTsKKyAgICAgICAgc2VjX2NvbXBvbmVudC0+cE9NWENvbXBvbmVudCA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKHNlY19jb21wb25lbnQtPmxpYkhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIFNFQ19PU0FMX2RsY2xvc2Uoc2VjX2NvbXBvbmVudC0+bGliSGFuZGxlKTsKKyAgICAgICAgc2VjX2NvbXBvbmVudC0+bGliSGFuZGxlID0gTlVMTDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY1ODBiZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaApAQCAtMCwwICsxLDc1IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db21wb25lbnRfUmVnaXN0ZXIuaAorICogQGJyaWVmICAgICAgU0VDIE9wZW5NQVggSUwgQ29tcG9uZW50IFJlZ2lzdGVyCisgKiBAYXV0aG9yICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT01YX0NPTVBPTkVOVF9SRUcKKyNkZWZpbmUgU0VDX09NWF9DT01QT05FTlRfUkVHCisKKyNpbmNsdWRlICJTRUNfT01YX0RlZi5oIgorI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9Db3JlLmgiCisjaW5jbHVkZSAiT01YX0NvbXBvbmVudC5oIgorCisKK3R5cGVkZWYgc3RydWN0IF9TRUNSZWdpc3RlckNvbXBvbmVudFR5cGUKK3sKKyAgICBPTVhfVTggIGNvbXBvbmVudE5hbWVbTUFYX09NWF9DT01QT05FTlRfTkFNRV9TSVpFXTsKKyAgICBPTVhfVTggIHJvbGVzW01BWF9PTVhfQ09NUE9ORU5UX1JPTEVfTlVNXVtNQVhfT01YX0NPTVBPTkVOVF9ST0xFX1NJWkVdOworICAgIE9NWF9VMzIgdG90YWxSb2xlTnVtOworfSBTRUNSZWdpc3RlckNvbXBvbmVudFR5cGU7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfT01YX0NPTVBPTkVOVF9SRUdMSVNUCit7CisgICAgU0VDUmVnaXN0ZXJDb21wb25lbnRUeXBlIGNvbXBvbmVudDsKKyAgICBPTVhfVTggIGxpYk5hbWVbTUFYX09NWF9DT01QT05FTlRfTElCTkFNRV9TSVpFXTsKK30gU0VDX09NWF9DT01QT05FTlRfUkVHTElTVDsKKworc3RydWN0IFNFQ19PTVhfQ09NUE9ORU5UOwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfQ09NUE9ORU5UCit7CisgICAgT01YX1U4ICAgICAgICAgICAgICAgICAgICBjb21wb25lbnROYW1lW01BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRV07CisgICAgT01YX1U4ICAgICAgICAgICAgICAgICAgICBsaWJOYW1lW01BWF9PTVhfQ09NUE9ORU5UX0xJQk5BTUVfU0laRV07CisgICAgT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBsaWJIYW5kbGU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICAgICpwT01YQ29tcG9uZW50OworICAgIHN0cnVjdCBTRUNfT01YX0NPTVBPTkVOVCAqbmV4dE9NWENvbXA7Cit9IFNFQ19PTVhfQ09NUE9ORU5UOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworCitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyKFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKipjb21wTGlzdCwgT01YX1UzMiAqY29tcE51bSk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50X1VucmVnaXN0ZXIoU0VDX09NWF9DT01QT05FTlRfUkVHTElTVCAqY29tcG9uZW50TGlzdCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50TG9hZChTRUNfT01YX0NPTVBPTkVOVCAqc2VjX2NvbXBvbmVudCk7CitPTVhfRVJST1JUWVBFIFNFQ19PTVhfQ29tcG9uZW50VW5sb2FkKFNFQ19PTVhfQ09NUE9ORU5UICpzZWNfY29tcG9uZW50KTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvU0VDX09NWF9Db3JlLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMjg3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29yZS5jCkBAIC0wLDAgKzEsMzYzIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09NWF9Db3JlLmMKKyAqIEBicmllZiAgICAgIFNFQyBPcGVuTUFYIElMIENvcmUKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICBIeWVZZW9uIENodW5nIChoeWVvbi5jaHVuZ0BzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgIFl1bmppIEtpbSAoeXVuamkua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4wCisgKiBAaGlzdG9yeQorICogICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPiAgICAgICAgIC8vIGZvciBwdGhyZWFkIHJlbGF0ZWQgZnVuY3Rpb25zCisKKyNpbmNsdWRlICJTRUNfT01YX0NvcmUuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIiAgLy8gZm9yIG11dGV4dCByZWxhdGVkIGZ1bmN0aW9ucworI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIiAgICAvLyBmb3IgU0VDX09TQUxfU3RyY21wLCBldGMKKyNpbmNsdWRlICJTRUNfT01YX0NvbXBvbmVudF9SZWdpc3Rlci5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PTVhfUmVzb3VyY2VtYW5hZ2VyLmgiCisKKyN1bmRlZiAgU0VDX0xPR19UQUcKKyNkZWZpbmUgU0VDX0xPR19UQUcgICAgIlNFQ19PTVhfQ09SRSIKKyNkZWZpbmUgU0VDX0xPR19PRkYKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCitzdGF0aWMgaW50IGdJbml0aWFsaXplZCA9IDA7CitzdGF0aWMgT01YX1UzMiBnQ29tcG9uZW50TnVtID0gMDsKKworc3RhdGljIFNFQ19PTVhfQ09NUE9ORU5UX1JFR0xJU1QgKmdDb21wb25lbnRMaXN0ID0gTlVMTDsKK3N0YXRpYyBTRUNfT01YX0NPTVBPTkVOVCAqZ0xvYWRDb21wb25lbnRMaXN0ID0gTlVMTDsKK3N0YXRpYyBwdGhyZWFkX211dGV4X3QgZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4ID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfSW5pdCh2b2lkKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jaygmZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4KTsKKyAgICBpZiAoZ0luaXRpYWxpemVkID09IDApIHsKKyAgICAgICAgaWYgKFNFQ19PTVhfQ29tcG9uZW50X1JlZ2lzdGVyKCZnQ29tcG9uZW50TGlzdCwgJmdDb21wb25lbnROdW0pKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIlNFQ19PTVhfSW5pdCA6ICVzIiwgIk9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlcyIpOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisKKyAgICAgICAgU0VDX09NWF9SZXNvdXJjZU1hbmFnZXJfSW5pdCgpOworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIlNFQ19PTVhfSW5pdCA6ICVzIiwgIk9NWF9FcnJvck5vbmUiKTsKKyAgICB9CisgICAgKytnSW5pdGlhbGl6ZWQ7CisKK0VYSVQ6CisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soJmdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgU0VDX09NWF9EZWluaXQodm9pZCkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soJmdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisgICAgaWYgKGdJbml0aWFsaXplZCA+IDApIHsKKyAgICAgICAgLS1nSW5pdGlhbGl6ZWQ7CisgICAgfQorCisgICAgaWYgKGdJbml0aWFsaXplZCAhPSAwKSB7CisgICAgICAgIC8vIFNvbWUgY29tcG9uZW50IHN0aWxsIHVzZXMgdGhlIGNvcmUuCisgICAgICAgIC8vIE5vdGhpbmcgbmVlZHMgdG8gYmUgZG9uZQorICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgU0VDX09NWF9SZXNvdXJjZU1hbmFnZXJfRGVpbml0KCk7CisKKyAgICBpZiAoT01YX0Vycm9yTm9uZSAhPSBTRUNfT01YX0NvbXBvbmVudF9VbnJlZ2lzdGVyKGdDb21wb25lbnRMaXN0KSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgZ0NvbXBvbmVudExpc3QgPSBOVUxMOworICAgIGdDb21wb25lbnROdW0gPSAwOworCitFWElUOgorICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKCZnaExvYWRDb21wb25lbnRMaXN0TXV0ZXgpOworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfQ29tcG9uZW50TmFtZUVudW0oCisgICAgT01YX09VVCBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1UzMiBuTmFtZUxlbmd0aCwKKyAgICBPTVhfSU4gIE9NWF9VMzIgbkluZGV4KQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChuSW5kZXggPj0gZ0NvbXBvbmVudE51bSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb01vcmU7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBzcHJpbnRmKGNDb21wb25lbnROYW1lLCAiJXMiLCBnQ29tcG9uZW50TGlzdFtuSW5kZXhdLmNvbXBvbmVudC5jb21wb25lbnROYW1lKTsKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfR2V0SGFuZGxlKAorICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUgKnBIYW5kbGUsCisgICAgT01YX0lOICBPTVhfU1RSSU5HIGNDb21wb25lbnROYW1lLAorICAgIE9NWF9JTiAgT01YX1BUUiBwQXBwRGF0YSwKKyAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUgKnBDYWxsQmFja3MpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9DT01QT05FTlQgKmxvYWRDb21wb25lbnQ7CisgICAgU0VDX09NWF9DT01QT05FTlQgKmN1cnJlbnRDb21wb25lbnQ7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoZ0luaXRpYWxpemVkICE9IDEpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm90UmVhZHk7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAoKHBIYW5kbGUgPT0gTlVMTCkgfHwgKGNDb21wb25lbnROYW1lID09IE5VTEwpIHx8IChwQ2FsbEJhY2tzID09IE5VTEwpKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgIkNvbXBvbmVudE5hbWUgOiAlcyIsIGNDb21wb25lbnROYW1lKTsKKworICAgIE9NWF9VMzIgaSA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGdDb21wb25lbnROdW07IGkrKykgeworICAgICAgICBpZiAoU0VDX09TQUxfU3RyY21wKGNDb21wb25lbnROYW1lLCBnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQuY29tcG9uZW50TmFtZSkgPT0gMCkgeworICAgICAgICAgICAgbG9hZENvbXBvbmVudCA9IFNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09NWF9DT01QT05FTlQpKTsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChsb2FkQ29tcG9uZW50LCAwLCBzaXplb2YoU0VDX09NWF9DT01QT05FTlQpKTsKKworICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KGxvYWRDb21wb25lbnQtPmxpYk5hbWUsIGdDb21wb25lbnRMaXN0W2ldLmxpYk5hbWUpOworICAgICAgICAgICAgU0VDX09TQUxfU3RyY3B5KGxvYWRDb21wb25lbnQtPmNvbXBvbmVudE5hbWUsIGdDb21wb25lbnRMaXN0W2ldLmNvbXBvbmVudC5jb21wb25lbnROYW1lKTsKKyAgICAgICAgICAgIHJldCA9IFNFQ19PTVhfQ29tcG9uZW50TG9hZChsb2FkQ29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICAgICAgICAgIFNFQ19PU0FMX0ZyZWUobG9hZENvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJPTVhfRXJyb3IsIExpbmU6JWQiLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXQgPSBsb2FkQ29tcG9uZW50LT5wT01YQ29tcG9uZW50LT5TZXRDYWxsYmFja3MobG9hZENvbXBvbmVudC0+cE9NWENvbXBvbmVudCwgcENhbGxCYWNrcywgcEFwcERhdGEpOworICAgICAgICAgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgICAgICAgICAgU0VDX09NWF9Db21wb25lbnRVbmxvYWQobG9hZENvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfRnJlZShsb2FkQ29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIk9NWF9FcnJvciwgTGluZTolZCIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNFQ19PU0FMX011dGV4TG9jaygmZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4KTsKKyAgICAgICAgICAgIGlmIChnTG9hZENvbXBvbmVudExpc3QgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGdMb2FkQ29tcG9uZW50TGlzdCA9IGxvYWRDb21wb25lbnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnQgPSBnTG9hZENvbXBvbmVudExpc3Q7CisgICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcCA9IGxvYWRDb21wb25lbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTRUNfT1NBTF9NdXRleFVubG9jaygmZ2hMb2FkQ29tcG9uZW50TGlzdE11dGV4KTsKKworICAgICAgICAgICAgKnBIYW5kbGUgPSBsb2FkQ29tcG9uZW50LT5wT01YQ29tcG9uZW50OworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiU0VDX09NWF9HZXRIYW5kbGUgOiAlcyIsICJPTVhfRXJyb3JOb25lIik7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZDsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0ZyZWVIYW5kbGUoT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpCit7CisgICAgT01YX0VSUk9SVFlQRSAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX09NWF9DT01QT05FTlQgKmN1cnJlbnRDb21wb25lbnQ7CisgICAgU0VDX09NWF9DT01QT05FTlQgKmRlbGV0ZUNvbXBvbmVudDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChnSW5pdGlhbGl6ZWQgIT0gMSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb3RSZWFkeTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmICghaENvbXBvbmVudCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2soJmdoTG9hZENvbXBvbmVudExpc3RNdXRleCk7CisgICAgY3VycmVudENvbXBvbmVudCA9IGdMb2FkQ29tcG9uZW50TGlzdDsKKyAgICBpZiAoZ0xvYWRDb21wb25lbnRMaXN0LT5wT01YQ29tcG9uZW50ID09IGhDb21wb25lbnQpIHsKKyAgICAgICAgZGVsZXRlQ29tcG9uZW50ID0gZ0xvYWRDb21wb25lbnRMaXN0OworICAgICAgICBnTG9hZENvbXBvbmVudExpc3QgPSBnTG9hZENvbXBvbmVudExpc3QtPm5leHRPTVhDb21wOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlICgoY3VycmVudENvbXBvbmVudCAhPSBOVUxMKSAmJiAoKChTRUNfT01YX0NPTVBPTkVOVCAqKShjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcCkpLT5wT01YQ29tcG9uZW50ICE9IGhDb21wb25lbnQpKQorICAgICAgICAgICAgY3VycmVudENvbXBvbmVudCA9IGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wOworCisgICAgICAgIGlmICgoKFNFQ19PTVhfQ09NUE9ORU5UICopKGN1cnJlbnRDb21wb25lbnQtPm5leHRPTVhDb21wKSktPnBPTVhDb21wb25lbnQgPT0gaENvbXBvbmVudCkgeworICAgICAgICAgICAgZGVsZXRlQ29tcG9uZW50ID0gY3VycmVudENvbXBvbmVudC0+bmV4dE9NWENvbXA7CisgICAgICAgICAgICBjdXJyZW50Q29tcG9uZW50LT5uZXh0T01YQ29tcCA9IGRlbGV0ZUNvbXBvbmVudC0+bmV4dE9NWENvbXA7CisgICAgICAgIH0gZWxzZSBpZiAoY3VycmVudENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JDb21wb25lbnROb3RGb3VuZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PTVhfQ29tcG9uZW50VW5sb2FkKGRlbGV0ZUNvbXBvbmVudCk7CisgICAgU0VDX09TQUxfRnJlZShkZWxldGVDb21wb25lbnQpOworCitFWElUOgorICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKCZnaExvYWRDb21wb25lbnRMaXN0TXV0ZXgpOworICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfU2V0dXBUdW5uZWwoCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhPdXRwdXQsCisgICAgT01YX0lOIE9NWF9VMzIgblBvcnRPdXRwdXQsCisgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhJbnB1dCwKKyAgICBPTVhfSU4gT01YX1UzMiBuUG9ydElucHV0KQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0Q29udGVudFBpcGUoCisgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSAqaFBpcGUsCisgICAgT01YX0lOICBPTVhfU1RSSU5HIHN6VVJJKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0FQSSBPTVhfRVJST1JUWVBFIFNFQ19PTVhfR2V0Q29tcG9uZW50c09mUm9sZSAoCisgICAgT01YX0lOICAgIE9NWF9TVFJJTkcgcm9sZSwKKyAgICBPTVhfSU5PVVQgT01YX1UzMiAqcE51bUNvbXBzLAorICAgIE9NWF9JTk9VVCBPTVhfVTggICoqY29tcE5hbWVzKQoreworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBpbnQgICAgICAgICAgIG1heF9yb2xlX251bSA9IDA7CisgICAgT01YX1NUUklORyAgICBSb2xlU3RyaW5nW01BWF9PTVhfQ09NUE9ORU5UX1JPTEVfU0laRV07CisgICAgaW50IGkgPSAwLCBqID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChnSW5pdGlhbGl6ZWQgIT0gMSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JOb3RSZWFkeTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgICpwTnVtQ29tcHMgPSAwOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PTVhfQ09NUE9ORU5UX05VTTsgaSsrKSB7CisgICAgICAgIG1heF9yb2xlX251bSA9IGdDb21wb25lbnRMaXN0W2ldLmNvbXBvbmVudC50b3RhbFJvbGVOdW07CisKKyAgICAgICAgZm9yIChqID0gMDsgaiA8IG1heF9yb2xlX251bTsgaisrKSB7CisgICAgICAgICAgICBpZiAoU0VDX09TQUxfU3RyY21wKGdDb21wb25lbnRMaXN0W2ldLmNvbXBvbmVudC5yb2xlc1tqXSwgcm9sZSkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChjb21wTmFtZXMgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBTRUNfT1NBTF9TdHJjcHkoKE9NWF9TVFJJTkcpY29tcE5hbWVzWypwTnVtQ29tcHNdLCBnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQuY29tcG9uZW50TmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwTnVtQ29tcHMgPSAoKnBOdW1Db21wcyArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgU0VDX09NWF9HZXRSb2xlc09mQ29tcG9uZW50ICgKKyAgICBPTVhfSU4gICAgT01YX1NUUklORyBjb21wTmFtZSwKKyAgICBPTVhfSU5PVVQgT01YX1UzMiAqcE51bVJvbGVzLAorICAgIE9NWF9PVVQgICBPTVhfVTggKipyb2xlcykKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0JPT0wgICAgICBkZXRlY3RDb21wID0gT01YX0ZBTFNFOworICAgIGludCAgICAgICAgICAgY29tcE51bSA9IDAsIHRvdGFsUm9sZU51bSA9IDA7CisgICAgaW50IGkgPSAwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGdJbml0aWFsaXplZCAhPSAxKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vdFJlYWR5OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9PTVhfQ09NUE9ORU5UX05VTTsgaSsrKSB7CisgICAgICAgIGlmIChnQ29tcG9uZW50TGlzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICBpZiAoU0VDX09TQUxfU3RyY21wKGdDb21wb25lbnRMaXN0W2ldLmNvbXBvbmVudC5jb21wb25lbnROYW1lLCBjb21wTmFtZSkgPT0gMCkgeworICAgICAgICAgICAgICAgICpwTnVtUm9sZXMgPSB0b3RhbFJvbGVOdW0gPSBnQ29tcG9uZW50TGlzdFtpXS5jb21wb25lbnQudG90YWxSb2xlTnVtOworICAgICAgICAgICAgICAgIGNvbXBOdW0gPSBpOworICAgICAgICAgICAgICAgIGRldGVjdENvbXAgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChkZXRlY3RDb21wID09IE9NWF9GQUxTRSkgeworICAgICAgICAqcE51bVJvbGVzID0gMDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQ29tcG9uZW50Tm90Rm91bmQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAocm9sZXMgIT0gTlVMTCkgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG90YWxSb2xlTnVtOyBpKyspIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX1N0cmNweShyb2xlc1tpXSwgZ0NvbXBvbmVudExpc3RbY29tcE51bV0uY29tcG9uZW50LnJvbGVzW2ldKTsKKyAgICAgICAgfQorICAgIH0KKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2NvcmUvU0VDX09NWF9Db3JlLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjU2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL1NFQ19PTVhfQ29yZS5oCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICBTRUNfT01YX0NvcmUuaAorICogQGJyaWVmICAgICAgU0VDIE9wZW5NQVggSUwgQ29yZQorICogQGF1dGhvciAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgIEh5ZVllb24gQ2h1bmcgKGh5ZW9uLmNodW5nQHNhbXN1bmcuY29tKQorICogICAgICAgICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PTVhfQ09SRQorI2RlZmluZSBTRUNfT01YX0NPUkUKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0luaXQodm9pZCk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfRGVpbml0KHZvaWQpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0NvbXBvbmVudE5hbWVFbnVtKAorICAgIE9NWF9PVVQgICBPTVhfU1RSSU5HICAgICAgICBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gICAgT01YX1UzMiAgICAgICAgICAgbk5hbWVMZW5ndGgsCisgICAgT01YX0lOICAgIE9NWF9VMzIgICAgICAgICAgIG5JbmRleCk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIFNFQ19PTVhfR2V0SGFuZGxlKAorICAgIE9NWF9PVVQgICBPTVhfSEFORExFVFlQRSAgICpwSGFuZGxlLAorICAgIE9NWF9JTiAgICBPTVhfU1RSSU5HICAgICAgICBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gICAgT01YX1BUUiAgICAgICAgICAgcEFwcERhdGEsCisgICAgT01YX0lOICAgIE9NWF9DQUxMQkFDS1RZUEUgKnBDYWxsQmFja3MpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX0ZyZWVIYW5kbGUoCisgICAgT01YX0lOICAgIE9NWF9IQU5ETEVUWVBFICAgIGhDb21wb25lbnQpOworU0VDX0VYUE9SVF9SRUYgT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBTRUNfT01YX1NldHVwVHVubmVsKAorICAgIE9NWF9JTiAgICBPTVhfSEFORExFVFlQRSAgICBoT3V0cHV0LAorICAgIE9NWF9JTiAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydE91dHB1dCwKKyAgICBPTVhfSU4gICAgT01YX0hBTkRMRVRZUEUgICAgaElucHV0LAorICAgIE9NWF9JTiAgICBPTVhfVTMyICAgICAgICAgICBuUG9ydElucHV0KTsKK1NFQ19FWFBPUlRfUkVGIE9NWF9BUEkgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgU0VDX09NWF9HZXRDb250ZW50UGlwZSgKKyAgICBPTVhfT1VUICAgT01YX0hBTkRMRVRZUEUgICAqaFBpcGUsCisgICAgT01YX0lOICAgIE9NWF9TVFJJTkcgICAgICAgIHN6VVJJKTsKK1NFQ19FWFBPUlRfUkVGIE9NWF9BUEkgT01YX0VSUk9SVFlQRSAgICAgICAgICAgICAgU0VDX09NWF9HZXRDb21wb25lbnRzT2ZSb2xlKAorICAgIE9NWF9JTiAgICBPTVhfU1RSSU5HICAgICAgICByb2xlLAorICAgIE9NWF9JTk9VVCBPTVhfVTMyICAgICAgICAgICpwTnVtQ29tcHMsCisgICAgT01YX0lOT1VUIE9NWF9VOCAgICAgICAgICAqKmNvbXBOYW1lcyk7CitTRUNfRVhQT1JUX1JFRiBPTVhfQVBJIE9NWF9FUlJPUlRZUEUgICAgICAgICAgICAgIFNFQ19PTVhfR2V0Um9sZXNPZkNvbXBvbmVudCgKKyAgICBPTVhfSU4gICAgT01YX1NUUklORyAgICAgICAgY29tcE5hbWUsCisgICAgT01YX0lOT1VUIE9NWF9VMzIgICAgICAgICAgKnBOdW1Sb2xlcywKKyAgICBPTVhfT1VUICAgT01YX1U4ICAgICAgICAgICoqcm9sZXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9jb3JlL3NlY29teHJlZ2lzdHJ5IGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29yZS9zZWNvbXhyZWdpc3RyeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmFlYmEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfY29yZS9zZWNvbXhyZWdpc3RyeQpAQCAtMCwwICsxLDQgQEAKK2xpYk9NWC5TRUMuQVZDLkRlY29kZXIuc28KK2xpYk9NWC5TRUMuTTRWLkRlY29kZXIuc28KK2xpYk9NWC5TRUMuQVZDLkVuY29kZXIuc28KK2xpYk9NWC5TRUMuTTRWLkVuY29kZXIuc28KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfQXVkaW8uaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfQXVkaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGYxYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9BdWRpby5oCkBAIC0wLDAgKzEsMTMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBUaGUgS2hyb25vcyBHcm91cCBJbmMuIAorICogCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QKKyAqIHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAorICogCisgKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUworICogT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULgorICogSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkKKyAqIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsCisgKiBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRQorICogU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAorICoKKyAqLworCisvKiogQGZpbGUgT01YX0F1ZGlvLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgQXVkaW8gY29tcG9uZW50cyB0byBleGNoYW5nZQorICogIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIHRoZSBjb21wb25lbm1pbHRzLgorICovCisKKyNpZm5kZWYgT01YX0F1ZGlvX2gKKyNkZWZpbmUgT01YX0F1ZGlvX2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qIEVhY2ggT01YIGhlYWRlciBtdXN0IGluY2x1ZGUgYWxsIHJlcXVpcmVkIGhlYWRlciBmaWxlcyB0byBhbGxvdyB0aGUKKyAqICBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqICBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0NvcmUuaD4KKworLyoqIEBkZWZncm91cCBtaWRpIE1JREkKKyAqIEBpbmdyb3VwIGF1ZGlvCisgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgZWZmZWN0cyBBdWRpbyBlZmZlY3RzCisgKiBAaW5ncm91cCBhdWRpbworICovCisKKy8qKiBAZGVmZ3JvdXAgYXVkaW8gT3Blbk1BWCBJTCBBdWRpbyBEb21haW4KKyAqIFN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgQXVkaW8gZG9tYWluCisgKiBAeworICovCisKKy8qKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgYXVkaW8gY29kaW5ncy4gIAorICogIElmICJPTVhfQVVESU9fQ29kaW5nVW51c2VkIiBpcyBzZWxlY3RlZCwgdGhlIGNvZGluZyBzZWxlY3Rpb24gbXVzdCAKKyAqICBiZSBkb25lIGluIGEgdmVuZG9yIHNwZWNpZmljIHdheS4gIFNpbmNlIHRoaXMgaXMgZm9yIGFuIGF1ZGlvIAorICogIHByb2Nlc3NpbmcgZWxlbWVudCB0aGlzIGVudW0gaXMgcmVsZXZhbnQuICBIb3dldmVyLCBmb3IgYW5vdGhlciAKKyAqICB0eXBlIG9mIGNvbXBvbmVudCBvdGhlciBlbnVtcyB3b3VsZCBiZSBpbiB0aGlzIGFyZWEuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQ09ESU5HVFlQRSB7CisgICAgT01YX0FVRElPX0NvZGluZ1VudXNlZCA9IDAsICAvKio8IFBsYWNlaG9sZGVyIHZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQXV0b0RldGVjdCwgIC8qKjwgYXV0byBkZXRlY3Rpb24gb2YgYXVkaW8gZm9ybWF0ICovCisgICAgT01YX0FVRElPX0NvZGluZ1BDTSwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBDTSBjb2RpbmcgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQURQQ00sICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQURQQ00gZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0FNUiwgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEFNUiBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nR1NNRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIGZ1bGxyYXRlIChpLmUuIEdTTTYxMCkgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nR1NNRUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgR1NNIEVuaGFuY2VkIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSovCisgICAgT01YX0FVRElPX0NvZGluZ0dTTUhSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEdTTSBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUERDRlIsICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUERDIEZ1bGxyYXRlIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdQRENFRlIsICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBQREMgRW5oYW5jZWQgRnVsbHJhdGUgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1BEQ0hSLCAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFBEQyBIYWxmcmF0ZSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nVERNQUZSLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQyMCkgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nVERNQUVGUiwgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVERNQSBFbmhhbmNlZCBGdWxscmF0ZSBlbmNvZGVkIGRhdGEgKFRJQS9FSUEtMTM2LTQxMCkgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nUUNFTFA4LCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgUUNFTFAgOGticHMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1FDRUxQMTMsICAgICAvKio8IEFueSB2YXJpYW50IG9mIFFDRUxQIDEza2JwcyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRVZSQywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRVZSQyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nU01WLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgU01WIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHNzExLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcxMSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nRzcyMywgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgRy43MjMgZG90IDEgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ0c3MjYsICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIEcuNzI2IGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdHNzI5LCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBHLjcyOSBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nQUFDLCAgICAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgQUFDIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdNUDMsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNUDMgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1NCQywgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFNCQyBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fQ29kaW5nVk9SQklTLCAgICAgIC8qKjwgQW55IHZhcmlhbnQgb2YgVk9SQklTIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdXTUEsICAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBXTUEgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0NvZGluZ1JBLCAgICAgICAgICAvKio8IEFueSB2YXJpYW50IG9mIFJBIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdNSURJLCAgICAgICAgLyoqPCBBbnkgdmFyaWFudCBvZiBNSURJIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19Db2RpbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NvZGluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0NvZGluZ01heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0NPRElOR1RZUEU7CisKKworLyoqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAorICogIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IGF1ZGlvIAorICogIHBhdGguICBJZiBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGlzIG5lZWRlZCB0byBkZWZpbmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlCisgKiAgcG9ydCAoc3VjaCBhcyBmcmVxdWVuY3kpLCBhZGRpdGlvbmFsIHN0cnVjdHVyZXMgbXVzdCBiZSBzZW50IHN1Y2ggYXMgdGhlCisgKiAgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHN0cnVjdHVyZSB0byBzdXBwbHkgdGhlIGV4dHJhIHBhcmFtZXRlcnMgZm9yIHRoZSBwb3J0LgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUE9SVERFRklOSVRJT05UWVBFIHsKKyAgICBPTVhfU1RSSU5HIGNNSU1FVHlwZTsgICAgICAgICAgICAvKio8IE1JTUUgdHlwZSBvZiBkYXRhIGZvciB0aGUgcG9ydCAqLworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOyAvKiogPCBwbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFuIG91dHB1dCBkZXZpY2UsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwICovCisgICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OyAgLyoqPCBUdXJucyBvbiBlcnJvciBjb25jZWFsbWVudCBpZiBpdCBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgT01YIGNvbXBvbmVudCAqLworICAgIE9NWF9BVURJT19DT0RJTkdUWVBFIGVFbmNvZGluZzsgIC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydCAoZS5nLiBQQ00sIEFNUiwgTVAzLCBldGMpICovCit9IE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEU7CisKKworLyoqICBQb3J0IGZvcm1hdCBwYXJhbWV0ZXIuICBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGVudW1lcmF0ZQorICAqICB0aGUgdmFyaW91cyBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgorICAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgIC8qKjwgSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0ICovCisgICAgT01YX1UzMiBuSW5kZXg7ICAgICAgICAgICAgICAgICAvKio8IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAweDAgdG8gTi0xICovCisgICAgT01YX0FVRElPX0NPRElOR1RZUEUgZUVuY29kaW5nOyAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBwb3J0IChlLmcuIFBDTSwgQU1SLCBNUDMsIGV0YykgKi8KK30gT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOworCisKKy8qKiBQQ00gbW9kZSB0eXBlICAqLyAKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fUENNTU9ERVRZUEUgeyAKKyAgICBPTVhfQVVESU9fUENNTW9kZUxpbmVhciA9IDAsICAvKio8IExpbmVhciBQQ00gZW5jb2RlZCBkYXRhICovIAorICAgIE9NWF9BVURJT19QQ01Nb2RlQUxhdywgICAgICAgIC8qKjwgQSBsYXcgUENNIGVuY29kZWQgZGF0YSAoRy43MTEpICovIAorICAgIE9NWF9BVURJT19QQ01Nb2RlTVVMYXcsICAgICAgIC8qKjwgTXUgbGF3IFBDTSBlbmNvZGVkIGRhdGEgKEcuNzExKSAgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX1BDTU1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19QQ01Nb2RlTWF4ID0gMHg3RkZGRkZGRiAKK30gT01YX0FVRElPX1BDTU1PREVUWVBFOyAKKworCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0NIQU5ORUxUWVBFIHsKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE5vbmUgPSAweDAsICAgIC8qKjwgVW51c2VkIG9yIGVtcHR5ICovCisgICAgT01YX0FVRElPX0NoYW5uZWxMRiAgID0gMHgxLCAgICAvKio8IExlZnQgZnJvbnQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbFJGICAgPSAweDIsICAgIC8qKjwgUmlnaHQgZnJvbnQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbENGICAgPSAweDMsICAgIC8qKjwgQ2VudGVyIGZyb250ICovCisgICAgT01YX0FVRElPX0NoYW5uZWxMUyAgID0gMHg0LCAgICAvKio8IExlZnQgc3Vycm91bmQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbFJTICAgPSAweDUsICAgIC8qKjwgUmlnaHQgc3Vycm91bmQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExGRSAgPSAweDYsICAgIC8qKjwgTG93IGZyZXF1ZW5jeSBlZmZlY3RzICovCisgICAgT01YX0FVRElPX0NoYW5uZWxDUyAgID0gMHg3LCAgICAvKio8IEJhY2sgc3Vycm91bmQgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbExSICAgPSAweDgsICAgIC8qKjwgTGVmdCByZWFyLiAqLworICAgIE9NWF9BVURJT19DaGFubmVsUlIgICA9IDB4OSwgICAgLyoqPCBSaWdodCByZWFyLiAqLworICAgIE9NWF9BVURJT19DaGFubmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19DaGFubmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1heCAgPSAweDdGRkZGRkZGIAorfSBPTVhfQVVESU9fQ0hBTk5FTFRZUEU7CisKKyNkZWZpbmUgT01YX0FVRElPX01BWENIQU5ORUxTIDE2ICAvKio8IG1heGltdW0gbnVtYmVyIGRpc3RpbmN0IGF1ZGlvIGNoYW5uZWxzIHRoYXQgYSBidWZmZXIgbWF5IGNvbnRhaW4gKi8KKyNkZWZpbmUgT01YX01JTl9QQ01QQVlMT0FEX01TRUMgNSAvKio8IE1pbmltdW0gYXVkaW8gYnVmZmVyIHBheWxvYWQgc2l6ZSBmb3IgdW5jb21wcmVzc2VkIChQQ00pIGF1ZGlvICovCisKKy8qKiBQQ00gZm9ybWF0IGRlc2NyaXB0aW9uICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BDTU1PREVUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKGUuZy4gMiBmb3Igc3RlcmVvKSAqLyAKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgZU51bURhdGE7ICAgLyoqPCBpbmRpY2F0ZXMgUENNIGRhdGEgYXMgc2lnbmVkIG9yIHVuc2lnbmVkICovIAorICAgIE9NWF9FTkRJQU5UWVBFIGVFbmRpYW47ICAgICAgICAgICAvKio8IGluZGljYXRlcyBQQ00gZGF0YSBhcyBsaXR0bGUgb3IgYmlnIGVuZGlhbiAqLyAKKyAgICBPTVhfQk9PTCBiSW50ZXJsZWF2ZWQ7ICAgICAgICAgICAgLyoqPCBUcnVlIGZvciBub3JtYWwgaW50ZXJsZWF2ZWQgZGF0YTsgZmFsc2UgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi1pbnRlcmxlYXZlZCBkYXRhIChlLmcuIGJsb2NrIGRhdGEpICovIAorICAgIE9NWF9VMzIgbkJpdFBlclNhbXBsZTsgICAgICAgICAgICAvKio8IEJpdCBwZXIgc2FtcGxlICovIAorICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8gCisgICAgT01YX0FVRElPX1BDTU1PREVUWVBFIGVQQ01Nb2RlOyAgIC8qKjwgUENNIG1vZGUgZW51bWVyYXRpb24gKi8gCisgICAgT01YX0FVRElPX0NIQU5ORUxUWVBFIGVDaGFubmVsTWFwcGluZ1tPTVhfQVVESU9fTUFYQ0hBTk5FTFNdOyAvKio8IFNsb3QgaSBjb250YWlucyBjaGFubmVsIGRlZmluZWQgYnkgZUNoYW5uZWxNYXBbaV0gKi8KKworfSBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEU7IAorCisKKy8qKiBBdWRpbyBjaGFubmVsIG1vZGUuICBUaGlzIGlzIHVzZWQgYnkgYm90aCBBQUMgYW5kIE1QMywgYWx0aG91Z2ggdGhlIG5hbWVzIGFyZSBtb3JlIGFwcHJvcHJpYXRlCisgKiBmb3IgdGhlIE1QMy4gIEZvciBleGFtcGxlLCBKb2ludFN0ZXJlbyBmb3IgTVAzIGlzIENvdXBsaW5nQ2hhbm5lbHMgZm9yIEFBQy4gCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIHsKKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVTdGVyZW8gPSAwLCAgLyoqPCAyIGNoYW5uZWxzLCB0aGUgYml0cmF0ZSBhbGxvY2F0aW9uIGJldHdlZW4gdGhvc2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0d28gY2hhbm5lbHMgY2hhbmdlcyBhY2NvcmRpbmdseSB0byBlYWNoIGNoYW5uZWwgaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVKb2ludFN0ZXJlbywgLyoqPCBtb2RlIHRoYXQgdGFrZXMgYWR2YW50YWdlIG9mIHdoYXQgaXMgY29tbW9uIGJldHdlZW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBjaGFubmVscyBmb3IgaGlnaGVyIGNvbXByZXNzaW9uIGdhaW4gKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVEdWFsLCAgICAgICAgLyoqPCAyIG1vbm8tY2hhbm5lbHMsIGVhY2ggY2hhbm5lbCBpcyBlbmNvZGVkIHdpdGggaGFsZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYml0cmF0ZSBvZiB0aGUgb3ZlcmFsbCBiaXRyYXRlICovCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlTW9ubywgICAgICAgIC8qKjwgTW9ubyBjaGFubmVsIG1vZGUgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0NoYW5uZWxNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQ2hhbm5lbE1vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEU7CisKKwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFIHsKKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TVAxTGF5ZXIzID0gMCwgLyoqPCBNUDMgQXVkaW8gTVBFRyAxIExheWVyIDMgU3RyZWFtIGZvcm1hdCAqLworICAgIE9NWF9BVURJT19NUDNTdHJlYW1Gb3JtYXRNUDJMYXllcjMsICAgICAvKio8IE1QMyBBdWRpbyBNUEVHIDIgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdE1QMl81TGF5ZXIzLCAgIC8qKjwgTVAzIEF1ZGlvIE1QRUcyLjUgTGF5ZXIgMyBTdHJlYW0gZm9ybWF0ICovCisgICAgT01YX0FVRElPX01QM1N0cmVhbUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fTVAzU3RyZWFtRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTVAzU1RSRUFNRk9STUFUVFlQRTsKKworLyoqIE1QMyBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIG9yIHVua25vd24gc2FtcGxpbmcgcmF0ZS4gKi8KKyAgICBPTVhfVTMyIG5BdWRpb0JhbmRXaWR0aDsgICAgICAgLyoqPCBBdWRpbyBiYW5kIHdpZHRoIChpbiBIeikgdG8gd2hpY2ggYW4gZW5jb2RlciBzaG91bGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KKyAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgICAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19NUDNTVFJFQU1GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IE1QMyBzdHJlYW0gZm9ybWF0ICovCit9IE9NWF9BVURJT19QQVJBTV9NUDNUWVBFOworCisKK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQUFDU1RSRUFNRk9STUFUVFlQRSB7CisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdE1QMkFEVFMgPSAwLCAvKio8IEFBQyBBdWRpbyBEYXRhIFRyYW5zcG9ydCBTdHJlYW0gMiBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0QURUUywgICAgIC8qKjwgQUFDIEF1ZGlvIERhdGEgVHJhbnNwb3J0IFN0cmVhbSA0IGZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRMT0FTLCAgICAgLyoqPCBBQUMgTG93IE92ZXJoZWFkIEF1ZGlvIFN0cmVhbSBmb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0TVA0TEFUTSwgICAgIC8qKjwgQUFDIExvdyBvdmVyaGVhZCBBdWRpbyBUcmFuc3BvcnQgTXVsdGlwbGV4ICovCisgICAgT01YX0FVRElPX0FBQ1N0cmVhbUZvcm1hdEFESUYsICAgICAgICAvKio8IEFBQyBBdWRpbyBEYXRhIEludGVyY2hhbmdlIEZvcm1hdCAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNUDRGRiwgICAgICAgLyoqPCBBQUMgaW5zaWRlIE1QRUctNC9JU08gRmlsZSBGb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0UkFXLCAgICAgICAgIC8qKjwgQUFDIFJhdyBGb3JtYXQgKi8KKyAgICBPTVhfQVVESU9fQUFDU3RyZWFtRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19BQUNTdHJlYW1Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFOworCisKKy8qKiBBQUMgbW9kZSB0eXBlLiAgTm90ZSB0aGF0IHRoZSB0ZXJtIHByb2ZpbGUgaXMgdXNlZCB3aXRoIHRoZSBNUEVHLTIKKyAqIHN0YW5kYXJkIGFuZCB0aGUgdGVybSBvYmplY3QgdHlwZSBhbmQgcHJvZmlsZSBpcyB1c2VkIHdpdGggTVBFRy00ICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFeworICBPTVhfQVVESU9fQUFDT2JqZWN0TnVsbCA9IDAsICAgICAgLyoqPCBOdWxsLCBub3QgdXNlZCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TWFpbiA9IDEsICAgICAgLyoqPCBBQUMgTWFpbiBvYmplY3QgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdExDLCAgICAgICAgICAgIC8qKjwgQUFDIExvdyBDb21wbGV4aXR5IG9iamVjdCAoQUFDIHByb2ZpbGUpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RTU1IsICAgICAgICAgICAvKio8IEFBQyBTY2FsYWJsZSBTYW1wbGUgUmF0ZSBvYmplY3QgKi8KKyAgT01YX0FVRElPX0FBQ09iamVjdExUUCwgICAgICAgICAgIC8qKjwgQUFDIExvbmcgVGVybSBQcmVkaWN0aW9uIG9iamVjdCAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICAgICAgICAgICAgLyoqPCBBQUMgSGlnaCBFZmZpY2llbmN5IChvYmplY3QgdHlwZSBTQlIsIEhFLUFBQyBwcm9maWxlKSAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0U2NhbGFibGUsICAgICAgLyoqPCBBQUMgU2NhbGFibGUgb2JqZWN0ICovCisgIE9NWF9BVURJT19BQUNPYmplY3RFUkxDID0gMTcsICAgICAvKio8IEVSIEFBQyBMb3cgQ29tcGxleGl0eSBvYmplY3QgKEVycm9yIFJlc2lsaWVudCBBQUMtTEMpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RMRCA9IDIzLCAgICAgICAvKio8IEFBQyBMb3cgRGVsYXkgb2JqZWN0IChFcnJvciBSZXNpbGllbnQpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUyA9IDI5LCAgICAvKio8IEFBQyBIaWdoIEVmZmljaWVuY3kgd2l0aCBQYXJhbWV0cmljIFN0ZXJlbyBjb2RpbmcgKEhFLUFBQyB2Miwgb2JqZWN0IHR5cGUgUFMpICovCisgIE9NWF9BVURJT19BQUNPYmplY3RLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19BQUNPYmplY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfQVVESU9fQUFDT2JqZWN0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEU7CisKKworLyoqIEFBQyB0b29sIHVzYWdlIChmb3IgbkFBQ3Rvb2xzIGluIE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSkuCisgKiBSZXF1aXJlZCBmb3IgZW5jb2RlciBjb25maWd1cmF0aW9uIGFuZCBvcHRpb25hbCBhcyBkZWNvZGVyIGluZm8gb3V0cHV0LgorICogRm9yIE1QMywgT01YX0FVRElPX0NIQU5ORUxNT0RFVFlQRSBpcyBzdWZmaWNpZW50LiAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbE5vbmUgMHgwMDAwMDAwMCAvKio8IG5vIEFBQyB0b29scyBhbGxvd2VkIChlbmNvZGVyIGNvbmZpZykgb3IgYWN0aXZlIChkZWNvZGVyIGluZm8gb3V0cHV0KSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbE1TICAgMHgwMDAwMDAwMSAvKio8IE1TOiBNaWQvc2lkZSBqb2ludCBjb2RpbmcgdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbElTICAgMHgwMDAwMDAwMiAvKio8IElTOiBJbnRlbnNpdHkgc3RlcmVvIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xUTlMgIDB4MDAwMDAwMDQgLyoqPCBUTlM6IFRlbXBvcmFsIE5vaXNlIFNoYXBpbmcgdG9vbCBhbGxvd2VkIG9yIGFjdGl2ZSAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDVG9vbFBOUyAgMHgwMDAwMDAwOCAvKio8IFBOUzogTVBFRy00IFBlcmNlcHR1YWwgTm9pc2Ugc3Vic3RpdHV0aW9uIHRvb2wgYWxsb3dlZCBvciBhY3RpdmUgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ1Rvb2xMVFAgIDB4MDAwMDAwMTAgLyoqPCBMVFA6IE1QRUctNCBMb25nIFRlcm0gUHJlZGljdGlvbiB0b29sIGFsbG93ZWQgb3IgYWN0aXZlICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNUb29sQWxsICAweDdGRkZGRkZGIC8qKjwgYWxsIEFBQyB0b29scyBhbGxvd2VkIG9yIGFjdGl2ZSAoKi8KKworLyoqIE1QRUctNCBBQUMgZXJyb3IgcmVzaWxpZW5jZSAoRVIpIHRvb2wgdXNhZ2UgKGZvciBuQUFDRVJ0b29scyBpbiBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUpLgorICogUmVxdWlyZWQgZm9yIEVSIGVuY29kZXIgY29uZmlndXJhdGlvbiBhbmQgb3B0aW9uYWwgYXMgZGVjb2RlciBpbmZvIG91dHB1dCAqLworI2RlZmluZSBPTVhfQVVESU9fQUFDRVJOb25lICAweDAwMDAwMDAwICAvKio8IG5vIEFBQyBFUiB0b29scyBhbGxvd2VkL3VzZWQgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSVkNCMTEgMHgwMDAwMDAwMSAgLyoqPCBWQ0IxMTogVmlydHVhbCBDb2RlIEJvb2tzIGZvciBBQUMgc2VjdGlvbiBkYXRhICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUlJWTEMgIDB4MDAwMDAwMDIgIC8qKjwgUlZMQzogUmV2ZXJzaWJsZSBWYXJpYWJsZSBMZW5ndGggQ29kaW5nICovCisjZGVmaW5lIE9NWF9BVURJT19BQUNFUkhDUiAgIDB4MDAwMDAwMDQgIC8qKjwgSENSOiBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcgKi8KKyNkZWZpbmUgT01YX0FVRElPX0FBQ0VSQWxsICAgMHg3RkZGRkZGRiAgLyoqPCBhbGwgQUFDIEVSIHRvb2xzIGFsbG93ZWQvdXNlZCAqLworCisKKy8qKiBBQUMgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuU2FtcGxlUmF0ZTsgICAgICAgICAgIC8qKjwgU2FtcGxpbmcgcmF0ZSBvZiB0aGUgc291cmNlIGRhdGEuICBVc2UgMCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAgICAgIC8qKjwgQXVkaW8gYmFuZCB3aWR0aCAoaW4gSHopIHRvIHdoaWNoIGFuIGVuY29kZXIgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgdGhlIGF1ZGlvIHNpZ25hbC4gVXNlIDAgdG8gbGV0IGVuY29kZXIgZGVjaWRlICovCisgICAgT01YX1UzMiBuRnJhbWVMZW5ndGg7ICAgICAgICAgIC8qKjwgRnJhbWUgbGVuZ3RoIChpbiBhdWRpbyBzYW1wbGVzIHBlciBjaGFubmVsKSBvZiB0aGUgY29kZWMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIDEwMjQgb3IgOTYwIChBQUMtTEMpLCAyMDQ4IChIRS1BQUMpLCA0ODAgb3IgNTEyIChBQUMtTEQpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAwIHRvIGxldCBlbmNvZGVyIGRlY2lkZSAqLworICAgIE9NWF9VMzIgbkFBQ3Rvb2xzOyAgICAgICAgICAgICAvKio8IEFBQyB0b29sIHVzYWdlICovCisgICAgT01YX1UzMiBuQUFDRVJ0b29sczsgICAgICAgICAgIC8qKjwgTVBFRy00IEFBQyBlcnJvciByZXNpbGllbmNlIHRvb2wgdXNhZ2UgKi8KKyAgICBPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUgZUFBQ1Byb2ZpbGU7ICAgLyoqPCBBQUMgcHJvZmlsZSBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19BQUNTVFJFQU1GT1JNQVRUWVBFIGVBQUNTdHJlYW1Gb3JtYXQ7IC8qKjwgQUFDIHN0cmVhbSBmb3JtYXQgZW51bWVyYXRpb24gKi8KKyAgICBPTVhfQVVESU9fQ0hBTk5FTE1PREVUWVBFIGVDaGFubmVsTW9kZTsgICAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLworfSBPTVhfQVVESU9fUEFSQU1fQUFDUFJPRklMRVRZUEU7CisKKworLyoqIFZPUkJJUyBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9WT1JCSVNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAvKio8IEJpdCByYXRlIG9mIHRoZSBlbmNvZGVkIGRhdGEgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzLiBFbmNvZGluZyBpcyBzZXQgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUgY2xvc2VzdCB0byBzcGVjaWZpZWQgIHZhbHVlIChpbiBicHMpICovCisgICAgT01YX1UzMiBuTWluQml0UmF0ZTsgICAgICAvKio8IFNldHMgbWluaW11bSBiaXRyYXRlIChpbiBicHMpLiAqLworICAgIE9NWF9VMzIgbk1heEJpdFJhdGU7ICAgICAgLyoqPCBTZXRzIG1heGltdW0gYml0cmF0ZSAoaW4gYnBzKS4gKi8KKworICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgLyoqPCBTYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YS4gIFVzZSAwIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCisgICAgT01YX1UzMiBuQXVkaW9CYW5kV2lkdGg7ICAvKio8IEF1ZGlvIGJhbmQgd2lkdGggKGluIEh6KSB0byB3aGljaCBhbiBlbmNvZGVyIHNob3VsZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB0aGUgYXVkaW8gc2lnbmFsLiBVc2UgMCB0byBsZXQgZW5jb2RlciBkZWNpZGUgKi8KKyAgICBPTVhfUzMyIG5RdWFsaXR5OwkJICAvKio8IFNldHMgZW5jb2RpbmcgcXVhbGl0eSB0byBuLCBiZXR3ZWVuIC0xIChsb3cpIGFuZCAxMCAoaGlnaCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBkZWZhdWx0IG1vZGUgb2Ygb3BlcmF0aW9uLCB0ZWggcXVhbGl0eSBsZXZlbCBpcyAzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWwgcXVhbGl0eSByYW5nZSBpcyAwIC0gMTAuICovCisgICAgT01YX0JPT0wgYk1hbmFnZWQ7CQkgIC8qKjwgU2V0ICBiaXRyYXRlICBtYW5hZ2VtZW50ICBtb2RlLiBUaGlzIHR1cm5zIG9mZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsIFZCUiBlbmNvZGluZywgYnV0IGFsbG93cyBoYXJkIG9yIHNvZnQgYml0cmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJhaW50cyB0byBiZSBlbmZvcmNlZCBieSB0aGUgZW5jb2Rlci4gVGhpcyBtb2RlIGNhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzbG93ZXIsIGFuZCBtYXkgYWxzbyBiZSBsb3dlciBxdWFsaXR5LiBJdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJpbHkgdXNlZnVsIGZvciBzdHJlYW1pbmcuICovCisgICAgT01YX0JPT0wgYkRvd25taXg7CQkgIC8qKjwgRG93bm1peCBpbnB1dCBmcm9tIHN0ZXJlbyB0byBtb25vIChoYXMgbm8gZWZmZWN0IG9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub24tc3RlcmVvIHN0cmVhbXMpLiBVc2VmdWwgZm9yIGxvd2VyLWJpdHJhdGUgZW5jb2RpbmcuICovICAgICAKK30gT01YX0FVRElPX1BBUkFNX1ZPUkJJU1RZUEU7CisKKworLyoqIFdNQSBWZXJzaW9uICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgeworICBPTVhfQVVESU9fV01BRm9ybWF0VW51c2VkID0gMCwgLyoqPCBmb3JtYXQgdW51c2VkIG9yIHVua25vd24gKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdDcsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBBdWRpbyBmb3JtYXQgNyAqLworICBPTVhfQVVESU9fV01BRm9ybWF0OCwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIEF1ZGlvIGZvcm1hdCA4ICovCisgIE9NWF9BVURJT19XTUFGb3JtYXQ5LCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgQXVkaW8gZm9ybWF0IDkgKi8KKyAgT01YX0FVRElPX1dNQUZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX1dNQUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19XTUFGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19XTUFGT1JNQVRUWVBFOworCisKKy8qKiBXTUEgUHJvZmlsZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19XTUFQUk9GSUxFVFlQRSB7CisgIE9NWF9BVURJT19XTUFQcm9maWxlVW51c2VkID0gMCwgIC8qKjwgcHJvZmlsZSB1bnVzZWQgb3IgdW5rbm93biAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZUwxLCAgICAgICAgICAvKio8IFdpbmRvd3MgTWVkaWEgYXVkaW8gdmVyc2lvbiA5IHByb2ZpbGUgTDEgKi8KKyAgT01YX0FVRElPX1dNQVByb2ZpbGVMMiwgICAgICAgICAgLyoqPCBXaW5kb3dzIE1lZGlhIGF1ZGlvIHZlcnNpb24gOSBwcm9maWxlIEwyICovCisgIE9NWF9BVURJT19XTUFQcm9maWxlTDMsICAgICAgICAgIC8qKjwgV2luZG93cyBNZWRpYSBhdWRpbyB2ZXJzaW9uIDkgcHJvZmlsZSBMMyAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgT01YX0FVRElPX1dNQVByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfQVVESU9fV01BUHJvZmlsZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFOworCisKKy8qKiBXTUEgcGFyYW1zICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fV01BVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UxNiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlIG9yIHVua25vd24gYml0IHJhdGVzICovCisgICAgT01YX0FVRElPX1dNQUZPUk1BVFRZUEUgZUZvcm1hdDsgLyoqPCBWZXJzaW9uIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCisJT01YX0FVRElPX1dNQVBST0ZJTEVUWVBFIGVQcm9maWxlOyAgLyoqPCBQcm9maWxlIG9mIFdNQSBzdHJlYW0gLyBkYXRhICovCisgICAgT01YX1UzMiBuU2FtcGxpbmdSYXRlOyAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhICovCisgICAgT01YX1UxNiBuQmxvY2tBbGlnbjsgICAgICAvKio8IGlzIHRoZSBibG9jayBhbGlnbm1lbnQsIG9yIGJsb2NrIHNpemUsIGluIGJ5dGVzIG9mIHRoZSBhdWRpbyBjb2RlYyAqLworICAgIE9NWF9VMTYgbkVuY29kZU9wdGlvbnM7ICAgLyoqPCBXTUEgVHlwZS1zcGVjaWZpYyBkYXRhICovCisgICAgT01YX1UzMiBuU3VwZXJCbG9ja0FsaWduOyAvKio8IFdNQSBUeXBlLXNwZWNpZmljIGRhdGEgKi8KK30gT01YX0FVRElPX1BBUkFNX1dNQVRZUEU7CisKKy8qKiAKKyAqIFJlYWxBdWRpbyBmb3JtYXQKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19SQUZPUk1BVFRZUEUgeworICAgIE9NWF9BVURJT19SQUZvcm1hdFVudXNlZCA9IDAsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgICAgT01YX0FVRElPX1JBOCwgICAgICAgICAgICAgICAgLyoqPCBSZWFsQXVkaW8gOCBjb2RlYyAqLworICAgIE9NWF9BVURJT19SQTksICAgICAgICAgICAgICAgIC8qKjwgUmVhbEF1ZGlvIDkgY29kZWMgKi8KKyAgICBPTVhfQVVESU9fUkExMF9BQUMsICAgICAgICAgICAvKio8IE1QRUctNCBBQUMgY29kZWMgZm9yIGJpdHJhdGVzIG9mIG1vcmUgdGhhbiAxMjhrYnBzICovCisgICAgT01YX0FVRElPX1JBMTBfQ09ERUMsICAgICAgICAgLyoqPCBSZWFsQXVkaW8gY29kZWMgZm9yIGJpdHJhdGVzIGxlc3MgdGhhbiAxMjgga2JwcyAqLworICAgIE9NWF9BVURJT19SQTEwX0xPU1NMRVNTLCAgICAgIC8qKjwgUmVhbEF1ZGlvIExvc3NsZXNzICovCisgICAgT01YX0FVRElPX1JBMTBfTVVMVElDSEFOTkVMLCAgLyoqPCBSZWFsQXVkaW8gTXVsdGljaGFubmVsICovCisgICAgT01YX0FVRElPX1JBMTBfVk9JQ0UsICAgICAgICAgLyoqPCBSZWFsQXVkaW8gVm9pY2UgZm9yIGJpdHJhdGVzIGJlbG93IDE1IGticHMgKi8KKyAgICBPTVhfQVVESU9fUkFGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX1JBRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fUkFGb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19SQUZPUk1BVFRZUEU7CisKKy8qKiBSQSAoUmVhbCBBdWRpbykgcGFyYW1zICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1JBVFlQRSB7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhpcyBzdHJ1Y3R1cmUsIGluIEJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzICovIAorICAgIE9NWF9VMzIgblNhbXBsaW5nUmF0ZTsgICAgICAvKio8IGlzIHRoZSBzYW1wbGluZyByYXRlIG9mIHRoZSBzb3VyY2UgZGF0YSAqLyAKKyAgICBPTVhfVTMyIG5CaXRzUGVyRnJhbWU7ICAgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIGJpdHMgcGVyIGZyYW1lICAqLyAKKyAgICBPTVhfVTMyIG5TYW1wbGVQZXJGcmFtZTsgICAgLyoqPCBpcyB0aGUgdmFsdWUgZm9yIHNhbXBsZXMgcGVyIGZyYW1lICovIAorICAgIE9NWF9VMzIgbkNvdXBsaW5nUXVhbnRCaXRzOyAvKio8IGlzIHRoZSBudW1iZXIgb2YgY291cGxpbmcgcXVhbnRpemF0aW9uIGJpdHMgaW4gdGhlIHN0cmVhbSAqLyAKKyAgICBPTVhfVTMyIG5Db3VwbGluZ1N0YXJ0UmVnaW9uOyAgIC8qKjwgaXMgdGhlIGNvdXBsaW5nIHN0YXJ0IHJlZ2lvbiBpbiB0aGUgc3RyZWFtICAqLyAKKyAgICBPTVhfVTMyIG5OdW1SZWdpb25zOyAgICAgICAgLyoqPCBpcyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgdmFsdWUgKi8gCisgICAgT01YX0FVRElPX1JBRk9STUFUVFlQRSBlRm9ybWF0OyAvKio8IGlzIHRoZSBSZWFsQXVkaW8gYXVkaW8gZm9ybWF0ICovCit9IE9NWF9BVURJT19QQVJBTV9SQVRZUEU7IAorCisKKy8qKiBTQkMgQWxsb2NhdGlvbiBNZXRob2QgVHlwZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEUgeworICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RMb3VkbmVzcywgLyoqPCBMb3VkbmVzcyBhbGxvY2F0aW9uIG1ldGhvZCAqLworICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RTTlIsICAgICAgLyoqPCBTTlIgYWxsb2NhdGlvbiBtZXRob2QgKi8KKyAgT01YX0FVRElPX1NCQ0FsbG9jTWV0aG9kS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfQVVESU9fU0JDQWxsb2NNZXRob2RNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEU7CisKKworLyoqIFNCQyBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyAqLworICAgIE9NWF9VMzIgbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgQml0IHJhdGUgb2YgdGhlIGlucHV0IGRhdGEuICBVc2UgMCBmb3IgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGUgb3IgdW5rbm93biBiaXQgcmF0ZXMgKi8KKyAgICBPTVhfVTMyIG5TYW1wbGVSYXRlOyAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBvciB1bmtub3duIHNhbXBsaW5nIHJhdGUuICovCisgICAgT01YX1UzMiBuQmxvY2tzOyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgYmxvY2tzICovCisgICAgT01YX1UzMiBuU3ViYmFuZHM7ICAgICAgICAgLyoqPCBOdW1iZXIgb2Ygc3ViYmFuZHMgKi8KKyAgICBPTVhfVTMyIG5CaXRQb29sOyAgICAgICAgICAvKio8IEJpdHBvb2wgdmFsdWUgKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlQml0cmF0ZTsgICAvKio8IFVzZSBiaXRyYXRlIHZhbHVlIGluc3RlYWQgb2YgYml0cG9vbCAqLworICAgIE9NWF9BVURJT19DSEFOTkVMTU9ERVRZUEUgZUNoYW5uZWxNb2RlOyAvKio8IENoYW5uZWwgbW9kZSBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19TQkNBTExPQ01FVEhPRFRZUEUgZVNCQ0FsbG9jVHlwZTsgICAvKio8IFNCQyBBbGxvY2F0aW9uIG1ldGhvZCB0eXBlICovCit9IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFOworCisKKy8qKiBBRFBDTSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fQURQQ01UWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAorICAgIE9NWF9VMzIgbkJpdHNQZXJTYW1wbGU7ICAgICAvKio8IE51bWJlciBvZiBiaXRzIGluIGVhY2ggc2FtcGxlICovIAorICAgIE9NWF9VMzIgblNhbXBsZVJhdGU7ICAgICAgICAvKio8IFNhbXBsaW5nIHJhdGUgb2YgdGhlIHNvdXJjZSBkYXRhLiAgVXNlIDAgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgb3IgdW5rbm93biBzYW1wbGluZyByYXRlLiAqLyAKK30gT01YX0FVRElPX1BBUkFNX0FEUENNVFlQRTsgCisKKworLyoqIEc3MjMgcmF0ZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzIzUkFURSB7CisgICAgT01YX0FVRElPX0c3MjNNb2RlVW51c2VkID0gMCwgIC8qKjwgQU1STkIgTW9kZSB1bnVzZWQgLyB1bmtub3duICovCisgICAgT01YX0FVRElPX0c3MjNNb2RlTG93LCAgICAgICAgIC8qKjwgNTMwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fRzcyM01vZGVIaWdoLCAgICAgICAgLyoqPCA2MzAwIGJwcyAqLworICAgIE9NWF9BVURJT19HNzIzTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fRzcyM01vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19HNzIzTW9kZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0c3MjNSQVRFOworCisKKy8qKiBHNzIzIC0gU2FtcGxlIHJhdGUgbXVzdCBiZSA4IEtIeiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjNUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAorICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLyAKKyAgICBPTVhfQVVESU9fRzcyM1JBVEUgZUJpdFJhdGU7ICAvKio8IHRvZG86IFNob3VsZCB0aGlzIGJlIG1vdmVkIHRvIGEgY29uZmlnPyAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8gCisgICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgUG9zdCBGaWx0ZXIgKi8gCit9IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRTsgCisKKworLyoqIElUVSBHNzI2IChBRFBDTSkgcmF0ZSAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19HNzI2TU9ERSB7CisgICAgT01YX0FVRElPX0c3MjZNb2RlVW51c2VkID0gMCwgIC8qKjwgRzcyNiBNb2RlIHVudXNlZCAvIHVua25vd24gKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGUxNiwgICAgICAgICAgLyoqPCAxNiBrYnBzICovCisgICAgT01YX0FVRElPX0c3MjZNb2RlMjQsICAgICAgICAgIC8qKjwgMjQga2JwcyAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZTMyLCAgICAgICAgICAvKio8IDMyIGticHMsIG1vc3QgY29tbW9uIHJhdGUsIGFsc28gRzcyMSAqLworICAgIE9NWF9BVURJT19HNzI2TW9kZTQwLCAgICAgICAgICAvKio8IDQwIGticHMgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0c3MjZNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fRzcyNk1vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19HNzI2TU9ERTsKKworCisvKiogRy43MjYgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzIC0gbXVzdCBiZSBhdCA4S0h6ICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0c3MjZUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8gCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovIAorICAgICBPTVhfQVVESU9fRzcyNk1PREUgZUc3MjZNb2RlOworfSBPTVhfQVVESU9fUEFSQU1fRzcyNlRZUEU7IAorCisKKy8qKiBHNzI5IGNvZGVyIHR5cGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fRzcyOVRZUEUgeworICAgIE9NWF9BVURJT19HNzI5ID0gMCwgICAgICAgICAgIC8qKjwgSVRVIEcuNzI5ICBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fRzcyOUEsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSBhbm5leCBBICBlbmNvZGVkIGRhdGEgKi8KKyAgICBPTVhfQVVESU9fRzcyOUIsICAgICAgICAgICAgICAvKio8IElUVSBHLjcyOSB3aXRoIGFubmV4IEIgZW5jb2RlZCBkYXRhICovCisgICAgT01YX0FVRElPX0c3MjlBQiwgICAgICAgICAgICAgLyoqPCBJVFUgRy43MjkgYW5uZXhlcyBBIGFuZCBCIGVuY29kZWQgZGF0YSAqLworICAgIE9NWF9BVURJT19HNzI5S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19HNzI5VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fRzcyOU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX0c3MjlUWVBFOworCisKKy8qKiBHNzI5IHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAtIGZpeGVkIDZLSHogc2FtcGxlIHJhdGUgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9HNzI5VFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgLyoqPCBFbmFibGUgRGlzY29udGludW91cyBUcmFuc21pc3NzaW9uICovCisgICAgT01YX0FVRElPX0c3MjlUWVBFIGVCaXRUeXBlOworfSBPTVhfQVVESU9fUEFSQU1fRzcyOVRZUEU7CisKKworLyoqIEFNUiBGcmFtZSBmb3JtYXQgKi8gCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRSB7IAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdENvbmZvcm1hbmNlID0gMCwgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBDb25mb3JtYW5jZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGFuZGFyZCkgRm9ybWF0ICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdElGMSwgICAgICAgICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBJbnRlcmZhY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgMSAqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRJRjIsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgSW50ZXJmYWNlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0IDIqLyAKKyAgICBPTVhfQVVESU9fQU1SRnJhbWVGb3JtYXRGU0YsICAgICAgICAgICAgICAvKio8IEZyYW1lIEZvcm1hdCBpcyBBTVIgRmlsZSBTdG9yYWdlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0ICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFJUUFBheWxvYWQsICAgICAgIC8qKjwgRnJhbWUgRm9ybWF0IGlzIEFNUiBSZWFsLVRpbWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc3BvcnQgUHJvdG9jb2wgUGF5bG9hZCBGb3JtYXQgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0SVRVLCAgICAgICAgICAgICAgLyoqPCBGcmFtZSBGb3JtYXQgaXMgSVRVIEZvcm1hdCAoYWRkZWQgYXQgTW90b3JvbGEgcmVxdWVzdCkgKi8gCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19BTVJGcmFtZUZvcm1hdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0FNUkZyYW1lRm9ybWF0TWF4ID0gMHg3RkZGRkZGRiAKK30gT01YX0FVRElPX0FNUkZSQU1FRk9STUFUVFlQRTsgCisKKworLyoqIEFNUiBiYW5kIG1vZGUgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHsKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVVbnVzZWQgPSAwLCAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgdW51c2VkIC8gdW5rbm93biAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CMCwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSAwID0gIDQ3NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkIxLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDEgPSAgNTE1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjIsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMiA9ICA1OTAwIGJwcyAqLyAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjMsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgMyA9ICA2NzAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA0ID0gIDc0MDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlTkI1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJOQiBNb2RlIDUgPSAgNzk1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVOQjYsICAgICAgICAgICAgICAgICAvKio8IEFNUk5CIE1vZGUgNiA9IDEwMjAwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZU5CNywgICAgICAgICAgICAgICAgIC8qKjwgQU1STkIgTW9kZSA3ID0gMTIyMDAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0IwLCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDAgPSAgNjYwMCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjEsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgMSA9ICA4ODUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMiwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAyID0gMTI2NTAgYnBzICovIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCMywgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSAzID0gMTQyNTAgYnBzICovIAorICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNCwgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA0ID0gMTU4NTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I1LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDUgPSAxODI1MCBicHMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVXQjYsICAgICAgICAgICAgICAgICAvKio8IEFNUldCIE1vZGUgNiA9IDE5ODUwIGJwcyAqLworICAgIE9NWF9BVURJT19BTVJCYW5kTW9kZVdCNywgICAgICAgICAgICAgICAgIC8qKjwgQU1SV0IgTW9kZSA3ID0gMjMwNTAgYnBzICovCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlV0I4LCAgICAgICAgICAgICAgICAgLyoqPCBBTVJXQiBNb2RlIDggPSAyMzg1MCBicHMgKi8gICAgICAKKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkJhbmRNb2RlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fQU1SQmFuZE1vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEU7CisgICAgIAorCisvKiogQU1SIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzaW9uIG1vZGUgKi8gCit0eXBlZGVmIGVudW0gT01YX0FVRElPX0FNUkRUWE1PREVUWVBFIHsgCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVPZmYgPSAwLCAgICAgICAgLyoqPCBBTVIgRGlzY29udGludW91cyBUcmFuc21pc3Npb24gTW9kZSBpcyBkaXNhYmxlZCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMSwgICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIHVzaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IgMSAoVkFEMSkgaXMgZW5hYmxlZCAqLyAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uVkFEMiwgICAgICAgICAvKio8IEFNUiBEaXNjb250aW51b3VzIFRyYW5zbWlzc2lvbiBNb2RlIHVzaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9pY2UgQWN0aXZpdHkgRGV0ZWN0b3IgMiAoVkFEMikgaXMgZW5hYmxlZCAqLyAgICAgICAKKyAgICBPTVhfQVVESU9fQU1SRFRYTW9kZU9uQXV0bywgICAgICAgICAvKio8IFRoZSBjb2RlYyB3aWxsIGF1dG9tYXRpY2FsbHkgc2VsZWN0IGJldHdlZW4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmYsIFZBRDEgb3IgVkFEMiBtb2RlcyAqLyAKKworICAgIE9NWF9BVURJT19BTVJEVFhhc0VGUiwgICAgICAgICAgICAgLyoqPCBEVFggYXMgRUZSIGluc3RlYWQgb2YgQU1SIHN0YW5kYXJkICgzR1BQIDI2LjEwMSwgZnJhbWUgdHlwZSA9OCw5LDEwKSAqLworCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX0FNUkRUWE1vZGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19BTVJEVFhNb2RlTWF4ID0gMHg3RkZGRkZGRiAKK30gT01YX0FVRElPX0FNUkRUWE1PREVUWVBFOyAKKyAKKworLyoqIEFNUiBwYXJhbXMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9BTVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KKyAgICBPTVhfVTMyIG5CaXRSYXRlOyAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSByZWFkIG9ubHkgZmllbGQgKi8KKyAgICBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIGVBTVJCYW5kTW9kZTsgLyoqPCBBTVIgQmFuZCBNb2RlIGVudW1lcmF0aW9uICovIAorICAgIE9NWF9BVURJT19BTVJEVFhNT0RFVFlQRSAgZUFNUkRUWE1vZGU7ICAvKio8IEFNUiBEVFggTW9kZSBlbnVtZXJhdGlvbiAqLworICAgIE9NWF9BVURJT19BTVJGUkFNRUZPUk1BVFRZUEUgZUFNUkZyYW1lRm9ybWF0OyAvKio8IEFNUiBmcmFtZSBmb3JtYXQgZW51bWVyYXRpb24gKi8KK30gT01YX0FVRElPX1BBUkFNX0FNUlRZUEU7CisKKworLyoqIEdTTV9GUiAoRVRTSSAwNi4xMCwgM0dQUCA0Ni4wMTApIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX0dTTUZSVFlQRTsKKworCisvKiogR1NNLUhSIChFVFNJIDA2LjIwLCAzR1BQIDQ2LjAyMCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgLyoqPCBFbmFibGUgSGlnaCBQYXNzIEZpbHRlciAqLworfSBPTVhfQVVESU9fUEFSQU1fR1NNSFJUWVBFOworCisKKy8qKiBHU00tRUZSIChFVFNJIDA2LjYwLCAzR1BQIDQ2LjA2MCkgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fR1NNRUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkRUWDsgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEU7CisKKworLyoqIFRETUEgRlIgKFRJQS9FSUEtMTM2LTQyMCwgVlNFTFAgNy45NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1RETUFGUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9URE1BRlJUWVBFOworCisKKy8qKiBURE1BIEVGUiAoVElBL0VJQS0xMzYtNDEwLCBBQ0VMUCA3LjRrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9URE1BRUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1RETUFFRlJUWVBFOworCisKKy8qKiBQREMgRlIgKCBSQ1ItMjcsIFZTRUxQIDYuN2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1BEQ0ZSVFlQRTsKKworCisvKiogUERDIEVGUiAoIFJDUi0yNywgQUNFTFAgNi43a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fUERDRUZSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9CT09MIGJEVFg7ICAgICAgICAgICAgICAgIC8qKjwgRW5hYmxlIERpc2NvbnRpbnVvdXMgVHJhbnNtaXNzc2lvbiAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIEhpZ2ggUGFzcyBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX1BEQ0VGUlRZUEU7CisKKy8qKiBQREMgSFIgKCBSQ1ItMjcsIFBTSS1DRUxQIDMuNDVrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkNoYW5uZWxzOyAgICAgICAgICAgIC8qKjwgTnVtYmVyIG9mIGNoYW5uZWxzIGluIHRoZSBkYXRhIHN0cmVhbSAobm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWNlc3NhcmlseSB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSByZW5kZXJlZC4gKi8KKyAgICBPTVhfQk9PTCBiRFRYOyAgICAgICAgICAgICAgICAvKio8IEVuYWJsZSBEaXNjb250aW51b3VzIFRyYW5zbWlzc3Npb24gKi8KKyAgICBPTVhfQk9PTCBiSGlQYXNzRmlsdGVyOyAgICAgICAvKio8IEVuYWJsZSBIaWdoIFBhc3MgRmlsdGVyICovCit9IE9NWF9BVURJT19QQVJBTV9QRENIUlRZUEU7CisKKworLyoqIENETUEgUmF0ZSB0eXBlcyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19DRE1BUkFURVRZUEUgeworICAgIE9NWF9BVURJT19DRE1BUmF0ZUJsYW5rID0gMCwgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaXMgYmxhbmsgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVGdWxsLCAgICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGZ1bGwgcmF0ZSAqLworICAgIE9NWF9BVURJT19DRE1BUmF0ZUhhbGYsICAgICAgICAgICAgICAgLyoqPCBDRE1BIGVuY29kZWQgZnJhbWUgaW4gaGFsZiByYXRlICovCisgICAgT01YX0FVRElPX0NETUFSYXRlUXVhcnRlciwgICAgICAgICAgICAvKio8IENETUEgZW5jb2RlZCBmcmFtZSBpbiBxdWFydGVyIHJhdGUgKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVFaWdodGgsICAgICAgICAgICAgIC8qKjwgQ0RNQSBlbmNvZGVkIGZyYW1lIGluIGVpZ2h0aCByYXRlIChEVFgpKi8KKyAgICBPTVhfQVVESU9fQ0RNQVJhdGVFcmFzdXJlLCAgICAgICAgICAgIC8qKjwgQ0RNQSBlcmFzdXJlIGZyYW1lICovCisgICAgT01YX0FVRElPX0NETUFSYXRlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9BVURJT19DRE1BUmF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX0NETUFSYXRlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fQ0RNQVJBVEVUWVBFOworCisKKy8qKiBRQ0VMUDggKFRJQS9FSUEtOTYsIHVwIHRvIDhrYnBzIGNvZGVyKSBzdHJlYW0gZm9ybWF0IHBhcmFtZXRlcnMgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19QQVJBTV9RQ0VMUDhUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX1UzMiBuQml0UmF0ZTsgICAgICAgICAgICAgLyoqPCBCaXQgcmF0ZSBvZiB0aGUgaW5wdXQgZGF0YS4gIFVzZSAwIGZvciB2YXJpYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZSBvciB1bmtub3duIGJpdCByYXRlcyAqLworICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxICovCisgICAgT01YX1UzMiBuTWF4Qml0UmF0ZTsgICAgICAgICAgLyoqPCBtYXhpbWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDQgKi8KK30gT01YX0FVRElPX1BBUkFNX1FDRUxQOFRZUEU7CisKKworLyoqIFFDRUxQMTMgKCBDRE1BLCBFSUEvVElBLTczMywgMTMuM2ticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgRnJhbWUgcmF0ZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLworfSBPTVhfQVVESU9fUEFSQU1fUUNFTFAxM1RZUEU7CisKKworLyoqIEVWUkMgKCBDRE1BLCBFSUEvVElBLTEyNywgUkNFTFAgdXAgdG8gOC41NWticHMgY29kZXIpIHN0cmVhbSBmb3JtYXQgcGFyYW1ldGVycyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5DaGFubmVsczsgICAgICAgICAgICAvKio8IE51bWJlciBvZiBjaGFubmVscyBpbiB0aGUgZGF0YSBzdHJlYW0gKG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBjaGFubmVscworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVuZGVyZWQuICovCisgICAgT01YX0FVRElPX0NETUFSQVRFVFlQRSBlQ0RNQVJhdGU7IC8qKjwgYWN0dWFsIEZyYW1lIHJhdGUgKi8KKyAgICBPTVhfQk9PTCBiUkFURV9SRURVQ29uOyAgICAgICAvKio8IFJBVEVfUkVEVUN0aW9uIGlzIHJlcXVlc3RlZCBmb3IgdGhpcyBmcmFtZSAqLworICAgIE9NWF9VMzIgbk1pbkJpdFJhdGU7ICAgICAgICAgIC8qKjwgbWlubWFsIHJhdGUgZm9yIHRoZSBlbmNvZGVyID0gMSwyLDMsNCwgZGVmYXVsdCA9IDEgKi8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCAqLworICAgIE9NWF9CT09MIGJIaVBhc3NGaWx0ZXI7ICAgICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBIaWdoIFBhc3MgRmlsdGVyICovCisgICAgT01YX0JPT0wgYk5vaXNlU3VwcHJlc3NvcjsgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIG5vaXNlIHN1cHByZXNzb3IgcHJlLXByb2Nlc3NpbmcgKi8KKyAgICBPTVhfQk9PTCBiUG9zdEZpbHRlcjsgICAgICAgICAvKio8IEVuYWJsZSBkZWNvZGVyJ3MgcG9zdCBGaWx0ZXIgKi8KK30gT01YX0FVRElPX1BBUkFNX0VWUkNUWVBFOworCisKKy8qKiBTTVYgKCB1cCB0byA4LjU1a2JwcyBjb2Rlcikgc3RyZWFtIGZvcm1hdCBwYXJhbWV0ZXJzICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fU01WVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbHM7ICAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gdGhlIGRhdGEgc3RyZWFtIChub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyaWx5IHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlbmRlcmVkLiAqLworICAgIE9NWF9BVURJT19DRE1BUkFURVRZUEUgZUNETUFSYXRlOyAvKio8IEZyYW1lIHJhdGUgKi8KKyAgICBPTVhfQk9PTCBiUkFURV9SRURVQ29uOyAgICAgICAgICAgLyoqPCBSQVRFX1JFRFVDdGlvbiBpcyByZXF1ZXN0ZWQgZm9yIHRoaXMgZnJhbWUgKi8KKyAgICBPTVhfVTMyIG5NaW5CaXRSYXRlOyAgICAgICAgICAvKio8IG1pbm1hbCByYXRlIGZvciB0aGUgZW5jb2RlciA9IDEsMiwzLDQsIGRlZmF1bHQgPSAxID8/Ki8KKyAgICBPTVhfVTMyIG5NYXhCaXRSYXRlOyAgICAgICAgICAvKio8IG1heGltYWwgcmF0ZSBmb3IgdGhlIGVuY29kZXIgPSAxLDIsMyw0LCBkZWZhdWx0ID0gNCA/PyovCisgICAgT01YX0JPT0wgYkhpUGFzc0ZpbHRlcjsgICAgICAgLyoqPCBFbmFibGUgZW5jb2RlcidzIEhpZ2ggUGFzcyBGaWx0ZXIgPz8qLworICAgIE9NWF9CT09MIGJOb2lzZVN1cHByZXNzb3I7ICAgIC8qKjwgRW5hYmxlIGVuY29kZXIncyBub2lzZSBzdXBwcmVzc29yIHByZS1wcm9jZXNzaW5nICovCisgICAgT01YX0JPT0wgYlBvc3RGaWx0ZXI7ICAgICAgICAgLyoqPCBFbmFibGUgZGVjb2RlcidzIHBvc3QgRmlsdGVyID8/Ki8KK30gT01YX0FVRElPX1BBUkFNX1NNVlRZUEU7CisKKworLyoqIE1JREkgRm9ybWF0IAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIGVudW0gT01YX0FVRElPX01JRElGT1JNQVRUWVBFCit7CisgICAgT01YX0FVRElPX01JRElGb3JtYXRVbmtub3duID0gMCwgLyoqPCBNSURJIEZvcm1hdCB1bmtub3duIG9yIGRvbid0IGNhcmUgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjAsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDAgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjEsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDEgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNNRjIsICAgICAgICAvKio8IFN0YW5kYXJkIE1JREkgRmlsZSBUeXBlIDIgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFNQTUlESSwgICAgICAvKio8IFNQLU1JREkgKi8KKyAgICBPTVhfQVVESU9fTUlESUZvcm1hdFhNRjAsICAgICAgICAvKio8IGVYdGVuc2libGUgTXVzaWMgRm9ybWF0IHR5cGUgMCAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0WE1GMSwgICAgICAgIC8qKjwgZVh0ZW5zaWJsZSBNdXNpYyBGb3JtYXQgdHlwZSAxICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRNb2JpbGVYTUYsICAgLyoqPCBNb2JpbGUgWE1GIChlWHRlbnNpYmxlIE11c2ljIEZvcm1hdCB0eXBlIDIpICovCisgICAgT01YX0FVRElPX01JRElGb3JtYXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX01JRElGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9BVURJT19NSURJRm9ybWF0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fTUlESUZPUk1BVFRZUEU7CisKKworLyoqIE1JREkgcGFyYW1zIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMzIgbkZpbGVTaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIE1JREkgZmlsZSBpbiBieXRlcywgd2hlcmUgdGhlIGVudGlyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIGZpbGUgcGFzc2VkIGluLCBvdGhlcndpc2UgaWYgMHgwLCB0aGUgTUlESSBkYXRhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1lcmdlZCBhbmQgc3RyZWFtZWQgKGluc3RlYWQgb2YgcGFzc2VkIGFzIGFuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGlyZSBNSURJIGZpbGUpICovCisgICAgT01YX0JVMzIgc01heFBvbHlwaG9ueTsgICAgICAgIC8qKjwgU3BlY2lmaWVzIHRoZSBtYXhpbXVtIHNpbXVsdGFuZW91cyBwb2x5cGhvbmljIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWNlcy4gQSB2YWx1ZSBvZiB6ZXJvIGluZGljYXRlcyB0aGF0IHRoZSBkZWZhdWx0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlwaG9ueSBvZiB0aGUgZGV2aWNlIGlzIHVzZWQgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX0JPT0wgYkxvYWREZWZhdWx0U291bmQ7ICAgIC8qKjwgV2hldGhlciB0byBsb2FkIGRlZmF1bHQgc291bmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFuayBhdCBpbml0aWFsaXphdGlvbiAqLworICAgIE9NWF9BVURJT19NSURJRk9STUFUVFlQRSBlTWlkaUZvcm1hdDsgLyoqPCBWZXJzaW9uIG9mIHRoZSBNSURJIGZpbGUgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX0FVRElPX1BBUkFNX01JRElUWVBFOworCisKKy8qKiBUeXBlIG9mIHRoZSBNSURJIHNvdW5kIGJhbmsgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVNPVU5EQkFOS1RZUEUgeworICAgIE9NWF9BVURJT19NSURJU291bmRCYW5rVW51c2VkID0gMCwgICAgICAgICAgIC8qKjwgdW51c2VkL3Vua25vd24gc291bmRiYW5rIHR5cGUgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0RMUzEsICAgICAgICAgICAgICAgICAvKio8IERMUyB2ZXJzaW9uIDEgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0RMUzIsICAgICAgICAgICAgICAgICAvKio8IERMUyB2ZXJzaW9uIDIgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01vYmlsZURMU0Jhc2UsICAgICAgICAvKio8IE1vYmlsZSBETFMsIHVzaW5nIHRoZSBiYXNlIGZ1bmN0aW9uYWxpdHkgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua01vYmlsZURMU1BsdXNPcHRpb25zLCAvKio8IE1vYmlsZSBETFMsIHVzaW5nIHRoZSBzcGVjaWZpY2F0aW9uLWRlZmluZWQgb3B0aW9uYWwgZmVhdHVyZSBzZXQgKi8KKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRTsKKworCisvKiogQmFuayBMYXlvdXQgZGVzY3JpYmVzIGhvdyBiYW5rIE1TQiAmIExTQiBhcmUgdXNlZCBpbiB0aGUgRExTIGluc3RydW1lbnQgZGVmaW5pdGlvbnMgc291bmQgYmFuayAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9BVURJT19NSURJU09VTkRCQU5LTEFZT1VUVFlQRSB7CisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFVudXNlZCA9IDAsICAgLyoqPCB1bnVzZWQvdW5rbm93biBzb3VuZGJhbmsgdHlwZSAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRHTSwgICAgICAgICAgIC8qKjwgR1MgbGF5b3V0IChiYXNlZCBvbiBiYW5rIE1TQiAweDAwKSAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRHTTIsICAgICAgICAgIC8qKjwgR2VuZXJhbCBNSURJIDIgbGF5b3V0ICh1c2luZyBNU0IgMHg3OC8weDc5LCBMU0IgMHgwMCkgKi8KKyAgIE9NWF9BVURJT19NSURJU291bmRCYW5rTGF5b3V0VXNlciwgICAgICAgICAvKio8IERvZXMgbm90IGNvbmZvcm0gdG8gYW55IGJhbmsgbnVtYmVyaW5nIHN0YW5kYXJkcyAqLworICAgT01YX0FVRElPX01JRElTb3VuZEJhbmtMYXlvdXRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICBPTVhfQVVESU9fTUlESVNvdW5kQmFua0xheW91dE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFOworCisKKy8qKiBNSURJIHBhcmFtcyB0byBsb2FkL3VubG9hZCB1c2VyIHNvdW5kYmFuayAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuRExTSW5kZXg7ICAgICAgICAvKio8IERMUyBmaWxlIGluZGV4IHRvIGJlIGxvYWRlZCAqLworICAgIE9NWF9VMzIgbkRMU1NpemU7ICAgICAgICAgLyoqPCBTaXplIGluIGJ5dGVzICovCisgICAgT01YX1BUUiBwRExTRGF0YTsgICAgICAgICAvKio8IFBvaW50ZXIgdG8gRExTIGZpbGUgZGF0YSAqLworICAgIE9NWF9BVURJT19NSURJU09VTkRCQU5LVFlQRSBlTWlkaVNvdW5kQmFuazsgICAvKio8IE1pZGkgc291bmQgYmFuayB0eXBlIGVudW1lcmF0aW9uICovCisgICAgT01YX0FVRElPX01JRElTT1VOREJBTktMQVlPVVRUWVBFIGVNaWRpU291bmRCYW5rTGF5b3V0OyAvKio8IE1pZGkgc291bmQgYmFuayBsYXlvdXQgZW51bWVyYXRpb24gKi8KK30gT01YX0FVRElPX1BBUkFNX01JRElMT0FEVVNFUlNPVU5EVFlQRTsKKworCisvKiogU3RydWN0dXJlIGZvciBMaXZlIE1JREkgZXZlbnRzIGFuZCBNSVAgbWVzc2FnZXMuIAorICogKE1JUCA9IE1heGltdW0gSW5zdGFudGFuZW91cyBQb2x5cGhvbnk7IHBhcnQgb2YgdGhlIFNQLU1JREkgc3RhbmRhcmQuKSAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19NSURJSU1NRURJQVRFRVZFTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVTMyIG5NaWRpRXZlbnRTaXplOyAgIC8qKjwgU2l6ZSBvZiBpbW1lZGlhdGUgTUlESSBldmVudHMgb3IgTUlQIG1lc3NhZ2UgaW4gYnl0ZXMgICovCisgICAgT01YX1U4IG5NaWRpRXZlbnRzWzFdOyAgICAvKio8IE1JREkgZXZlbnQgYXJyYXkgdG8gYmUgcmVuZGVyZWQgaW1tZWRpYXRlbHksIG9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5IGZvciB0aGUgTUlQIG1lc3NhZ2UgYnVmZmVyLCB3aGVyZSB0aGUgc2l6ZSBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVkIGJ5IG5NaWRpRXZlbnRTaXplICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESUlNTUVESUFURUVWRU5UVFlQRTsKKworCisvKiogTUlESSBzb3VuZCBiYW5rLyBwcm9ncmFtIHBhaXIgaW4gYSBnaXZlbiBjaGFubmVsIAorICogQGluZ3JvdXAgbWlkaQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01JRElTT1VOREJBTktQUk9HUkFNVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgVmFsaWQgY2hhbm5lbCB2YWx1ZXMgcmFuZ2UgZnJvbSAxIHRvIDE2ICovCisgICAgT01YX1UxNiBuSURQcm9ncmFtOyAgICAgICAgIC8qKjwgVmFsaWQgcHJvZ3JhbSBJRCByYW5nZSBpcyAxIHRvIDEyOCAqLworICAgIE9NWF9VMTYgbklEU291bmRCYW5rOyAgICAgICAvKio8IFNvdW5kIGJhbmsgSUQgKi8KKyAgICBPTVhfVTMyIG5Vc2VyU291bmRCYW5rSW5kZXg7LyoqPCBVc2VyIHNvdW5kYmFuayBpbmRleCwgZWFzaWVyIHRvIGFjY2VzcyBzb3VuZGJhbmtzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGluZGV4IGlmIG11bHRpcGxlIGJhbmtzIGFyZSBwcmVzZW50ICovCit9IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFOworCisKKy8qKiBNSURJIGNvbnRyb2wgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQlMzMiBzUGl0Y2hUcmFuc3Bvc2l0aW9uOyAvKio8IFBpdGNoIHRyYW5zcG9zaXRpb24gaW4gc2VtaXRvbmVzLCBzdG9yZWQgYXMgUTIyLjEwIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0IGJhc2VkIG9uIEpBVkEgTU1BUEkgKEpTUi0xMzUpIHJlcXVpcmVtZW50ICovCisgICAgT01YX0JVMzIgc1BsYXlCYWNrUmF0ZTsgICAgICAgLyoqPCBSZWxhdGl2ZSBwbGF5YmFjayByYXRlLCBzdG9yZWQgYXMgUTE0LjE3IGZpeGVkLXBvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgYmFzZWQgb24gSlNSLTEzNSByZXF1aXJlbWVudCAqLworICAgIE9NWF9CVTMyIHNUZW1wbyA7ICAgICAgICAgICAgIC8qKjwgVGVtcG8gaW4gYmVhdHMgcGVyIG1pbnV0ZSAoQlBNKSwgc3RvcmVkIGFzIFEyMi4xMCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpeGVkLXBvaW50IG51bWJlciBiYXNlZCBvbiBKU1ItMTM1IHJlcXVpcmVtZW50ICovCisgICAgT01YX1UzMiBuTWF4UG9seXBob255OyAgICAgICAgLyoqPCBTcGVjaWZpZXMgdGhlIG1heGltdW0gc2ltdWx0YW5lb3VzIHBvbHlwaG9uaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2ljZXMuIEEgdmFsdWUgb2YgemVybyBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVmYXVsdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvbHlwaG9ueSBvZiB0aGUgZGV2aWNlIGlzIHVzZWQgICovCisgICAgT01YX1UzMiBuTnVtUmVwZWF0OyAgICAgICAgICAgLyoqPCBOdW1iZXIgb2YgdGltZXMgdG8gcmVwZWF0IHBsYXliYWNrICovCisgICAgT01YX1UzMiBuU3RvcFRpbWU7ICAgICAgICAgICAgLyoqPCBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byBpbmRpY2F0ZSB3aGVuIHBsYXliYWNrIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBzdG9wIGF1dG9tYXRpY2FsbHkuICBTZXQgdG8gemVybyBpZiBub3QgdXNlZCAqLworICAgIE9NWF9VMTYgbkNoYW5uZWxNdXRlTWFzazsgICAgIC8qKjwgMTYgYml0IG1hc2sgZm9yIGNoYW5uZWwgbXV0ZSBzdGF0dXMgKi8KKyAgICBPTVhfVTE2IG5DaGFubmVsU29sb01hc2s7ICAgICAvKio8IDE2IGJpdCBtYXNrIGZvciBjaGFubmVsIHNvbG8gc3RhdHVzICovCisgICAgT01YX1UzMiBuVHJhY2swMDMxTXV0ZU1hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgbXV0ZSBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAwLTMxICovCisgICAgT01YX1UzMiBuVHJhY2szMjYzTXV0ZU1hc2s7ICAgLyoqPCAzMiBiaXQgbWFzayBmb3IgdHJhY2sgbXV0ZSBzdGF0dXMuIE5vdGU6IFRoaXMgaXMgZm9yIHRyYWNrcyAzMi02MyAqLworICAgIE9NWF9VMzIgblRyYWNrMDAzMVNvbG9NYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIHNvbG8gc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMC0zMSAqLworICAgIE9NWF9VMzIgblRyYWNrMzI2M1NvbG9NYXNrOyAgIC8qKjwgMzIgYml0IG1hc2sgZm9yIHRyYWNrIHNvbG8gc3RhdHVzLiBOb3RlOiBUaGlzIGlzIGZvciB0cmFja3MgMzItNjMgKi8KKworfSBPTVhfQVVESU9fQ09ORklHX01JRElDT05UUk9MVFlQRTsKKworCisvKiogTUlESSBQbGF5YmFjayBTdGF0ZXMgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fTUlESVBMQVlCQUNLU1RBVEVUWVBFIHsKKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlVW5rbm93biA9IDAsICAgICAgLyoqPCBVbmtub3duIHN0YXRlIG9yIHN0YXRlIGRvZXMgbm90IG1hcCB0byAKKyAgCQkJCQkJCQkJCQkJCW90aGVyIGRlZmluZWQgc3RhdGVzICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZUNsb3NlZEVuZ2FnZWQsICAgIC8qKjwgTm8gTUlESSByZXNvdXJjZSBpcyBjdXJyZW50bHkgb3Blbi4gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JREkgZXZlbnRzLiAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQYXJzaW5nLCAgICAgICAgICAvKio8IEEgTUlESSByZXNvdXJjZSBpcyBvcGVuIGFuZCBpcyBiZWluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltZWQuIFRoZSBNSURJIGVuZ2luZSBpcyBjdXJyZW50bHkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBNSURJIGV2ZW50cy4gKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlT3BlbkVuZ2FnZWQsICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgcHJpbWVkIGJ1dCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgcGxheWluZy4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuIFRoZSB0cmFuc2l0aW9uIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSBpcyBvbmx5IHBvc3NpYmxlIGZyb20gdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVBsYXlpbmcgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGUgJ3BsYXliYWNrIGhlYWQnIHJlYWNoZXMgdGhlIGVuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIG1lZGlhIGRhdGEgb3IgdGhlIHBsYXliYWNrIHN0b3BzIGR1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3AgdGltZSBzZXQuKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZywgICAgICAgICAgLyoqPCBBIE1JREkgcmVzb3VyY2UgaXMgb3BlbiBhbmQgY3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWluZy4gVGhlIE1JREkgZW5naW5lIGlzIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgTUlESSBldmVudHMuKi8KKyAgT01YX0FVRElPX01JRElQbGF5QmFja1N0YXRlUGxheWluZ1BhcnRpYWxseSwgLyoqPCBCZXN0LWVmZm9ydCBwbGF5YmFjayBkdWUgdG8gU1AtTUlESS9ETFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBjb25zdHJhaW50cyAqLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVQbGF5aW5nU2lsZW50bHksICAvKio8IER1ZSB0byBzeXN0ZW0gcmVzb3VyY2UgY29uc3RyYWludHMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1AtTUlESSBjb250ZW50IGNvbnN0cmFpbnRzLCB0aGVyZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGF1ZGlibGUgTUlESSBjb250ZW50IGR1cmluZyBwbGF5YmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseS4gVGhlIHNpdHVhdGlvbiBtYXkgY2hhbmdlIGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzIGFyZSBmcmVlZCBsYXRlci4qLworICBPTVhfQVVESU9fTUlESVBsYXlCYWNrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgIE9NWF9BVURJT19NSURJUGxheUJhY2tTdGF0ZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRTsKKworCisvKiogTUlESSBzdGF0dXMgCisgKiBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESVNUQVRVU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9VMTYgbk51bVRyYWNrczsgICAgICAgICAvKio8IE51bWJlciBvZiBNSURJIHRyYWNrcyBpbiB0aGUgZmlsZSwgcmVhZCBvbmx5IGZpZWxkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgdGhlIGVudGlyZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLworICAgIE9NWF9VMzIgbkR1cmF0aW9uOyAgICAgICAgICAvKio8IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnRseSBvcGVuIE1JREkgcmVzb3VyY2UgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLyAgCisgICAgT01YX1UzMiBuUG9zaXRpb247ICAgICAgICAgIC8qKjwgQ3VycmVudCBQb3NpdGlvbiBvZiB0aGUgTUlESSByZXNvdXJjZSBiZWluZyBwbGF5ZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzICovCisgICAgT01YX0JPT0wgYlZpYnJhOyAgICAgICAgICAgIC8qKjwgRG9lcyBWaWJyYSB0cmFjayBleGlzdD8gTk9URTogTWF5IG5vdCByZXR1cm4gYSBtZWFuaW5nZnVsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHVudGlsIHRoZSBlbnRpcmUgZmlsZSBpcyBwYXJzZWQgYW5kIGJ1ZmZlcmVkLiAqLworICAgIE9NWF9VMzIgbk51bU1ldGFFdmVudHM7ICAgICAvKio8IFRvdGFsIG51bWJlciBvZiBNSURJIE1ldGEgRXZlbnRzIGluIHRoZSBjdXJyZW50bHkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbiBNSURJIHJlc291cmNlLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW50aWwgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICAqLworICAgIE9NWF9VMzIgbk51bUFjdGl2ZVZvaWNlczsgICAvKio8IE51bWJlciBvZiBhY3RpdmUgdm9pY2VzIGluIHRoZSBjdXJyZW50bHkgcGxheWluZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSURJIHJlc291cmNlLiBOT1RFOiBNYXkgbm90IHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgdW50aWwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBmaWxlIGlzIHBhcnNlZCBhbmQgYnVmZmVyZWQuICovCisgICAgT01YX0FVRElPX01JRElQTEFZQkFDS1NUQVRFVFlQRSBlTUlESVBsYXlCYWNrU3RhdGU7ICAvKio8IE1JREkgcGxheWJhY2sgc3RhdGUgZW51bWVyYXRpb24sIHJlYWQgb25seSBmaWVsZCAqLworfSBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFOworCisKKy8qKiBNSURJIE1ldGEgRXZlbnQgc3RydWN0dXJlIG9uZSBwZXIgTWV0YSBFdmVudC4KKyAqICBNSURJIE1ldGEgRXZlbnRzIGFyZSBsaWtlIGF1ZGlvIG1ldGFkYXRhLCBleGNlcHQgdGhhdCB0aGV5IGFyZSBpbnRlcnNwZXJzZWQgCisgKiAgd2l0aCB0aGUgTUlESSBjb250ZW50IHRocm91Z2hvdXQgdGhlIGZpbGUgYW5kIGFyZSBub3QgbG9jYWxpemVkIGluIHRoZSBoZWFkZXIuIAorICogIEFzIHN1Y2gsIGl0IGlzIG5lY2Vzc2FyeSB0byByZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB0aGVzZSBNZXRhIEV2ZW50cyBmcm9tIAorICogIHRoZSBlbmdpbmUsIGFzIGl0IGVuY291bnRlcnMgdGhlc2UgTWV0YSBFdmVudHMgd2l0aGluIHRoZSBNSURJIGNvbnRlbnQuIAorICogIEZvciBleGFtcGxlLCBTTUYgZmlsZXMgY2FuIGhhdmUgdXAgdG8gMTQgdHlwZXMgb2YgTUlESSBNZXRhIEV2ZW50cyAoY29weXJpZ2h0LCAKKyAqICBhdXRob3IsIGRlZmF1bHQgdGVtcG8sIGV0Yy4pIHNjYXR0ZXJlZCB0aHJvdWdob3V0IHRoZSBmaWxlLiAKKyAqICBAaW5ncm91cCBtaWRpCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVFRZUEV7IAorICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovIAorICAgIE9NWF9VMzIgbkluZGV4OyAgICAgICAgICAgLyoqPCBJbmRleCBvZiBNZXRhIEV2ZW50ICovIAorICAgIE9NWF9VOCBuTWV0YUV2ZW50VHlwZTsgICAgLyoqPCBNZXRhIEV2ZW50IFR5cGUsIDdiaXRzIChpLmUuIDAgLSAxMjcpICovIAorICAgIE9NWF9VMzIgbk1ldGFFdmVudFNpemU7ICAgLyoqPCBzaXplIG9mIHRoZSBNZXRhIEV2ZW50IGluIGJ5dGVzICovIAorICAgIE9NWF9VMzIgblRyYWNrOyAgICAgICAgICAgLyoqPCB0cmFjayBudW1iZXIgZm9yIHRoZSBtZXRhIGV2ZW50ICovCisgICAgT01YX1UzMiBuUG9zaXRpb247ICAgICAgICAvKio8IFBvc2l0aW9uIG9mIHRoZSBtZXRhLWV2ZW50IGluIG1pbGxpc2Vjb25kcyAqLworfSBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFOyAKKworCisvKiogTUlESSBNZXRhIEV2ZW50IERhdGEgc3RydWN0dXJlIC0gb25lIHBlciBNZXRhIEV2ZW50LiAKKyAqIEBpbmdyb3VwIG1pZGkKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTUlESU1FVEFFVkVOVERBVEFUWVBFeyAKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5JbmRleDsgICAgICAgICAgIC8qKjwgSW5kZXggb2YgTWV0YSBFdmVudCAqLyAKKyAgICBPTVhfVTMyIG5NZXRhRXZlbnRTaXplOyAgIC8qKjwgc2l6ZSBvZiB0aGUgTWV0YSBFdmVudCBpbiBieXRlcyAqLyAKKyAgICBPTVhfVTggbkRhdGFbMV07ICAgICAgICAgIC8qKjwgYXJyYXkgb2Ygb25lIG9yIG1vcmUgYnl0ZXMgb2YgbWV0YSBkYXRhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBpbmRpY2F0ZWQgYnkgdGhlIG5NZXRhRXZlbnRTaXplIGZpZWxkICovIAorfSBPTVhfQVVESU9fQ09ORklHX19NSURJTUVUQUVWRU5UREFUQVRZUEU7IAorCisKKy8qKiBBdWRpbyBWb2x1bWUgYWRqdXN0bWVudCBmb3IgYSBwb3J0ICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1ZPTFVNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBQb3J0IGluZGV4IGluZGljYXRpbmcgd2hpY2ggcG9ydCB0byAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuICBTZWxlY3QgdGhlIGlucHV0IHBvcnQgdG8gc2V0IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1c3QgdGhhdCBwb3J0J3Mgdm9sdW1lLiAgU2VsZWN0IHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgcG9ydCB0byBhZGp1c3QgdGhlIG1hc3RlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUuICovCisgICAgT01YX0JPT0wgYkxpbmVhcjsgICAgICAgICAgIC8qKjwgSXMgdGhlIHZvbHVtZSB0byBiZSBzZXQgaW4gbGluZWFyICgwLjEwMCkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLworICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICBUaGUgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHZvbHVtZSBhcmUgaW4gbUIgKG1pbGxpYmVscyA9IDEvMTAwIGRCKSByZWxhdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGEgZ2FpbiBvZiAxIChlLmcuIHRoZSBvdXRwdXQgaXMgdGhlIHNhbWUgYXMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0IGxldmVsKS4gIFZhbHVlcyBhcmUgaW4gbUIgZnJvbSBuTWF4IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXhpbXVtIHZvbHVtZSkgdG8gbk1pbiBtQiAodHlwaWNhbGx5IG5lZ2F0aXZlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdm9sdW1lIGlzICJ2b2x0YWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgYSAicG93ZXIiLCBpdCB0YWtlcyBhIHNldHRpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjAwIG1CIHRvIGRlY3JlYXNlIHRoZSB2b2x1bWUgYnkgMS8yLiAgSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSB0byB0aGUgcmVxdWVzdGVkIHZhbHVlLCBpdCBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSB2b2x1bWUgdG8gdGhlIGNsb3Nlc3QgdmFsdWUgQkVMT1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIHZhbHVlLiAgV2hlbiBnZXR0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBzZXR0aW5nLCB0aGUgY3VycmVudCBhY3R1YWwgdm9sdW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXR1cm5lZC4gKi8KK30gT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFOworCisKKy8qKiBBdWRpbyBWb2x1bWUgYWRqdXN0bWVudCBmb3IgYSBjaGFubmVsICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIHZvbHVtZS4gIFNlbGVjdCB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0IHBvcnQgdG8gYWRqdXN0IHRoZSBtYXN0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lLiAqLworICAgIE9NWF9VMzIgbkNoYW5uZWw7ICAgICAgICAgICAvKio8IGNoYW5uZWwgdG8gc2VsZWN0IGZyb20gMCB0byBOLTEsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIE9NWF9BTEwgdG8gYXBwbHkgdm9sdW1lIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsIGNoYW5uZWxzICovCisgICAgT01YX0JPT0wgYkxpbmVhcjsgICAgICAgICAgIC8qKjwgSXMgdGhlIHZvbHVtZSB0byBiZSBzZXQgaW4gbGluZWFyICgwLjEwMCkgb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nYXJpdGhtaWMgc2NhbGUgKG1CKSAqLworICAgIE9NWF9CUzMyIHNWb2x1bWU7ICAgICAgICAgICAvKio8IFZvbHVtZSBsaW5lYXIgc2V0dGluZyBpbiB0aGUgMC4uMTAwIHJhbmdlLCBPUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZSBsb2dhcml0aG1pYyBzZXR0aW5nIGZvciB0aGlzIHBvcnQuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWVzIGZvciB2b2x1bWUgYXJlIGluIG1CIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaWxsaWJlbHMgPSAxLzEwMCBkQikgcmVsYXRpdmUgdG8gYSBnYWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgMSAoZS5nLiB0aGUgb3V0cHV0IGlzIHRoZSBzYW1lIGFzIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBsZXZlbCkuICBWYWx1ZXMgYXJlIGluIG1CIGZyb20gbk1heCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF4aW11bSB2b2x1bWUpIHRvIG5NaW4gbUIgKHR5cGljYWxseSBuZWdhdGl2ZSkuICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdm9sdW1lIGlzICJ2b2x0YWdlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBub3QgYSAicG93ZXIiLCBpdCB0YWtlcyBhIHNldHRpbmcgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjAwIG1CIHRvIGRlY3JlYXNlIHRoZSB2b2x1bWUgYnkgMS8yLiAgSWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGNvbXBvbmVudCBjYW5ub3QgYWNjdXJhdGVseSBzZXQgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSB0byB0aGUgcmVxdWVzdGVkIHZhbHVlLCBpdCBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRoZSB2b2x1bWUgdG8gdGhlIGNsb3Nlc3QgdmFsdWUgQkVMT1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVxdWVzdGVkIHZhbHVlLiAgV2hlbiBnZXR0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZSBzZXR0aW5nLCB0aGUgY3VycmVudCBhY3R1YWwgdm9sdW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZXR1cm5lZC4gKi8KKyAgICBPTVhfQk9PTCBiSXNNSURJOyAgICAgICAgICAgLyoqPCBUUlVFIGlmIG5DaGFubmVsIHJlZmVycyB0byBhIE1JREkgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UgKi8KK30gT01YX0FVRElPX0NPTkZJR19DSEFOTkVMVk9MVU1FVFlQRTsKKworCisvKiogQXVkaW8gYmFsYW5jZSBzZXR0aW5nICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIGJhbGFuY2UuICBTZWxlY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhbGFuY2UuICovCisgICAgT01YX1MzMiBuQmFsYW5jZTsgICAgICAgICAgIC8qKjwgYmFsYW5jZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMDAgdG8gMTAwLCB3aGVyZSAtMTAwIGluZGljYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBsZWZ0LCBhbmQgbm8gcmlnaHQgKi8KK30gT01YX0FVRElPX0NPTkZJR19CQUxBTkNFVFlQRTsKKworCisvKiogQXVkaW8gUG9ydCBtdXRlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX01VVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCBpbmRleCBpbmRpY2F0aW5nIHdoaWNoIHBvcnQgdG8gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LiAgU2VsZWN0IHRoZSBpbnB1dCBwb3J0IHRvIHNldCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHRoYXQgcG9ydCdzIG11dGUuICBTZWxlY3QgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBwb3J0IHRvIGFkanVzdCB0aGUgbWFzdGVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGUuICovCisgICAgT01YX0JPT0wgYk11dGU7ICAgICAgICAgICAgIC8qKjwgTXV0ZSBzZXR0aW5nIGZvciB0aGlzIHBvcnQgKi8KK30gT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRTsKKworCisvKiogQXVkaW8gQ2hhbm5lbCBtdXRlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX1UzMiBuQ2hhbm5lbDsgICAgICAgICAgIC8qKjwgY2hhbm5lbCB0byBzZWxlY3QgZnJvbSAwIHRvIE4tMSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmcgT01YX0FMTCB0byBhcHBseSBtdXRlIHNldHRpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYWxsIGNoYW5uZWxzICovCisgICAgT01YX0JPT0wgYk11dGU7ICAgICAgICAgICAgIC8qKjwgTXV0ZSBzZXR0aW5nIGZvciB0aGlzIGNoYW5uZWwgKi8KKyAgICBPTVhfQk9PTCBiSXNNSURJOyAgICAgICAgICAgLyoqPCBUUlVFIGlmIG5DaGFubmVsIHJlZmVycyB0byBhIE1JREkgY2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSBvdGhlcndpc2UgKi8gCit9IE9NWF9BVURJT19DT05GSUdfQ0hBTk5FTE1VVEVUWVBFOworCisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGxvdWRuZXNzIGNvbnRyb2wsIHdoaWNoIGJvb3N0cyBiYXNzIGFuZCB0byBhIAorICogIHNtYWxsZXIgZXh0ZW50IGhpZ2ggZW5kIGZyZXF1ZW5jaWVzIHRvIGNvbXBlbnNhdGUgZm9yIGhlYXJpbmcKKyAqICBhYmlsaXR5IGF0IHRoZSBleHRyZW1lIGVuZHMgb2YgdGhlIGF1ZGlvIHNwZWN0cnVtCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0xPVURORVNTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkxvdWRuZXNzOyAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgbG91ZG5lc3MgKi8KK30gT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEU7CisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGJhc3MsIHdoaWNoIGNvbnRyb2xzIGxvdyBmcmVxdWVuY2llcworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19CQVNTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgYmFzcyBjb250cm9sICovCisgICAgT01YX1MzMiBuQmFzczsgICAgICAgICAgICAgLyoqPCBiYXNzIHNldHRpbmcgZm9yIHRoZSBwb3J0LCBhcyBhIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludW91cyB2YWx1ZSBmcm9tIC0xMDAgdG8gMTAwICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgwIG1lYW5zIG5vIGNoYW5nZSBpbiBiYXNzIGxldmVsKSovCit9IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEU7CisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIHRyZWJsZSwgd2hpY2ggY29udHJvbHMgaGlnaCBmcmVxdWVuY2llcyB0b25lcworICovIAordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlOyAgICAgICAgICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciB0cmVibGUgY29udHJvbCAqLworICAgIE9NWF9TMzIgIG5UcmVibGU7ICAgICAgICAgIC8qKjwgdHJlYmxlIHNldHRpbmcgZm9yIHRoZSBwb3J0LCBhcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzIHZhbHVlIGZyb20gLTEwMCB0byAxMDAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDAgbWVhbnMgbm8gY2hhbmdlIGluIHRyZWJsZSBsZXZlbCkgKi8KK30gT01YX0FVRElPX0NPTkZJR19UUkVCTEVUWVBFOworCisKKy8qKiBBbiBlcXVhbGl6ZXIgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHR3byByZWFzb25zOiB0byBjb21wZW5zYXRlIGZvciBhbiAKKyAqICBzdWItb3B0aW1hbCBmcmVxdWVuY3kgcmVzcG9uc2Ugb2YgYSBzeXN0ZW0gdG8gbWFrZSBpdCBzb3VuZCBtb3JlIG5hdHVyYWwgCisgKiAgb3IgdG8gY3JlYXRlIGludGVudGlvbmFsbHkgc29tZSB1bm5hdHVyYWwgY29sb3JpbmcgdG8gdGhlIHNvdW5kIHRvIGNyZWF0ZQorICogIGFuIGVmZmVjdC4KKyAqICBAaW5ncm91cCBlZmZlY3RzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfRVFVQUxJWkVSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgZXF1YWxpemVyICovCisgICAgT01YX0JVMzIgc0JhbmRJbmRleDsgICAgICAgLyoqPCBCYW5kIG51bWJlciB0byBiZSBzZXQuICBVcHBlciBMaW1pdCBpcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE4tMSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIGJhbmRzLCBsb3dlciBsaW1pdCBpcyAwICovCisgICAgT01YX0JVMzIgc0NlbnRlckZyZXE7ICAgICAgLyoqPCBDZW50ZXIgZnJlcXVlY2llcyBpbiBIei4gIFRoaXMgaXMgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBvbmx5IGVsZW1lbnQgYW5kIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGxvd2VyLCBjZW50ZXIgYW5kIHVwcGVyIGZyZXF1ZW5jeSBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYmFuZC4gICovCisgICAgT01YX0JTMzIgc0JhbmRMZXZlbDsgICAgICAgLyoqPCBiYW5kIGxldmVsIGluIG1pbGxpYmVscyAqLworfSBPTVhfQVVESU9fQ09ORklHX0VRVUFMSVpFUlRZUEU7CisKKworLyoqIFN0ZXJlbyB3aWRlbmluZyBtb2RlIHR5cGUgCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8gCit0eXBlZGVmIGVudW0gT01YX0FVRElPX1NURVJFT1dJREVOSU5HVFlQRSB7CisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nSGVhZHBob25lcywgICAgLyoqPCBTdGVyZW8gd2lkZW5pbmcgZm9yIGxvdWRzcGVha2VycyAqLworICAgIE9NWF9BVURJT19TdGVyZW9XaWRlbmluZ0xvdWRzcGVha2VycywgIC8qKjwgU3RlcmVvIHdpZGVuaW5nIGZvciBjbG9zZWx5IHNwYWNlZCBsb3Vkc3BlYWtlcnMgKi8KKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0FVRElPX1N0ZXJlb1dpZGVuaW5nVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfQVVESU9fU3RlcmVvV2lkZW5pbmdNYXggPSAweDdGRkZGRkZGCit9IE9NWF9BVURJT19TVEVSRU9XSURFTklOR1RZUEU7CisKKworLyoqIENvbnRyb2wgZm9yIHN0ZXJlbyB3aWRlbmluZywgd2hpY2ggaXMgYSBzcGVjaWFsIDItY2hhbm5lbAorICogIGNhc2Ugb2YgdGhlIGF1ZGlvIHZpcnR1YWxpemVyIGVmZmVjdC4gRm9yIGV4YW1wbGUsIGZvciA1LjEtY2hhbm5lbCAKKyAqICBvdXRwdXQsIGl0IHRyYW5zbGF0ZXMgdG8gdmlydHVhbCBzdXJyb3VuZCBzb3VuZC4gCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX1NURVJFT1dJREVOSU5HVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3Igc3RlcmVvIHdpZGVuaW5nIGNvbnRyb2wgKi8KKyAgICBPTVhfQVVESU9fU1RFUkVPV0lERU5JTkdUWVBFIGVXaWRlbmluZ1R5cGU7IC8qKjwgU3RlcmVvIHdpZGVuaW5nIGFsZ29yaXRobSB0eXBlICovCisgICAgT01YX1UzMiAgblN0ZXJlb1dpZGVuaW5nOyAgLyoqPCBzdGVyZW8gd2lkZW5pbmcgc2V0dGluZyBmb3IgdGhlIHBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyBhIGNvbnRpbnVvdXMgdmFsdWUgZnJvbSAwIHRvIDEwMCAgKi8KK30gT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEU7CisKKworLyoqIFRoZSBjaG9ydXMgZWZmZWN0IChvciBgYGNob3JhbGl6ZXInJykgaXMgYW55IHNpZ25hbCBwcm9jZXNzb3Igd2hpY2ggbWFrZXMKKyAqICBvbmUgc291bmQgc291cmNlIChzdWNoIGFzIGEgdm9pY2UpIHNvdW5kIGxpa2UgbWFueSBzdWNoIHNvdXJjZXMgc2luZ2luZyAKKyAqICAob3IgcGxheWluZykgaW4gdW5pc29uLiBTaW5jZSBwZXJmb3JtYW5jZSBpbiB1bmlzb24gaXMgbmV2ZXIgZXhhY3QsIGNob3J1cyAKKyAqICBlZmZlY3RzIHNpbXVsYXRlIHRoaXMgYnkgbWFraW5nIGluZGVwZW5kZW50bHkgbW9kaWZpZWQgY29waWVzIG9mIHRoZSBpbnB1dCAKKyAqICBzaWduYWwuIE1vZGlmaWNhdGlvbnMgbWF5IGluY2x1ZGUgKDEpIGRlbGF5LCAoMikgZnJlcXVlbmN5IHNoaWZ0LCBhbmQgCisgKiAgKDMpIGFtcGxpdHVkZSBtb2R1bGF0aW9uLgorICogQGluZ3JvdXAgZWZmZWN0cworICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0NIT1JVU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9CT09MIGJFbmFibGU7ICAgICAgICAgIC8qKjwgRW5hYmxlL2Rpc2FibGUgZm9yIGNob3J1cyAqLworICAgIE9NWF9CVTMyIHNEZWxheTsgICAgICAgICAgIC8qKjwgYXZlcmFnZSBkZWxheSBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQlUzMiBzTW9kdWxhdGlvblJhdGU7ICAvKio8IHJhdGUgb2YgbW9kdWxhdGlvbiBpbiBtaWxsaWhlcnR6ICovCisgICAgT01YX1UzMiBuTW9kdWxhdGlvbkRlcHRoOyAgLyoqPCBkZXB0aCBvZiBtb2R1bGF0aW9uIGFzIGEgcGVyY2VudGFnZSBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5IChpLmUuIDAgdG8gMTAwKSAqLworICAgIE9NWF9CVTMyIG5GZWVkYmFjazsgICAgICAgIC8qKjwgRmVlZGJhY2sgZnJvbSBjaG9ydXMgb3V0cHV0IHRvIGlucHV0IGluIHBlcmNlbnRhZ2UgKi8KK30gT01YX0FVRElPX0NPTkZJR19DSE9SVVNUWVBFOworCisKKy8qKiBSZXZlcmJlcmF0aW9uIGlzIHBhcnQgb2YgdGhlIHJlZmxlY3RlZCBzb3VuZCB0aGF0IGZvbGxvd3MgdGhlIGVhcmx5IAorICogIHJlZmxlY3Rpb25zLiBJbiBhIHR5cGljYWwgcm9vbSwgdGhpcyBjb25zaXN0cyBvZiBhIGRlbnNlIHN1Y2Nlc3Npb24gb2YgCisgKiAgZWNob2VzIHdob3NlIGVuZXJneSBkZWNheXMgZXhwb25lbnRpYWxseS4gVGhlIHJldmVyYmVyYXRpb24gZWZmZWN0IHN0cnVjdHVyZSAKKyAqICBhcyBkZWZpbmVkIGhlcmUgaW5jbHVkZXMgYm90aCAoZWFybHkpIHJlZmxlY3Rpb25zIGFzIHdlbGwgYXMgKGxhdGUpIHJldmVyYmVyYXRpb25zLiAKKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JPT0wgYkVuYWJsZTsgICAgICAgICAgICAgLyoqPCBFbmFibGUvZGlzYWJsZSBmb3IgcmV2ZXJiZXJhdGlvbiBjb250cm9sICovCisgICAgT01YX0JTMzIgc1Jvb21MZXZlbDsgICAgICAgICAgLyoqPCBJbnRlbnNpdHkgbGV2ZWwgZm9yIHRoZSB3aG9sZSByb29tIGVmZmVjdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGJvdGggZWFybHkgcmVmbGVjdGlvbnMgYW5kIGxhdGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXZlcmJlcmF0aW9uKSBpbiBtaWxsaWJlbHMgKi8KKyAgICBPTVhfQlMzMiBzUm9vbUhpZ2hGcmVxTGV2ZWw7ICAvKio8IEF0dGVudWF0aW9uIGF0IGhpZ2ggZnJlcXVlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGF0aXZlIHRvIHRoZSBpbnRlbnNpdHkgYXQgbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVuY2llcyBpbiBtaWxsaWJlbHMgKi8KKyAgICBPTVhfQlMzMiBzUmVmbGVjdGlvbnNMZXZlbDsgICAvKio8IEludGVuc2l0eSBsZXZlbCBvZiBlYXJseSByZWZsZWN0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbGF0aXZlIHRvIHJvb20gdmFsdWUpLCBpbiBtaWxsaWJlbHMgKi8KKyAgICBPTVhfQlUzMiBzUmVmbGVjdGlvbnNEZWxheTsgICAvKio8IERlbGF5IHRpbWUgb2YgdGhlIGZpcnN0IHJlZmxlY3Rpb24gcmVsYXRpdmUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZGlyZWN0IHBhdGgsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CUzMyIHNSZXZlcmJMZXZlbDsgICAgICAgIC8qKjwgSW50ZW5zaXR5IGxldmVsIG9mIGxhdGUgcmV2ZXJiZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmUgdG8gcm9vbSBsZXZlbCwgaW4gbWlsbGliZWxzICovCisgICAgT01YX0JVMzIgc1JldmVyYkRlbGF5OyAgICAgICAgLyoqPCBUaW1lIGRlbGF5IGZyb20gdGhlIGZpcnN0IGVhcmx5IHJlZmxlY3Rpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uLCBpbiBtaWxsaXNlY29uZHMgKi8KKyAgICBPTVhfQlUzMiBzRGVjYXlUaW1lOyAgICAgICAgICAvKio8IExhdGUgcmV2ZXJiZXJhdGlvbiBkZWNheSB0aW1lIGF0IGxvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlcXVlbmNpZXMsIGluIG1pbGxpc2Vjb25kcyAqLworICAgIE9NWF9CVTMyIG5EZWNheUhpZ2hGcmVxUmF0aW87IC8qKjwgUmF0aW8gb2YgaGlnaCBmcmVxdWVuY3kgZGVjYXkgdGltZSByZWxhdGl2ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGxvdyBmcmVxdWVuY3kgZGVjYXkgdGltZSBpbiBwZXJjZW50ICAqLworICAgIE9NWF9VMzIgbkRlbnNpdHk7ICAgICAgICAgICAgIC8qKjwgTW9kYWwgZGVuc2l0eSBpbiB0aGUgbGF0ZSByZXZlcmJlcmF0aW9uIGRlY2F5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGVyY2VudCAoaS5lLiAwIC0gMTAwKSAqLworICAgIE9NWF9VMzIgbkRpZmZ1c2lvbjsgICAgICAgICAgIC8qKjwgRWNobyBkZW5zaXR5IGluIHRoZSBsYXRlIHJldmVyYmVyYXRpb24gZGVjYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwZXJjZW50IChpLmUuIDAgLSAxMDApICovCisgICAgT01YX0JVMzIgc1JlZmVyZW5jZUhpZ2hGcmVxOyAgLyoqPCBSZWZlcmVuY2UgaGlnaCBmcmVxdWVuY3kgaW4gSGVydHouIFRoaXMgaXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJlcXVlbmN5IHVzZWQgYXMgdGhlIHJlZmVyZW5jZSBmb3IgYWxsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGhpZ2gtZnJlcXVlbmN5IHNldHRpbmdzIGFib3ZlICovCisKK30gT01YX0FVRElPX0NPTkZJR19SRVZFUkJFUkFUSU9OVFlQRTsKKworCisvKiogUG9zc2libGUgc2V0dGluZ3MgZm9yIHRoZSBFY2hvIENhbmNlbGF0aW9uIHN0cnVjdHVyZSB0byB1c2UgCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQVVESU9fRUNIT0NBTlRZUEUgeworICAgT01YX0FVRElPX0VjaG9DYW5PZmYgPSAwLCAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIGlzIGRpc2FibGVkICovCisgICBPTVhfQVVESU9fRWNob0Nhbk5vcm1hbCwgICAgIC8qKjwgRWNobyBDYW5jZWxsYXRpb24gbm9ybWFsIG9wZXJhdGlvbiAtIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gZnJvbSBwbGFzdGljcyBhbmQgZmFjZSAqLworICAgT01YX0FVRElPX0VjaG9DYW5IRnJlZSwgICAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG9wdGltaXplZCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZHMgRnJlZSBvcGVyYXRpb24gKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuQ2FyS2l0LCAgICAvKio8IEVjaG8gQ2FuY2VsbGF0aW9uIG9wdGltaXplZCBmb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FyIEtpdCAobG9uZ2VyIGVjaG8pICovCisgICBPTVhfQVVESU9fRWNob0Nhbktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9BVURJT19FY2hvQ2FuVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgIE9NWF9BVURJT19FY2hvQ2FuTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQVVESU9fRUNIT0NBTlRZUEU7CisKKworLyoqIEVuYWJsZSAvIERpc2FibGUgZm9yIGVjaG8gY2FuY2VsYXRpb24sIHdoaWNoIHJlbW92ZXMgdW5kZXNpcmVkIGVjaG8ncworICogIGZyb20gdGhlIGF1ZGlvCisgKiBAaW5ncm91cCBlZmZlY3RzCisgKi8gCit0eXBlZGVmIHN0cnVjdCBPTVhfQVVESU9fQ09ORklHX0VDSE9DQU5DRUxBVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9BVURJT19FQ0hPQ0FOVFlQRSBlRWNob0NhbmNlbGF0aW9uOyAvKio8IEVjaG8gY2FuY2VsYXRpb24gc2V0dGluZ3MgKi8KK30gT01YX0FVRElPX0NPTkZJR19FQ0hPQ0FOQ0VMQVRJT05UWVBFOworCisKKy8qKiBFbmFibGUgLyBEaXNhYmxlIGZvciBub2lzZSByZWR1Y3Rpb24sIHdoaWNoIHVuZGVzaXJlZCBub2lzZSBmcm9tCisgKiB0aGUgYXVkaW8KKyAqIEBpbmdyb3VwIGVmZmVjdHMKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9BVURJT19DT05GSUdfTk9JU0VSRURVQ1RJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiTm9pc2VSZWR1Y3Rpb247ICAvKio8IEVuYWJsZS9kaXNhYmxlIGZvciBub2lzZSByZWR1Y3Rpb24gKi8KK30gT01YX0FVRElPX0NPTkZJR19OT0lTRVJFRFVDVElPTlRZUEU7CisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfQ29tcG9uZW50LmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0NvbXBvbmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1OTU2NDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiBPTVhfQ29tcG9uZW50LmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0NvbXBvbmVudCBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKKyAqICB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhIGNvbXBvbmVudC4gIFRoaXMgaGVhZGVyIGZpbGUgaXMgaW50ZW5kZWQgdG8KKyAqICBiZSB1c2VkIGJ5IGJvdGggdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LgorICovCisKKyNpZm5kZWYgT01YX0NvbXBvbmVudF9oCisjZGVmaW5lIE9NWF9Db21wb25lbnRfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9JbWFnZS5oPgorI2luY2x1ZGUgPE9NWF9PdGhlci5oPgorCisvKiogQGluZ3JvdXAgY29tcCAqLwordHlwZWRlZiBlbnVtIE9NWF9QT1JURE9NQUlOVFlQRSB7IAorICAgIE9NWF9Qb3J0RG9tYWluQXVkaW8sIAorICAgIE9NWF9Qb3J0RG9tYWluVmlkZW8sIAorICAgIE9NWF9Qb3J0RG9tYWluSW1hZ2UsIAorICAgIE9NWF9Qb3J0RG9tYWluT3RoZXIsCisgICAgT01YX1BvcnREb21haW5LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1BvcnREb21haW5WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Qb3J0RG9tYWluTWF4ID0gMHg3ZmZmZmZmCit9IE9NWF9QT1JURE9NQUlOVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgLyoqPCBQb3J0IG51bWJlciB0aGUgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElSVFlQRSBlRGlyOyAgICAgICAgICAgICAgLyoqPCBEaXJlY3Rpb24gKGlucHV0IG9yIG91dHB1dCkgb2YgdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRBY3R1YWw7ICAgIC8qKjwgVGhlIGFjdHVhbCBudW1iZXIgb2YgYnVmZmVycyBhbGxvY2F0ZWQgb24gdGhpcyBwb3J0ICovCisgICAgT01YX1UzMiBuQnVmZmVyQ291bnRNaW47ICAgICAgIC8qKjwgVGhlIG1pbmltdW0gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhpcyBwb3J0IHJlcXVpcmVzICovCisgICAgT01YX1UzMiBuQnVmZmVyU2l6ZTsgICAgICAgICAgIC8qKjwgU2l6ZSwgaW4gYnl0ZXMsIGZvciBidWZmZXJzIHRvIGJlIHVzZWQgZm9yIHRoaXMgY2hhbm5lbCAqLworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAgICAgICAgICAvKio8IFBvcnRzIGRlZmF1bHQgdG8gZW5hYmxlZCBhbmQgYXJlIGVuYWJsZWQvZGlzYWJsZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfQ29tbWFuZFBvcnRFbmFibGUvT01YX0NvbW1hbmRQb3J0RGlzYWJsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIGRpc2FibGVkIGEgcG9ydCBpcyB1bnBvcHVsYXRlZC4gQSBkaXNhYmxlZCBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBvcHVsYXRlZCB3aXRoIGJ1ZmZlcnMgb24gYSB0cmFuc2l0aW9uIHRvIElETEUuICovCisgICAgT01YX0JPT0wgYlBvcHVsYXRlZDsgICAgICAgICAgIC8qKjwgUG9ydCBpcyBwb3B1bGF0ZWQgd2l0aCBhbGwgb2YgaXRzIGJ1ZmZlcnMgYXMgaW5kaWNhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbkJ1ZmZlckNvdW50QWN0dWFsLiBBIGRpc2FibGVkIHBvcnQgaXMgYWx3YXlzIHVucG9wdWxhdGVkLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBlbmFibGVkIHBvcnQgaXMgcG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBPTVhfU3RhdGVJZGxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHVucG9wdWxhdGVkIG9uIGEgdHJhbnNpdGlvbiB0byBsb2FkZWQuICovCisgICAgT01YX1BPUlRET01BSU5UWVBFIGVEb21haW47ICAgIC8qKjwgRG9tYWluIG9mIHRoZSBwb3J0LiBEZXRlcm1pbmVzIHRoZSBjb250ZW50cyBvZiBtZXRhZGF0YSBiZWxvdy4gKi8KKyAgICB1bmlvbiB7CisgICAgICAgIE9NWF9BVURJT19QT1JUREVGSU5JVElPTlRZUEUgYXVkaW87CisgICAgICAgIE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgdmlkZW87CisgICAgICAgIE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEUgaW1hZ2U7CisgICAgICAgIE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgb3RoZXI7CisgICAgfSBmb3JtYXQ7CisgICAgT01YX0JPT0wgYkJ1ZmZlcnNDb250aWd1b3VzOworICAgIE9NWF9VMzIgbkJ1ZmZlckFsaWdubWVudDsKK30gT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9VMzJUWVBFIHsgCisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGlzIHN0cnVjdHVyZSwgaW4gQnl0ZXMgKi8gCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLyAKKyAgICBPTVhfVTMyIG5VMzI7ICAgICAgICAgICAgICAgICAgICAgLyoqPCBVMzIgdmFsdWUgKi8KK30gT01YX1BBUkFNX1UzMlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgZW51bSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgeworICAgIE9NWF9TdXNwZW5zaW9uRGlzYWJsZWQsIC8qKjwgTm8gc3VzcGVuc2lvbjsgdjEuMCBiZWhhdmlvciAqLworICAgIE9NWF9TdXNwZW5zaW9uRW5hYmxlZCwgIC8qKjwgU3VzcGVuc2lvbiBhbGxvd2VkICovICAgCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25Qb2xpY3lTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5zaW9uUG9saWN5TWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OUE9MSUNZVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgICAKKyAgICBPTVhfU1VTUEVOU0lPTlBPTElDWVRZUEUgZVBvbGljeTsKK30gT01YX1BBUkFNX1NVU1BFTlNJT05QT0xJQ1lUWVBFOworCisvKiogQGluZ3JvdXAgcnBtICovCit0eXBlZGVmIGVudW0gT01YX1NVU1BFTlNJT05UWVBFIHsKKyAgICBPTVhfTm90U3VzcGVuZGVkLCAvKio8IGNvbXBvbmVudCBpcyBub3Qgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbmRlZCwgICAgLyoqPCBjb21wb25lbnQgaXMgc3VzcGVuZGVkICovCisgICAgT01YX1N1c3BlbnNpb25LaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1N1c3BlbnNpb25WZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdXNwZW5kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfU1VTUEVOU0lPTlRZUEU7CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIAorICAgIE9NWF9TVVNQRU5TSU9OVFlQRSBlVHlwZTsgICAgICAgICAgICAgCit9IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSA7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQk9PTEVBTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9CT09MIGJFbmFibGVkOyAgICAKK30gT01YX0NPTkZJR19CT09MRUFOVFlQRTsKKworLyogUGFyYW1ldGVyIHNwZWNpZnlpbmcgdGhlIGNvbnRlbnQgdXJpIHRvIHVzZS4gKi8KKy8qKiBAaW5ncm91cCBjcCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFCit7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMsIGluY2x1ZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsIFVSSSBuYW1lICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1U4IGNvbnRlbnRVUklbMV07ICAgICAgICAgICAgICAgLyoqPCBUaGUgVVJJIG5hbWUgKi8KK30gT01YX1BBUkFNX0NPTlRFTlRVUklUWVBFOworCisvKiBQYXJhbWV0ZXIgc3BlY2lmeWluZyB0aGUgcGlwZSB0byB1c2UuICovCisvKiogQGluZ3JvdXAgY3AgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9DT05URU5UUElQRVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX0hBTkRMRVRZUEUgaFBpcGU7ICAgICAgIC8qKjwgVGhlIHBpcGUgaGFuZGxlKi8KK30gT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRTsKKworLyoqIEBpbmdyb3VwIHJwbSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9CT09MIGJSZXNvdXJjZUNvbmNlYWxtZW50Rm9yYmlkZGVuOyAvKio8IGRpc2FsbG93IHRoZSB1c2Ugb2YgcmVzb3VyY2UgY29uY2VhbG1lbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKGxpa2UgZGVncmFkaW5nIGFsZ29yaXRobSBxdWFsaXR5IHRvIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciByZXNvdXJjZSBjb25zdW1wdGlvbiBvciBmdW5jdGlvbmFsIGJ5cGFzcykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGEgY29tcG9uZW50IGFzIGEgcmVzb2x1dGlvbiB0byByZXNvdXJjZSBjb25mbGljdHMuICovCit9IE9NWF9SRVNPVVJDRUNPTkNFQUxNRU5UVFlQRTsKKworCisvKiogQGluZ3JvdXAgbWV0YWRhdGEgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSB7CisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVua25vd24gPSAwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRBU0NJSSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0QmluYXJ5LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRDb2RlUGFnZTEyNTIsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjgsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEphdmFDb25mb3JtYW50VVRGOCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VVRGNywKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SW1hcFVURjcsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFVURjE2TEUsIAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRVVEYxNkJFLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjEyMzQ1LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRIWkdCMjMxMiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0R0IyMzEyLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQjE4MDMwLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRHQkssCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEJpZzUsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MiwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk0LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5NSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTYsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTk3LAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5OCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTksCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxMCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPODg1OTEzLAorICAgIE9NWF9NZXRhZGF0YUNoYXJzZXRJU084ODU5MTQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzg4NTkxNSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0U2hpZnRKSVMsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldElTTzIwMjJKUCwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPMjAyMkpQMSwKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0SVNPRVVDSlAsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldFNNUzdCaXQsCisgICAgT01YX01ldGFkYXRhQ2hhcnNldEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWV0YWRhdGFDaGFyc2V0VHlwZU1heD0gMHg3RkZGRkZGRgorfSBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIGVudW0gT01YX01FVEFEQVRBU0NPUEVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2NvcGVBbGxMZXZlbHMsCisgICAgT01YX01ldGFkYXRhU2NvcGVUb3BMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZVBvcnRMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZU5vZGVMZXZlbCwKKyAgICBPTVhfTWV0YWRhdGFTY29wZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTY29wZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX01ldGFkYXRhU2NvcGVUeXBlTWF4ID0gMHg3ZmZmZmZmZgorfSBPTVhfTUVUQURBVEFTQ09QRVRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBlbnVtIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFCit7CisgICAgT01YX01ldGFkYXRhU2VhcmNoVmFsdWVTaXplQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hJdGVtQnlJbmRleCwKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hOZXh0SXRlbUJ5S2V5LAorICAgIE9NWF9NZXRhZGF0YVNlYXJjaEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWV0YWRhdGFTZWFyY2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9NZXRhZGF0YVNlYXJjaFR5cGVNYXggPSAweDdmZmZmZmZmCit9IE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFOworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRQoreworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9NRVRBREFUQVNDT1BFVFlQRSBlU2NvcGVNb2RlOworICAgIE9NWF9VMzIgblNjb3BlU3BlY2lmaWVyOworICAgIE9NWF9VMzIgbk1ldGFkYXRhSXRlbUNvdW50OworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfTUVUQURBVEFTQ09QRVRZUEUgZVNjb3BlTW9kZTsKKyAgICBPTVhfVTMyIG5TY29wZVNwZWNpZmllcjsKKyAgICBPTVhfVTMyIG5NZXRhZGF0YUl0ZW1JbmRleDsgIAorICAgIE9NWF9NRVRBREFUQVNFQVJDSE1PREVUWVBFIGVTZWFyY2hNb2RlOworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VOCBuS2V5U2l6ZVVzZWQ7CisgICAgT01YX1U4IG5LZXlbMTI4XTsKKyAgICBPTVhfTUVUQURBVEFDSEFSU0VUVFlQRSBlVmFsdWVDaGFyc2V0OworICAgIE9NWF9TVFJJTkcgc0xhbmd1YWdlQ291bnRyeTsKKyAgICBPTVhfVTMyIG5WYWx1ZU1heFNpemU7CisgICAgT01YX1UzMiBuVmFsdWVTaXplVXNlZDsKKyAgICBPTVhfVTggblZhbHVlWzFdOworfSBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEU7CisKKy8qIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVDT1VOVFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTnVtTm9kZXM7Cit9IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUNPVU5UVFlQRTsKKworLyoqIEBpbmdyb3VwIG1ldGFkYXRhICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEUKK3sKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsKKyAgICBPTVhfVTMyIG5QYXJlbnROb2RlSUQ7CisgICAgT01YX1UzMiBuTm9kZUluZGV4OyAKKyAgICBPTVhfVTMyIG5Ob2RlSUQ7IAorICAgIE9NWF9TVFJJTkcgY05vZGVOYW1lOworICAgIE9NWF9CT09MIGJJc0xlYWZUeXBlOworfSBPTVhfQ09ORklHX0NPTlRBSU5FUk5PREVJRFRZUEU7CisKKy8qKiBAaW5ncm91cCBtZXRhZGF0YSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAKK3sgCisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfQk9PTCBiQWxsS2V5czsJLyogaWYgdHJ1ZSB0aGVuIHRoaXMgc3RydWN0dXJlIHJlZmVycyB0byBhbGwga2V5cyBhbmQgCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0aGUgdGhyZWUga2V5IGZpZWxkcyBiZWxvdyBhcmUgaWdub3JlZCAqLworICAgIE9NWF9NRVRBREFUQUNIQVJTRVRUWVBFIGVLZXlDaGFyc2V0OworICAgIE9NWF9VMzIgbktleVNpemVVc2VkOyAKKyAgICBPTVhfVTggICBuS2V5IFsxMjhdOyAKKyAgICBPTVhfVTMyIG5MYW5ndWFnZUNvdW50cnlTaXplVXNlZDsKKyAgICBPTVhfVTggbkxhbmd1YWdlQ291bnRyeVsxMjhdOworICAgIE9NWF9CT09MIGJFbmFibGVkOwkvKiBpZiB0cnVlIHRoZW4ga2V5IGlzIHBhcnQgb2YgZmlsdGVyIChlLmcuIAorICAgICAgICAgICAgICAgICAgICAgICAgICogcmV0YWluZWQgZm9yIHF1ZXJ5IGxhdGVyKS4gSWYgZmFsc2UgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgICoga2V5IGlzIG5vdCBwYXJ0IG9mIGZpbHRlciAqLworfSBPTVhfUEFSQU1fTUVUQURBVEFGSUxURVJUWVBFOyAKKworLyoqIFRoZSBPTVhfSEFORExFVFlQRSBzdHJ1Y3R1cmUgZGVmaW5lcyB0aGUgY29tcG9uZW50IGhhbmRsZS4gIFRoZSBjb21wb25lbnQgCisgKiAgaGFuZGxlIGlzIHVzZWQgdG8gYWNjZXNzIGFsbCBvZiB0aGUgY29tcG9uZW50J3MgcHVibGljIG1ldGhvZHMgYW5kIGFsc28KKyAqICBjb250YWlucyBwb2ludGVycyB0byB0aGUgY29tcG9uZW50J3MgcHJpdmF0ZSBkYXRhIGFyZWEuICBUaGUgY29tcG9uZW50CisgKiAgaGFuZGxlIGlzIGluaXRpYWxpemVkIGJ5IHRoZSBPTVggY29yZSAod2l0aCBoZWxwIGZyb20gdGhlIGNvbXBvbmVudCkKKyAqICBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgbG9hZGluZyB0aGUgY29tcG9uZW50LiAgQWZ0ZXIgdGhlIGNvbXBvbmVudCBpcworICogIHN1Y2Nlc3NmdWxseSBsb2FkZWQsIHRoZSBhcHBsaWNhdGlvbiBjYW4gc2FmZWx5IGFjY2VzcyBhbnkgb2YgdGhlCisgKiAgY29tcG9uZW50J3MgcHVibGljIGZ1bmN0aW9ucyAoYWx0aG91Z2ggc29tZSBtYXkgcmV0dXJuIGFuIGVycm9yIGJlY2F1c2UKKyAqICB0aGUgc3RhdGUgaXMgaW5hcHByb3ByaWF0ZSBmb3IgdGhlIGFjY2VzcykuCisgKiAKKyAqICBAaW5ncm91cCBjb21wCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT01QT05FTlRUWVBFCit7CisgICAgLyoqIFRoZSBzaXplIG9mIHRoaXMgc3RydWN0dXJlLCBpbiBieXRlcy4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eQorICAgICAgICBvZiB0aGUgYWxsb2NhdG9yIG9mIHRoaXMgc3RydWN0dXJlIHRvIGZpbGwgaW4gdGhpcyB2YWx1ZS4gIFNpbmNlCisgICAgICAgIHRoaXMgc3RydWN0dXJlIGlzIGFsbG9jYXRlZCBieSB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLCB0aGlzCisgICAgICAgIGZ1bmN0aW9uIHdpbGwgZmlsbCBpbiB0aGlzIHZhbHVlLiAqLworICAgIE9NWF9VMzIgblNpemU7CisKKyAgICAvKiogblZlcnNpb24gaXMgdGhlIHZlcnNpb24gb2YgdGhlIE9NWCBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIHN0cnVjdHVyZSAKKyAgICAgICAgaXMgYnVpbHQgYWdhaW5zdC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY3JlYXRvciBvZiB0aGlzIAorICAgICAgICBzdHJ1Y3R1cmUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlIGFuZCBldmVyeSB1c2VyIG9mIHRoaXMgc3RydWN0dXJlIAorICAgICAgICBzaG91bGQgdmVyaWZ5IHRoYXQgaXQga25vd3MgaG93IHRvIHVzZSB0aGUgZXhhY3QgdmVyc2lvbiBvZiAKKyAgICAgICAgdGhpcyBzdHJ1Y3R1cmUgZm91bmQgaGVyZWluLiAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKworICAgIC8qKiBwQ29tcG9uZW50UHJpdmF0ZSBpcyBhIHBvaW50ZXIgdG8gdGhlIGNvbXBvbmVudCBwcml2YXRlIGRhdGEgYXJlYS4gIAorICAgICAgICBUaGlzIG1lbWJlciBpcyBhbGxvY2F0ZWQgYW5kIGluaXRpYWxpemVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiB0aGUgCisgICAgICAgIGNvbXBvbmVudCBpcyBmaXJzdCBsb2FkZWQuICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhY2Nlc3MgdGhpcyAKKyAgICAgICAgZGF0YSBhcmVhLiAqLworICAgIE9NWF9QVFIgcENvbXBvbmVudFByaXZhdGU7CisKKyAgICAvKiogcEFwcGxpY2F0aW9uUHJpdmF0ZSBpcyBhIHBvaW50ZXIgdGhhdCBpcyBhIHBhcmFtZXRlciB0byB0aGUgCisgICAgICAgIE9NWF9HZXRIYW5kbGUgbWV0aG9kLCBhbmQgY29udGFpbnMgYW4gYXBwbGljYXRpb24gcHJpdmF0ZSB2YWx1ZSAKKyAgICAgICAgcHJvdmlkZWQgYnkgdGhlIElMIGNsaWVudC4gIFRoaXMgYXBwbGljYXRpb24gcHJpdmF0ZSBkYXRhIGlzIAorICAgICAgICByZXR1cm5lZCB0byB0aGUgSUwgQ2xpZW50IGJ5IE9NWCBpbiBhbGwgY2FsbGJhY2tzICovCisgICAgT01YX1BUUiBwQXBwbGljYXRpb25Qcml2YXRlOworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29tcG9uZW50VmVyc2lvbiBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldENvbXBvbmVudFZlcnNpb24pKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX09VVCBPTVhfU1RSSU5HIHBDb21wb25lbnROYW1lLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBDb21wb25lbnRWZXJzaW9uLAorICAgICAgICAgICAgT01YX09VVCBPTVhfVkVSU0lPTlRZUEUqIHBTcGVjVmVyc2lvbiwKKyAgICAgICAgICAgIE9NWF9PVVQgT01YX1VVSURUWVBFKiBwQ29tcG9uZW50VVVJRCk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX1NlbmRDb21tYW5kIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2VuZENvbW1hbmQgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZW5kQ29tbWFuZCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DT01NQU5EVFlQRSBDbWQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBhcmFtMSwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX1BUUiBwQ21kRGF0YSk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFBhcmFtZXRlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIEdldFBhcmFtZXRlciBtZXRob2QuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkdldFBhcmFtZXRlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfSU5ERVhUWVBFIG5QYXJhbUluZGV4LCAgCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX1BUUiBwQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKKworCisgICAgLyoqIHJlZmVyIHRvIE9NWF9TZXRQYXJhbWV0ZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBTZXRQYXJhbWV0ZXIgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpTZXRQYXJhbWV0ZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCAKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9QVFIgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfR2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqR2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9QVFIgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSk7CisKKworICAgIC8qKiByZWZlciB0byBPTVhfU2V0Q29uZmlnIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgU2V0Q29uZmlnIG1ldGhvZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqU2V0Q29uZmlnKSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0lOREVYVFlQRSBuSW5kZXgsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldEV4dGVuc2lvbkluZGV4IGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0RXh0ZW5zaW9uSW5kZXggbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRFeHRlbnNpb25JbmRleCkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9TVFJJTkcgY1BhcmFtZXRlck5hbWUsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9JTkRFWFRZUEUqIHBJbmRleFR5cGUpOworCisKKyAgICAvKiogcmVmZXIgdG8gT01YX0dldFN0YXRlIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgR2V0U3RhdGUgbWV0aG9kLgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpHZXRTdGF0ZSkoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfT1VUIE9NWF9TVEFURVRZUEUqIHBTdGF0ZSk7CisKKyAgICAKKyAgICAvKiogVGhlIENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIHdpbGwgaW50ZXJhY3Qgd2l0aCBhbm90aGVyIE9NWAorICAgICAgICBjb21wb25lbnQgdG8gZGV0ZXJtaW5lIGlmIHR1bm5lbGluZyBpcyBwb3NzaWJsZSBhbmQgdG8gc2V0dXAgdGhlCisgICAgICAgIHR1bm5lbGluZy4gIFRoZSByZXR1cm4gY29kZXMgZm9yIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIAorICAgICAgICBkZXRlcm1pbmUgaWYgdHVubmVsaW5nIGlzIG5vdCBwb3NzaWJsZSwgb3IgaWYgdHVubmVsaW5nIGlzIG5vdAorICAgICAgICBzdXBwb3J0ZWQuICAKKyAgICAgICAgCisgICAgICAgIEJhc2UgcHJvZmlsZSBjb21wb25lbnRzIChpLmUuIG5vbi1pbnRlcm9wKSBkbyBub3Qgc3VwcG9ydCB0aGlzCisgICAgICAgIG1ldGhvZCBhbmQgc2hvdWxkIHJldHVybiBPTVhfRXJyb3JOb3RJbXBsZW1lbnRlZCAKKworICAgICAgICBUaGUgaW50ZXJvcCBwcm9maWxlIGNvbXBvbmVudCBNVVNUIHN1cHBvcnQgdHVubmVsaW5nIHRvIGFub3RoZXIgCisgICAgICAgIGludGVyb3AgcHJvZmlsZSBjb21wb25lbnQgd2l0aCBhIGNvbXBhdGlibGUgcG9ydCBwYXJhbWV0ZXJzLiAgCisgICAgICAgIEEgY29tcG9uZW50IG1heSBhbHNvIHN1cHBvcnQgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbi4KKyAgICAgICAgCisgICAgICAgIElmIHByb3ByaWV0YXJ5IGNvbW11bmljYXRpb24gaXMgc3VwcG9ydGVkIHRoZSBuZWdvdGlhdGlvbiBvZiAKKyAgICAgICAgcHJvcHJpZXRhcnkgY29tbXVuaWNhdGlvbiBpcyBkb25lIG91dHNpZGUgb2YgT01YIGluIGEgdmVuZG9yIAorICAgICAgICBzcGVjaWZpYyB3YXkuIEl0IGlzIG9ubHkgcmVxdWlyZWQgdGhhdCB0aGUgcHJvcGVyIHJlc3VsdCBiZSAKKyAgICAgICAgcmV0dXJuZWQgYW5kIHRoZSBkZXRhaWxzIG9mIGhvdyB0aGUgc2V0dXAgaXMgZG9uZSBpcyBsZWZ0IAorICAgICAgICB0byB0aGUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uLiAgCisgICAgCisgICAgICAgIFdoZW4gdGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuIG5Qb3J0IGluIGFuIG91dHB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBQb3B1bGF0ZSB0aGUgcFR1bm5lbFNldHVwIHN0cnVjdHVyZSB3aXRoIHRoZSBvdXRwdXQgcG9ydCdzIAorICAgICAgICAgICAgcmVxdWlyZW1lbnRzIGFuZCBjb25zdHJhaW50cyBmb3IgdGhlIHR1bm5lbC4KKworICAgICAgICBXaGVuIHRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbiBuUG9ydCBpbiBhbiBpbnB1dCBwb3J0LCB0aGUKKyAgICAgICAgY29tcG9uZW50IHdpbGw6CisgICAgICAgIDEuICBRdWVyeSB0aGUgbmVjZXNzYXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgb3V0cHV0IHBvcnQgdG8gCisgICAgICAgICAgICBkZXRlcm1pbmUgaWYgdGhlIHBvcnRzIGFyZSBjb21wYXRpYmxlIGZvciB0dW5uZWxpbmcKKyAgICAgICAgMi4gIElmIHRoZSBwb3J0cyBhcmUgY29tcGF0aWJsZSwgdGhlIGNvbXBvbmVudCBzaG91bGQgc3RvcmUKKyAgICAgICAgICAgIHRoZSB0dW5uZWwgc3RlcCBwcm92aWRlZCBieSB0aGUgb3V0cHV0IHBvcnQKKyAgICAgICAgMy4gIERldGVybWluZSB3aGljaCBwb3J0IChlaXRoZXIgaW5wdXQgb3Igb3V0cHV0KSBpcyB0aGUgYnVmZmVyCisgICAgICAgICAgICBzdXBwbGllciwgYW5kIGNhbGwgT01YX1NldFBhcmFtZXRlciBvbiB0aGUgb3V0cHV0IHBvcnQgdG8KKyAgICAgICAgICAgIGluZGljYXRlIHRoaXMgc2VsZWN0aW9uLgorICAgICAgICAKKyAgICAgICAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgICAgICBAcGFyYW0gW2luXSBoQ29tcAorICAgICAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0CisgICAgICAgICAgICBuUG9ydCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgcG9ydCBvbiB0aGUgY29tcG9uZW50IHRvIGJlIHVzZWQKKyAgICAgICAgICAgIGZvciB0dW5uZWxpbmcuCisgICAgICAgIEBwYXJhbSBbaW5dIGhUdW5uZWxlZENvbXAKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIHR1bm5lbCB3aXRoLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50IAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZC4gIFdoZW4KKyAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGlzIDB4MCB0aGUgY29tcG9uZW50IHNob3VsZCBzZXR1cCB0aGUgcG9ydCBmb3IKKyAgICAgICAgICAgIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBDbGllbnQuCisgICAgICAgIEBwYXJhbSBbaW5dIG5Qb3J0T3V0cHV0CisgICAgICAgICAgICBuUG9ydE91dHB1dCBpcyB1c2VkIGluZGljYXRlIHRoZSBwb3J0IHRoZSBjb21wb25lbnQgc2hvdWxkCisgICAgICAgICAgICB0dW5uZWwgd2l0aC4KKyAgICAgICAgQHBhcmFtIFtpbl0gcFR1bm5lbFNldHVwCisgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB0dW5uZWwgc2V0dXAgc3RydWN0dXJlLiAgV2hlbiBuUG9ydCBpcyBhbiBvdXRwdXQgcG9ydAorICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBzaG91bGQgcG9wdWxhdGUgdGhlIGZpZWxkcyBvZiB0aGlzIHN0cnVjdHVyZS4gIFdoZW4KKyAgICAgICAgICAgIFdoZW4gblBvcnQgaXMgYW4gaW5wdXQgcG9ydCB0aGUgY29tcG9uZW50IHNob3VsZCByZXZpZXcgdGhlIHNldHVwCisgICAgICAgICAgICBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdpdGggdGhlIG91dHB1dCBwb3J0LgorICAgICAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICBAaW5ncm91cCB0dW4KKyAgICAqLworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFR1bm5lbFJlcXVlc3QpKAorICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wLAorICAgICAgICBPTVhfSU4gIE9NWF9VMzIgblBvcnQsCisgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaFR1bm5lbGVkQ29tcCwKKyAgICAgICAgT01YX0lOICBPTVhfVTMyIG5UdW5uZWxlZFBvcnQsCisgICAgICAgIE9NWF9JTk9VVCAgT01YX1RVTk5FTFNFVFVQVFlQRSogcFR1bm5lbFNldHVwKTsgCisKKyAgICAvKiogcmVmZXIgdG8gT01YX1VzZUJ1ZmZlciBpbiBPTVhfY29yZS5oIG9yIHRoZSBPTVggSUwgCisgICAgICAgIHNwZWNpZmljYXRpb24gZm9yIGRldGFpbHMgb24gdGhlIFVzZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpVc2VCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU5PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqKiBwcEJ1ZmZlckhkciwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwUHJpdmF0ZSwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5TaXplQnl0ZXMsCisgICAgICAgICAgICBPTVhfSU4gT01YX1U4KiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfQWxsb2NhdGVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBBbGxvY2F0ZUJ1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpBbGxvY2F0ZUJ1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwKKyAgICAgICAgICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSoqIHBwQnVmZmVyLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblBvcnRJbmRleCwKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBQcml2YXRlLAorICAgICAgICAgICAgT01YX0lOIE9NWF9VMzIgblNpemVCeXRlcyk7CisKKyAgICAvKiogcmVmZXIgdG8gT01YX0ZyZWVCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGcmVlQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkZyZWVCdWZmZXIpKAorICAgICAgICAgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0SW5kZXgsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRW1wdHlUaGlzQnVmZmVyIGluIE9NWF9jb3JlLmggb3IgdGhlIE9NWCBJTCAKKyAgICAgICAgc3BlY2lmaWNhdGlvbiBmb3IgZGV0YWlscyBvbiB0aGUgRW1wdHlUaGlzQnVmZmVyIG1ldGhvZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkVtcHR5VGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiByZWZlciB0byBPTVhfRmlsbFRoaXNCdWZmZXIgaW4gT01YX2NvcmUuaCBvciB0aGUgT01YIElMIAorICAgICAgICBzcGVjaWZpY2F0aW9uIGZvciBkZXRhaWxzIG9uIHRoZSBGaWxsVGhpc0J1ZmZlciBtZXRob2QuCisgICAgICAgIEBpbmdyb3VwIGJ1ZgorICAgICAqLworICAgIE9NWF9FUlJPUlRZUEUgKCpGaWxsVGhpc0J1ZmZlcikoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiBUaGUgU2V0Q2FsbGJhY2tzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBjb3JlIHRvIHNwZWNpZnkgdGhlIGNhbGxiYWNrCisgICAgICAgIHN0cnVjdHVyZSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nCisgICAgICAgIGNhbGwuICBUaGUgY29tcG9uZW50IHdpbGwgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIFtpbl0gcENhbGxiYWNrcworICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQ0FMTEJBQ0tUWVBFIHN0cnVjdHVyZSB1c2VkIHRvIHByb3ZpZGUgdGhlIAorICAgICAgICAgICAgY2FsbGJhY2sgaW5mb3JtYXRpb24gdG8gdGhlIGNvbXBvbmVudAorICAgICAgICBAcGFyYW0gW2luXSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlLiAgSXQgaXMgYW50aWNpcGF0ZWQgdGhhdCAKKyAgICAgICAgICAgIHRoZSBhcHBsaWNhdGlvbiB3aWxsIHBhc3MgYSBwb2ludGVyIHRvIGEgZGF0YSBzdHJ1Y3R1cmUgb3IgYSAidGhpcworICAgICAgICAgICAgcG9pbnRlciIgaW4gdGhpcyBhcmVhIHRvIGFsbG93IHRoZSBjYWxsYmFjayAoaW4gdGhlIGFwcGxpY2F0aW9uKQorICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIHRoZSBjb250ZXh0IG9mIHRoZSBjYWxsCisgICAgICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKlNldENhbGxiYWNrcykoCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgICAgICBPTVhfSU4gIE9NWF9DQUxMQkFDS1RZUEUqIHBDYWxsYmFja3MsIAorICAgICAgICAgICAgT01YX0lOICBPTVhfUFRSIHBBcHBEYXRhKTsKKworICAgIC8qKiBDb21wb25lbnREZUluaXQgbWV0aG9kIGlzIHVzZWQgdG8gZGVpbml0aWFsaXplIHRoZSBjb21wb25lbnQKKyAgICAgICAgcHJvdmlkaW5nIGEgbWVhbnMgdG8gZnJlZSBhbnkgcmVzb3VyY2VzIGFsbG9jYXRlZCBhdCBjb21wb25lbnQKKyAgICAgICAgaW5pdGlhbGl6YXRpb24uICBOT1RFOiAgQWZ0ZXIgdGhpcyBjYWxsIHRoZSBjb21wb25lbnQgaGFuZGxlIGlzCisgICAgICAgIG5vdCB2YWxpZCBmb3IgZnVydGhlciB1c2UuCisgICAgICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBPTVhfRVJST1JUWVBFICgqQ29tcG9uZW50RGVJbml0KSgKKyAgICAgICAgICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCk7CisKKyAgICAvKiogQGluZ3JvdXAgYnVmICovCisgICAgT01YX0VSUk9SVFlQRSAoKlVzZUVHTEltYWdlKSgKKyAgICAgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICAgICAgT01YX0lOT1VUIE9NWF9CVUZGRVJIRUFERVJUWVBFKiogcHBCdWZmZXJIZHIsCisgICAgICAgICAgICBPTVhfSU4gT01YX1UzMiBuUG9ydEluZGV4LAorICAgICAgICAgICAgT01YX0lOIE9NWF9QVFIgcEFwcFByaXZhdGUsCisgICAgICAgICAgICBPTVhfSU4gdm9pZCogZWdsSW1hZ2UpOworCisgICAgT01YX0VSUk9SVFlQRSAoKkNvbXBvbmVudFJvbGVFbnVtKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisJCU9NWF9PVVQgT01YX1U4ICpjUm9sZSwKKwkJT01YX0lOIE9NWF9VMzIgbkluZGV4KTsKKworfSBPTVhfQ09NUE9ORU5UVFlQRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9Db250ZW50UGlwZS5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9Db250ZW50UGlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjMxMGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0NvbnRlbnRQaXBlLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIE9NWF9Db250ZW50UGlwZS5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIE9NWF9Db250ZW50UGlwZSBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgdXNlZCB0byBkZWZpbmUKKyAqICB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgY29udGVudCBwaXBsZXMuICBUaGlzIGhlYWRlciBmaWxlIGlzIGludGVuZGVkIHRvCisgKiAgYmUgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICovCisKKyNpZm5kZWYgT01YX0NPTlRFTlRQSVBFX0gKKyNkZWZpbmUgT01YX0NPTlRFTlRQSVBFX0gKKworI2lmbmRlZiBLRF9FQUNDRVMKKy8qIE9wZW5LT0RFIGVycm9yIGNvZGVzLiBDUFJlc3VsdCB2YWx1ZXMgbWF5IGJlIHplcm8gKGluZGljYXRpbmcgc3VjY2VzcworICAgb3Igb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzKSAqLworI2RlZmluZSBLRF9FQUNDRVMgKDEpCisjZGVmaW5lIEtEX0VBRERSSU5VU0UgKDIpCisjZGVmaW5lIEtEX0VBR0FJTiAoNSkKKyNkZWZpbmUgS0RfRUJBREYgKDcpCisjZGVmaW5lIEtEX0VCVVNZICg4KQorI2RlZmluZSBLRF9FQ09OTlJFRlVTRUQgKDkpCisjZGVmaW5lIEtEX0VDT05OUkVTRVQgKDEwKQorI2RlZmluZSBLRF9FREVBRExLICgxMSkKKyNkZWZpbmUgS0RfRURFU1RBRERSUkVRICgxMikKKyNkZWZpbmUgS0RfRVJBTkdFICgzNSkKKyNkZWZpbmUgS0RfRUVYSVNUICgxMykKKyNkZWZpbmUgS0RfRUZCSUcgKDE0KQorI2RlZmluZSBLRF9FSE9TVFVOUkVBQ0ggKDE1KQorI2RlZmluZSBLRF9FSU5WQUwgKDE3KQorI2RlZmluZSBLRF9FSU8gKDE4KQorI2RlZmluZSBLRF9FSVNDT05OICgyMCkKKyNkZWZpbmUgS0RfRUlTRElSICgyMSkKKyNkZWZpbmUgS0RfRU1GSUxFICgyMikKKyNkZWZpbmUgS0RfRU5BTUVUT09MT05HICgyMykKKyNkZWZpbmUgS0RfRU5PRU5UICgyNCkKKyNkZWZpbmUgS0RfRU5PTUVNICgyNSkKKyNkZWZpbmUgS0RfRU5PU1BDICgyNikKKyNkZWZpbmUgS0RfRU5PU1lTICgyNykKKyNkZWZpbmUgS0RfRU5PVENPTk4gKDI4KQorI2RlZmluZSBLRF9FUEVSTSAoMzMpCisjZGVmaW5lIEtEX0VUSU1FRE9VVCAoMzYpCisjZGVmaW5lIEtEX0VJTFNFUSAoMTkpCisjZW5kaWYKKworLyoqIE1hcCB0eXBlcyBmcm9tIE9NWCBzdGFuZGFyZCB0eXBlcyBvbmx5IGhlcmUgc28gaW50ZXJmYWNlIGlzIGFzIGdlbmVyaWMgYXMgcG9zc2libGUuICovCit0eXBlZGVmIE9NWF9VMzIgICAgQ1ByZXN1bHQ7Cit0eXBlZGVmIGNoYXIgKiAgICAgQ1BzdHJpbmc7ICAKK3R5cGVkZWYgdm9pZCAqICAgICBDUGhhbmRsZTsKK3R5cGVkZWYgT01YX1UzMiAgICBDUHVpbnQ7Cit0eXBlZGVmIE9NWF9TMzIgICAgQ1BpbnQ7ICAKK3R5cGVkZWYgY2hhciAgICAgICBDUGJ5dGU7ICAKK3R5cGVkZWYgT01YX0JPT0wgICBDUGJvb2w7CisKKy8qKiBlbnVtZXJhdGlvbiBvZiBvcmlnaW4gdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBTZWVrIGZ1bmN0aW9uIAorICogQGluZ3JvdXAgY3AKKyAqLwordHlwZWRlZiBlbnVtIENQX09SSUdJTlRZUEUgeworICAgIENQX09yaWdpbkJlZ2luLCAgICAgIAorICAgIENQX09yaWdpbkN1ciwgICAgICAKKyAgICBDUF9PcmlnaW5FbmQsICAgICAgCisgICAgQ1BfT3JpZ2luS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIENQX09yaWdpblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgQ1BfT3JpZ2luTWF4ID0gMFg3RkZGRkZGRgorfSBDUF9PUklHSU5UWVBFOworCisvKiogZW51bWVyYXRpb24gb2YgY29udGFjdCBhY2Nlc3MgdHlwZXMgdXNlZCBpbiB0aGUgQ1BfUElQRVRZUEUncyBPcGVuIGZ1bmN0aW9uIAorICogQGluZ3JvdXAgY3AKKyAqLwordHlwZWRlZiBlbnVtIENQX0FDQ0VTU1RZUEUgeworICAgIENQX0FjY2Vzc1JlYWQsICAgICAgCisgICAgQ1BfQWNjZXNzV3JpdGUsICAKKyAgICBDUF9BY2Nlc3NSZWFkV3JpdGUgLCAgCisgICAgQ1BfQWNjZXNzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIENQX0FjY2Vzc1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgQ1BfQWNjZXNzTWF4ID0gMFg3RkZGRkZGRgorfSBDUF9BQ0NFU1NUWVBFOworCisvKiogZW51bWVyYXRpb24gb2YgcmVzdWx0cyByZXR1cm5lZCBieSB0aGUgQ1BfUElQRVRZUEUncyBDaGVja0F2YWlsYWJsZUJ5dGVzIGZ1bmN0aW9uIAorICogQGluZ3JvdXAgY3AKKyAqLwordHlwZWRlZiBlbnVtIENQX0NIRUNLQllURVNSRVNVTFRUWVBFCit7CisgICAgQ1BfQ2hlY2tCeXRlc09rLCAgICAgICAgICAgICAgICAgICAgLyoqPCBUaGVyZSBhcmUgYXQgbGVhc3QgdGhlIHJlcXVlc3QgbnVtYmVyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIGJ5dGVzIGF2YWlsYWJsZSAqLworICAgIENQX0NoZWNrQnl0ZXNOb3RSZWFkeSwgICAgICAgICAgICAgIC8qKjwgVGhlIHBpcGUgaXMgc3RpbGwgcmV0cmlldmluZyBieXRlcyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJlc2VudGx5IGxhY2tzIHN1ZmZpY2llbnQgYnl0ZXMuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZXkgYXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1ZmZpY2llbnQgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gKi8KKyAgICBDUF9DaGVja0J5dGVzSW5zdWZmaWNpZW50Qnl0ZXMgICwgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJldHJpZXZlZCBhbGwgYnl0ZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRob3NlIGF2YWlsYWJsZSBhcmUgbGVzcyB0aGFuIHRob3NlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZCAqLworICAgIENQX0NoZWNrQnl0ZXNBdEVuZE9mU3RyZWFtLCAgICAgICAgIC8qKjwgVGhlIHBpcGUgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlLiAqLworICAgIENQX0NoZWNrQnl0ZXNPdXRPZkJ1ZmZlcnMsICAgICAgICAgIC8qKjwgQWxsIHJlYWQvd3JpdGUgYnVmZmVycyBhcmUgY3VycmVudGx5IGluIHVzZS4gKi8KKyAgICBDUF9DaGVja0J5dGVzS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIENQX0NoZWNrQnl0ZXNWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIENQX0NoZWNrQnl0ZXNNYXggPSAwWDdGRkZGRkZGCit9IENQX0NIRUNLQllURVNSRVNVTFRUWVBFOworCisvKiogZW51bWVyYXRpb24gb2YgY29udGVudCBwaXBlIGV2ZW50cyBzZW50IHRvIHRoZSBjbGllbnQgY2FsbGJhY2suIAorICogQGluZ3JvdXAgY3AKKyAqLwordHlwZWRlZiBlbnVtIENQX0VWRU5UVFlQRXsKKyAgICBDUF9CeXRlc0F2YWlsYWJsZSwgICAgICAJICAgIC8qKiBieXRlcyByZXF1ZXN0ZWQgaW4gYSBDaGVja0F2YWlsYWJsZUJ5dGVzIGNhbGwgYXJlIG5vdyBhdmFpbGFibGUqLworICAgIENQX092ZXJmbG93LCAgCQkgICAgICAgICAgIC8qKiBlbnVtZXJhdGlvbiBvZiBjb250ZW50IHBpcGUgZXZlbnRzIHNlbnQgdG8gdGhlIGNsaWVudCBjYWxsYmFjayovCisgICAgQ1BfUGlwZURpc2Nvbm5lY3RlZCAgLCAgCQkgICAgLyoqIGVudW1lcmF0aW9uIG9mIGNvbnRlbnQgcGlwZSBldmVudHMgc2VudCB0byB0aGUgY2xpZW50IGNhbGxiYWNrKi8KKyAgICBDUF9FdmVudEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBDUF9FdmVudFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgQ1BfRXZlbnRNYXggPSAwWDdGRkZGRkZGCit9IENQX0VWRU5UVFlQRTsKKworLyoqIGNvbnRlbnQgcGlwZSBkZWZpbml0aW9uIAorICogQGluZ3JvdXAgY3AKKyAqLwordHlwZWRlZiBzdHJ1Y3QgQ1BfUElQRVRZUEUKK3sKKyAgICAvKiogT3BlbiBhIGNvbnRlbnQgc3RyZWFtIGZvciByZWFkaW5nIG9yIHdyaXRpbmcuICovIAorICAgIENQcmVzdWx0ICgqT3BlbikoIENQaGFuZGxlKiBoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkksIENQX0FDQ0VTU1RZUEUgZUFjY2VzcyApOworCisgICAgLyoqIENsb3NlIGEgY29udGVudCBzdHJlYW0uICovIAorICAgIENQcmVzdWx0ICgqQ2xvc2UpKCBDUGhhbmRsZSBoQ29udGVudCApOworCisgICAgLyoqIENyZWF0ZSBhIGNvbnRlbnQgc291cmNlIGFuZCBvcGVuIGl0IGZvciB3cml0aW5nLiAqLyAKKyAgICBDUHJlc3VsdCAoKkNyZWF0ZSkoIENQaGFuZGxlICpoQ29udGVudCwgQ1BzdHJpbmcgc3pVUkkgKTsKKworICAgIC8qKiBDaGVjayB0aGUgdGhhdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHJlYWRpbmcgb3Igd3JpdGluZyAoZGVwZW5kaW5nIG9uIGFjY2VzcyB0eXBlKS4qLworICAgIENQcmVzdWx0ICgqQ2hlY2tBdmFpbGFibGVCeXRlcykoIENQaGFuZGxlIGhDb250ZW50LCBDUHVpbnQgbkJ5dGVzUmVxdWVzdGVkLCBDUF9DSEVDS0JZVEVTUkVTVUxUVFlQRSAqZVJlc3VsdCApOworCisgICAgLyoqIFNlZWsgdG8gY2VydGFpbiBwb3NpdGlvbiBpbiB0aGUgY29udGVudCByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIG9yaWdpbi4gKi8KKyAgICBDUHJlc3VsdCAoKlNldFBvc2l0aW9uKSggQ1BoYW5kbGUgIGhDb250ZW50LCBDUGludCBuT2Zmc2V0LCBDUF9PUklHSU5UWVBFIGVPcmlnaW4pOworCisgICAgLyoqIFJldHJpZXZlIHRoZSBjdXJyZW50IHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgY29udGVudC4gKi8KKyAgICBDUHJlc3VsdCAoKkdldFBvc2l0aW9uKSggQ1BoYW5kbGUgaENvbnRlbnQsIENQdWludCAqcFBvc2l0aW9uKTsKKworICAgIC8qKiBSZXRyaWV2ZSBkYXRhIG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBmcm9tIHRoZSBjb250ZW50IHN0cmVhbSAoYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgc2l6ZSBvZiBkYXRhKS4KKyAgICAgICBOb3RlOiBwaXBlIGNsaWVudCBwcm92aWRlcyBwb2ludGVyLiBUaGlzIGZ1bmN0aW9uIGlzIGFwcHJvcHJpYXRlIGZvciBzbWFsbCBoaWdoIGZyZXF1ZW5jeSByZWFkcy4gKi8KKyAgICBDUHJlc3VsdCAoKlJlYWQpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwRGF0YSwgQ1B1aW50IG5TaXplKTsgCisKKyAgICAvKiogUmV0cmlldmUgYSBidWZmZXIgYWxsb2NhdGVkIGJ5IHRoZSBwaXBlIHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBudW1iZXIgb2YgYnl0ZXMuIAorICAgICAgIEJ1ZmZlciBjb250YWlucyB0aGUgbmV4dCBibG9jayBvZiBieXRlcywgYXMgc3BlY2lmaWVkIGJ5IG5TaXplLCBvZiB0aGUgY29udGVudC4gblNpemUgYWxzbworICAgICAgIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGJsb2NrIGFjdHVhbGx5IHJlYWQuIENvbnRlbnQgcG9pbnRlciBhZHZhbmNlcyB0aGUgYnkgdGhlIHJldHVybmVkIHNpemUuIAorICAgICAgIE5vdGU6IHBpcGUgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3IgbGFyZ2UgcmVhZHMuIFRoZSBjbGllbnQgbXVzdCBjYWxsIAorICAgICAgIFJlbGVhc2VSZWFkQnVmZmVyIHdoZW4gZG9uZSB3aXRoIGJ1ZmZlci4gCisKKyAgICAgICBJbiBzb21lIGNhc2VzIHRoZSByZXF1ZXN0ZWQgYmxvY2sgbWF5IG5vdCByZXNpZGUgaW4gY29udGlndW91cyBtZW1vcnkgd2l0aGluIHRoZQorICAgICAgIHBpcGUgaW1wbGVtZW50YXRpb24uIEZvciBpbnN0YW5jZSBpZiB0aGUgcGlwZSBsZXZlcmFnZXMgYSBjaXJjdWxhciBidWZmZXIgdGhlbiB0aGUgcmVxdWVzdGVkIAorICAgICAgIGJsb2NrIG1heSBzdHJhZGRsZSB0aGUgYm91bmRhcnkgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlci4gQnkgZGVmYXVsdCBhIHBpcGUgaW1wbGVtZW50YXRpb24gCisgICAgICAgcGVyZm9ybXMgYSBjb3B5IGluIHRoaXMgY2FzZSB0byBwcm92aWRlIHRoZSBibG9jayB0byB0aGUgcGlwZSBjbGllbnQgaW4gb25lIGNvbnRpZ3VvdXMgYnVmZmVyLgorICAgICAgIElmLCBob3dldmVyLCB0aGUgY2xpZW50IHNldHMgYkZvcmJpZENvcHksIHRoZW4gdGhlIHBpcGUgcmV0dXJucyBvbmx5IHRob3NlIGJ5dGVzIHByZWNlZGluZyB0aGUgbWVtb3J5IAorICAgICAgIGJvdW5kYXJ5LiBIZXJlIHRoZSBjbGllbnQgbWF5IHJldHJpZXZlIHRoZSBkYXRhIGluIHNlZ21lbnRzIG92ZXIgc3VjY2Vzc2l2ZSBjYWxscy4gKi8KKyAgICBDUHJlc3VsdCAoKlJlYWRCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCAqblNpemUsIENQYm9vbCBiRm9yYmlkQ29weSk7CisKKyAgICAvKiogUmVsZWFzZSBhIGJ1ZmZlciBvYnRhaW5lZCBieSBSZWFkQnVmZmVyIGJhY2sgdG8gdGhlIHBpcGUuICovCisgICAgQ1ByZXN1bHQgKCpSZWxlYXNlUmVhZEJ1ZmZlcikoQ1BoYW5kbGUgaENvbnRlbnQsIENQYnl0ZSAqcEJ1ZmZlcik7CisKKyAgICAvKiogV3JpdGUgZGF0YSBvZiB0aGUgc3BlY2lmaWVkIHNpemUgdG8gdGhlIGNvbnRlbnQgKGFkdmFuY2UgY29udGVudCBwb2ludGVyIGJ5IHNpemUgb2YgZGF0YSkuCisgICAgICAgTm90ZTogcGlwZSBjbGllbnQgcHJvdmlkZXMgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBpcyBhcHByb3ByaWF0ZSBmb3Igc21hbGwgaGlnaCBmcmVxdWVuY3kgd3JpdGVzLiAqLworICAgIENQcmVzdWx0ICgqV3JpdGUpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpkYXRhLCBDUHVpbnQgblNpemUpOyAKKworICAgIC8qKiBSZXRyaWV2ZSBhIGJ1ZmZlciBhbGxvY2F0ZWQgYnkgdGhlIHBpcGUgdXNlZCB0byB3cml0ZSBkYXRhIHRvIHRoZSBjb250ZW50LiAKKyAgICAgICBDbGllbnQgd2lsbCBmaWxsIGJ1ZmZlciB3aXRoIG91dHB1dCBkYXRhLiBOb3RlOiBwaXBlIHByb3ZpZGVzIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gaXMgYXBwcm9wcmlhdGUKKyAgICAgICBmb3IgbGFyZ2Ugd3JpdGVzLiBUaGUgY2xpZW50IG11c3QgY2FsbCBXcml0ZUJ1ZmZlciB3aGVuIGRvbmUgaXQgaGFzIGZpbGxlZCB0aGUgYnVmZmVyIHdpdGggZGF0YS4qLworICAgIENQcmVzdWx0ICgqR2V0V3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICoqcHBCdWZmZXIsIENQdWludCBuU2l6ZSk7CisKKyAgICAvKiogRGVsaXZlciBhIGJ1ZmZlciBvYnRhaW5lZCB2aWEgR2V0V3JpdGVCdWZmZXIgdG8gdGhlIHBpcGUuIFBpcGUgd2lsbCB3cml0ZSB0aGUgCisgICAgICAgdGhlIGNvbnRlbnRzIG9mIHRoZSBidWZmZXIgdG8gY29udGVudCBhbmQgYWR2YW5jZSBjb250ZW50IHBvaW50ZXIgYnkgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciAqLworICAgIENQcmVzdWx0ICgqV3JpdGVCdWZmZXIpKCBDUGhhbmRsZSBoQ29udGVudCwgQ1BieXRlICpwQnVmZmVyLCBDUHVpbnQgbkZpbGxlZFNpemUpOworCisgICAgLyoqIFJlZ2lzdGVyIGEgcGVyLWhhbmRsZSBjbGllbnQgY2FsbGJhY2sgd2l0aCB0aGUgY29udGVudCBwaXBlLiAqLworICAgIENQcmVzdWx0ICgqUmVnaXN0ZXJDYWxsYmFjaykoIENQaGFuZGxlIGhDb250ZW50LCBDUHJlc3VsdCAoKkNsaWVudENhbGxiYWNrKShDUF9FVkVOVFRZUEUgZUV2ZW50LCBDUHVpbnQgaVBhcmFtKSk7CisKK30gQ1BfUElQRVRZUEU7CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0NvcmUuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfQ29yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNzZmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0NvcmUuaApAQCAtMCwwICsxLDE0MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIE9NWF9Db3JlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgT01YX0NvcmUgaGVhZGVyIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb25zIHVzZWQgYnkgYm90aCB0aGUKKyAqICBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MgY29tbW9uIGl0ZW1zLgorICovCisKKyNpZm5kZWYgT01YX0NvcmVfaAorI2RlZmluZSBPTVhfQ29yZV9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgc2hhbGwgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfSW5kZXguaD4KKworCisvKiogVGhlIE9NWF9DT01NQU5EVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGFjdGlvbiBpbiB0aGUKKyAqICBPTVhfU2VuZENvbW1hbmQgbWFjcm8uICAKKyAqICBAaW5ncm91cCBjb3JlCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09NTUFORFRZUEUKK3sKKyAgICBPTVhfQ29tbWFuZFN0YXRlU2V0LCAgICAvKio8IENoYW5nZSB0aGUgY29tcG9uZW50IHN0YXRlICovCisgICAgT01YX0NvbW1hbmRGbHVzaCwgICAgICAgLyoqPCBGbHVzaCB0aGUgZGF0YSBxdWV1ZShzKSBvZiBhIGNvbXBvbmVudCAqLworICAgIE9NWF9Db21tYW5kUG9ydERpc2FibGUsIC8qKjwgRGlzYWJsZSBhIHBvcnQgb24gYSBjb21wb25lbnQuICovCisgICAgT01YX0NvbW1hbmRQb3J0RW5hYmxlLCAgLyoqPCBFbmFibGUgYSBwb3J0IG9uIGEgY29tcG9uZW50LiAqLworICAgIE9NWF9Db21tYW5kTWFya0J1ZmZlciwgIC8qKjwgTWFyayBhIGNvbXBvbmVudC9idWZmZXIgZm9yIG9ic2VydmF0aW9uICovCisgICAgT01YX0NvbW1hbmRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0NvbW1hbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Db21tYW5kTWF4ID0gMFg3RkZGRkZGRgorfSBPTVhfQ09NTUFORFRZUEU7CisKKworCisvKiogVGhlIE9NWF9TVEFURVRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSBvciBjaGFuZ2UgdGhlIGNvbXBvbmVudAorICogIHN0YXRlLiAgVGhpcyBlbnVtZXJhdGlvbiByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgY29tcG9uZW50IHdoZW4KKyAqICB1c2VkIHdpdGggdGhlIE9NWF9HZXRTdGF0ZSBtYWNybyBvciBiZWNvbWVzIHRoZSBwYXJhbWV0ZXIgaW4gYSBzdGF0ZSBjaGFuZ2UKKyAqICBjb21tYW5kIHdoZW4gdXNlZCB3aXRoIHRoZSBPTVhfU2VuZENvbW1hbmQgbWFjcm8uCisgKgorICogIFRoZSBjb21wb25lbnQgd2lsbCBiZSBpbiB0aGUgTG9hZGVkIHN0YXRlIGFmdGVyIHRoZSBjb21wb25lbnQgaXMgaW5pdGlhbGx5CisgKiAgbG9hZGVkIGludG8gbWVtb3J5LiAgSW4gdGhlIExvYWRlZCBzdGF0ZSwgdGhlIGNvbXBvbmVudCBpcyBub3QgYWxsb3dlZCB0bworICogIGFsbG9jYXRlIG9yIGhvbGQgcmVzb3VyY2VzIG90aGVyIHRoYW4gdG8gYnVpbGQgaXQncyBpbnRlcm5hbCBwYXJhbWV0ZXIKKyAqICBhbmQgY29uZmlndXJhdGlvbiB0YWJsZXMuICBUaGUgYXBwbGljYXRpb24gd2lsbCBzZW5kIG9uZSBvciBtb3JlCisgKiAgU2V0UGFyYW1ldGVycy9HZXRQYXJhbWV0ZXJzIGFuZCBTZXRDb25maWcvR2V0Q29uZmlnIGNvbW1hbmRzIHRvIHRoZQorICogIGNvbXBvbmVudCBhbmQgdGhlIGNvbXBvbmVudCB3aWxsIHJlY29yZCBlYWNoIG9mIHRoZXNlIHBhcmFtZXRlciBhbmQKKyAqICBjb25maWd1cmF0aW9uIGNoYW5nZXMgZm9yIHVzZSBsYXRlci4gIFdoZW4gdGhlIGFwcGxpY2F0aW9uIHNlbmRzIHRoZQorICogIElkbGUgY29tbWFuZCwgdGhlIGNvbXBvbmVudCB3aWxsIGFjcXVpcmUgdGhlIHJlc291cmNlcyBuZWVkZWQgZm9yIHRoZQorICogIHNwZWNpZmllZCBjb25maWd1cmF0aW9uIGFuZCB3aWxsIHRyYW5zaXRpb24gdG8gdGhlIGlkbGUgc3RhdGUgaWYgdGhlCisgKiAgYWxsb2NhdGlvbiBpcyBzdWNjZXNzZnVsLiAgSWYgdGhlIGNvbXBvbmVudCBjYW5ub3Qgc3VjY2Vzc2Z1bGx5CisgKiAgdHJhbnNpdGlvbiB0byB0aGUgaWRsZSBzdGF0ZSBmb3IgYW55IHJlYXNvbiwgdGhlIHN0YXRlIG9mIHRoZSBjb21wb25lbnQKKyAqICBzaGFsbCBiZSBmdWxseSByb2xsZWQgYmFjayB0byB0aGUgTG9hZGVkIHN0YXRlIChlLmcuIGFsbCBhbGxvY2F0ZWQgCisgKiAgcmVzb3VyY2VzIHNoYWxsIGJlIHJlbGVhc2VkKS4gIFdoZW4gdGhlIGNvbXBvbmVudCByZWNlaXZlcyB0aGUgY29tbWFuZAorICogIHRvIGdvIHRvIHRoZSBFeGVjdXRpbmcgc3RhdGUsIGl0IHNoYWxsIGJlZ2luIHByb2Nlc3NpbmcgYnVmZmVycyBieQorICogIHNlbmRpbmcgYWxsIGlucHV0IGJ1ZmZlcnMgaXQgaG9sZHMgdG8gdGhlIGFwcGxpY2F0aW9uLiAgV2hpbGUKKyAqICB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBJZGxlIHN0YXRlLCB0aGUgYXBwbGljYXRpb24gbWF5IGFsc28gc2VuZCB0aGUKKyAqICBQYXVzZSBjb21tYW5kLiAgSWYgdGhlIGNvbXBvbmVudCByZWNlaXZlcyB0aGUgcGF1c2UgY29tbWFuZCB3aGlsZSBpbiB0aGUKKyAqICBJZGxlIHN0YXRlLCB0aGUgY29tcG9uZW50IHNoYWxsIHNlbmQgYWxsIGlucHV0IGJ1ZmZlcnMgaXQgaG9sZHMgdG8gdGhlIAorICogIGFwcGxpY2F0aW9uLCBidXQgc2hhbGwgbm90IGJlZ2luIHByb2Nlc3NpbmcgYnVmZmVycy4gIFRoaXMgd2lsbCBhbGxvdyB0aGUKKyAqICBhcHBsaWNhdGlvbiB0byBwcmVmaWxsIGJ1ZmZlcnMuCisgKiAKKyAqICBAaW5ncm91cCBjb21wCisgKi8KKwordHlwZWRlZiBlbnVtIE9NWF9TVEFURVRZUEUKK3sKKyAgICBPTVhfU3RhdGVJbnZhbGlkLCAgICAgIC8qKjwgY29tcG9uZW50IGhhcyBkZXRlY3RlZCB0aGF0IGl0J3MgaW50ZXJuYWwgZGF0YSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJlcyBhcmUgY29ycnVwdGVkIHRvIHRoZSBwb2ludCB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbm5vdCBkZXRlcm1pbmUgaXQncyBzdGF0ZSBwcm9wZXJseSAqLworICAgIE9NWF9TdGF0ZUxvYWRlZCwgICAgICAvKio8IGNvbXBvbmVudCBoYXMgYmVlbiBsb2FkZWQgYnV0IGhhcyBub3QgY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uLiAgVGhlIE9NWF9TZXRQYXJhbWV0ZXIgbWFjcm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBPTVhfR2V0UGFyYW1ldGVyIG1hY3JvIGFyZSB0aGUgb25seSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgbWFjcm9zIGFsbG93ZWQgdG8gYmUgc2VudCB0byB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCBpbiB0aGlzIHN0YXRlLiAqLworICAgIE9NWF9TdGF0ZUlkbGUsICAgICAgICAvKio8IGNvbXBvbmVudCBpbml0aWFsaXphdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IGFuZCB0aGUgY29tcG9uZW50IGlzIHJlYWR5IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0YXJ0LiAqLworICAgIE9NWF9TdGF0ZUV4ZWN1dGluZywgICAvKio8IGNvbXBvbmVudCBoYXMgYWNjZXB0ZWQgdGhlIHN0YXJ0IGNvbW1hbmQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHByb2Nlc3NpbmcgZGF0YSAoaWYgZGF0YSBpcyBhdmFpbGFibGUpICovCisgICAgT01YX1N0YXRlUGF1c2UsICAgICAgIC8qKjwgY29tcG9uZW50IGhhcyByZWNlaXZlZCBwYXVzZSBjb21tYW5kICovCisgICAgT01YX1N0YXRlV2FpdEZvclJlc291cmNlcywgLyoqPCBjb21wb25lbnQgaXMgd2FpdGluZyBmb3IgcmVzb3VyY2VzLCBlaXRoZXIgYWZ0ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWVtcHRpb24gb3IgYmVmb3JlIGl0IGdldHMgdGhlIHJlc291cmNlcyByZXF1ZXN0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSBzcGVjaWZpY2F0aW9uIGZvciBjb21wbGV0ZSBkZXRhaWxzLiAqLworICAgIE9NWF9TdGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfU3RhdGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9TdGF0ZU1heCA9IDBYN0ZGRkZGRkYKK30gT01YX1NUQVRFVFlQRTsKKworLyoqIFRoZSBPTVhfRVJST1JUWVBFIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHN0YW5kYXJkIE9NWCBFcnJvcnMuICBUaGVzZSAKKyAqICBlcnJvcnMgc2hvdWxkIGNvdmVyIG1vc3Qgb2YgdGhlIGNvbW1vbiBmYWlsdXJlIGNhc2VzLiAgSG93ZXZlciwgCisgKiAgdmVuZG9ycyBhcmUgZnJlZSB0byBhZGQgYWRkaXRpb25hbCBlcnJvciBtZXNzYWdlcyBvZiB0aGVpciBvd24gYXMgCisgKiAgbG9uZyBhcyB0aGV5IGZvbGxvdyB0aGVzZSBydWxlczoKKyAqICAxLiAgVmVuZG9yIGVycm9yIG1lc3NhZ2VzIHNoYWxsIGJlIGluIHRoZSByYW5nZSBvZiAweDkwMDAwMDAwIHRvCisgKiAgICAgIDB4OTAwMEZGRkYuCisgKiAgMi4gIFZlbmRvciBlcnJvciBtZXNzYWdlcyBzaGFsbCBiZSBkZWZpbmVkIGluIGEgaGVhZGVyIGZpbGUgcHJvdmlkZWQKKyAqICAgICAgd2l0aCB0aGUgY29tcG9uZW50LiAgTm8gZXJyb3IgbWVzc2FnZXMgYXJlIGFsbG93ZWQgdGhhdCBhcmUKKyAqICAgICAgbm90IGRlZmluZWQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRVJST1JUWVBFCit7CisgIE9NWF9FcnJvck5vbmUgPSAwLAorCisgIC8qKiBUaGVyZSB3ZXJlIGluc3VmZmljaWVudCByZXNvdXJjZXMgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLworICBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXMgPSAoT01YX1MzMikgMHg4MDAwMTAwMCwKKworICAvKiogVGhlcmUgd2FzIGFuIGVycm9yLCBidXQgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZCAqLworICBPTVhfRXJyb3JVbmRlZmluZWQgPSAoT01YX1MzMikgMHg4MDAwMTAwMSwKKworICAvKiogVGhlIGNvbXBvbmVudCBuYW1lIHN0cmluZyB3YXMgbm90IHZhbGlkICovCisgIE9NWF9FcnJvckludmFsaWRDb21wb25lbnROYW1lID0gKE9NWF9TMzIpIDB4ODAwMDEwMDIsCisKKyAgLyoqIE5vIGNvbXBvbmVudCB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBzdHJpbmcgd2FzIGZvdW5kICovCisgIE9NWF9FcnJvckNvbXBvbmVudE5vdEZvdW5kID0gKE9NWF9TMzIpIDB4ODAwMDEwMDMsCisKKyAgLyoqIFRoZSBjb21wb25lbnQgc3BlY2lmaWVkIGRpZCBub3QgaGF2ZSBhICJPTVhfQ29tcG9uZW50SW5pdCIgb3IKKyAgICAgICJPTVhfQ29tcG9uZW50RGVJbml0IGVudHJ5IHBvaW50ICovCisgIE9NWF9FcnJvckludmFsaWRDb21wb25lbnQgPSAoT01YX1MzMikgMHg4MDAwMTAwNCwKKworICAvKiogT25lIG9yIG1vcmUgcGFyYW1ldGVycyB3ZXJlIG5vdCB2YWxpZCAqLworICBPTVhfRXJyb3JCYWRQYXJhbWV0ZXIgPSAoT01YX1MzMikgMHg4MDAwMTAwNSwKKworICAvKiogVGhlIHJlcXVlc3RlZCBmdW5jdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQgKi8KKyAgT01YX0Vycm9yTm90SW1wbGVtZW50ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAwNiwKKworICAvKiogVGhlIGJ1ZmZlciB3YXMgZW1wdGllZCBiZWZvcmUgdGhlIG5leHQgYnVmZmVyIHdhcyByZWFkeSAqLworICBPTVhfRXJyb3JVbmRlcmZsb3cgPSAoT01YX1MzMikgMHg4MDAwMTAwNywKKworICAvKiogVGhlIGJ1ZmZlciB3YXMgbm90IGF2YWlsYWJsZSB3aGVuIGl0IHdhcyBuZWVkZWQgKi8KKyAgT01YX0Vycm9yT3ZlcmZsb3cgPSAoT01YX1MzMikgMHg4MDAwMTAwOCwKKworICAvKiogVGhlIGhhcmR3YXJlIGZhaWxlZCB0byByZXNwb25kIGFzIGV4cGVjdGVkICovCisgIE9NWF9FcnJvckhhcmR3YXJlID0gKE9NWF9TMzIpIDB4ODAwMDEwMDksCisKKyAgLyoqIFRoZSBjb21wb25lbnQgaXMgaW4gdGhlIHN0YXRlIE9NWF9TdGF0ZUludmFsaWQgKi8KKyAgT01YX0Vycm9ySW52YWxpZFN0YXRlID0gKE9NWF9TMzIpIDB4ODAwMDEwMEEsCisKKyAgLyoqIFN0cmVhbSBpcyBmb3VuZCB0byBiZSBjb3JydXB0ICovCisgIE9NWF9FcnJvclN0cmVhbUNvcnJ1cHQgPSAoT01YX1MzMikgMHg4MDAwMTAwQiwKKworICAvKiogUG9ydHMgYmVpbmcgY29ubmVjdGVkIGFyZSBub3QgY29tcGF0aWJsZSAqLworICBPTVhfRXJyb3JQb3J0c05vdENvbXBhdGlibGUgPSAoT01YX1MzMikgMHg4MDAwMTAwQywKKworICAvKiogUmVzb3VyY2VzIGFsbG9jYXRlZCB0byBhbiBpZGxlIGNvbXBvbmVudCBoYXZlIGJlZW4KKyAgICAgIGxvc3QgcmVzdWx0aW5nIGluIHRoZSBjb21wb25lbnQgcmV0dXJuaW5nIHRvIHRoZSBsb2FkZWQgc3RhdGUgKi8KKyAgT01YX0Vycm9yUmVzb3VyY2VzTG9zdCA9IChPTVhfUzMyKSAweDgwMDAxMDBELAorCisgIC8qKiBObyBtb3JlIGluZGljaWVzIGNhbiBiZSBlbnVtZXJhdGVkICovCisgIE9NWF9FcnJvck5vTW9yZSA9IChPTVhfUzMyKSAweDgwMDAxMDBFLAorCisgIC8qKiBUaGUgY29tcG9uZW50IGRldGVjdGVkIGEgdmVyc2lvbiBtaXNtYXRjaCAqLworICBPTVhfRXJyb3JWZXJzaW9uTWlzbWF0Y2ggPSAoT01YX1MzMikgMHg4MDAwMTAwRiwKKworICAvKiogVGhlIGNvbXBvbmVudCBpcyBub3QgcmVhZHkgdG8gcmV0dXJuIGRhdGEgYXQgdGhpcyB0aW1lICovCisgIE9NWF9FcnJvck5vdFJlYWR5ID0gKE9NWF9TMzIpIDB4ODAwMDEwMTAsCisKKyAgLyoqIFRoZXJlIHdhcyBhIHRpbWVvdXQgdGhhdCBvY2N1cnJlZCAqLworICBPTVhfRXJyb3JUaW1lb3V0ID0gKE9NWF9TMzIpIDB4ODAwMDEwMTEsCisKKyAgLyoqIFRoaXMgZXJyb3Igb2NjdXJzIHdoZW4gdHJ5aW5nIHRvIHRyYW5zaXRpb24gaW50byB0aGUgc3RhdGUgeW91IGFyZSBhbHJlYWR5IGluICovCisgIE9NWF9FcnJvclNhbWVTdGF0ZSA9IChPTVhfUzMyKSAweDgwMDAxMDEyLAorCisgIC8qKiBSZXNvdXJjZXMgYWxsb2NhdGVkIHRvIGFuIGV4ZWN1dGluZyBvciBwYXVzZWQgY29tcG9uZW50IGhhdmUgYmVlbiAKKyAgICAgIHByZWVtcHRlZCwgY2F1c2luZyB0aGUgY29tcG9uZW50IHRvIHJldHVybiB0byB0aGUgaWRsZSBzdGF0ZSAqLworICBPTVhfRXJyb3JSZXNvdXJjZXNQcmVlbXB0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAxMywgCisKKyAgLyoqIEEgbm9uLXN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCisgICAgICBkdXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYnVmZmVycyAob24gYSB0cmFuc2l0aW9uIGZyb20gdGhlIExPQURFRCB0byB0aGUgSURMRSBzdGF0ZSBvcgorICAgICAgb24gYSBwb3J0IHJlc3RhcnQpIHdoZW4gaXQgZGVlbXMgdGhhdCBpdCBoYXMgd2FpdGVkIGFuIHVudXN1YWxseSBsb25nIHRpbWUgZm9yIHRoZSBzdXBwbGllciAKKyAgICAgIHRvIHNlbmQgaXQgYW4gYWxsb2NhdGVkIGJ1ZmZlciB2aWEgYSBVc2VCdWZmZXIgY2FsbC4gKi8KKyAgT01YX0Vycm9yUG9ydFVucmVzcG9uc2l2ZUR1cmluZ0FsbG9jYXRpb24gPSAoT01YX1MzMikgMHg4MDAwMTAxNCwKKworICAvKiogQSBub24tc3VwcGxpZXIgcG9ydCBzZW5kcyB0aGlzIGVycm9yIHRvIHRoZSBJTCBjbGllbnQgKHZpYSB0aGUgRXZlbnRIYW5kbGVyIGNhbGxiYWNrKSAKKyAgICAgIGR1cmluZyB0aGUgZGVhbGxvY2F0aW9uIG9mIGJ1ZmZlcnMgKG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBJRExFIHRvIExPQURFRCBzdGF0ZSBvciAKKyAgICAgIG9uIGEgcG9ydCBzdG9wKSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciB0aGUgc3VwcGxpZXIgCisgICAgICB0byByZXF1ZXN0IHRoZSBkZWFsbG9jYXRpb24gb2YgYSBidWZmZXIgaGVhZGVyIHZpYSBhIEZyZWVCdWZmZXIgY2FsbC4gKi8KKyAgT01YX0Vycm9yUG9ydFVucmVzcG9uc2l2ZUR1cmluZ0RlYWxsb2NhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE1LAorCisgIC8qKiBBIHN1cHBsaWVyIHBvcnQgc2VuZHMgdGhpcyBlcnJvciB0byB0aGUgSUwgY2xpZW50ICh2aWEgdGhlIEV2ZW50SGFuZGxlciBjYWxsYmFjaykgCisgICAgICBkdXJpbmcgdGhlIHN0b3BwaW5nIG9mIGEgcG9ydCAoZWl0aGVyIG9uIGEgdHJhbnNpdGlvbiBmcm9tIHRoZSBJRExFIHRvIExPQURFRCAKKyAgICAgIHN0YXRlIG9yIGEgcG9ydCBzdG9wKSB3aGVuIGl0IGRlZW1zIHRoYXQgaXQgaGFzIHdhaXRlZCBhbiB1bnVzdWFsbHkgbG9uZyB0aW1lIGZvciAKKyAgICAgIHRoZSBub24tc3VwcGxpZXIgdG8gcmV0dXJuIGEgYnVmZmVyIHZpYSBhbiBFbXB0eVRoaXNCdWZmZXIgb3IgRmlsbFRoaXNCdWZmZXIgY2FsbC4gKi8KKyAgT01YX0Vycm9yUG9ydFVucmVzcG9uc2l2ZUR1cmluZ1N0b3AgPSAoT01YX1MzMikgMHg4MDAwMTAxNiwKKworICAvKiogQXR0ZW1wdGluZyBhIHN0YXRlIHRyYW5zdGlvbiB0aGF0IGlzIG5vdCBhbGxvd2VkICovCisgIE9NWF9FcnJvckluY29ycmVjdFN0YXRlVHJhbnNpdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE3LAorCisgIC8qIEF0dGVtcHRpbmcgYSBjb21tYW5kIHRoYXQgaXMgbm90IGFsbG93ZWQgZHVyaW5nIHRoZSBwcmVzZW50IHN0YXRlLiAqLworICBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbiA9IChPTVhfUzMyKSAweDgwMDAxMDE4LCAKKworICAvKiogVGhlIHZhbHVlcyBlbmNhcHN1bGF0ZWQgaW4gdGhlIHBhcmFtZXRlciBvciBjb25maWcgc3RydWN0dXJlIGFyZSBub3Qgc3VwcG9ydGVkLiAqLworICBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcgPSAoT01YX1MzMikgMHg4MDAwMTAxOSwKKworICAvKiogVGhlIHBhcmFtZXRlciBvciBjb25maWcgaW5kaWNhdGVkIGJ5IHRoZSBnaXZlbiBpbmRleCBpcyBub3Qgc3VwcG9ydGVkLiAqLworICBPTVhfRXJyb3JVbnN1cHBvcnRlZEluZGV4ID0gKE9NWF9TMzIpIDB4ODAwMDEwMUEsCisKKyAgLyoqIFRoZSBwb3J0IGluZGV4IHN1cHBsaWVkIGlzIGluY29ycmVjdC4gKi8KKyAgT01YX0Vycm9yQmFkUG9ydEluZGV4ID0gKE9NWF9TMzIpIDB4ODAwMDEwMUIsCisKKyAgLyoqIFRoZSBwb3J0IGhhcyBsb3N0IG9uZSBvciBtb3JlIG9mIGl0cyBidWZmZXJzIGFuZCBpdCB0aHVzIHVucG9wdWxhdGVkLiAqLworICBPTVhfRXJyb3JQb3J0VW5wb3B1bGF0ZWQgPSAoT01YX1MzMikgMHg4MDAwMTAxQywKKworICAvKiogQ29tcG9uZW50IHN1c3BlbmRlZCBkdWUgdG8gdGVtcG9yYXJ5IGxvc3Mgb2YgcmVzb3VyY2VzICovCisgIE9NWF9FcnJvckNvbXBvbmVudFN1c3BlbmRlZCA9IChPTVhfUzMyKSAweDgwMDAxMDFELAorCisgIC8qKiBDb21wb25lbnQgc3VzcGVuZGVkIGR1ZSB0byBhbiBpbmFiaWxpdHkgdG8gYWNxdWlyZSBkeW5hbWljIHJlc291cmNlcyAqLworICBPTVhfRXJyb3JEeW5hbWljUmVzb3VyY2VzVW5hdmFpbGFibGUgPSAoT01YX1MzMikgMHg4MDAwMTAxRSwKKworICAvKiogV2hlbiB0aGUgbWFjcm9ibG9jayBlcnJvciByZXBvcnRpbmcgaXMgZW5hYmxlZCB0aGUgY29tcG9uZW50IHJldHVybnMgbmV3IGVycm9yIAorICBmb3IgZXZlcnkgZnJhbWUgdGhhdCBoYXMgZXJyb3JzICovCisgIE9NWF9FcnJvck1iRXJyb3JzSW5GcmFtZSA9IChPTVhfUzMyKSAweDgwMDAxMDFGLAorCisgIC8qKiBBIGNvbXBvbmVudCByZXBvcnRzIHRoaXMgZXJyb3Igd2hlbiBpdCBjYW5ub3QgcGFyc2Ugb3IgZGV0ZXJtaW5lIHRoZSBmb3JtYXQgb2YgYW4gaW5wdXQgc3RyZWFtLiAqLworICBPTVhfRXJyb3JGb3JtYXROb3REZXRlY3RlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIwLCAKKworICAvKiogVGhlIGNvbnRlbnQgb3BlbiBvcGVyYXRpb24gZmFpbGVkLiAqLworICBPTVhfRXJyb3JDb250ZW50UGlwZU9wZW5GYWlsZWQgPSAoT01YX1MzMikgMHg4MDAwMTAyMSwKKworICAvKiogVGhlIGNvbnRlbnQgY3JlYXRpb24gb3BlcmF0aW9uIGZhaWxlZC4gKi8KKyAgT01YX0Vycm9yQ29udGVudFBpcGVDcmVhdGlvbkZhaWxlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIyLAorCisgIC8qKiBTZXBhcmF0ZSB0YWJsZSBpbmZvcm1hdGlvbiBpcyBiZWluZyB1c2VkICovCisgIE9NWF9FcnJvclNlcGVyYXRlVGFibGVzVXNlZCA9IChPTVhfUzMyKSAweDgwMDAxMDIzLAorCisgIC8qKiBUdW5uZWxpbmcgaXMgdW5zdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCovCisgIE9NWF9FcnJvclR1bm5lbGluZ1Vuc3VwcG9ydGVkID0gKE9NWF9TMzIpIDB4ODAwMDEwMjQsCisKKyAgT01YX0Vycm9yS2hyb25vc0V4dGVuc2lvbnMgPSAoT01YX1MzMikweDhGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICBPTVhfRXJyb3JWZW5kb3JTdGFydFVudXNlZCA9IChPTVhfUzMyKTB4OTAwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICBPTVhfRXJyb3JNYXggPSAweDdGRkZGRkZGCit9IE9NWF9FUlJPUlRZUEU7CisKKy8qKiBAaW5ncm91cCBjb3JlICovCit0eXBlZGVmIE9NWF9FUlJPUlRZUEUgKCogT01YX0NPTVBPTkVOVElOSVRUWVBFKShPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQpOworCisvKiogQGluZ3JvdXAgY29yZSAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTVBPTkVOVFJFR0lTVEVSVFlQRQoreworICBjb25zdCBjaGFyICAgICAgICAgICogcE5hbWU7ICAgICAgIC8qIENvbXBvbmVudCBuYW1lLCAxMjggYnl0ZSBsaW1pdCAoaW5jbHVkaW5nICdcMCcpIGFwcGxpZXMgKi8KKyAgT01YX0NPTVBPTkVOVElOSVRUWVBFIHBJbml0aWFsaXplOyAvKiBDb21wb25lbnQgaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24gKi8KK30gT01YX0NPTVBPTkVOVFJFR0lTVEVSVFlQRTsKKworLyoqIEBpbmdyb3VwIGNvcmUgKi8KK2V4dGVybiBPTVhfQ09NUE9ORU5UUkVHSVNURVJUWVBFIE9NWF9Db21wb25lbnRSZWdpc3RlcmVkW107CisKKy8qKiBAaW5ncm91cCBycG0gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QUklPUklUWU1HTVRUWVBFIHsKKyBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworIE9NWF9VMzIgbkdyb3VwUHJpb3JpdHk7ICAgICAgICAgICAgLyoqPCBQcmlvcml0eSBvZiB0aGUgY29tcG9uZW50IGdyb3VwICovCisgT01YX1UzMiBuR3JvdXBJRDsgICAgICAgICAgICAgICAgICAvKio8IElEIG9mIHRoZSBjb21wb25lbnQgZ3JvdXAgKi8KK30gT01YX1BSSU9SSVRZTUdNVFRZUEU7CisKKy8qIENvbXBvbmVudCBuYW1lIGFuZCBSb2xlIG5hbWVzIGFyZSBsaW1pdGVkIHRvIDEyOCBjaGFyYWN0ZXJzIGluY2x1ZGluZyB0aGUgdGVybWluYXRpbmcgJ1wwJy4gKi8KKyNkZWZpbmUgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUgMTI4CisKKy8qKiBAaW5ncm91cCBjb21wICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQ09NUE9ORU5UUk9MRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTggY1JvbGVbT01YX01BWF9TVFJJTkdOQU1FX1NJWkVdOyAgLyoqPCBuYW1lIG9mIHN0YW5kYXJkIGNvbXBvbmVudCB3aGljaCBkZWZpbmVzIGNvbXBvbmVudCByb2xlICovCit9IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRTsKKworLyoqIEVuZCBvZiBTdHJlYW0gQnVmZmVyIEZsYWc6IAorICAqCisgICogQSBjb21wb25lbnQgc2V0cyBFT1Mgd2hlbiBpdCBoYXMgbm8gbW9yZSBkYXRhIHRvIGVtaXQgb24gYSBwYXJ0aWN1bGFyIAorICAqIG91dHB1dCBwb3J0LiBUaHVzIGFuIG91dHB1dCBwb3J0IHNoYWxsIHNldCBFT1Mgb24gdGhlIGxhc3QgYnVmZmVyIGl0IAorICAqIGVtaXRzLiBBIGNvbXBvbmVudCdzIGRldGVybWluYXRpb24gb2Ygd2hlbiBhbiBvdXRwdXQgcG9ydCBzaG91bGQgCisgICogY2Vhc2Ugc2VuZGluZyBkYXRhIGlzIGltcGxlbWVuYXRpb24gc3BlY2lmaWMuCisgICogQGluZ3JvdXAgYnVmCisgICovCisKKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfRU9TIDB4MDAwMDAwMDEgCisKKy8qKiBTdGFydCBUaW1lIEJ1ZmZlciBGbGFnOiAKKyAqCisgKiBUaGUgc291cmNlIG9mIGEgc3RyZWFtIChlLmcuIGEgZGVtdXggY29tcG9uZW50KSBzZXRzIHRoZSBTVEFSVFRJTUUKKyAqIGZsYWcgb24gdGhlIGJ1ZmZlciB0aGF0IGNvbnRhaW5zIHRoZSBzdGFydGluZyB0aW1lc3RhbXAgZm9yIHRoZQorICogc3RyZWFtLiBUaGUgc3RhcnRpbmcgdGltZXN0YW1wIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBkYXRhIHRoYXQKKyAqIHNob3VsZCBiZSBkaXNwbGF5ZWQgYXQgc3RhcnR1cCBvciBhZnRlciBhIHNlZWsuCisgKiBUaGUgZmlyc3QgdGltZXN0YW1wIG9mIHRoZSBzdHJlYW0gaXMgbm90IG5lY2Vzc2FyaWx5IHRoZSBzdGFydCB0aW1lLgorICogRm9yIGluc3RhbmNlLCBpbiB0aGUgY2FzZSBvZiBhIHNlZWsgdG8gYSBwYXJ0aWN1bGFyIHZpZGVvIGZyYW1lLCAKKyAqIHRoZSB0YXJnZXQgZnJhbWUgbWF5IGJlIGFuIGludGVyZnJhbWUuIFRodXMgdGhlIGZpcnN0IGJ1ZmZlciBvZiAKKyAqIHRoZSBzdHJlYW0gd2lsbCBiZSB0aGUgaW50cmEtZnJhbWUgcHJlY2VkaW5nIHRoZSB0YXJnZXQgZnJhbWUgYW5kCisgKiB0aGUgc3RhcnR0aW1lIHdpbGwgb2NjdXIgd2l0aCB0aGUgdGFyZ2V0IGZyYW1lICh3aXRoIGFueSBvdGhlcgorICogcmVxdWlyZWQgZnJhbWVzIHJlcXVpcmVkIHRvIHJlY29uc3RydWN0IHRoZSB0YXJnZXQgaW50ZXJ2ZW5pbmcpLgorICoKKyAqIFRoZSBTVEFSVFRJTUUgZmxhZyBpcyBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggdGhlIGJ1ZmZlcidzIAorICogdGltZXN0YW1wICcgdGh1cyBpdHMgYXNzb2NpYXRpb24gdG8gYnVmZmVyIGRhdGEgYW5kIGl0cyAKKyAqIHByb3BhZ2F0aW9uIGlzIGlkZW50aWNhbCB0byB0aGUgdGltZXN0YW1wJ3MuCisgKgorICogV2hlbiBhIFN5bmMgQ29tcG9uZW50IGNsaWVudCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoIHRoZSAKKyAqIFNUQVJUVElNRSBmbGFnIGl0IHNoYWxsIHBlcmZvcm0gYSBTZXRDb25maWcgb24gaXRzIHN5bmMgcG9ydCAKKyAqIHVzaW5nIE9NWF9Db25maWdUaW1lQ2xpZW50U3RhcnRUaW1lIGFuZCBwYXNzaW5nIHRoZSBidWZmZXIncworICogdGltZXN0YW1wLgorICogCisgKiBAaW5ncm91cCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX1NUQVJUVElNRSAweDAwMDAwMDAyCisKKyAKKworLyoqIERlY29kZSBPbmx5IEJ1ZmZlciBGbGFnOiAKKyAqCisgKiBUaGUgc291cmNlIG9mIGEgc3RyZWFtIChlLmcuIGEgZGVtdXggY29tcG9uZW50KSBzZXRzIHRoZSBERUNPREVPTkxZCisgKiBmbGFnIG9uIGFueSBidWZmZXIgdGhhdCBzaG91bGQgc2hhbGwgYmUgZGVjb2RlZCBidXQgc2hvdWxkIG5vdCBiZQorICogZGlzcGxheWVkLiBUaGlzIGZsYWcgaXMgdXNlZCwgZm9yIGluc3RhbmNlLCB3aGVuIGEgc291cmNlIHNlZWtzIHRvIAorICogYSB0YXJnZXQgaW50ZXJmcmFtZSB0aGF0IHJlcXVpcmVzIHRoZSBkZWNvZGUgb2YgZnJhbWVzIHByZWNlZGluZyB0aGUgCisgKiB0YXJnZXQgdG8gZmFjaWxpdGF0ZSB0aGUgdGFyZ2V0J3MgcmVjb25zdHJ1Y3Rpb24uIEluIHRoaXMgY2FzZSB0aGUgCisgKiBzb3VyY2Ugd291bGQgZW1pdCB0aGUgZnJhbWVzIHByZWNlZGluZyB0aGUgdGFyZ2V0IGRvd25zdHJlYW0gCisgKiBidXQgbWFyayB0aGVtIGFzIGRlY29kZSBvbmx5LgorICoKKyAqIFRoZSBERUNPREVPTkxZIGlzIGFzc29jaWF0ZWQgd2l0aCBidWZmZXIgZGF0YSBhbmQgcHJvcGFnYXRlZCBpbiBhIAorICogbWFubmVyIGlkZW50aWNhbCB0byB0aGUgYnVmZmVyIHRpbWVzdGFtcC4KKyAqCisgKiBBIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgZGF0YSBzaG91bGQgaWdub3JlIGFsbCBidWZmZXJzIHdpdGggCisgKiB0aGUgREVDT0RFT05MWSBmbGFnIHNldC4KKyAqIAorICogQGluZ3JvdXAgYnVmCisgKi8KKworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19ERUNPREVPTkxZIDB4MDAwMDAwMDQKKworCisvKiBEYXRhIENvcnJ1cHQgRmxhZzogVGhpcyBmbGFnIGlzIHNldCB3aGVuIHRoZSBJTCBjbGllbnQgYmVsaWV2ZXMgdGhlIGRhdGEgaW4gdGhlIGFzc29jaWF0ZWQgYnVmZmVyIGlzIGNvcnJ1cHQgCisgKiBAaW5ncm91cCBidWYKKyAqLworCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX0RBVEFDT1JSVVBUIDB4MDAwMDAwMDgKKworLyogRW5kIG9mIEZyYW1lOiBUaGUgYnVmZmVyIGNvbnRhaW5zIGV4YWN0bHkgb25lIGVuZCBvZiBmcmFtZSBhbmQgbm8gZGF0YQorICogIG9jY3VycyBhZnRlciB0aGUgZW5kIG9mIGZyYW1lLiBUaGlzIGZsYWcgaXMgYW4gb3B0aW9uYWwgaGludC4gVGhlIGFic2VuY2UKKyAqICBvZiB0aGlzIGZsYWcgZG9lcyBub3QgaW1wbHkgdGhlIGFic2VuY2Ugb2YgYW4gZW5kIG9mIGZyYW1lIHdpdGhpbiB0aGUgYnVmZmVyLiAKKyAqIEBpbmdyb3VwIGJ1ZgorKi8KKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfRU5ET0ZGUkFNRSAweDAwMDAwMDEwCisKKy8qIFN5bmMgRnJhbWUgRmxhZzogVGhpcyBmbGFnIGlzIHNldCB3aGVuIHRoZSBidWZmZXIgY29udGVudCBjb250YWlucyBhIGNvZGVkIHN5bmMgZnJhbWUgJyAKKyAqICBhIGZyYW1lIHRoYXQgaGFzIG5vIGRlcGVuZGVuY3kgb24gYW55IG90aGVyIGZyYW1lIGluZm9ybWF0aW9uIAorICogIEBpbmdyb3VwIGJ1ZgorICovCisjZGVmaW5lIE9NWF9CVUZGRVJGTEFHX1NZTkNGUkFNRSAweDAwMDAwMDIwCisKKy8qIEV4dHJhIGRhdGEgcHJlc2VudCBmbGFnOiB0aGVyZSBpcyBleHRyYSBkYXRhIGFwcGVuZGVkIHRvIHRoZSBkYXRhIHN0cmVhbQorICogcmVzaWRpbmcgaW4gdGhlIGJ1ZmZlciAKKyAqIEBpbmdyb3VwIGJ1ZiAgCisgKi8KKyNkZWZpbmUgT01YX0JVRkZFUkZMQUdfRVhUUkFEQVRBIDB4MDAwMDAwNDAKKworLyoqIENvZGVjIENvbmZpZyBCdWZmZXIgRmxhZzogCisqIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHIGlzIGFuIG9wdGlvbmFsIGZsYWcgdGhhdCBpcyBzZXQgYnkgYW4KKyogb3V0cHV0IHBvcnQgd2hlbiBhbGwgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBmb3JtIHBhcnQgb3IgYWxsIG9mIGEgc2V0IG9mCisqIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEV4YW1wbGVzIGluY2x1ZGUgU1BTL1BQUyBuYWwgdW5pdHMKKyogZm9yIE9NWF9WSURFT19Db2RpbmdBVkMgb3IgQXVkaW9TcGVjaWZpY0NvbmZpZyBkYXRhIGZvcgorKiBPTVhfQVVESU9fQ29kaW5nQUFDLiAgQW55IGNvbXBvbmVudCB0aGF0IGZvciBhIGdpdmVuIHN0cmVhbSBzZXRzIAorKiBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyBzaGFsbCBub3QgbWl4IGNvZGVjIGNvbmZpZ3VyYXRpb24gYnl0ZXMKKyogd2l0aCBmcmFtZSBkYXRhIGluIHRoZSBzYW1lIGJ1ZmZlciwgYW5kIHNoYWxsIHNlbmQgYWxsIGJ1ZmZlcnMKKyogY29udGFpbmluZyBjb2RlYyBjb25maWd1cmF0aW9uIGJ5dGVzIGJlZm9yZSBhbnkgYnVmZmVycyBjb250YWluaW5nCisqIGZyYW1lIGRhdGEgdGhhdCB0aG9zZSBjb25maWd1cmF0aW9ucyBieXRlcyBkZXNjcmliZS4KKyogSWYgdGhlIHN0cmVhbSBmb3JtYXQgZm9yIGEgcGFydGljdWxhciBjb2RlYyBoYXMgYSBmcmFtZSBzcGVjaWZpYworKiBoZWFkZXIgYXQgdGhlIHN0YXJ0IG9mIGVhY2ggZnJhbWUsIGZvciBleGFtcGxlIE9NWF9BVURJT19Db2RpbmdNUDMgb3IKKyogT01YX0FVRElPX0NvZGluZ0FBQyBpbiBBRFRTIG1vZGUsIHRoZW4gdGhlc2Ugc2hhbGwgYmUgcHJlc2VudGVkIGFzCisqIG5vcm1hbCB3aXRob3V0IHNldHRpbmcgT01YX0JVRkZFUkZMQUdfQ09ERUNDT05GSUcuCisgKiBAaW5ncm91cCBidWYKKyAqLworI2RlZmluZSBPTVhfQlVGRkVSRkxBR19DT0RFQ0NPTkZJRyAweDAwMDAwMDgwCisKKworCisvKiogQGluZ3JvdXAgYnVmICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQlVGRkVSSEVBREVSVFlQRQoreworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTgqIHBCdWZmZXI7ICAgICAgICAgICAgLyoqPCBQb2ludGVyIHRvIGFjdHVhbCBibG9jayBvZiBtZW1vcnkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpcyBhY3RpbmcgYXMgdGhlIGJ1ZmZlciAqLworICAgIE9NWF9VMzIgbkFsbG9jTGVuOyAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQsIGluIGJ5dGVzICovCisgICAgT01YX1UzMiBuRmlsbGVkTGVuOyAgICAgICAgIC8qKjwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSBpbiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICovCisgICAgT01YX1UzMiBuT2Zmc2V0OyAgICAgICAgICAgIC8qKjwgc3RhcnQgb2Zmc2V0IG9mIHZhbGlkIGRhdGEgaW4gYnl0ZXMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgT01YX1BUUiBwQXBwUHJpdmF0ZTsgICAgICAgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLworICAgIE9NWF9QVFIgcFBsYXRmb3JtUHJpdmF0ZTsgICAvKio8IHBvaW50ZXIgdG8gYW55IGRhdGEgdGhlIHBsYXRmb3JtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FudHMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBidWZmZXIgKi8gCisgICAgT01YX1BUUiBwSW5wdXRQb3J0UHJpdmF0ZTsgIC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgaW5wdXQgcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFzc29jaWF0ZSB3aXRoIHRoaXMgYnVmZmVyICovCisgICAgT01YX1BUUiBwT3V0cHV0UG9ydFByaXZhdGU7IC8qKjwgcG9pbnRlciB0byBhbnkgZGF0YSB0aGUgb3V0cHV0IHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YW50cyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGJ1ZmZlciAqLworICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAvKio8IFRoZSBjb21wb25lbnQgdGhhdCB3aWxsIGdlbmVyYXRlIGEgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFyayBldmVudCB1cG9uIHByb2Nlc3NpbmcgdGhpcyBidWZmZXIuICovCisgICAgT01YX1BUUiBwTWFya0RhdGE7ICAgICAgICAgIC8qKjwgQXBwbGljYXRpb24gc3BlY2lmaWMgZGF0YSBhc3NvY2lhdGVkIHdpdGggCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcmsgc2VudCBvbiBhIG1hcmsgZXZlbnQgdG8gZGlzYW1iaWd1YXRlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFyayBmcm9tIG90aGVycy4gKi8KKyAgICBPTVhfVTMyIG5UaWNrQ291bnQ7ICAgICAgICAgLyoqPCBPcHRpb25hbCBlbnRyeSB0aGF0IHRoZSBjb21wb25lbnQgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY2FuIHVwZGF0ZSB3aXRoIGEgdGljayBjb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhleSBhY2Nlc3MgdGhlIGNvbXBvbmVudC4gIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzaG91bGQgYmUgaW4gbWljcm9zZWNvbmRzLiAgU2luY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGlzIGEgdmFsdWUgcmVsYXRpdmUgdG8gYW4gYXJiaXRyYXJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgcG9pbnQsIHRoaXMgdmFsdWUgY2Fubm90IGJlIHVzZWQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIGFic29sdXRlIHRpbWUuICBUaGlzIGlzIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZW50cnkgYW5kIG5vdCBhbGwgY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdXBkYXRlIGl0LiovCisgT01YX1RJQ0tTIG5UaW1lU3RhbXA7ICAgICAgICAgIC8qKjwgVGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNhbXBsZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydGluZyBhdCB0aGUgZmlyc3QgbG9naWNhbCBzYW1wbGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRhcnkgaW4gdGhlIGJ1ZmZlci4gVGltZXN0YW1wcyBvZiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzaXZlIHNhbXBsZXMgd2l0aGluIHRoZSBidWZmZXIgbWF5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgaW5mZXJyZWQgYnkgYWRkaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHByZWNlZGluZyBidWZmZXIgdG8gdGhlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBwcmVjZWRpbmcgYnVmZmVyLiovCisgIE9NWF9VMzIgICAgIG5GbGFnczsgICAgICAgICAgIC8qKjwgYnVmZmVyIHNwZWNpZmljIGZsYWdzICovCisgIE9NWF9VMzIgbk91dHB1dFBvcnRJbmRleDsgICAgIC8qKjwgVGhlIGluZGV4IG9mIHRoZSBvdXRwdXQgcG9ydCAoaWYgYW55KSB1c2luZyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGJ1ZmZlciAqLworICBPTVhfVTMyIG5JbnB1dFBvcnRJbmRleDsgICAgICAvKio8IFRoZSBpbmRleCBvZiB0aGUgaW5wdXQgcG9ydCAoaWYgYW55KSB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgYnVmZmVyICovCit9IE9NWF9CVUZGRVJIRUFERVJUWVBFOworCisvKiogVGhlIE9NWF9FWFRSQURBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSAKKyAqIHBvc3NpYmxlIGV4dHJhIGRhdGEgcGF5bG9hZCB0eXBlcy4KKyAqIE5COiB0aGlzIGVudW0gaXMgYmluYXJ5IGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzCisgKiBPTVhfRVhUUkFEQVRBX1FVQU5UIGRlZmluZS4gIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGgKKyAqIE9NWF9FeHRyYURhdGFRdWFudGl6YXRpb24uCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRVhUUkFEQVRBVFlQRQoreworICAgT01YX0V4dHJhRGF0YU5vbmUgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBJbmRpY2F0ZXMgdGhhdCBubyBtb3JlIGV4dHJhIGRhdGEgc2VjdGlvbnMgZm9sbG93ICovICAgICAgICAKKyAgIE9NWF9FeHRyYURhdGFRdWFudGl6YXRpb24sICAgICAgICAgICAgICAgICAgIC8qKjwgVGhlIGRhdGEgcGF5bG9hZCBjb250YWlucyBxdWFudGl6YXRpb24gZGF0YSAqLworICAgT01YX0V4dHJhRGF0YUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9FeHRyYURhdGFWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgT01YX0V4dHJhRGF0YU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0VYVFJBREFUQVRZUEU7CisKKwordHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0VYVFJBREFUQVRZUEUgIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0VYVFJBREFUQVRZUEUgZVR5cGU7ICAgICAgIC8qIEV4dHJhIERhdGEgdHlwZSAqLworICAgIE9NWF9VMzIgbkRhdGFTaXplOyAgIC8qIFNpemUgb2YgdGhlIHN1cHBvcnRpbmcgZGF0YSB0byBmb2xsb3cgKi8KKyAgICBPTVhfVTggIGRhdGFbMV07ICAgICAvKiBTdXBwb3J0aW5nIGRhdGEgaGludCAgKi8KK30gT01YX09USEVSX0VYVFJBREFUQVRZUEU7CisKKy8qKiBAaW5ncm91cCBjb21wICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUE9SVF9QQVJBTV9UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydHM7ICAgICAgICAgICAgIC8qKjwgVGhlIG51bWJlciBvZiBwb3J0cyBmb3IgdGhpcyBjb21wb25lbnQgKi8KKyAgICBPTVhfVTMyIG5TdGFydFBvcnROdW1iZXI7ICAgLyoqIGZpcnN0IHBvcnQgbnVtYmVyIGZvciB0aGlzIHR5cGUgb2YgcG9ydCAqLworfSBPTVhfUE9SVF9QQVJBTV9UWVBFOyAKKworLyoqIEBpbmdyb3VwIGNvbXAgKi8KK3R5cGVkZWYgZW51bSBPTVhfRVZFTlRUWVBFCit7CisgICAgT01YX0V2ZW50Q21kQ29tcGxldGUsICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIHN1Y2Vzc2Z1bGx5IGNvbXBsZXRlZCBhIGNvbW1hbmQgKi8KKyAgICBPTVhfRXZlbnRFcnJvciwgICAgICAgICAgICAgICAvKio8IGNvbXBvbmVudCBoYXMgZGV0ZWN0ZWQgYW4gZXJyb3IgY29uZGl0aW9uICovCisgICAgT01YX0V2ZW50TWFyaywgICAgICAgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGEgYnVmZmVyIG1hcmsgKi8KKyAgICBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAvKio8IGNvbXBvbmVudCBpcyByZXBvcnRlZCBhIHBvcnQgc2V0dGluZ3MgY2hhbmdlICovCisgICAgT01YX0V2ZW50QnVmZmVyRmxhZywgICAgICAgICAgLyoqPCBjb21wb25lbnQgaGFzIGRldGVjdGVkIGFuIEVPUyAqLyAKKyAgICBPTVhfRXZlbnRSZXNvdXJjZXNBY3F1aXJlZCwgICAvKio8IGNvbXBvbmVudCBoYXMgYmVlbiBncmFudGVkIHJlc291cmNlcyBhbmQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgc3RhcnRpbmcgdGhlIHN0YXRlIGNoYW5nZSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVhfU3RhdGVXYWl0Rm9yUmVzb3VyY2VzIHRvIE9NWF9TdGF0ZUlkbGUuICovCisgICBPTVhfRXZlbnRDb21wb25lbnRSZXN1bWVkLCAgICAgLyoqPCBDb21wb25lbnQgcmVzdW1lZCBkdWUgdG8gcmVhY3F1aXNpdGlvbiBvZiByZXNvdXJjZXMgKi8KKyAgIE9NWF9FdmVudER5bmFtaWNSZXNvdXJjZXNBdmFpbGFibGUsIC8qKjwgQ29tcG9uZW50IGhhcyBhY3F1aXJlZCBwcmV2aW91c2x5IHVuYXZhaWxhYmxlIGR5bmFtaWMgcmVzb3VyY2VzICovCisgICBPTVhfRXZlbnRQb3J0Rm9ybWF0RGV0ZWN0ZWQsICAgICAgLyoqPCBDb21wb25lbnQgaGFzIGRldGVjdGVkIGEgc3VwcG9ydGVkIGZvcm1hdC4gKi8KKyAgIE9NWF9FdmVudEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgIE9NWF9FdmVudFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICBPTVhfRXZlbnRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9FVkVOVFRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DQUxMQkFDS1RZUEUKK3sKKyAgICAvKiogVGhlIEV2ZW50SGFuZGxlciBtZXRob2QgaXMgdXNlZCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIHdoZW4gYW4KKyAgICAgICAgZXZlbnQgb2YgaW50ZXJlc3Qgb2NjdXJzLiAgRXZlbnRzIGFyZSBkZWZpbmVkIGluIHRoZSBPTVhfRVZFTlRUWVBFCisgICAgICAgIGVudW1lcmF0aW9uLiAgUGxlYXNlIHNlZSB0aGF0IGVudW1lcmF0aW9uIGZvciBkZXRhaWxzIG9mIHdoYXQgd2lsbAorICAgICAgICBiZSByZXR1cm5lZCBmb3IgZWFjaCB0eXBlIG9mIGV2ZW50LiBDYWxsYmFja3Mgc2hvdWxkIG5vdCByZXR1cm4KKyAgICAgICAgYW4gZXJyb3IgdG8gdGhlIGNvbXBvbmVudCwgc28gaWYgYW4gZXJyb3Igb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gCisgICAgICAgIHNoYWxsIGhhbmRsZSBpdCBpbnRlcm5hbGx5LiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisKKyAgICAgICAgVGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYyB0byBhdm9pZAorICAgICAgICBibG9ja2luZyB0aGUgY29tcG9uZW50IGZvciBhbiBleGNlc3NpdmVseSBsb25nIHBlcmlvZCBvZiB0aW1lLgorCisgICAgICAgIEBwYXJhbSBoQ29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBhY2Nlc3MuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgICAgICBAcGFyYW0gcEFwcERhdGEKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdhcyBwcm92aWRlZCBpbiB0aGUgCisgICAgICAgICAgICBwQXBwRGF0YSBwYXJhbWV0ZXIgdG8gdGhlIE9NWF9HZXRIYW5kbGUgbWV0aG9kIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgVGhpcyBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIGlzIHByb3ZpZGVkIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIAorICAgICAgICAgICAgY2FuIGhhdmUgYSBjb21wb25lbnQgc3BlY2lmaWMgY29udGV4dCB3aGVuIHJlY2VpdmluZyB0aGUgY2FsbGJhY2suCisgICAgICAgIEBwYXJhbSBlRXZlbnQKKyAgICAgICAgICAgIEV2ZW50IHRoYXQgdGhlIGNvbXBvbmVudCB3YW50cyB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIGFib3V0LgorICAgICAgICBAcGFyYW0gbkRhdGExCisgICAgICAgICAgICBuRGF0YSB3aWxsIGJlIHRoZSBPTVhfRVJST1JUWVBFIGZvciBhbiBlcnJvciBldmVudCBhbmQgd2lsbCBiZSAKKyAgICAgICAgICAgIGFuIE9NWF9DT01NQU5EVFlQRSBmb3IgYSBjb21tYW5kIGNvbXBsZXRlIGV2ZW50IGFuZCBPTVhfSU5ERVhUWVBFIGZvciBhIE9NWF9Qb3J0U2V0dGluZ3NDaGFuZ2VkIGV2ZW50LgorICAgICAgICAgQHBhcmFtIG5EYXRhMgorICAgICAgICAgICAgbkRhdGEyIHdpbGwgaG9sZCBmdXJ0aGVyIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIGV2ZW50LiBDYW4gYmUgT01YX1NUQVRFVFlQRSBmb3IKKyAgICAgICAgICAgIGEgT01YX0NvbW1hbmRTdGF0ZVNldCBjb21tYW5kIG9yIHBvcnQgaW5kZXggZm9yIGEgT01YX1BvcnRTZXR0aW5nc0NoYW5nZWQgZXZlbnQuCisgICAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIDAgaWYgbm90IHVzZWQuICkKKyAgICAgICAgQHBhcmFtIHBFdmVudERhdGEKKyAgICAgICAgICAgIFBvaW50ZXIgdG8gYWRkaXRpb25hbCBldmVudC1zcGVjaWZpYyBkYXRhIChzZWUgc3BlYyBmb3IgbWVhbmluZykuCisgICAgICAqLworCisgICBPTVhfRVJST1JUWVBFICgqRXZlbnRIYW5kbGVyKSgKKyAgICAgICAgT01YX0lOIE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsCisgICAgICAgIE9NWF9JTiBPTVhfUFRSIHBBcHBEYXRhLAorICAgICAgICBPTVhfSU4gT01YX0VWRU5UVFlQRSBlRXZlbnQsCisgICAgICAgIE9NWF9JTiBPTVhfVTMyIG5EYXRhMSwKKyAgICAgICAgT01YX0lOIE9NWF9VMzIgbkRhdGEyLAorICAgICAgICBPTVhfSU4gT01YX1BUUiBwRXZlbnREYXRhKTsKKworICAgIC8qKiBUaGUgRW1wdHlCdWZmZXJEb25lIG1ldGhvZCBpcyB1c2VkIHRvIHJldHVybiBlbXB0aWVkIGJ1ZmZlcnMgZnJvbSBhbgorICAgICAgICBpbnB1dCBwb3J0IGJhY2sgdG8gdGhlIGFwcGxpY2F0aW9uIGZvciByZXVzZS4gIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIAorICAgICAgICBzbyB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG5vdCBhdHRlbXB0IHRvIHJlZmlsbCB0aGUgYnVmZmVycyBkdXJpbmcgdGhpcworICAgICAgICBjYWxsLCBidXQgc2hvdWxkIHF1ZXVlIHRoZW0gYW5kIHJlZmlsbCB0aGVtIGluIGFub3RoZXIgdGhyZWFkLiAgVGhlcmUKKyAgICAgICAgaXMgbm8gZXJyb3IgcmV0dXJuLCBzbyB0aGUgYXBwbGljYXRpb24gc2hhbGwgaGFuZGxlIGFueSBlcnJvcnMgZ2VuZXJhdGVkCisgICAgICAgIGludGVybmFsbHkuICAKKyAgICAgICAgCisgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgICAgIAorICAgICAgICBAcGFyYW0gaENvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYWNjZXNzLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICAgICAgQHBhcmFtIHBBcHBEYXRhCisgICAgICAgICAgICBwb2ludGVyIHRvIGFuIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgdGhhdCB3YXMgcHJvdmlkZWQgaW4gdGhlIAorICAgICAgICAgICAgcEFwcERhdGEgcGFyYW1ldGVyIHRvIHRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIFRoaXMgYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSBpcyBwcm92aWRlZCBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiAKKyAgICAgICAgICAgIGNhbiBoYXZlIGEgY29tcG9uZW50IHNwZWNpZmljIGNvbnRleHQgd2hlbiByZWNlaXZpbmcgdGhlIGNhbGxiYWNrLgorICAgICAgICBAcGFyYW0gcEJ1ZmZlcgorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgYWxsb2NhdGVkIHdpdGggVXNlQnVmZmVyCisgICAgICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlciBpbmRpY2F0aW5nIHRoZSBidWZmZXIgdGhhdCB3YXMgZW1wdGllZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkVtcHR5QnVmZmVyRG9uZSkoCisgICAgICAgIE9NWF9JTiBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfSU4gT01YX1BUUiBwQXBwRGF0YSwKKyAgICAgICAgT01YX0lOIE9NWF9CVUZGRVJIRUFERVJUWVBFKiBwQnVmZmVyKTsKKworICAgIC8qKiBUaGUgRmlsbEJ1ZmZlckRvbmUgbWV0aG9kIGlzIHVzZWQgdG8gcmV0dXJuIGZpbGxlZCBidWZmZXJzIGZyb20gYW4KKyAgICAgICAgb3V0cHV0IHBvcnQgYmFjayB0byB0aGUgYXBwbGljYXRpb24gZm9yIGVtcHR5aW5nIGFuZCB0aGVuIHJldXNlLiAgCisgICAgICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsIHNvIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbm90IGF0dGVtcHQgdG8gCisgICAgICAgIGVtcHR5IHRoZSBidWZmZXJzIGR1cmluZyB0aGlzIGNhbGwsIGJ1dCBzaG91bGQgcXVldWUgdGhlIGJ1ZmZlcnMgCisgICAgICAgIGFuZCBlbXB0eSB0aGVtIGluIGFub3RoZXIgdGhyZWFkLiAgVGhlcmUgaXMgbm8gZXJyb3IgcmV0dXJuLCBzbyAKKyAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIGhhbmRsZSBhbnkgZXJyb3JzIGdlbmVyYXRlZCBpbnRlcm5hbGx5LiAgVGhlIAorICAgICAgICBhcHBsaWNhdGlvbiBzaGFsbCBhbHNvIHVwZGF0ZSB0aGUgYnVmZmVyIGhlYWRlciB0byBpbmRpY2F0ZSB0aGUKKyAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIHBsYWNlZCBpbnRvIHRoZSBidWZmZXIuICAKKworICAgICAgICBUaGUgYXBwbGljYXRpb24gc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgICAgICAKKyAgICAgICAgQHBhcmFtIGhDb21wb25lbnQKKyAgICAgICAgICAgIGhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGFjY2Vzcy4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgICAgIEBwYXJhbSBwQXBwRGF0YQorICAgICAgICAgICAgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkZWZpbmVkIHZhbHVlIHRoYXQgd2FzIHByb3ZpZGVkIGluIHRoZSAKKyAgICAgICAgICAgIHBBcHBEYXRhIHBhcmFtZXRlciB0byB0aGUgT01YX0dldEhhbmRsZSBtZXRob2QgZm9yIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBUaGlzIGFwcGxpY2F0aW9uIGRlZmluZWQgdmFsdWUgaXMgcHJvdmlkZWQgc28gdGhhdCB0aGUgYXBwbGljYXRpb24gCisgICAgICAgICAgICBjYW4gaGF2ZSBhIGNvbXBvbmVudCBzcGVjaWZpYyBjb250ZXh0IHdoZW4gcmVjZWl2aW5nIHRoZSBjYWxsYmFjay4KKyAgICAgICAgQHBhcmFtIHBCdWZmZXIKKyAgICAgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIgaW5kaWNhdGluZyB0aGUgYnVmZmVyIHRoYXQgd2FzIGZpbGxlZC4KKyAgICAgICAgQGluZ3JvdXAgYnVmCisgICAgICovCisgICAgT01YX0VSUk9SVFlQRSAoKkZpbGxCdWZmZXJEb25lKSgKKyAgICAgICAgT01YX09VVCBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LAorICAgICAgICBPTVhfT1VUIE9NWF9QVFIgcEFwcERhdGEsCisgICAgICAgIE9NWF9PVVQgT01YX0JVRkZFUkhFQURFUlRZUEUqIHBCdWZmZXIpOworCit9IE9NWF9DQUxMQkFDS1RZUEU7CisKKy8qKiBUaGUgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSBlbnVtZXJhdGlvbiBpcyB1c2VkIHRvIGRpY3RhdGUgcG9ydCBzdXBwbGllcgorICAgIHByZWZlcmVuY2Ugd2hlbiB0dW5uZWxpbmcgYmV0d2VlbiB0d28gcG9ydHMuCisgICAgQGluZ3JvdXAgdHVuIGJ1ZgorKi8KK3R5cGVkZWYgZW51bSBPTVhfQlVGRkVSU1VQUExJRVJUWVBFCit7CisgICAgT01YX0J1ZmZlclN1cHBseVVuc3BlY2lmaWVkID0gMHgwLCAvKio8IHBvcnQgc3VwcGx5aW5nIHRoZSBidWZmZXJzIGlzIHVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRvbid0IGNhcmUgKi8KKyAgICBPTVhfQnVmZmVyU3VwcGx5SW5wdXQsICAgICAgICAgICAgIC8qKjwgaW5wdXQgcG9ydCBzdXBwbGllcyB0aGUgYnVmZmVycyAqLworICAgIE9NWF9CdWZmZXJTdXBwbHlPdXRwdXQsICAgICAgICAgICAgLyoqPCBvdXRwdXQgcG9ydCBzdXBwbGllcyB0aGUgYnVmZmVycyAqLworICAgIE9NWF9CdWZmZXJTdXBwbHlLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0J1ZmZlclN1cHBseVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0J1ZmZlclN1cHBseU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0JVRkZFUlNVUFBMSUVSVFlQRTsKKworCisvKiogYnVmZmVyIHN1cHBsaWVyIHBhcmFtZXRlciAKKyAqIEBpbmdyb3VwIHR1bgorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fQlVGRkVSU1VQUExJRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAvKio8IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0JVRkZFUlNVUFBMSUVSVFlQRSBlQnVmZmVyU3VwcGxpZXI7IC8qKjwgYnVmZmVyIHN1cHBsaWVyICovCit9IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEU7CisKKworLyoqPCBpbmRpY2F0ZXMgdGhhdCBidWZmZXJzIHJlY2VpdmVkIGJ5IGFuIGlucHV0IHBvcnQgb2YgYSB0dW5uZWwgCisgICAgIG1heSBub3QgbW9kaWZ5IHRoZSBkYXRhIGluIHRoZSBidWZmZXJzIAorICAgICBAaW5ncm91cCB0dW4KKyAqLworI2RlZmluZSBPTVhfUE9SVFRVTk5FTEZMQUdfUkVBRE9OTFkgMHgwMDAwMDAwMSAKKworCisvKiogVGhlIE9NWF9UVU5ORUxTRVRVUFRZUEUgc3RydWN0dXJlIGlzIHVzZWQgdG8gcGFzcyBkYXRhIGZyb20gYW4gb3V0cHV0CisgICAgcG9ydCB0byBhbiBpbnB1dCBwb3J0IGFzIHBhcnQgdGhlIHR3byBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IGNhbGxzCisgICAgcmVzdWx0aW5nIGZyb20gYSBPTVhfU2V0dXBUdW5uZWwgY2FsbCBmcm9tIHRoZSBJTCBDbGllbnQuIAorICAgIEBpbmdyb3VwIHR1bgorICovICAgCit0eXBlZGVmIHN0cnVjdCBPTVhfVFVOTkVMU0VUVVBUWVBFCit7CisgICAgT01YX1UzMiBuVHVubmVsRmxhZ3M7ICAgICAgICAgICAgIC8qKjwgYml0IGZsYWdzIGZvciB0dW5uZWxpbmcgKi8KKyAgICBPTVhfQlVGRkVSU1VQUExJRVJUWVBFIGVTdXBwbGllcjsgLyoqPCBzdXBwbGllciBwcmVmZXJlbmNlICovCit9IE9NWF9UVU5ORUxTRVRVUFRZUEU7IAorCisvKiBPTVggQ29tcG9uZW50IGhlYWRlcnMgaXMgaW5jbHVkZWQgdG8gZW5hYmxlIHRoZSBjb3JlIHRvIHVzZQorICAgbWFjcm9zIGZvciBmdW5jdGlvbnMgaW50byB0aGUgY29tcG9uZW50IGZvciBPTVggcmVsZWFzZSAxLjAuICAKKyAgIERldmVsb3BlcnMgc2hvdWxkIG5vdCBhY2Nlc3MgYW55IHN0cnVjdHVyZXMgb3IgZGF0YSBmcm9tIHdpdGhpbgorICAgdGhlIGNvbXBvbmVudCBoZWFkZXIgZGlyZWN0bHkgKi8KKy8qIFRPIEJFIFJFTU9WRUQgLSAjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPiAqLworCisvKiogR2V0Q29tcG9uZW50VmVyc2lvbiB3aWxsIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY29tcG9uZW50LiAgCisgICAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuICBUaGlzIG1hY3JvIHdpbGwgZ28gZGlyZWN0bHkgZnJvbSB0aGUKKyAgICBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50ICh2aWEgYSBjb3JlIG1hY3JvKS4gIFRoZQorICAgIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgaGFuZGxlIG9mIGNvbXBvbmVudCB0byBleGVjdXRlIHRoZSBjb21tYW5kCisgICAgQHBhcmFtIFtvdXRdIHBDb21wb25lbnROYW1lCisgICAgICAgIHBvaW50ZXIgdG8gYW4gZW1wdHkgc3RyaW5nIG9mIGxlbmd0aCAxMjggYnl0ZXMuICBUaGUgY29tcG9uZW50IAorICAgICAgICB3aWxsIHdyaXRlIGl0cyBuYW1lIGludG8gdGhpcyBzdHJpbmcuICBUaGUgbmFtZSB3aWxsIGJlIAorICAgICAgICB0ZXJtaW5hdGVkIGJ5IGEgc2luZ2xlIHplcm8gYnl0ZS4gIFRoZSBuYW1lIG9mIGEgY29tcG9uZW50IHdpbGwgCisgICAgICAgIGJlIDEyNyBieXRlcyBvciBsZXNzIHRvIGxlYXZlIHJvb20gZm9yIHRoZSB0cmFpbGluZyB6ZXJvIGJ5dGUuICAKKyAgICAgICAgQW4gZXhhbXBsZSBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguQUJDLkNoYW5uZWxNaXhlclwwIi4KKyAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudFZlcnNpb24KKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVggVmVyc2lvbiBzdHJ1Y3R1cmUgdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgZmlsbCAKKyAgICAgICAgaW4uICBUaGUgY29tcG9uZW50IHdpbGwgZmlsbCBpbiBhIHZhbHVlIHRoYXQgaW5kaWNhdGVzIHRoZSAKKyAgICAgICAgY29tcG9uZW50IHZlcnNpb24uICBOT1RFOiB0aGUgY29tcG9uZW50IHZlcnNpb24gaXMgTk9UIHRoZSBzYW1lIAorICAgICAgICBhcyB0aGUgT01YIFNwZWNpZmljYXRpb24gdmVyc2lvbiAoZm91bmQgaW4gYWxsIHN0cnVjdHVyZXMpLiAgVGhlIAorICAgICAgICBjb21wb25lbnQgdmVyc2lvbiBpcyBkZWZpbmVkIGJ5IHRoZSB2ZW5kb3Igb2YgdGhlIGNvbXBvbmVudCBhbmQgCisgICAgICAgIGl0cyB2YWx1ZSBpcyBlbnRpcmVseSB1cCB0byB0aGUgY29tcG9uZW50IHZlbmRvci4KKyAgICBAcGFyYW0gW291dF0gcFNwZWNWZXJzaW9uCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YIFZlcnNpb24gc3RydWN0dXJlIHRoYXQgdGhlIGNvbXBvbmVudCB3aWxsIGZpbGwgCisgICAgICAgIGluLiAgVGhlIFNwZWNWZXJzaW9uIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIHRoYXQgdGhlIAorICAgICAgICBjb21wb25lbnQgd2FzIGJ1aWx0IGFnYWluc3QuICBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgdmFsdWUgbWF5IG9yIAorICAgICAgICBtYXkgbm90IG1hdGNoIHRoZSBzdHJ1Y3R1cmUncyB2ZXJzaW9uLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSAKKyAgICAgICAgY29tcG9uZW50IHdhcyBidWlsdCBhZ2FpbnN0IHRoZSAyLjAgc3BlY2lmaWNhdGlvbiwgYnV0IHRoZSAKKyAgICAgICAgYXBwbGljYXRpb24gKHdoaWNoIGNyZWF0ZXMgdGhlIHN0cnVjdHVyZSBpcyBidWlsdCBhZ2FpbnN0IHRoZSAKKyAgICAgICAgMS4wIHNwZWNpZmljYXRpb24gdGhlIHZlcnNpb25zIHdvdWxkIGJlIGRpZmZlcmVudC4KKyAgICBAcGFyYW0gW291dF0gcENvbXBvbmVudFVVSUQKKyAgICAgICAgcG9pbnRlciB0byB0aGUgVVVJRCBvZiB0aGUgY29tcG9uZW50IHdoaWNoIHdpbGwgYmUgZmlsbGVkIGluIGJ5IAorICAgICAgICB0aGUgY29tcG9uZW50LiAgVGhlIFVVSUQgaXMgYSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlzIHNldCBhdCAKKyAgICAgICAgUlVOIHRpbWUgZm9yIHRoZSBjb21wb25lbnQgYW5kIGlzIHVuaXF1ZSB0byBlYWNoIGluc3RhbnRpb24gb2YgCisgICAgICAgIHRoZSBjb21wb25lbnQuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcAorICovCisjZGVmaW5lIE9NWF9HZXRDb21wb25lbnRWZXJzaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnROYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBTcGVjVmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRVVUlEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldENvbXBvbmVudFZlcnNpb24oICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnROYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRWZXJzaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBTcGVjVmVyc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRVVUlEKSAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb21wb25lbnQuICBUaGlzIGNhbGwgaXMgYSBub24tYmxvY2tpbmcgY2FsbC4KKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCBjaGVjayB0aGUgcGFyYW1ldGVycyBhbmQgdGhlbiBxdWV1ZSB0aGUgY29tbWFuZAorICAgIHRvIHRoZSBjb21wb25lbnQgdGhyZWFkIHRvIGJlIGV4ZWN1dGVkLiAgVGhlIGNvbXBvbmVudCB0aHJlYWQgc2hhbGwgCisgICAgc2VuZCB0aGUgRXZlbnRIYW5kbGVyKCkgY2FsbGJhY2sgYXQgdGhlIGNvbmNsdXNpb24gb2YgdGhlIGNvbW1hbmQuIAorICAgIFRoaXMgbWFjcm8gd2lsbCBnbyBkaXJlY3RseSBmcm9tIHRoZSBhcHBsaWNhdGlvbiB0byB0aGUgY29tcG9uZW50ICh2aWEKKyAgICBhIGNvcmUgbWFjcm8pLiAgVGhlIGNvbXBvbmVudCB3aWxsIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIFdoZW4gdGhlIGNvbW1hbmQgaXMgIk9NWF9Db21tYW5kU3RhdGVTZXQiIHRoZSBjb21wb25lbnQgd2lsbCBxdWV1ZSBhCisgICAgc3RhdGUgdHJhbnNpdGlvbiB0byB0aGUgbmV3IHN0YXRlIGlkZW5maWVkIGluIG5QYXJhbS4KKyAgICAKKyAgICBXaGVuIHRoZSBjb21tYW5kIGlzICJPTVhfQ29tbWFuZEZsdXNoIiwgdG8gZmx1c2ggYSBwb3J0J3MgYnVmZmVyIHF1ZXVlcywKKyAgICB0aGUgY29tbWFuZCB3aWxsIGZvcmNlIHRoZSBjb21wb25lbnQgdG8gcmV0dXJuIGFsbCBidWZmZXJzIE5PVCBDVVJSRU5UTFkgCisgICAgQkVJTkcgUFJPQ0VTU0VEIHRvIHRoZSBhcHBsaWNhdGlvbiwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZSBidWZmZXJzIAorICAgIHdlcmUgcmVjZWl2ZWQuCisgICAgCisgICAgV2hlbiB0aGUgY29tbWFuZCBpcyAiT01YX0NvbW1hbmRQb3J0RGlzYWJsZSIgb3IgCisgICAgIk9NWF9Db21tYW5kUG9ydEVuYWJsZSIsIHRoZSBjb21wb25lbnQncyBwb3J0IChnaXZlbiBieSB0aGUgdmFsdWUgb2YKKyAgICBuUGFyYW0pIHdpbGwgYmUgc3RvcHBlZCBvciByZXN0YXJ0ZWQuIAorICAgIAorICAgIFdoZW4gdGhlIGNvbW1hbmQgIk9NWF9Db21tYW5kTWFya0J1ZmZlciIgaXMgdXNlZCB0byBtYXJrIGEgYnVmZmVyLCB0aGUKKyAgICBwQ21kRGF0YSB3aWxsIHBvaW50IHRvIGEgT01YX01BUktUWVBFIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZSBjb21wb25lbnQKKyAgICBoYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBleGFtaW5lIHRoZSBidWZmZXIgY2hhaW4gZm9yIHRoZSBtYXJrLiAgblBhcmFtMQorICAgIGNvbnRhaW5zIHRoZSBpbmRleCBvZiB0aGUgcG9ydCBvbiB3aGljaCB0aGUgYnVmZmVyIG1hcmsgaXMgYXBwbGllZC4KKworICAgIFNwZWNpZmljYXRpb24gdGV4dCBmb3IgbW9yZSBkZXRhaWxzLiAKKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIGhhbmRsZSBvZiBjb21wb25lbnQgdG8gZXhlY3V0ZSB0aGUgY29tbWFuZAorICAgIEBwYXJhbSBbaW5dIENtZAorICAgICAgICBDb21tYW5kIGZvciB0aGUgY29tcG9uZW50IHRvIGV4ZWN1dGUKKyAgICBAcGFyYW0gW2luXSBuUGFyYW0KKyAgICAgICAgUGFyYW1ldGVyIGZvciB0aGUgY29tbWFuZCB0byBiZSBleGVjdXRlZC4gIFdoZW4gQ21kIGhhcyB0aGUgdmFsdWUgCisgICAgICAgIE9NWF9Db21tYW5kU3RhdGVTZXQsIHZhbHVlIGlzIGEgbWVtYmVyIG9mIE9NWF9TVEFURVRZUEUuICBXaGVuIENtZCBoYXMgCisgICAgICAgIHRoZSB2YWx1ZSBPTVhfQ29tbWFuZEZsdXNoLCB2YWx1ZSBvZiBuUGFyYW0gaW5kaWNhdGVzIHdoaWNoIHBvcnQocykgCisgICAgICAgIHRvIGZsdXNoLiAtMSBpcyB1c2VkIHRvIGZsdXNoIGFsbCBwb3J0cyBhIHNpbmdsZSBwb3J0IGluZGV4IHdpbGwgCisgICAgICAgIG9ubHkgZmx1c2ggdGhhdCBwb3J0LiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAiT01YX0NvbW1hbmRQb3J0RGlzYWJsZSIKKyAgICAgICAgb3IgIk9NWF9Db21tYW5kUG9ydEVuYWJsZSIsIHRoZSBjb21wb25lbnQncyBwb3J0IGlzIGdpdmVuIGJ5IAorICAgICAgICB0aGUgdmFsdWUgb2YgblBhcmFtLiAgV2hlbiBDbWQgaGFzIHRoZSB2YWx1ZSAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIgorICAgICAgICB0aGUgY29tcG9uZW50cyBwb3QgaXMgZ2l2ZW4gYnkgdGhlIHZhbHVlIG9mIG5QYXJhbS4KKyAgICBAcGFyYW0gW2luXSBwQ21kRGF0YQorICAgICAgICBQYXJhbWV0ZXIgcG9pbnRpbmcgdG8gdGhlIE9NWF9NQVJLVFlQRSBzdHJ1Y3R1cmUgd2hlbiBDbWQgaGFzIHRoZSB2YWx1ZQorICAgICAgICAiT01YX0NvbW1hbmRNYXJrQnVmZmVyIi4gICAgIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfU2VuZENvbW1hbmQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgQ21kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgblBhcmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcENtZERhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2VuZENvbW1hbmQoICAgICAgICAgXAorICAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgQ21kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgblBhcmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgcENtZERhdGEpICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9HZXRQYXJhbWV0ZXIgbWFjcm8gd2lsbCBnZXQgb25lIG9mIHRoZSBjdXJyZW50IHBhcmFtZXRlciAKKyAgICBzZXR0aW5ncyBmcm9tIHRoZSBjb21wb25lbnQuICBUaGlzIG1hY3JvIGNhbm5vdCBvbmx5IGJlIGludm9rZWQgd2hlbiAKKyAgICB0aGUgY29tcG9uZW50IGlzIGluIHRoZSBPTVhfU3RhdGVJbnZhbGlkIHN0YXRlLiAgVGhlIG5QYXJhbUluZGV4CisgICAgcGFyYW1ldGVyIGlzIHVzZWQgdG8gaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nIHJlcXVlc3RlZCBmcm9tCisgICAgdGhlIGNvbXBvbmVudC4gIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBhbGxvY2F0ZSB0aGUgY29ycmVjdCBzdHJ1Y3R1cmUgCisgICAgYW5kIHNoYWxsIGZpbGwgaW4gdGhlIHN0cnVjdHVyZSBzaXplIGFuZCB2ZXJzaW9uIGluZm9ybWF0aW9uIGJlZm9yZSAKKyAgICBpbnZva2luZyB0aGlzIG1hY3JvLiAgV2hlbiB0aGUgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBwb3J0LCB0aGUKKyAgICBjYWxsZXIgc2hhbGwgZmlsbCBpbiB0aGUgYXBwcm9wcmlhdGUgblBvcnRJbmRleCB2YWx1ZSBpbmRpY2F0aW5nIHRoZQorICAgIHBvcnQgb24gd2hpY2ggdGhlIHBhcmFtZXRlciBhcHBsaWVzLiBJZiB0aGUgY29tcG9uZW50IGhhcyBub3QgaGFkIAorICAgIGFueSBzZXR0aW5ncyBjaGFuZ2VkLCB0aGVuIHRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBhIHNldCBvZiAKKyAgICB2YWxpZCBERUZBVUxUICBwYXJhbWV0ZXJzIGZvciB0aGUgY29tcG9uZW50LiAgVGhpcyBpcyBhIGJsb2NraW5nIAorICAgIGNhbGwuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gblBhcmFtSW5kZXgKKyAgICAgICAgSW5kZXggb2YgdGhlIHN0cnVjdHVyZSB0byBiZSBmaWxsZWQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCisgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCisgICAgQHBhcmFtIFtpbixvdXRdIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUKKyAgICAgICAgUG9pbnRlciB0byBhcHBsaWNhdGlvbiBhbGxvY2F0ZWQgc3RydWN0dXJlIHRvIGJlIGZpbGxlZCBieSB0aGUgCisgICAgICAgIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX0dldFBhcmFtZXRlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldFBhcmFtZXRlciggICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX1NldFBhcmFtZXRlciBtYWNybyB3aWxsIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyCisgICAgc3RydWN0dXJlIHRvIGEgY29tcG9uZW50LiAgRWFjaCBzdHJ1Y3R1cmUgc2hhbGwgYmUgc2VudCBvbmUgYXQgYSB0aW1lLAorICAgIGluIGEgc2VwYXJhdGUgaW52b2NhdGlvbiBvZiB0aGUgbWFjcm8uICBUaGlzIG1hY3JvIGNhbiBvbmx5IGJlCisgICAgaW52b2tlZCB3aGVuIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIE9NWF9TdGF0ZUxvYWRlZCBzdGF0ZSwgb3IgdGhlCisgICAgcG9ydCBpcyBkaXNhYmxlZCAod2hlbiB0aGUgcGFyYW1ldGVyIGFwcGxpZXMgdG8gYSBwb3J0KS4gVGhlIAorICAgIG5QYXJhbUluZGV4IHBhcmFtZXRlciBpcyB1c2VkIHRvIGluZGljYXRlIHdoaWNoIHN0cnVjdHVyZSBpcyBiZWluZworICAgIHBhc3NlZCB0byB0aGUgY29tcG9uZW50LiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGFsbG9jYXRlIHRoZSAKKyAgICBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgYW5kIHZlcnNpb24gCisgICAgaW5mb3JtYXRpb24gKGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBkYXRhKSBiZWZvcmUgaW52b2tpbmcgdGhpcyBtYWNyby4KKyAgICBUaGUgYXBwbGljYXRpb24gaXMgZnJlZSB0byBkaXNwb3NlIG9mIHRoaXMgc3RydWN0dXJlIGFmdGVyIHRoZSBjYWxsCisgICAgYXMgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZCB0byBjb3B5IGFueSBkYXRhIGl0IHNoYWxsIHJldGFpbi4gIFRoaXMgCisgICAgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIG5JbmRleAorICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIHNlbnQuICBUaGlzIHZhbHVlIGlzIGZyb20gdGhlCisgICAgICAgIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uCisgICAgQHBhcmFtIFtpbl0gcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZQorICAgICAgICBwb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgdXNlZCBmb3IKKyAgICAgICAgaW5pdGlhbGl6YXRpb24gYnkgdGhlIGNvbXBvbmVudC4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX1NldFBhcmFtZXRlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBhcmFtSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlNldFBhcmFtZXRlciggICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5QYXJhbUluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0dldENvbmZpZyBtYWNybyB3aWxsIGdldCBvbmUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RydWN0dXJlcyAKKyAgICBmcm9tIGEgY29tcG9uZW50LiAgVGhpcyBtYWNybyBjYW4gYmUgaW52b2tlZCBhbnl0aW1lIGFmdGVyIHRoZSAKKyAgICBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkLiAgVGhlIG5QYXJhbUluZGV4IGNhbGwgcGFyYW1ldGVyIGlzIHVzZWQgdG8gCisgICAgaW5kaWNhdGUgd2hpY2ggc3RydWN0dXJlIGlzIGJlaW5nIHJlcXVlc3RlZCBmcm9tIHRoZSBjb21wb25lbnQuICBUaGUgCisgICAgYXBwbGljYXRpb24gc2hhbGwgYWxsb2NhdGUgdGhlIGNvcnJlY3Qgc3RydWN0dXJlIGFuZCBzaGFsbCBmaWxsIGluIHRoZSAKKyAgICBzdHJ1Y3R1cmUgc2l6ZSBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbiBiZWZvcmUgaW52b2tpbmcgdGhpcyBtYWNyby4gIAorICAgIElmIHRoZSBjb21wb25lbnQgaGFzIG5vdCBoYWQgdGhpcyBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBzZW50IGJlZm9yZSwgCisgICAgdGhlbiB0aGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gYSBzZXQgb2YgdmFsaWQgREVGQVVMVCB2YWx1ZXMgZm9yIHRoZSAKKyAgICBjb21wb25lbnQuICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLgorICAgIEBwYXJhbSBbaW5dIG5JbmRleAorICAgICAgICBJbmRleCBvZiB0aGUgc3RydWN0dXJlIHRvIGJlIGZpbGxlZC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbi4KKyAgICBAcGFyYW0gW2luLG91dF0gcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZQorICAgICAgICBwb2ludGVyIHRvIGFwcGxpY2F0aW9uIGFsbG9jYXRlZCBzdHJ1Y3R1cmUgdG8gYmUgZmlsbGVkIGJ5IHRoZSAKKyAgICAgICAgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyovICAgICAgICAKKyNkZWZpbmUgT01YX0dldENvbmZpZyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkdldENvbmZpZyggICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Db25maWdJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBDb21wb25lbnRDb25maWdTdHJ1Y3R1cmUpICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX1NldENvbmZpZyBtYWNybyB3aWxsIHNlbmQgb25lIG9mIHRoZSBjb25maWd1cmF0aW9uIAorICAgIHN0cnVjdHVyZXMgdG8gYSBjb21wb25lbnQuICBFYWNoIHN0cnVjdHVyZSBzaGFsbCBiZSBzZW50IG9uZSBhdCBhIHRpbWUsCisgICAgZWFjaCBpbiBhIHNlcGFyYXRlIGludm9jYXRpb24gb2YgdGhlIG1hY3JvLiAgVGhpcyBtYWNybyBjYW4gYmUgaW52b2tlZCAKKyAgICBhbnl0aW1lIGFmdGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gbG9hZGVkLiAgVGhlIGFwcGxpY2F0aW9uIHNoYWxsIAorICAgIGFsbG9jYXRlIHRoZSBjb3JyZWN0IHN0cnVjdHVyZSBhbmQgc2hhbGwgZmlsbCBpbiB0aGUgc3RydWN0dXJlIHNpemUgCisgICAgYW5kIHZlcnNpb24gaW5mb3JtYXRpb24gKGFzIHdlbGwgYXMgdGhlIGFjdHVhbCBkYXRhKSBiZWZvcmUgaW52b2tpbmcgCisgICAgdGhpcyBtYWNyby4gIFRoZSBhcHBsaWNhdGlvbiBpcyBmcmVlIHRvIGRpc3Bvc2Ugb2YgdGhpcyBzdHJ1Y3R1cmUgYWZ0ZXIgCisgICAgdGhlIGNhbGwgYXMgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZCB0byBjb3B5IGFueSBkYXRhIGl0IHNoYWxsIHJldGFpbi4gIAorICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gbkNvbmZpZ0luZGV4CisgICAgICAgIEluZGV4IG9mIHRoZSBzdHJ1Y3R1cmUgdG8gYmUgc2VudC4gIFRoaXMgdmFsdWUgaXMgZnJvbSB0aGUKKyAgICAgICAgT01YX0lOREVYVFlQRSBlbnVtZXJhdGlvbiBhYm92ZS4KKyAgICBAcGFyYW0gW2luXSBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlCisgICAgICAgIHBvaW50ZXIgdG8gYXBwbGljYXRpb24gYWxsb2NhdGVkIHN0cnVjdHVyZSB0byBiZSB1c2VkIGZvcgorICAgICAgICBpbml0aWFsaXphdGlvbiBieSB0aGUgY29tcG9uZW50LgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfU2V0Q29uZmlnKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuQ29uZmlnSW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQ29tcG9uZW50Q29uZmlnU3RydWN0dXJlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+U2V0Q29uZmlnKCAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbkNvbmZpZ0luZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcENvbXBvbmVudENvbmZpZ1N0cnVjdHVyZSkgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXggbWFjcm8gd2lsbCBpbnZva2UgYSBjb21wb25lbnQgdG8gdHJhbnNsYXRlIAorICAgIGEgdmVuZG9yIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gb3IgcGFyYW1ldGVyIHN0cmluZyBpbnRvIGFuIE9NWCAKKyAgICBzdHJ1Y3R1cmUgaW5kZXguICBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgdGhlIHZlbmRvciB0byBzdXBwb3J0IAorICAgIHRoaXMgY29tbWFuZCBmb3IgdGhlIGluZGV4ZXMgYWxyZWFkeSBmb3VuZCBpbiB0aGUgT01YX0lOREVYVFlQRSAKKyAgICBlbnVtZXJhdGlvbiAodGhpcyBpcyBkb25lIHRvIHNhdmUgc3BhY2UgaW4gc21hbGwgY29tcG9uZW50cykuICBUaGUgCisgICAgY29tcG9uZW50IHNoYWxsIHN1cHBvcnQgYWxsIHZlbmRvciBzdXBwbGllZCBleHRlbnNpb24gaW5kZXhlcyBub3QgZm91bmQKKyAgICBpbiB0aGUgbWFzdGVyIE9NWF9JTkRFWFRZUEUgZW51bWVyYXRpb24uICBUaGlzIGlzIGEgYmxvY2tpbmcgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhDb21wb25lbnQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBUaGlzIGlzIHRoZSBjb21wb25lbnQKKyAgICAgICAgaGFuZGxlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBHZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gY1BhcmFtZXRlck5hbWUKKyAgICAgICAgT01YX1NUUklORyB0aGF0IHNoYWxsIGJlIGxlc3MgdGhhbiAxMjggY2hhcmFjdGVycyBsb25nIGluY2x1ZGluZworICAgICAgICB0aGUgdHJhaWxpbmcgbnVsbCBieXRlLiAgVGhpcyBpcyB0aGUgc3RyaW5nIHRoYXQgd2lsbCBnZXQgCisgICAgICAgIHRyYW5zbGF0ZWQgYnkgdGhlIGNvbXBvbmVudCBpbnRvIGEgY29uZmlndXJhdGlvbiBpbmRleC4KKyAgICBAcGFyYW0gW291dF0gcEluZGV4VHlwZQorICAgICAgICBhIHBvaW50ZXIgdG8gYSBPTVhfSU5ERVhUWVBFIHRvIHJlY2VpdmUgdGhlIGluZGV4IHZhbHVlLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAKKyAqLworI2RlZmluZSBPTVhfR2V0RXh0ZW5zaW9uSW5kZXgoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjUGFyYW1ldGVyTmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwSW5kZXhUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5HZXRFeHRlbnNpb25JbmRleCggICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjUGFyYW1ldGVyTmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwSW5kZXhUeXBlKSAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0dldFN0YXRlIG1hY3JvIHdpbGwgaW52b2tlIHRoZSBjb21wb25lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IAorICAgIHN0YXRlIG9mIHRoZSBjb21wb25lbnQgYW5kIHBsYWNlIHRoZSBzdGF0ZSB2YWx1ZSBpbnRvIHRoZSBsb2NhdGlvbgorICAgIHBvaW50ZWQgdG8gYnkgcFN0YXRlLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtvdXRdIHBTdGF0ZQorICAgICAgICBwb2ludGVyIHRvIHRoZSBsb2NhdGlvbiB0byByZWNlaXZlIHRoZSBzdGF0ZS4gIFRoZSB2YWx1ZSByZXR1cm5lZAorICAgICAgICBpcyBvbmUgb2YgdGhlIE9NWF9TVEFURVRZUEUgbWVtYmVycyAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wCisgKi8KKyNkZWZpbmUgT01YX0dldFN0YXRlKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFN0YXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+R2V0U3RhdGUoICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcFN0YXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9Vc2VCdWZmZXIgbWFjcm8gd2lsbCByZXF1ZXN0IHRoYXQgdGhlIGNvbXBvbmVudCB1c2UKKyAgICBhIGJ1ZmZlciAoYW5kIGFsbG9jYXRlIGl0cyBvd24gYnVmZmVyIGhlYWRlcikgYWxyZWFkeSBhbGxvY2F0ZWQgCisgICAgYnkgYW5vdGhlciBjb21wb25lbnQsIG9yIGJ5IHRoZSBJTCBDbGllbnQuIFRoaXMgaXMgYSBibG9ja2luZyAKKyAgICBjYWxsLgorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIHRoZSAKKyAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlcgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvbXAgYnVmCisgKi8KKworI2RlZmluZSBPTVhfVXNlQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuU2l6ZUJ5dGVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5Vc2VCdWZmZXIoICAgICAgICAgICAgXAorICAgICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwcEJ1ZmZlckhkciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuUG9ydEluZGV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQXBwUHJpdmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBuU2l6ZUJ5dGVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICBwQnVmZmVyKQorCisKKy8qKiBUaGUgT01YX0FsbG9jYXRlQnVmZmVyIG1hY3JvIHdpbGwgcmVxdWVzdCB0aGF0IHRoZSBjb21wb25lbnQgYWxsb2NhdGUgCisgICAgYSBuZXcgYnVmZmVyIGFuZCBidWZmZXIgaGVhZGVyLiAgVGhlIGNvbXBvbmVudCB3aWxsIGFsbG9jYXRlIHRoZSAKKyAgICBidWZmZXIgYW5kIHRoZSBidWZmZXIgaGVhZGVyIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBidWZmZXIgCisgICAgaGVhZGVyLiAgVGhpcyBpcyBhIGJsb2NraW5nIGNhbGwuCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtvdXRdIHBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIHVzZWQgdG8gcmVjZWl2ZSAKKyAgICAgICAgdGhlIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciBoZWFkZXIKKyAgICBAcGFyYW0gW2luXSBuUG9ydEluZGV4CisgICAgICAgIG5Qb3J0SW5kZXggaXMgdXNlZCB0byBzZWxlY3QgdGhlIHBvcnQgb24gdGhlIGNvbXBvbmVudCB0aGUgYnVmZmVyIHdpbGwKKyAgICAgICAgYmUgdXNlZCB3aXRoLiAgVGhlIHBvcnQgY2FuIGJlIGZvdW5kIGJ5IHVzaW5nIHRoZSBuUG9ydEluZGV4CisgICAgICAgIHZhbHVlIGFzIGFuIGluZGV4IGludG8gdGhlIFBvcnQgRGVmaW5pdGlvbiBhcnJheSBvZiB0aGUgY29tcG9uZW50LgorICAgIEBwYXJhbSBbaW5dIHBBcHBQcml2YXRlCisgICAgICAgIHBBcHBQcml2YXRlIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgcEFwcFByaXZhdGUgbWVtYmVyIG9mIHRoZSAKKyAgICAgICAgYnVmZmVyIGhlYWRlciBzdHJ1Y3R1cmUuCisgICAgQHBhcmFtIFtpbl0gblNpemVCeXRlcworICAgICAgICBzaXplIG9mIHRoZSBidWZmZXIgdG8gYWxsb2NhdGUuICBVc2VkIHdoZW4gYkFsbG9jYXRlTmV3IGlzIHRydWUuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLyAgICAKKyNkZWZpbmUgT01YX0FsbG9jYXRlQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHBCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblNpemVCeXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoKE9NWF9DT01QT05FTlRUWVBFKiloQ29tcG9uZW50KS0+QWxsb2NhdGVCdWZmZXIoICAgICAgIFwKKyAgICAgICAgaENvbXBvbmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcHBCdWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblBvcnRJbmRleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcEFwcFByaXZhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgblNpemVCeXRlcykgICAgICAgICAgICAgICAgICAgICAvKiBNYWNybyBFbmQgKi8KKworCisvKiogVGhlIE9NWF9GcmVlQnVmZmVyIG1hY3JvIHdpbGwgcmVsZWFzZSBhIGJ1ZmZlciBoZWFkZXIgZnJvbSB0aGUgY29tcG9uZW50CisgICAgd2hpY2ggd2FzIGFsbG9jYXRlZCB1c2luZyBlaXRoZXIgT01YX0FsbG9jYXRlQnVmZmVyIG9yIE9NWF9Vc2VCdWZmZXIuIElmICAKKyAgICB0aGUgY29tcG9uZW50IGFsbG9jYXRlZCB0aGUgYnVmZmVyIChzZWUgdGhlIE9NWF9Vc2VCdWZmZXIgbWFjcm8pIHRoZW4gCisgICAgdGhlIGNvbXBvbmVudCBzaGFsbCBmcmVlIHRoZSBidWZmZXIgYW5kIGJ1ZmZlciBoZWFkZXIuIFRoaXMgaXMgYSAKKyAgICBibG9ja2luZyBjYWxsLiAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gblBvcnRJbmRleAorICAgICAgICBuUG9ydEluZGV4IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdGhlIGJ1ZmZlciB3aWxsCisgICAgICAgIGJlIHVzZWQgd2l0aC4KKyAgICBAcGFyYW0gW2luXSBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisjZGVmaW5lIE9NWF9GcmVlQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkZyZWVCdWZmZXIoICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworLyoqIFRoZSBPTVhfRW1wdHlUaGlzQnVmZmVyIG1hY3JvIHdpbGwgc2VuZCBhIGJ1ZmZlciBmdWxsIG9mIGRhdGEgdG8gYW4gCisgICAgaW5wdXQgcG9ydCBvZiBhIGNvbXBvbmVudC4gIFRoZSBidWZmZXIgd2lsbCBiZSBlbXB0aWVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICBhbmQgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSB0aGUgRW1wdHlCdWZmZXJEb25lIGNhbGwgYmFjay4KKyAgICBUaGlzIGlzIGEgbm9uLWJsb2NraW5nIGNhbGwgaW4gdGhhdCB0aGUgY29tcG9uZW50IHdpbGwgcmVjb3JkIHRoZSBidWZmZXIKKyAgICBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGFuZCB0aGVuIGVtcHR5IHRoZSBidWZmZXIsIGxhdGVyLCBhdCB0aGUgcHJvcGVyIAorICAgIHRpbWUuICBBcyBleHBlY3RlZCwgdGhpcyBtYWNybyBtYXkgYmUgaW52b2tlZCBvbmx5IHdoaWxlIHRoZSBjb21wb25lbnQgCisgICAgaXMgaW4gdGhlIE9NWF9TdGF0ZUV4ZWN1dGluZy4gIElmIG5Qb3J0SW5kZXggZG9lcyBub3Qgc3BlY2lmeSBhbiBpbnB1dAorICAgIHBvcnQsIHRoZSBjb21wb25lbnQgc2hhbGwgcmV0dXJuIGFuIGVycm9yLiAgCisgICAgCisgICAgVGhlIGNvbXBvbmVudCBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiA1IG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uCisgICAgQHBhcmFtIFtpbl0gcEJ1ZmZlcgorICAgICAgICBwb2ludGVyIHRvIGFuIE9NWF9CVUZGRVJIRUFERVJUWVBFIHN0cnVjdHVyZSBhbGxvY2F0ZWQgd2l0aCBVc2VCdWZmZXIKKyAgICAgICAgb3IgQWxsb2NhdGVCdWZmZXIuCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29tcCBidWYKKyAqLworI2RlZmluZSBPTVhfRW1wdHlUaGlzQnVmZmVyKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgoT01YX0NPTVBPTkVOVFRZUEUqKWhDb21wb25lbnQpLT5FbXB0eVRoaXNCdWZmZXIoICAgICAgXAorICAgICAgICBoQ29tcG9uZW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBwQnVmZmVyKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hY3JvIEVuZCAqLworCisKKy8qKiBUaGUgT01YX0ZpbGxUaGlzQnVmZmVyIG1hY3JvIHdpbGwgc2VuZCBhbiBlbXB0eSBidWZmZXIgdG8gYW4gCisgICAgb3V0cHV0IHBvcnQgb2YgYSBjb21wb25lbnQuICBUaGUgYnVmZmVyIHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICBhbmQgcmV0dXJuZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHZpYSB0aGUgRmlsbEJ1ZmZlckRvbmUgY2FsbCBiYWNrLgorICAgIFRoaXMgaXMgYSBub24tYmxvY2tpbmcgY2FsbCBpbiB0aGF0IHRoZSBjb21wb25lbnQgd2lsbCByZWNvcmQgdGhlIGJ1ZmZlcgorICAgIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgYW5kIHRoZW4gZmlsbCB0aGUgYnVmZmVyLCBsYXRlciwgYXQgdGhlIHByb3BlciAKKyAgICB0aW1lLiAgQXMgZXhwZWN0ZWQsIHRoaXMgbWFjcm8gbWF5IGJlIGludm9rZWQgb25seSB3aGlsZSB0aGUgY29tcG9uZW50IAorICAgIGlzIGluIHRoZSBPTVhfRXhlY3V0aW5nU3RhdGUuICBJZiBuUG9ydEluZGV4IGRvZXMgbm90IHNwZWNpZnkgYW4gb3V0cHV0CisgICAgcG9ydCwgdGhlIGNvbXBvbmVudCBzaGFsbCByZXR1cm4gYW4gZXJyb3IuICAKKyAgICAKKyAgICBUaGUgY29tcG9uZW50IHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDUgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW2luXSBwQnVmZmVyCisgICAgICAgIHBvaW50ZXIgdG8gYW4gT01YX0JVRkZFUkhFQURFUlRZUEUgc3RydWN0dXJlIGFsbG9jYXRlZCB3aXRoIFVzZUJ1ZmZlcgorICAgICAgICBvciBBbGxvY2F0ZUJ1ZmZlci4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisjZGVmaW5lIE9NWF9GaWxsVGhpc0J1ZmZlciggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPkZpbGxUaGlzQnVmZmVyKCAgICAgICBcCisgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHBCdWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFjcm8gRW5kICovCisKKworCisvKiogVGhlIE9NWF9Vc2VFR0xJbWFnZSBtYWNybyB3aWxsIHJlcXVlc3QgdGhhdCB0aGUgY29tcG9uZW50IHVzZQorICAgIGEgRUdMSW1hZ2UgcHJvdmlkZWQgYnkgRUdMIChhbmQgYWxsb2NhdGUgaXRzIG93biBidWZmZXIgaGVhZGVyKQorICAgIFRoaXMgaXMgYSBibG9ja2luZyBjYWxsLgorICAgIAorICAgIFRoZSBjb21wb25lbnQgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW2luXSBoQ29tcG9uZW50CisgICAgICAgIEhhbmRsZSBvZiB0aGUgY29tcG9uZW50IHRvIGJlIGFjY2Vzc2VkLiAgVGhpcyBpcyB0aGUgY29tcG9uZW50CisgICAgICAgIGhhbmRsZSByZXR1cm5lZCBieSB0aGUgY2FsbCB0byB0aGUgT01YX0dldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcGFyYW0gW291dF0gcHBCdWZmZXIKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfQlVGRkVSSEVBREVSVFlQRSBzdHJ1Y3R1cmUgdXNlZCB0byByZWNlaXZlIHRoZSAKKyAgICAgICAgcG9pbnRlciB0byB0aGUgYnVmZmVyIGhlYWRlci4gIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGxvY2F0aW9uIHVzZWQKKyAgICAgICAgZm9yIHRoaXMgYnVmZmVyIGlzIE5PVCB2aXNpYmxlIHRvIHRoZSBJTCBDbGllbnQuCisgICAgQHBhcmFtIFtpbl0gblBvcnRJbmRleAorICAgICAgICBuUG9ydEluZGV4IGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBwb3J0IG9uIHRoZSBjb21wb25lbnQgdGhlIGJ1ZmZlciB3aWxsCisgICAgICAgIGJlIHVzZWQgd2l0aC4gIFRoZSBwb3J0IGNhbiBiZSBmb3VuZCBieSB1c2luZyB0aGUgblBvcnRJbmRleAorICAgICAgICB2YWx1ZSBhcyBhbiBpbmRleCBpbnRvIHRoZSBQb3J0IERlZmluaXRpb24gYXJyYXkgb2YgdGhlIGNvbXBvbmVudC4KKyAgICBAcGFyYW0gW2luXSBwQXBwUHJpdmF0ZQorICAgICAgICBwQXBwUHJpdmF0ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHBBcHBQcml2YXRlIG1lbWJlciBvZiB0aGUgCisgICAgICAgIGJ1ZmZlciBoZWFkZXIgc3RydWN0dXJlLgorICAgIEBwYXJhbSBbaW5dIGVnbEltYWdlCisgICAgICAgIGVnbEltYWdlIGNvbnRhaW5zIHRoZSBoYW5kbGUgb2YgdGhlIEVHTEltYWdlIHRvIHVzZSBhcyBhIGJ1ZmZlciBvbiB0aGUKKyAgICAgICAgc3BlY2lmaWVkIHBvcnQuICBUaGUgY29tcG9uZW50IGlzIGV4cGVjdGVkIHRvIHZhbGlkYXRlIHByb3BlcnRpZXMgb2YgCisgICAgICAgIHRoZSBFR0xJbWFnZSBhZ2FpbnN0IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwb3J0IHRvIGVuc3VyZSB0aGUgY29tcG9uZW50CisgICAgICAgIGNhbiB1c2UgdGhlIEVHTEltYWdlIGFzIGEgYnVmZmVyLiAgICAgICAgICAKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb21wIGJ1ZgorICovCisjZGVmaW5lIE9NWF9Vc2VFR0xJbWFnZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGVnbEltYWdlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKChPTVhfQ09NUE9ORU5UVFlQRSopaENvbXBvbmVudCktPlVzZUVHTEltYWdlKCAgICAgICAgICBcCisgICAgICAgICAgIGhDb21wb25lbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBwQnVmZmVySGRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIG5Qb3J0SW5kZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIHBBcHBQcml2YXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIGVnbEltYWdlKQorCisvKiogVGhlIE9NWF9Jbml0IG1ldGhvZCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIE9NWCBjb3JlLiAgSXQgc2hhbGwgYmUgdGhlCisgICAgZmlyc3QgY2FsbCBtYWRlIGludG8gT01YIGFuZCBpdCBzaG91bGQgb25seSBiZSBleGVjdXRlZCBvbmUgdGltZSB3aXRob3V0CisgICAgYW4gaW50ZXJ2aWVuaW5nIE9NWF9EZWluaXQgY2FsbC4gIAorICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisKKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0luaXQodm9pZCk7CisKKworLyoqIFRoZSBPTVhfRGVpbml0IG1ldGhvZCBpcyB1c2VkIHRvIGRlaW5pdGlhbGl6ZSB0aGUgT01YIGNvcmUuICBJdCBzaGFsbCBiZSAKKyAgICB0aGUgbGFzdCBjYWxsIG1hZGUgaW50byBPTVguIEluIHRoZSBldmVudCB0aGF0IHRoZSBjb3JlIGRldGVybWluZXMgdGhhdCAKKyAgICB0aGFyZSBhcmUgY29tcG9uZW50cyBsb2FkZWQgd2hlbiB0aGlzIGNhbGwgaXMgbWFkZSwgdGhlIGNvcmUgbWF5IHJldHVybiAKKyAgICB3aXRoIGFuIGVycm9yIHJhdGhlciB0aGFuIHRyeSB0byB1bmxvYWQgdGhlIGNvbXBvbmVudHMuCisgICAgICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIE90aGVyd2lzZSB0aGUgYXBwcm9wcmlhdGUgT01YIGVycm9yIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgQGluZ3JvdXAgY29yZQorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9EZWluaXQodm9pZCk7CisKKworLyoqIFRoZSBPTVhfQ29tcG9uZW50TmFtZUVudW0gbWV0aG9kIHdpbGwgZW51bWVyYXRlIHRocm91Z2ggYWxsIHRoZSBuYW1lcyBvZgorICAgIHJlY29nbmlzZWQgdmFsaWQgY29tcG9uZW50cyBpbiB0aGUgc3lzdGVtLiBUaGlzIGZ1bmN0aW9uIGlzIHByb3ZpZGVkCisgICAgYXMgYSBtZWFucyB0byBkZXRlY3QgYWxsIHRoZSBjb21wb25lbnRzIGluIHRoZSBzeXN0ZW0gcnVuLXRpbWUuIFRoZXJlIGlzCisgICAgbm8gc3RyaWN0IG9yZGVyaW5nIHRvIHRoZSBlbnVtZXJhdGlvbiBvcmRlciBvZiBjb21wb25lbnQgbmFtZXMsIGFsdGhvdWdoCisgICAgZWFjaCBuYW1lIHdpbGwgb25seSBiZSBlbnVtZXJhdGVkIG9uY2UuICBJZiB0aGUgT01YIGNvcmUgc3VwcG9ydHMgcnVuLXRpbWUKKyAgICBpbnN0YWxsYXRpb24gb2YgbmV3IGNvbXBvbmVudHMsIGl0IGlzIG9ubHkgcmVxdXJpZWQgdG8gZGV0ZWN0IG5ld2x5CisgICAgaW5zdGFsbGVkIGNvbXBvbmVudHMgd2hlbiB0aGUgZmlyc3QgY2FsbCB0byBlbnVtZXJhdGUgY29tcG9uZW50IG5hbWVzCisgICAgaXMgbWFkZSAoaS5lLiB3aGVuIG5JbmRleCBpcyAweDApLgorICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgaW4gMjAgbXNlYy4KKyAgICAKKyAgICBAcGFyYW0gW291dF0gY0NvbXBvbmVudE5hbWUKKyAgICAgICAgcG9pbnRlciB0byBhIG51bGwgdGVybWluYXRlZCBzdHJpbmcgd2l0aCB0aGUgY29tcG9uZW50IG5hbWUuICBUaGUKKyAgICAgICAgbmFtZXMgb2YgdGhlIGNvbXBvbmVudHMgYXJlIHN0cmluZ3MgbGVzcyB0aGFuIDEyNyBieXRlcyBpbiBsZW5ndGgKKyAgICAgICAgcGx1cyB0aGUgdHJhaWxpbmcgbnVsbCBmb3IgYSBtYXhpbXVtIHNpemUgb2YgMTI4IGJ5dGVzLiAgQW4gZXhhbXBsZSAKKyAgICAgICAgb2YgYSB2YWxpZCBjb21wb25lbnQgbmFtZSBpcyAiT01YLlRJLkFVRElPLkRTUC5NSVhFUlwwIi4gIE5hbWVzIGFyZSAKKyAgICAgICAgYXNzaWduZWQgYnkgdGhlIHZlbmRvciwgYnV0IHNoYWxsIHN0YXJ0IHdpdGggIk9NWC4iIGFuZCB0aGVuIGhhdmUgCisgICAgICAgIHRoZSBWZW5kb3IgZGVzaWduYXRpb24gbmV4dC4KKyAgICBAcGFyYW0gW2luXSBuTmFtZUxlbmd0aAorICAgICAgICBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgY0NvbXBvbmVudE5hbWUgc3RyaW5nLiAgV2l0aCBhbGwgCisgICAgICAgIGNvbXBvbmVudCBuYW1lIHN0cmluZ3MgcmVzdHJpY3RlZCB0byBsZXNzIHRoYW4gMTI4IGNoYXJhY3RlcnMgCisgICAgICAgIChpbmNsdWRpbmcgdGhlIHRyYWlsaW5nIG51bGwpIGl0IGlzIHJlY29tZW5kZWQgdGhhdCB0aGUgY2FsbGVyCisgICAgICAgIHByb3ZpZGUgYSBpbnB1dCBzdHJpbmcgZm9yIHRoZSBjQ29tcG9uZW50TmFtZSBvZiAxMjggY2hhcmFjdGVycy4KKyAgICBAcGFyYW0gW2luXSBuSW5kZXgKKyAgICAgICAgbnVtYmVyIGNvbnRhaW5pbmcgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgY29tcG9uZW50LiAKKyAgICAgICAgTXVsdGlwbGUgY2FsbHMgdG8gT01YX0NvbXBvbmVudE5hbWVFbnVtIHdpdGggaW5jcmVhc2luZyB2YWx1ZXMKKyAgICAgICAgb2YgbkluZGV4IHdpbGwgZW51bWVyYXRlIHRocm91Z2ggdGhlIGNvbXBvbmVudCBuYW1lcyBpbiB0aGUKKyAgICAgICAgc3lzdGVtIHVudGlsIE9NWF9FcnJvck5vTW9yZSBpcyByZXR1cm5lZC4gIFRoZSB2YWx1ZSBvZiBuSW5kZXgKKyAgICAgICAgaXMgMCB0byAoTi0xKSwgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHZhbGlkIGluc3RhbGxlZCBjb21wb25lbnRzCisgICAgICAgIGluIHRoZSBzeXN0ZW0uCisgICAgQHJldHVybiBPTVhfRVJST1JUWVBFCisgICAgICAgIElmIHRoZSBjb21tYW5kIHN1Y2Nlc3NmdWxseSBleGVjdXRlcywgdGhlIHJldHVybiBjb2RlIHdpbGwgYmUKKyAgICAgICAgT01YX0Vycm9yTm9uZS4gIFdoZW4gdGhlIHZhbHVlIG9mIG5JbmRleCBleGNlZWRzIHRoZSBudW1iZXIgb2YgCisgICAgICAgIGNvbXBvbmVudHMgaW4gdGhlIHN5c3RlbSBtaW51cyAxLCBPTVhfRXJyb3JOb01vcmUgd2lsbCBiZQorICAgICAgICByZXR1cm5lZC4gT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0NvbXBvbmVudE5hbWVFbnVtKAorICAgIE9NWF9PVVQgT01YX1NUUklORyBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gIE9NWF9VMzIgbk5hbWVMZW5ndGgsCisgICAgT01YX0lOICBPTVhfVTMyIG5JbmRleCk7CisKKworLyoqIFRoZSBPTVhfR2V0SGFuZGxlIG1ldGhvZCB3aWxsIGxvY2F0ZSB0aGUgY29tcG9uZW50IHNwZWNpZmllZCBieSB0aGUKKyAgICBjb21wb25lbnQgbmFtZSBnaXZlbiwgbG9hZCB0aGF0IGNvbXBvbmVudCBpbnRvIG1lbW9yeSBhbmQgdGhlbiBpbnZva2UKKyAgICB0aGUgY29tcG9uZW50J3MgbWV0aG9kcyB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudC4gIAorICAgIAorICAgIFRoZSBjb3JlIHNob3VsZCByZXR1cm4gZnJvbSB0aGlzIGNhbGwgd2l0aGluIDIwIG1zZWMuCisgICAgCisgICAgQHBhcmFtIFtvdXRdIHBIYW5kbGUKKyAgICAgICAgcG9pbnRlciB0byBhbiBPTVhfSEFORExFVFlQRSBwb2ludGVyIHRvIGJlIGZpbGxlZCBpbiBieSB0aGlzIG1ldGhvZC4KKyAgICBAcGFyYW0gW2luXSBjQ29tcG9uZW50TmFtZQorICAgICAgICBwb2ludGVyIHRvIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyB3aXRoIHRoZSBjb21wb25lbnQgbmFtZS4gIFRoZQorICAgICAgICBuYW1lcyBvZiB0aGUgY29tcG9uZW50cyBhcmUgc3RyaW5ncyBsZXNzIHRoYW4gMTI3IGJ5dGVzIGluIGxlbmd0aAorICAgICAgICBwbHVzIHRoZSB0cmFpbGluZyBudWxsIGZvciBhIG1heGltdW0gc2l6ZSBvZiAxMjggYnl0ZXMuICBBbiBleGFtcGxlIAorICAgICAgICBvZiBhIHZhbGlkIGNvbXBvbmVudCBuYW1lIGlzICJPTVguVEkuQVVESU8uRFNQLk1JWEVSXDAiLiAgTmFtZXMgYXJlIAorICAgICAgICBhc3NpZ25lZCBieSB0aGUgdmVuZG9yLCBidXQgc2hhbGwgc3RhcnQgd2l0aCAiT01YLiIgYW5kIHRoZW4gaGF2ZSAKKyAgICAgICAgdGhlIFZlbmRvciBkZXNpZ25hdGlvbiBuZXh0LgorICAgIEBwYXJhbSBbaW5dIHBBcHBEYXRhCisgICAgICAgIHBvaW50ZXIgdG8gYW4gYXBwbGljYXRpb24gZGVmaW5lZCB2YWx1ZSB0aGF0IHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgICAgZHVyaW5nIGNhbGxiYWNrcyBzbyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBjYW4gaWRlbnRpZnkgdGhlIHNvdXJjZQorICAgICAgICBvZiB0aGUgY2FsbGJhY2suCisgICAgQHBhcmFtIFtpbl0gcENhbGxCYWNrcworICAgICAgICBwb2ludGVyIHRvIGEgT01YX0NBTExCQUNLVFlQRSBzdHJ1Y3R1cmUgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgICAgY29tcG9uZW50IHRvIGluaXRpYWxpemUgaXQgd2l0aC4gIAorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9BUElFTlRSWSBPTVhfR2V0SGFuZGxlKAorICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUqIHBIYW5kbGUsIAorICAgIE9NWF9JTiAgT01YX1NUUklORyBjQ29tcG9uZW50TmFtZSwKKyAgICBPTVhfSU4gIE9NWF9QVFIgcEFwcERhdGEsCisgICAgT01YX0lOICBPTVhfQ0FMTEJBQ0tUWVBFKiBwQ2FsbEJhY2tzKTsKKworCisvKiogVGhlIE9NWF9GcmVlSGFuZGxlIG1ldGhvZCB3aWxsIGZyZWUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IHRoZSBPTVhfR2V0SGFuZGxlIAorICAgIG1ldGhvZC4gIElmIHRoZSBjb21wb25lbnQgcmVmZXJlbmNlIGNvdW50IGdvZXMgdG8gemVybywgdGhlIGNvbXBvbmVudCB3aWxsCisgICAgYmUgdW5sb2FkZWQgZnJvbSBtZW1vcnkuICAKKyAgICAKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjIHdoZW4gdGhlIGNvbXBvbmVudCBpcyAKKyAgICBpbiB0aGUgT01YX1N0YXRlTG9hZGVkIHN0YXRlLgorCisgICAgQHBhcmFtIFtpbl0gaENvbXBvbmVudAorICAgICAgICBIYW5kbGUgb2YgdGhlIGNvbXBvbmVudCB0byBiZSBhY2Nlc3NlZC4gIFRoaXMgaXMgdGhlIGNvbXBvbmVudAorICAgICAgICBoYW5kbGUgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIEdldEhhbmRsZSBmdW5jdGlvbi4KKyAgICBAcmV0dXJuIE9NWF9FUlJPUlRZUEUKKyAgICAgICAgSWYgdGhlIGNvbW1hbmQgc3VjY2Vzc2Z1bGx5IGV4ZWN1dGVzLCB0aGUgcmV0dXJuIGNvZGUgd2lsbCBiZQorICAgICAgICBPTVhfRXJyb3JOb25lLiAgT3RoZXJ3aXNlIHRoZSBhcHByb3ByaWF0ZSBPTVggZXJyb3Igd2lsbCBiZSByZXR1cm5lZC4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfQVBJRU5UUlkgT01YX0ZyZWVIYW5kbGUoCisgICAgT01YX0lOICBPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50KTsKKworCisKKy8qKiBUaGUgT01YX1NldHVwVHVubmVsIG1ldGhvZCB3aWxsIGhhbmRsZSB0aGUgbmVjZXNzYXJ5IGNhbGxzIHRvIHRoZSBjb21wb25lbnRzCisgICAgdG8gc2V0dXAgdGhlIHNwZWNpZmllZCB0dW5uZWwgdGhlIHR3byBjb21wb25lbnRzLiAgTk9URTogVGhpcyBpcworICAgIGFuIGFjdHVhbCBtZXRob2QgKG5vdCBhICNkZWZpbmUgbWFjcm8pLiAgVGhpcyBtZXRob2Qgd2lsbCBtYWtlIGNhbGxzIGludG8KKyAgICB0aGUgY29tcG9uZW50IENvbXBvbmVudFR1bm5lbFJlcXVlc3QgbWV0aG9kIHRvIGRvIHRoZSBhY3R1YWwgdHVubmVsIAorICAgIGNvbm5lY3Rpb24uICAKKworICAgIFRoZSBDb21wb25lbnRUdW5uZWxSZXF1ZXN0IG1ldGhvZCBvbiBib3RoIGNvbXBvbmVudHMgd2lsbCBiZSBjYWxsZWQuIAorICAgIFRoaXMgbWV0aG9kIHNoYWxsIG5vdCBiZSBjYWxsZWQgdW5sZXNzIHRoZSBjb21wb25lbnQgaXMgaW4gdGhlIAorICAgIE9NWF9TdGF0ZUxvYWRlZCBzdGF0ZSBleGNlcHQgd2hlbiB0aGUgcG9ydHMgdXNlZCBmb3IgdGhlIHR1bm5lbCBhcmUKKyAgICBkaXNhYmxlZC4gSW4gdGhpcyBjYXNlLCB0aGUgY29tcG9uZW50IG1heSBiZSBpbiB0aGUgT01YX1N0YXRlRXhlY3V0aW5nLAorICAgIE9NWF9TdGF0ZVBhdXNlLCBvciBPTVhfU3RhdGVJZGxlIHN0YXRlcy4gCisKKyAgICBUaGUgY29yZSBzaG91bGQgcmV0dXJuIGZyb20gdGhpcyBjYWxsIHdpdGhpbiAyMCBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIGhPdXRwdXQKKyAgICAgICAgSGFuZGxlIG9mIHRoZSBjb21wb25lbnQgdG8gYmUgYWNjZXNzZWQuICBBbHNvIHRoaXMgaXMgdGhlIGhhbmRsZQorICAgICAgICBvZiB0aGUgY29tcG9uZW50IHdob3NlIHBvcnQsIHNwZWNpZmllZCBpbiB0aGUgblBvcnRPdXRwdXQgcGFyYW1ldGVyCisgICAgICAgIHdpbGwgYmUgdXNlZCB0aGUgc291cmNlIGZvciB0aGUgdHVubmVsLiBUaGlzIGlzIHRoZSBjb21wb25lbnQgaGFuZGxlCisgICAgICAgIHJldHVybmVkIGJ5IHRoZSBjYWxsIHRvIHRoZSBPTVhfR2V0SGFuZGxlIGZ1bmN0aW9uLiAgVGhlcmUgaXMgYSAKKyAgICAgICAgcmVxdWlyZW1lbnQgdGhhdCBoT3V0cHV0IGJlIHRoZSBzb3VyY2UgZm9yIHRoZSBkYXRhIHdoZW4KKyAgICAgICAgdHVuZWxsaW5nIChpLmUuIG5Qb3J0T3V0cHV0IGlzIGFuIG91dHB1dCBwb3J0KS4gIElmIDB4MCwgdGhlIGNvbXBvbmVudAorICAgICAgICBzcGVjaWZpZWQgaW4gaElucHV0IHdpbGwgaGF2ZSBpdCdzIHBvcnQgc3BlY2lmaWVkIGluIG5Qb3J0SW5wdXQKKyAgICAgICAgc2V0dXAgZm9yIGNvbW11bmljYXRpb24gd2l0aCB0aGUgYXBwbGljYXRpb24gLyBJTCBjbGllbnQuCisgICAgQHBhcmFtIFtpbl0gblBvcnRPdXRwdXQKKyAgICAgICAgblBvcnRPdXRwdXQgaXMgdXNlZCB0byBzZWxlY3QgdGhlIHNvdXJjZSBwb3J0IG9uIGNvbXBvbmVudCB0byBiZQorICAgICAgICB1c2VkIGluIHRoZSB0dW5uZWwuIAorICAgIEBwYXJhbSBbaW5dIGhJbnB1dAorICAgICAgICBUaGlzIGlzIHRoZSBjb21wb25lbnQgdG8gc2V0dXAgdGhlIHR1bm5lbCB3aXRoLiBUaGlzIGlzIHRoZSBoYW5kbGUKKyAgICAgICAgb2YgdGhlIGNvbXBvbmVudCB3aG9zZSBwb3J0LCBzcGVjaWZpZWQgaW4gdGhlIG5Qb3J0SW5wdXQgcGFyYW1ldGVyCisgICAgICAgIHdpbGwgYmUgdXNlZCB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSB0dW5uZWwuIFRoaXMgaXMgdGhlIGNvbXBvbmVudCBoYW5kbGUKKyAgICAgICAgcmV0dXJuZWQgYnkgdGhlIGNhbGwgdG8gdGhlIE9NWF9HZXRIYW5kbGUgZnVuY3Rpb24uICBUaGVyZSBpcyBhIAorICAgICAgICByZXF1aXJlbWVudCB0aGF0IGhJbnB1dCBiZSB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBkYXRhIHdoZW4KKyAgICAgICAgdHVuZWxsaW5nIChpLmUuIG5Qb3J0SW51dCBpcyBhbiBpbnB1dCBwb3J0KS4gICBJZiAweDAsIHRoZSBjb21wb25lbnQKKyAgICAgICAgc3BlY2lmaWVkIGluIGhPdXRwdXQgd2lsbCBoYXZlIGl0J3MgcG9ydCBzcGVjaWZpZWQgaW4gblBvcnRQT3V0cHV0CisgICAgICAgIHNldHVwIGZvciBjb21tdW5pY2F0aW9uIHdpdGggdGhlIGFwcGxpY2F0aW9uIC8gSUwgY2xpZW50LgorICAgIEBwYXJhbSBbaW5dIG5Qb3J0SW5wdXQKKyAgICAgICAgblBvcnRJbnB1dCBpcyB1c2VkIHRvIHNlbGVjdCB0aGUgZGVzdGluYXRpb24gcG9ydCBvbiBjb21wb25lbnQgdG8gYmUKKyAgICAgICAgdXNlZCBpbiB0aGUgdHVubmVsLgorICAgIEByZXR1cm4gT01YX0VSUk9SVFlQRQorICAgICAgICBJZiB0aGUgY29tbWFuZCBzdWNjZXNzZnVsbHkgZXhlY3V0ZXMsIHRoZSByZXR1cm4gY29kZSB3aWxsIGJlCisgICAgICAgIE9NWF9FcnJvck5vbmUuICBPdGhlcndpc2UgdGhlIGFwcHJvcHJpYXRlIE9NWCBlcnJvciB3aWxsIGJlIHJldHVybmVkLgorICAgICAgICBXaGVuIE9NWF9FcnJvck5vdEltcGxlbWVudGVkIGlzIHJldHVybmVkLCBvbmUgb3IgYm90aCBjb21wb25lbnRzIGlzIAorICAgICAgICBhIG5vbi1pbnRlcm9wIGNvbXBvbmVudCBhbmQgZG9lcyBub3Qgc3VwcG9ydCB0dW5uZWxpbmcuCisgICAgICAgIAorICAgICAgICBPbiBmYWlsdXJlLCB0aGUgcG9ydHMgb2YgYm90aCBjb21wb25lbnRzIGFyZSBzZXR1cCBmb3IgY29tbXVuaWNhdGlvbgorICAgICAgICB3aXRoIHRoZSBhcHBsaWNhdGlvbiAvIElMIENsaWVudC4KKyAgICBAaW5ncm91cCBjb3JlIHR1bgorICovCitPTVhfQVBJIE9NWF9FUlJPUlRZUEUgT01YX0FQSUVOVFJZIE9NWF9TZXR1cFR1bm5lbCgKKyAgICBPTVhfSU4gIE9NWF9IQU5ETEVUWVBFIGhPdXRwdXQsCisgICAgT01YX0lOICBPTVhfVTMyIG5Qb3J0T3V0cHV0LAorICAgIE9NWF9JTiAgT01YX0hBTkRMRVRZUEUgaElucHV0LAorICAgIE9NWF9JTiAgT01YX1UzMiBuUG9ydElucHV0KTsKKyAgICAKKy8qKiBAaW5ncm91cCBjcCAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFICAgT01YX0dldENvbnRlbnRQaXBlKAorICAgIE9NWF9PVVQgT01YX0hBTkRMRVRZUEUgKmhQaXBlLAorICAgIE9NWF9JTiBPTVhfU1RSSU5HIHN6VVJJKTsKKworLyoqIFRoZSBPTVhfR2V0Q29tcG9uZW50c09mUm9sZSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHRoYXQgc3VwcG9ydCB0aGUgZ2l2ZW4KKyAgICByb2xlIGFuZCAoaWYgdGhlIGNvbXBOYW1lcyBmaWVsZCBpcyBub24tTlVMTCkgdGhlIG5hbWVzIG9mIHRob3NlIGNvbXBvbmVudHMuIFRoZSBjYWxsIHdpbGwgZmFpbCBpZiAKKyAgICBhbiBpbnN1ZmZpY2llbnRseSBzaXplZCBhcnJheSBvZiBuYW1lcyBpcyBzdXBwbGllZC4gVG8gZW5zdXJlIHRoZSBhcnJheSBpcyBzdWZmaWNpZW50bHkgc2l6ZWQgdGhlCisgICAgY2xpZW50IHNob3VsZDoKKyAgICAgICAgKiBmaXJzdCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgY29tcE5hbWVzIGZpZWxkIE5VTEwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgY29tcG9uZW50IG5hbWVzCisgICAgICAgICogc2Vjb25kIGNhbGwgdGhpcyBmdW5jdGlvbiB3aXRoIHRoZSBjb21wTmFtZXMgZmllbGQgcG9pbnRpbmcgdG8gYW4gYXJyYXkgb2YgbmFtZXMgYWxsb2NhdGVkIAorICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmaXJzdCBjYWxsLgorCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorICAgIAorICAgIEBwYXJhbSBbaW5dIHJvbGUKKyAgICAgICAgVGhpcyBpcyBnZW5lcmljIHN0YW5kYXJkIGNvbXBvbmVudCBuYW1lIGNvbnNpc3Rpbmcgb25seSBvZiBjb21wb25lbnQgY2xhc3MgCisgICAgICAgIG5hbWUgYW5kIHRoZSB0eXBlIHdpdGhpbiB0aGF0IGNsYXNzIChlLmcuICdhdWRpb19kZWNvZGVyLmFhYycpLgorICAgIEBwYXJhbSBbaW5vdXRdIHBOdW1Db21wcworICAgICAgICBUaGlzIGlzIHVzZWQgYm90aCBhcyBpbnB1dCBhbmQgb3V0cHV0LiAKKyAKKyAgICAgICAgSWYgY29tcE5hbWVzIGlzIE5VTEwsIHRoZSBpbnB1dCBpcyBpZ25vcmVkIGFuZCB0aGUgb3V0cHV0IHNwZWNpZmllcyBob3cgbWFueSBjb21wb25lbnRzIHN1cHBvcnQKKyAgICAgICAgdGhlIGdpdmVuIHJvbGUuCisgICAgIAorICAgICAgICBJZiBjb21wTmFtZXMgaXMgbm90IE5VTEwsIG9uIGlucHV0IGl0IGJvdW5kcyB0aGUgc2l6ZSBvZiB0aGUgaW5wdXQgc3RydWN0dXJlIGFuZCAKKyAgICAgICAgb24gb3V0cHV0LCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBjb21wb25lbnRzIHN0cmluZyBuYW1lcyBsaXN0ZWQgd2l0aGluIHRoZSBjb21wTmFtZXMgcGFyYW1ldGVyLgorICAgIEBwYXJhbSBbaW5vdXRdIGNvbXBOYW1lcworICAgICAgICBJZiBOVUxMIHRoaXMgZmllbGQgaXMgaWdub3JlZC4gSWYgbm9uLU5VTEwgdGhpcyBwb2ludHMgdG8gYW4gYXJyYXkgb2YgMTI4LWJ5dGUgc3RyaW5ncyB3aGljaCBhY2NlcHRzIAorICAgICAgICBhIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGFsbCBwaHlzaWNhbCBjb21wb25lbnRzIHRoYXQgaW1wbGVtZW50IHRoZSBzcGVjaWZpZWQgc3RhbmRhcmQgY29tcG9uZW50IG5hbWUuIAorICAgICAgICBFYWNoIG5hbWUgaXMgTlVMTCB0ZXJtaW5hdGVkLiBudW1Db21wcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBuYW1lcy4KKyAgICBAaW5ncm91cCBjb3JlCisgKi8KK09NWF9BUEkgT01YX0VSUk9SVFlQRSBPTVhfR2V0Q29tcG9uZW50c09mUm9sZSAoIAorCU9NWF9JTiAgICAgIE9NWF9TVFJJTkcgcm9sZSwKKyAgICBPTVhfSU5PVVQgICBPTVhfVTMyICpwTnVtQ29tcHMsCisgICAgT01YX0lOT1VUICAgT01YX1U4ICAqKmNvbXBOYW1lcyk7CisKKy8qKiBUaGUgT01YX0dldFJvbGVzT2ZDb21wb25lbnQgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2Ygcm9sZXMgc3VwcG9ydGVkIGJ5IHRoZSBnaXZlbgorICAgIGNvbXBvbmVudCBhbmQgKGlmIHRoZSByb2xlcyBmaWVsZCBpcyBub24tTlVMTCkgdGhlIG5hbWVzIG9mIHRob3NlIHJvbGVzLiBUaGUgY2FsbCB3aWxsIGZhaWwgaWYgCisgICAgYW4gaW5zdWZmaWNpZW50bHkgc2l6ZWQgYXJyYXkgb2YgbmFtZXMgaXMgc3VwcGxpZWQuIFRvIGVuc3VyZSB0aGUgYXJyYXkgaXMgc3VmZmljaWVudGx5IHNpemVkIHRoZQorICAgIGNsaWVudCBzaG91bGQ6CisgICAgICAgICogZmlyc3QgY2FsbCB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIHJvbGVzIGZpZWxkIE5VTEwgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygcm9sZSBuYW1lcworICAgICAgICAqIHNlY29uZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCB0aGUgcm9sZXMgZmllbGQgcG9pbnRpbmcgdG8gYW4gYXJyYXkgb2YgbmFtZXMgYWxsb2NhdGVkIAorICAgICAgICAgIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmaXJzdCBjYWxsLgorCisgICAgVGhlIGNvcmUgc2hvdWxkIHJldHVybiBmcm9tIHRoaXMgY2FsbCB3aXRoaW4gNSBtc2VjLgorCisgICAgQHBhcmFtIFtpbl0gY29tcE5hbWUKKyAgICAgICAgVGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGJlaW5nIHF1ZXJpZWQgYWJvdXQuCisgICAgQHBhcmFtIFtpbm91dF0gcE51bVJvbGVzCisgICAgICAgIFRoaXMgaXMgdXNlZCBib3RoIGFzIGlucHV0IGFuZCBvdXRwdXQuIAorIAorICAgICAgICBJZiByb2xlcyBpcyBOVUxMLCB0aGUgaW5wdXQgaXMgaWdub3JlZCBhbmQgdGhlIG91dHB1dCBzcGVjaWZpZXMgaG93IG1hbnkgcm9sZXMgdGhlIGNvbXBvbmVudCBzdXBwb3J0cy4KKyAgICAgCisgICAgICAgIElmIGNvbXBOYW1lcyBpcyBub3QgTlVMTCwgb24gaW5wdXQgaXQgYm91bmRzIHRoZSBzaXplIG9mIHRoZSBpbnB1dCBzdHJ1Y3R1cmUgYW5kIAorICAgICAgICBvbiBvdXRwdXQsIGl0IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIHJvbGVzIHN0cmluZyBuYW1lcyBsaXN0ZWQgd2l0aGluIHRoZSByb2xlcyBwYXJhbWV0ZXIuCisgICAgQHBhcmFtIFtvdXRdIHJvbGVzCisgICAgICAgIElmIE5VTEwgdGhpcyBmaWVsZCBpcyBpZ25vcmVkLiBJZiBub24tTlVMTCB0aGlzIHBvaW50cyB0byBhbiBhcnJheSBvZiAxMjgtYnl0ZSBzdHJpbmdzIAorICAgICAgICB3aGljaCBhY2NlcHRzIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgYWxsIHN0YW5kYXJkIGNvbXBvbmVudHMgcm9sZXMgaW1wbGVtZW50ZWQgb24gdGhlIAorICAgICAgICBzcGVjaWZpZWQgY29tcG9uZW50IG5hbWUuIG51bUNvbXBzIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIG5hbWVzLgorICAgIEBpbmdyb3VwIGNvcmUKKyAqLworT01YX0FQSSBPTVhfRVJST1JUWVBFIE9NWF9HZXRSb2xlc09mQ29tcG9uZW50ICggCisJT01YX0lOICAgICAgT01YX1NUUklORyBjb21wTmFtZSwgCisgICAgT01YX0lOT1VUICAgT01YX1UzMiAqcE51bVJvbGVzLAorICAgIE9NWF9PVVQgICAgIE9NWF9VOCAqKnJvbGVzKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLworCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0lWQ29tbW9uLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0lWQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0OTk1YwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfSVZDb21tb24uaApAQCAtMCwwICsxLDkyMCBAQAorLyoqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIAorICogQGZpbGUgT01YX0lWQ29tbW9uLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqICBUaGUgc3RydWN0dXJlcyBuZWVkZWQgYnkgVmlkZW8gYW5kIEltYWdlIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KKyAqLworI2lmbmRlZiBPTVhfSVZDb21tb25faAorI2RlZmluZSBPTVhfSVZDb21tb25faAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSBoZWFkZXIKKyAqIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkIGZvciB0aGlzIGhlYWRlcgorICogZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0NvcmUuaD4KKworLyoqIEBkZWZncm91cCBpdiBPcGVuTUFYIElMIEltYWdpbmcgYW5kIFZpZGVvIERvbWFpbgorICogQ29tbW9uIHN0cnVjdHVyZXMgZm9yIE9wZW5NQVggSUwgSW1hZ2luZyBhbmQgVmlkZW8gZG9tYWlucworICogQHsKKyAqLworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIGRlZmluaW5nIHBvc3NpYmxlIHVuY29tcHJlc3NlZCBpbWFnZS92aWRlbyBmb3JtYXRzLiAKKyAqCisgKiBFTlVNUzoKKyAqICBVbnVzZWQgICAgICAgICAgICAgICAgIDogUGxhY2Vob2xkZXIgdmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BCisgKiAgTW9ub2Nocm9tZSAgICAgICAgICAgICA6IGJsYWNrIGFuZCB3aGl0ZQorICogIDhiaXRSR0IzMzIgICAgICAgICAgICAgOiBSZWQgNzo1LCBHcmVlbiA0OjIsIEJsdWUgMTowCisgKiAgMTJiaXRSR0I0NDQgICAgICAgICAgICA6IFJlZCAxMTo4LCBHcmVlbiA3OjQsIEJsdWUgMzowCisgKiAgMTZiaXRBUkdCNDQ0NCAgICAgICAgICA6IEFscGhhIDE1OjEyLCBSZWQgMTE6OCwgR3JlZW4gNzo0LCBCbHVlIDM6MAorICogIDE2Yml0QVJHQjE1NTUgICAgICAgICAgOiBBbHBoYSAxNSwgUmVkIDE0OjEwLCBHcmVlbiA5OjUsIEJsdWUgNDowCisgKiAgMTZiaXRSR0I1NjUgICAgICAgICAgICA6IFJlZCAxNToxMSwgR3JlZW4gMTA6NSwgQmx1ZSA0OjAKKyAqICAxNmJpdEJHUjU2NSAgICAgICAgICAgIDogQmx1ZSAxNToxMSwgR3JlZW4gMTA6NSwgUmVkIDQ6MAorICogIDE4Yml0UkdCNjY2ICAgICAgICAgICAgOiBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCisgKiAgMThiaXRBUkdCMTY2NSAgICAgICAgICA6IEFscGhhIDE3LCBSZWQgMTY6MTEsIEdyZWVuIDEwOjUsIEJsdWUgNDowCisgKiAgMTliaXRBUkdCMTY2NiAgICAgICAgICA6IEFscGhhIDE4LCBSZWQgMTc6MTIsIEdyZWVuIDExOjYsIEJsdWUgNTowCisgKiAgMjRiaXRSR0I4ODggICAgICAgICAgICA6IFJlZCAyNDoxNiwgR3JlZW4gMTU6OCwgQmx1ZSA3OjAKKyAqICAyNGJpdEJHUjg4OCAgICAgICAgICAgIDogQmx1ZSAyNDoxNiwgR3JlZW4gMTU6OCwgUmVkIDc6MAorICogIDI0Yml0QVJHQjE4ODcgICAgICAgICAgOiBBbHBoYSAyMywgUmVkIDIyOjE1LCBHcmVlbiAxNDo3LCBCbHVlIDY6MAorICogIDI1Yml0QVJHQjE4ODggICAgICAgICAgOiBBbHBoYSAyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAorICogIDMyYml0QkdSQTg4ODggICAgICAgICAgOiBCbHVlIDMxOjI0LCBHcmVlbiAyMzoxNiwgUmVkIDE1OjgsIEFscGhhIDc6MAorICogIDMyYml0QVJHQjg4ODggICAgICAgICAgOiBBbHBoYSAzMToyNCwgUmVkIDIzOjE2LCBHcmVlbiAxNTo4LCBCbHVlIDc6MAorICogIFlVVjQxMVBsYW5hciAgICAgICAgICAgOiBVLFkgYXJlIHN1YnNhbXBsZWQgYnkgYSBmYWN0b3Igb2YgNCBob3Jpem9udGFsbHkKKyAqICBZVVY0MTFQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKKyAqICBZVVY0MjBQbGFuYXIgICAgICAgICAgIDogVGhyZWUgYXJyYXlzIFksVSxWLgorICogIFlVVjQyMFBhY2tlZFBsYW5hciAgICAgOiBwYWNrZWQgcGVyIHBheWxvYWQgaW4gcGxhbmFyIHNsaWNlcworICogIFlVVjQyMFNlbWlQbGFuYXIgICAgICAgOiBUd28gYXJyYXlzLCBvbmUgaXMgYWxsIFksIHRoZSBvdGhlciBpcyBVIGFuZCBWCisgKiAgWVVWNDIyUGxhbmFyICAgICAgICAgICA6IFRocmVlIGFycmF5cyBZLFUsVi4KKyAqICBZVVY0MjJQYWNrZWRQbGFuYXIgICAgIDogcGFja2VkIHBlciBwYXlsb2FkIGluIHBsYW5hciBzbGljZXMKKyAqICBZVVY0MjJTZW1pUGxhbmFyICAgICAgIDogVHdvIGFycmF5cywgb25lIGlzIGFsbCBZLCB0aGUgb3RoZXIgaXMgVSBhbmQgVgorICogIFlDYllDciAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgWVVZViAoaS5lLiBZQ2JZQ3IpCisgKiAgWUNyWUNiICAgICAgICAgICAgICAgICA6IE9yZ2FuaXplZCBhcyAxNmJpdCBZVllVIChpLmUuIFlDcllDYikKKyAqICBDYllDclkgICAgICAgICAgICAgICAgIDogT3JnYW5pemVkIGFzIDE2Yml0IFVZVlkgKGkuZS4gQ2JZQ3JZKQorICogIENyWUNiWSAgICAgICAgICAgICAgICAgOiBPcmdhbml6ZWQgYXMgMTZiaXQgVllVWSAoaS5lLiBDcllDYlkpCisgKiAgWVVWNDQ0SW50ZXJsZWF2ZWQgICAgICA6IEVhY2ggcGl4ZWwgY29udGFpbnMgZXF1YWwgcGFydHMgWVVWCisgKiAgUmF3QmF5ZXI4Yml0ICAgICAgICAgICA6IFNNSUEgY2FtZXJhIG91dHB1dCBmb3JtYXQKKyAqICBSYXdCYXllcjEwYml0ICAgICAgICAgIDogU01JQSBjYW1lcmEgb3V0cHV0IGZvcm1hdAorICogIFJhd0JheWVyOGJpdGNvbXByZXNzZWQgOiBTTUlBIGNhbWVyYSBvdXRwdXQgZm9ybWF0CisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09MT1JfRk9STUFUVFlQRSB7CisgICAgT01YX0NPTE9SX0Zvcm1hdFVudXNlZCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TW9ub2Nocm9tZSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0OGJpdFJHQjMzMiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1LAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MThiaXRSR0I2NjYsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjUsCisgICAgT01YX0NPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjYsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXQyNGJpdFJHQjg4OCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI0Yml0QVJHQjE4ODcsCisgICAgT01YX0NPTE9SX0Zvcm1hdDI1Yml0QVJHQjE4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODgsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDIyUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMlNlbWlQbGFuYXIsCisgICAgT01YX0NPTE9SX0Zvcm1hdFlDYllDciwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WUNyWUNiLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRDYllDclksCisgICAgT01YX0NPTE9SX0Zvcm1hdENyWUNiWSwKKyAgICBPTVhfQ09MT1JfRm9ybWF0WVVWNDQ0SW50ZXJsZWF2ZWQsCisgICAgT01YX0NPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXIxMGJpdCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCwKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDIsIAorICAgIE9NWF9DT0xPUl9Gb3JtYXRMNCwgCisgICAgT01YX0NPTE9SX0Zvcm1hdEw4LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDE2LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDI0LCAKKyAgICBPTVhfQ09MT1JfRm9ybWF0TDMyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyLAorICAgIE9NWF9DT0xPUl9Gb3JtYXQxOEJpdEJHUjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NiwKKyAgICBPTVhfQ09MT1JfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9DT0xPUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9DT0xPUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9DT0xPUl9GT1JNQVRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgdGhlIG1hdHJpeCBmb3IgY29udmVyc2lvbiBmcm9tIFJHQiB0byBZVVYgb3IgdmljZSB2ZXJzYS4KKyAqIGlDb2xvck1hdHJpeCBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZml4ZWQgcG9pbnQgdmFsdWVzIAorICogdXNlZCBpbiBjb252ZXJ0aW5nIGJldHdlZW4gZm9ybWF0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfUzMyIHhDb2xvck1hdHJpeFszXVszXTsgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KKyAgICBPTVhfUzMyIHhDb2xvck9mZnNldFs0XTsgICAgLyoqPCBTdG9yZWQgaW4gc2lnbmVkIFExNiBmb3JtYXQgKi8KK31PTVhfQ09ORklHX0NPTE9SQ09OVkVSU0lPTlRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIGRlZmluaW5nIHBlcmNlbnQgdG8gc2NhbGUgZWFjaCBmcmFtZSBkaW1lbnNpb24uICBGb3IgZXhhbXBsZTogIAorICogVG8gbWFrZSB0aGUgd2lkdGggNTAlIGxhcmdlciwgdXNlIGZXaWR0aCA9IDEuNSBhbmQgdG8gbWFrZSB0aGUgd2lkdGgKKyAqIDEvMiB0aGUgb3JpZ2luYWwgc2l6ZSwgdXNlIGZXaWR0aCA9IDAuNQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAvKio8IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm8gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvICovCisgICAgT01YX1MzMiB4V2lkdGg7ICAgICAgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfUzMyIHhIZWlnaHQ7ICAgICAgICAgIC8qKjwgRml4ZWQgcG9pbnQgdmFsdWUgc3RvcmVkIGFzIFExNiAqLworfU9NWF9DT05GSUdfU0NBTEVGQUNUT1JUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGltYWdlIGZpbHRlciB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRUZJTFRFUlRZUEUgeworICAgIE9NWF9JbWFnZUZpbHRlck5vbmUsCisgICAgT01YX0ltYWdlRmlsdGVyTm9pc2UsCisgICAgT01YX0ltYWdlRmlsdGVyRW1ib3NzLAorICAgIE9NWF9JbWFnZUZpbHRlck5lZ2F0aXZlLAorICAgIE9NWF9JbWFnZUZpbHRlclNrZXRjaCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJPaWxQYWludCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJIYXRjaCwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJHcGVuLAorICAgIE9NWF9JbWFnZUZpbHRlckFudGlhbGlhcywgCisgICAgT01YX0ltYWdlRmlsdGVyRGVSaW5nLCAgICAgICAKKyAgICBPTVhfSW1hZ2VGaWx0ZXJTb2xhcml6ZSwKKyAgICBPTVhfSW1hZ2VGaWx0ZXJLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0ltYWdlRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSW1hZ2VGaWx0ZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRUZJTFRFUlRZUEU7CisKKworLyoqIAorICogSW1hZ2UgZmlsdGVyIGNvbmZpZ3VyYXRpb24gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgIAorICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBlSW1hZ2VGaWx0ZXIgOiBJbWFnZSBmaWx0ZXIgdHlwZSBlbnVtZXJhdGlvbiAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRUZJTFRFUlRZUEUgZUltYWdlRmlsdGVyOworfSBPTVhfQ09ORklHX0lNQUdFRklMVEVSVFlQRTsKKworCisvKiogCisgKiBDdXN0b21pemVkIFUgYW5kIFYgZm9yIGNvbG9yIGVuaGFuY2VtZW50IAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiQ29sb3JFbmhhbmNlbWVudCA6IEVuYWJsZS9kaXNhYmxlIGNvbG9yIGVuaGFuY2VtZW50CisgKiAgbkN1c3RvbWl6ZWRVICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgIFUgY29tcG9uZW50CisgKiAgbkN1c3RvbWl6ZWRWICAgICAgOiBQcmFjdGljYWwgdmFsdWVzOiAxNi0yNDAsIHJhbmdlOiAwLTI1NSwgdmFsdWUgc2V0IGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgIFYgY29tcG9uZW50CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfQ09MT1JFTkhBTkNFTUVOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkNvbG9yRW5oYW5jZW1lbnQ7CisgICAgT01YX1U4IG5DdXN0b21pemVkVTsKKyAgICBPTVhfVTggbkN1c3RvbWl6ZWRWOworfSBPTVhfQ09ORklHX0NPTE9SRU5IQU5DRU1FTlRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBjb2xvciBrZXkgYW5kIGNvbG9yIGtleSBtYXNrIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuQVJHQkNvbG9yIDogMzJiaXQgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgQ29sb3IKKyAqICBuQVJHQk1hc2sgIDogMzJiaXQgTWFzayBmb3IgQWxwaGEsIFJlZCwgR3JlZW4sIEJsdWUgY2hhbm5lbHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT0xPUktFWVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5BUkdCQ29sb3I7CisgICAgT01YX1UzMiBuQVJHQk1hc2s7Cit9IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFOworCisKKy8qKiAKKyAqIExpc3Qgb2YgY29sb3IgYmxlbmQgdHlwZXMgZm9yIHByZS9wb3N0IHByb2Nlc3NpbmcgCisgKgorICogRU5VTVM6CisgKiAgTm9uZSAgICAgICAgICA6IE5vIGNvbG9yIGJsZW5kaW5nIHByZXNlbnQKKyAqICBBbHBoYUNvbnN0YW50IDogRnVuY3Rpb24gaXMgKGFscGhhX2NvbnN0YW50ICogc3JjKSArIAorICogICAgICAgICAgICAgICAgICAoMSAtIGFscGhhX2NvbnN0YW50KSAqIGRzdCkKKyAqICBBbHBoYVBlclBpeGVsIDogRnVuY3Rpb24gaXMgKGFscGhhICogc3JjKSArICgxIC0gYWxwaGEpICogZHN0KQorICogIEFsdGVybmF0ZSAgICAgOiBGdW5jdGlvbiBpcyBhbHRlcm5hdGluZyBwaXhlbHMgZnJvbSBzcmMgYW5kIGRzdAorICogIEFuZCAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjICYgZHN0KQorICogIE9yICAgICAgICAgICAgOiBGdW5jdGlvbiBpcyAoc3JjIHwgZHN0KQorICogIEludmVydCAgICAgICAgOiBGdW5jdGlvbiBpcyB+c3JjCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfQ09MT1JCTEVORFRZUEUgeworICAgIE9NWF9Db2xvckJsZW5kTm9uZSwKKyAgICBPTVhfQ29sb3JCbGVuZEFscGhhQ29uc3RhbnQsCisgICAgT01YX0NvbG9yQmxlbmRBbHBoYVBlclBpeGVsLAorICAgIE9NWF9Db2xvckJsZW5kQWx0ZXJuYXRlLAorICAgIE9NWF9Db2xvckJsZW5kQW5kLAorICAgIE9NWF9Db2xvckJsZW5kT3IsCisgICAgT01YX0NvbG9yQmxlbmRJbnZlcnQsCisgICAgT01YX0NvbG9yQmxlbmRLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0NvbG9yQmxlbmRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9Db2xvckJsZW5kTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfQ09MT1JCTEVORFRZUEU7CisKKworLyoqIAorICogQ29sb3IgYmxlbmQgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAKKyAqICBuUG9ydEluZGV4ICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAgICAgICAgICAgICAgIAorICogIG5SR0JBbHBoYUNvbnN0YW50IDogQ29uc3RhbnQgZ2xvYmFsIGFscGhhIHZhbHVlcyB3aGVuIGdsb2JhbCBhbHBoYSBpcyB1c2VkCisgKiAgZUNvbG9yQmxlbmQgICAgICAgOiBDb2xvciBibGVuZCB0eXBlIGVudW1lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUkdCQWxwaGFDb25zdGFudDsKKyAgICBPTVhfQ09MT1JCTEVORFRZUEUgIGVDb2xvckJsZW5kOworfSBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFOworCisKKy8qKiAKKyAqIEhvbGQgZnJhbWUgZGltZW5zaW9uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICAgICAKKyAqICBuV2lkdGggICAgIDogRnJhbWUgd2lkdGggaW4gcGl4ZWxzICAgICAgICAgICAgICAgICAKKyAqICBuSGVpZ2h0ICAgIDogRnJhbWUgaGVpZ2h0IGluIHBpeGVscyAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0ZSQU1FU0laRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5XaWR0aDsKKyAgICBPTVhfVTMyIG5IZWlnaHQ7Cit9IE9NWF9GUkFNRVNJWkVUWVBFOworCisKKy8qKgorICogUm90YXRpb24gY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblJvdGF0aW9uICA6ICsvLSBpbnRlZ2VyIHJvdGF0aW9uIHZhbHVlICAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUk9UQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuUm90YXRpb247IAorfSBPTVhfQ09ORklHX1JPVEFUSU9OVFlQRTsKKworCisvKiogCisgKiBQb3NzaWJsZSBtaXJyb3JpbmcgZGlyZWN0aW9ucyBmb3IgcHJlL3Bvc3QgcHJvY2Vzc2luZyAKKyAqCisgKiBFTlVNUzoKKyAqICBOb25lICAgICAgIDogTm8gbWlycm9yaW5nICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIFZlcnRpY2FsICAgOiBWZXJ0aWNhbCBtaXJyb3JpbmcsIGZsaXAgb24gWCBheGlzICAgCisgKiAgSG9yaXpvbnRhbCA6IEhvcml6b250YWwgbWlycm9yaW5nLCBmbGlwIG9uIFkgYXhpcyAgCisgKiAgQm90aCAgICAgICA6IEJvdGggdmVydGljYWwgYW5kIGhvcml6b250YWwgbWlycm9yaW5nCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfTUlSUk9SVFlQRSB7CisgICAgT01YX01pcnJvck5vbmUgPSAwLAorICAgIE9NWF9NaXJyb3JWZXJ0aWNhbCwKKyAgICBPTVhfTWlycm9ySG9yaXpvbnRhbCwKKyAgICBPTVhfTWlycm9yQm90aCwgCisgICAgT01YX01pcnJvcktocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfTWlycm9yVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfTWlycm9yTWF4ID0gMHg3RkZGRkZGRiAgIAorfSBPTVhfTUlSUk9SVFlQRTsKKworCisvKiogCisgKiBNaXJyb3JpbmcgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gIAorICogIGVNaXJyb3IgICAgOiBNaXJyb3IgdHlwZSBlbnVtZXJhdGlvbiAgICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUlSUk9SVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfTUlSUk9SVFlQRSAgZU1pcnJvcjsKK30gT01YX0NPTkZJR19NSVJST1JUWVBFOworCisKKy8qKiAKKyAqIFBvc2l0aW9uIGluZm9ybWF0aW9uIG9ubHkgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblggICAgICAgICA6IFggY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50ICAgICAgICAgICAgICAgICAgICAgCisgKiAgblkgICAgICAgICA6IFkgY29vcmRpbmF0ZSBmb3IgdGhlIHBvaW50IAorICovICAgICAgICAgICAgICAgICAgICAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19QT0lOVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5YOworICAgIE9NWF9TMzIgblk7Cit9IE9NWF9DT05GSUdfUE9JTlRUWVBFOworCisKKy8qKiAKKyAqIEZyYW1lIHNpemUgcGx1cyBwb3NpdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAgICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAKKyAqICBuTGVmdCAgICAgIDogWCBDb29yZGluYXRlIG9mIHRoZSB0b3AgbGVmdCBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZQorICogIG5Ub3AgICAgICAgOiBZIENvb3JkaW5hdGUgb2YgdGhlIHRvcCBsZWZ0IGNvcm5lciBvZiB0aGUgcmVjdGFuZ2xlCisgKiAgbldpZHRoICAgICA6IFdpZHRoIG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBuSGVpZ2h0ICAgIDogSGVpZ2h0IG9mIHRoZSByZWN0YW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1JFQ1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgCisgICAgT01YX1MzMiBuTGVmdDsgCisgICAgT01YX1MzMiBuVG9wOworICAgIE9NWF9VMzIgbldpZHRoOworICAgIE9NWF9VMzIgbkhlaWdodDsKK30gT01YX0NPTkZJR19SRUNUVFlQRTsKKworCisvKiogCisgKiBEZWJsb2NraW5nIHN0YXRlOyBpdCBpcyByZXF1aXJlZCB0byBiZSBzZXQgdXAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBjb2RlYyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgIAorICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgYkRlYmxvY2tpbmcgOiBFbmFibGUvZGlzYWJsZSBkZWJsb2NraW5nIG1vZGUgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9QQVJBTV9ERUJMT0NLSU5HVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJEZWJsb2NraW5nOworfSBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEU7CisKKworLyoqIAorICogU3RhYmlsaXphdGlvbiBzdGF0ZSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgIAorICogIGJTdGFiICAgICAgOiBFbmFibGUvZGlzYWJsZSBmcmFtZSBzdGFiaWxpemF0aW9uIHN0YXRlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRlJBTUVTVEFCVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9CT09MIGJTdGFiOworfSBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEU7CisKKworLyoqIAorICogV2hpdGUgQmFsYW5jZSBjb250cm9sIHR5cGUgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgU3VuTGlnaHQgOiBSZWZlcmVuY2VkIGluIEpTUi0yMzQKKyAqICBGbGFzaCAgICA6IE9wdGltYWwgZm9yIGRldmljZSdzIGludGVncmF0ZWQgZmxhc2gKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9XSElURUJBTENPTlRST0xUWVBFIHsKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sT2ZmID0gMCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sQXV0bywKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU3VuTGlnaHQsCisgICAgT01YX1doaXRlQmFsQ29udHJvbENsb3VkeSwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sU2hhZGUsCisgICAgT01YX1doaXRlQmFsQ29udHJvbFR1bmdzdGVuLAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbHVvcmVzY2VudCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSW5jYW5kZXNjZW50LAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xGbGFzaCwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sSG9yaXpvbiwKKyAgICBPTVhfV2hpdGVCYWxDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9XaGl0ZUJhbENvbnRyb2xNYXggPSAweDdGRkZGRkZGCit9IE9NWF9XSElURUJBTENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIFdoaXRlIEJhbGFuY2UgY29udHJvbCBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgIAorICogIGVXaGl0ZUJhbENvbnRyb2wgOiBXaGl0ZSBiYWxhbmNlIGVudW1lcmF0aW9uICAgICAgICAgICAgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9XSElURUJBTENPTlRST0xUWVBFIGVXaGl0ZUJhbENvbnRyb2w7Cit9IE9NWF9DT05GSUdfV0hJVEVCQUxDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBFeHBvc3VyZSBjb250cm9sIHR5cGUgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRSB7CisgICAgT01YX0V4cG9zdXJlQ29udHJvbE9mZiA9IDAsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbEF1dG8sCisgICAgT01YX0V4cG9zdXJlQ29udHJvbE5pZ2h0LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xCYWNrTGlnaHQsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbFNwb3RMaWdodCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU3BvcnRzLAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xTbm93LAorICAgIE9NWF9FeHBvc3VyZUNvbnRyb2xCZWFjaCwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sTGFyZ2VBcGVydHVyZSwKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sU21hbGxBcHBlcnR1cmUsCisgICAgT01YX0V4cG9zdXJlQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfRXhwb3N1cmVDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRXhwb3N1cmVDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfRVhQT1NVUkVDT05UUk9MVFlQRTsKKworCisvKiogCisgKiBXaGl0ZSBCYWxhbmNlIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgCisgKiAgblZlcnNpb24gICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gICAgICAgICAgICAgICAgCisgKiAgZUV4cG9zdXJlQ29udHJvbCA6IEV4cG9zdXJlIGNvbnRyb2wgZW51bWVyYXRpb24gICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0VYUE9TVVJFQ09OVFJPTFRZUEUgZUV4cG9zdXJlQ29udHJvbDsKK30gT01YX0NPTkZJR19FWFBPU1VSRUNPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgc2Vuc29yIHN1cHBvcnRlZCBtb2RlLiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBuRnJhbWVSYXRlIDogU2luZ2xlIHNob3QgbW9kZSBpcyBpbmRpY2F0ZWQgYnkgYSAwICAgICAKKyAqICBiT25lU2hvdCAgIDogRW5hYmxlIGZvciBzaW5nbGUgc2hvdCwgZGlzYWJsZSBmb3Igc3RyZWFtaW5nCisgKiAgc0ZyYW1lU2l6ZSA6IEZyYW1lc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fU0VOU09STU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5GcmFtZVJhdGU7CisgICAgT01YX0JPT0wgYk9uZVNob3Q7CisgICAgT01YX0ZSQU1FU0laRVRZUEUgc0ZyYW1lU2l6ZTsKK30gT01YX1BBUkFNX1NFTlNPUk1PREVUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgY29udHJhc3QgbGV2ZWwgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICAgICAgICAgICAgICAgIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAgICAgICAgICAgICAgICAgCisgKiAgbkNvbnRyYXN0ICA6IFZhbHVlcyBhbGxvd2VkIGZvciBjb250cmFzdCAtMTAwIHRvIDEwMCwgemVybyBtZWFucyBubyBjaGFuZ2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DT05UUkFTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5Db250cmFzdDsKK30gT01YX0NPTkZJR19DT05UUkFTVFRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBicmlnaHRuZXNzIGxldmVsIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICAgICAgICAgIAorICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvIAorICogIG5CcmlnaHRuZXNzIDogMC0xMDAlICAgICAgICAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19CUklHSFRORVNTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkJyaWdodG5lc3M7Cit9IE9NWF9DT05GSUdfQlJJR0hUTkVTU1RZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBiYWNrbGlnaHQgbGV2ZWwgY29uZmlndXJhdGlvbiBmb3IgYSB2aWRlbyBzaW5rLCBlLmcuIExDRCBwYW5lbCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkJhY2tsaWdodCA6IFZhbHVlcyBhbGxvd2VkIGZvciBiYWNrbGlnaHQgMC0xMDAlCisgKiAgblRpbWVvdXQgICA6IE51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGJhY2tsaWdodCBhdXRvbWF0aWNhbGx5IHR1cm5zIAorICogICAgICAgICAgICAgICBvZmYuICBBIHZhbHVlIG9mIDB4MCBkaXNhYmxlcyBiYWNraWdodCB0aW1lb3V0IAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5CYWNrbGlnaHQ7CisgICAgT01YX1UzMiBuVGltZW91dDsKK30gT01YX0NPTkZJR19CQUNLTElHSFRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgc2V0dGluZyBmb3IgR2FtbWEgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5HYW1tYSAgICAgOiBWYWx1ZXMgYWxsb3dlZCBmb3IgZ2FtbWEgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfR0FNTUFUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1MzMiBuR2FtbWE7Cit9IE9NWF9DT05GSUdfR0FNTUFUWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBmb3Igc2V0dGluZyBzYXR1cmF0aW9uIAorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuU2F0dXJhdGlvbiA6IFZhbHVlcyBhbGxvd2VkIGZvciBzYXR1cmF0aW9uIC0xMDAgdG8gMTAwLCB6ZXJvIG1lYW5zIAorICogICAgICAgICAgICAgICAgbm8gY2hhbmdlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfU0FUVVJBVElPTlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5TYXR1cmF0aW9uOworfSBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFOworCisKKy8qKiAKKyAqIERlZmluZSBmb3Igc2V0dGluZyBMaWdodG5lc3MgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbkxpZ2h0bmVzcyA6IFZhbHVlcyBhbGxvd2VkIGZvciBsaWdodG5lc3MgLTEwMCB0byAxMDAsIHplcm8gbWVhbnMgbm8gCisgKiAgICAgICAgICAgICAgIGNoYW5nZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfUzMyIG5MaWdodG5lc3M7Cit9IE9NWF9DT05GSUdfTElHSFRORVNTVFlQRTsKKworCisvKiogCisgKiBQbGFuZSBibGVuZCBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogSW5kZXggb2YgaW5wdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggdGhlIHBsYW5lLgorICogIG5EZXB0aCAgICAgOiBEZXB0aCBvZiB0aGUgcGxhbmUgaW4gcmVsYXRpb24gdG8gdGhlIHNjcmVlbi4gSGlnaGVyIAorICogICAgICAgICAgICAgICBudW1iZXJlZCBkZXB0aHMgYXJlICJiZWhpbmQiIGxvd2VyIG51bWJlciBkZXB0aHMuICAKKyAqICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgZGVmYXVsdHMgdG8gdGhlIFBvcnQgSW5kZXggbnVtYmVyLgorICogIG5BbHBoYSAgICAgOiBUcmFuc3BhcmVuY3kgYmxlbmRpbmcgY29tcG9uZW50IGZvciB0aGUgZW50aXJlIHBsYW5lLiAgCisgKiAgICAgICAgICAgICAgIFNlZSBibGVuZGluZyBtb2RlcyBmb3IgbW9yZSBkZXRhaWwuCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfUExBTkVCTEVORFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIG5EZXB0aDsKKyAgICBPTVhfVTMyIG5BbHBoYTsKK30gT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRTsKKworCisvKiogCisgKiBEZWZpbmUgaW50ZXJsYWNlIHR5cGUKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgCisgKiAgblZlcnNpb24gICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJFbmFibGUgICAgICAgICAgICAgICA6IEVuYWJsZSBjb250cm9sIHZhcmlhYmxlIGZvciB0aGlzIGZ1bmN0aW9uYWxpdHkgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSBiZWxvdykKKyAqICBuSW50ZXJsZWF2ZVBvcnRJbmRleCAgOiBJbmRleCBvZiBpbnB1dCBvciBvdXRwdXQgcG9ydCBhc3NvY2lhdGVkIHdpdGggIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnRlcmxlYXZlZCBwbGFuZS4gCisgKiAgcFBsYW5hclBvcnRJbmRleGVzWzRdIDogSW5kZXggb2YgaW5wdXQgb3Igb3V0cHV0IHBsYW5hciBwb3J0cy4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZTsKKyAgICBPTVhfVTMyIG5JbnRlcmxlYXZlUG9ydEluZGV4OworfSBPTVhfUEFSQU1fSU5URVJMRUFWRVRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyB0aGUgcGljdHVyZSBlZmZlY3QgdXNlZCBmb3IgYW4gaW5wdXQgcGljdHVyZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRSB7CisgICAgT01YX0VmZmVjdE5vbmUsCisgICAgT01YX0VmZmVjdEZhZGVGcm9tQmxhY2ssCisgICAgT01YX0VmZmVjdEZhZGVUb0JsYWNrLAorICAgIE9NWF9FZmZlY3RVbnNwZWNpZmllZFRocm91Z2hDb25zdGFudENvbG9yLAorICAgIE9NWF9FZmZlY3REaXNzb2x2ZSwKKyAgICBPTVhfRWZmZWN0V2lwZSwKKyAgICBPTVhfRWZmZWN0VW5zcGVjaWZpZWRNaXhPZlR3b1NjZW5lcywKKyAgICBPTVhfRWZmZWN0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9FZmZlY3RWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9FZmZlY3RNYXggPSAweDdGRkZGRkZGCit9IE9NWF9UUkFOU0lUSU9ORUZGRUNUVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgY3VycmVudCB0cmFuc2l0aW9uIGVmZmVjdCAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiBlRWZmZWN0ICAgIDogRWZmZWN0IHRvIGVuYWJsZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX1RSQU5TSVRJT05FRkZFQ1RUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1RSQU5TSVRJT05FRkZFQ1RUWVBFIGVFZmZlY3Q7Cit9IE9NWF9DT05GSUdfVFJBTlNJVElPTkVGRkVDVFRZUEU7CisKKworLyoqIAorICogRGVmaW5lcyBwb3NzaWJsZSBkYXRhIHVuaXQgdHlwZXMgZm9yIGVuY29kZWQgdmlkZW8gZGF0YS4gVGhlIGRhdGEgdW5pdCAKKyAqIHR5cGVzIGFyZSB1c2VkIGJvdGggZm9yIGVuY29kZWQgdmlkZW8gaW5wdXQgZm9yIHBsYXliYWNrIGFzIHdlbGwgYXMKKyAqIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVFRZUEUgeworICAgIE9NWF9EYXRhVW5pdENvZGVkUGljdHVyZSwKKyAgICBPTVhfRGF0YVVuaXRWaWRlb1NlZ21lbnQsCisgICAgT01YX0RhdGFVbml0U2V2ZXJhbFNlZ21lbnRzLAorICAgIE9NWF9EYXRhVW5pdEFyYml0cmFyeVN0cmVhbVNlY3Rpb24sCisgICAgT01YX0RhdGFVbml0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EYXRhVW5pdFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0RhdGFVbml0TWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfREFUQVVOSVRUWVBFOworCisKKy8qKiAKKyAqIERlZmluZXMgcG9zc2libGUgZW5jYXBzdWxhdGlvbiB0eXBlcyBmb3IgY29kZWQgdmlkZW8gZGF0YSB1bml0LiBUaGUgCisgKiBlbmNhcHN1bGF0aW9uIGluZm9ybWF0aW9uIGlzIHVzZWQgYm90aCBmb3IgZW5jb2RlZCB2aWRlbyBpbnB1dCBmb3IgCisgKiBwbGF5YmFjayBhcyB3ZWxsIGFzIGVuY29kZWQgdmlkZW8gb3V0cHV0IGZyb20gcmVjb3JkaW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9EQVRBVU5JVEVOQ0FQU1VMQVRJT05UWVBFIHsKKyAgICBPTVhfRGF0YUVuY2Fwc3VsYXRpb25FbGVtZW50YXJ5U3RyZWFtLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvbkdlbmVyaWNQYXlsb2FkLAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblJ0cFBheWxvYWQsCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EYXRhRW5jYXBzdWxhdGlvblZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0RhdGFFbmNhcHN1bGF0aW9uTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfREFUQVVOSVRFTkNBUFNVTEFUSU9OVFlQRTsKKworCisvKiogCisgKiBTdHJ1Y3R1cmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHR5cGUgb2YgYmVpbmcgZGVjb2RlZC9lbmNvZGVkIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfUEFSQU1fREFUQVVOSVRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8gCisgICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAvKio8IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvICovCisgICAgT01YX0RBVEFVTklUVFlQRSBlVW5pdFR5cGU7CisgICAgT01YX0RBVEFVTklURU5DQVBTVUxBVElPTlRZUEUgZUVuY2Fwc3VsYXRpb25UeXBlOworfSBPTVhfUEFSQU1fREFUQVVOSVRUWVBFOworCisKKy8qKgorICogRGVmaW5lcyBkaXRoZXIgdHlwZXMgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRElUSEVSVFlQRSB7CisgICAgT01YX0RpdGhlck5vbmUsCisgICAgT01YX0RpdGhlck9yZGVyZWQsCisgICAgT01YX0RpdGhlckVycm9yRGlmZnVzaW9uLAorICAgIE9NWF9EaXRoZXJPdGhlciwKKyAgICBPTVhfRGl0aGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9EaXRoZXJWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9EaXRoZXJNYXggPSAweDdGRkZGRkZGCit9IE9NWF9ESVRIRVJUWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSB1c2VkIHRvIGNvbmZpZ3VyZSBjdXJyZW50IHR5cGUgb2YgZGl0aGVyaW5nIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0RJVEhFUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfRElUSEVSVFlQRSBlRGl0aGVyOyAgIC8qKjwgVHlwZSBvZiBkaXRoZXJpbmcgdG8gdXNlICovCit9IE9NWF9DT05GSUdfRElUSEVSVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfQk9PTCBiQ29udGludW91czsgICAvKio8IElmIHRydWUgdGhlbiBpZ25vcmUgZnJhbWUgcmF0ZSBhbmQgZW1pdCBjYXB0dXJlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZGF0YSBhcyBmYXN0IGFzIHBvc3NpYmxlIChvdGhlcndpc2Ugb2JleSBwb3J0J3MgZnJhbWUgcmF0ZSkuICovCisgICAgT01YX0JPT0wgYkZyYW1lTGltaXRlZDsgLyoqPCBJZiB0cnVlIHRoZW4gdGVybWluYXRlIGNhcHR1cmUgYWZ0ZXIgdGhlIHBvcnQgZW1pdHMgdGhlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgc3BlY2lmaWVkIG51bWJlciBvZiBmcmFtZXMgKG90aGVyd2lzZSB0aGUgcG9ydCBkb2VzIG5vdCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRlcm1pbmF0ZSB0aGUgY2FwdHVyZSB1bnRpbCBpbnN0cnVjdGVkIHRvIGRvIHNvIGJ5IHRoZSBjbGllbnQpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEV2ZW4gaWYgc2V0LCB0aGUgY2xpZW50IG1heSBtYW51YWxseSB0ZXJtaW5hdGUgdGhlIGNhcHR1cmUgcHJpb3IgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB0byByZWFjaGluZyB0aGUgbGltaXQuICovCisgICAgT01YX1UzMiBuRnJhbWVMaW1pdDsgICAgICAvKio8IExpbWl0IG9uIG51bWJlciBvZiBmcmFtZXMgZW1pdHRlZCBkdXJpbmcgYSBjYXB0dXJlIChvbmx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHZhbGlkIGlmIGJGcmFtZUxpbWl0ZWQgaXMgc2V0KS4gKi8KK30gT01YX0NPTkZJR19DQVBUVVJFTU9ERVRZUEU7CisKK3R5cGVkZWYgZW51bSBPTVhfTUVURVJJTkdUWVBFIHsKKyAKKyAgICBPTVhfTWV0ZXJpbmdNb2RlQXZlcmFnZSwgICAgIC8qKjwgQ2VudGVyLXdlaWdodGVkIGF2ZXJhZ2UgbWV0ZXJpbmcuICovCisgICAgT01YX01ldGVyaW5nTW9kZVNwb3QsICAJICAgICAgLyoqPCBTcG90IChwYXJ0aWFsKSBtZXRlcmluZy4gKi8KKyAgICBPTVhfTWV0ZXJpbmdNb2RlTWF0cml4LCAgICAgIC8qKjwgTWF0cml4IG9yIGV2YWx1YXRpdmUgbWV0ZXJpbmcuICovCisgCisgICAgT01YX01ldGVyaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9NZXRlcmluZ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0VWTW9kZU1heCA9IDB4N2ZmZmZmZmYKK30gT01YX01FVEVSSU5HVFlQRTsKKyAKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRVhQT1NVUkVWQUxVRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfTUVURVJJTkdUWVBFIGVNZXRlcmluZzsKKyAgICBPTVhfUzMyIHhFVkNvbXBlbnNhdGlvbjsgICAgICAvKio8IEZpeGVkIHBvaW50IHZhbHVlIHN0b3JlZCBhcyBRMTYgKi8KKyAgICBPTVhfVTMyIG5BcGVydHVyZUZOdW1iZXI7ICAgICAvKio8IGUuZy4gbkFwZXJ0dXJlRk51bWJlciA9IDIgaW1wbGllcyAiZi8yIiAtIFExNiBmb3JtYXQgKi8KKyAgICBPTVhfQk9PTCBiQXV0b0FwZXJ0dXJlOwkJLyoqPCBXaGV0aGVyIGFwZXJ0dXJlIG51bWJlciBpcyBkZWZpbmVkIGF1dG9tYXRpY2FsbHkgKi8KKyAgICBPTVhfVTMyIG5TaHV0dGVyU3BlZWRNc2VjOyAgICAvKio8IFNodXR0ZXJzcGVlZCBpbiBtaWxsaXNlY29uZHMgKi8gCisgICAgT01YX0JPT0wgYkF1dG9TaHV0dGVyU3BlZWQ7CS8qKjwgV2hldGhlciBzaHV0dGVyIHNwZWVkIGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLyAKKyAgICBPTVhfVTMyIG5TZW5zaXRpdml0eTsgICAgICAgICAvKio8IGUuZy4gblNlbnNpdGl2aXR5ID0gMTAwIGltcGxpZXMgIklTTyAxMDAiICovCisgICAgT01YX0JPT0wgYkF1dG9TZW5zaXRpdml0eTsJLyoqPCBXaGV0aGVyIHNlbnNpdGl2aXR5IGlzIGRlZmluZWQgYXV0b21hdGljYWxseSAqLworfSBPTVhfQ09ORklHX0VYUE9TVVJFVkFMVUVUWVBFOworCisvKiogCisgKiBGb2N1cyByZWdpb24gY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBiQ2VudGVyICAgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiTGVmdCAgICAgICAgICAgOiBVc2UgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlJpZ2h0ICAgICAgICAgIDogVXNlIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wICAgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tICAgICAgICAgOiBVc2UgYm90dG9tIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiVG9wTGVmdCAgICAgICAgOiBVc2UgdG9wIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BSaWdodCAgICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21MZWZ0ICAgICA6IFVzZSBib3R0b20gbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYkJvdHRvbVJpZ2h0ICAgIDogVXNlIGJvdHRvbSByaWdodCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkNlbnRlcjsKKyAgICBPTVhfQk9PTCBiTGVmdDsKKyAgICBPTVhfQk9PTCBiUmlnaHQ7CisgICAgT01YX0JPT0wgYlRvcDsKKyAgICBPTVhfQk9PTCBiQm90dG9tOworICAgIE9NWF9CT09MIGJUb3BMZWZ0OworICAgIE9NWF9CT09MIGJUb3BSaWdodDsKKyAgICBPTVhfQk9PTCBiQm90dG9tTGVmdDsKKyAgICBPTVhfQk9PTCBiQm90dG9tUmlnaHQ7Cit9IE9NWF9DT05GSUdfRk9DVVNSRUdJT05UWVBFOworCisvKiogCisgKiBGb2N1cyBTdGF0dXMgdHlwZSAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9GT0NVU1NUQVRVU1RZUEUgeworICAgIE9NWF9Gb2N1c1N0YXR1c09mZiA9IDAsCisgICAgT01YX0ZvY3VzU3RhdHVzUmVxdWVzdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNSZWFjaGVkLAorICAgIE9NWF9Gb2N1c1N0YXR1c1VuYWJsZVRvUmVhY2gsCisgICAgT01YX0ZvY3VzU3RhdHVzTG9zdCwKKyAgICBPTVhfRm9jdXNTdGF0dXNLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0ZvY3VzU3RhdHVzVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfRm9jdXNTdGF0dXNNYXggPSAweDdGRkZGRkZGCit9IE9NWF9GT0NVU1NUQVRVU1RZUEU7CisKKy8qKiAKKyAqIEZvY3VzIHN0YXR1cyBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb2N1c1N0YXR1cyAgICAgICAgOiBTcGVjaWZpZXMgdGhlIGZvY3VzIHN0YXR1cworICogIGJDZW50ZXJTdGF0dXMgICAgICAgOiBVc2UgY2VudGVyIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiTGVmdFN0YXR1cyAgICAgICAgIDogVXNlIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJSaWdodFN0YXR1cyAgICAgICAgOiBVc2UgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJUb3BTdGF0dXMgICAgICAgICAgOiBVc2UgdG9wIHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqICBiQm90dG9tU3RhdHVzICAgICAgIDogVXNlIGJvdHRvbSByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcExlZnRTdGF0dXMgICAgICA6IFVzZSB0b3AgbGVmdCByZWdpb24gYXMgZm9jdXMgcmVnaW9uIG9mIGludGVyZXN0CisgKiAgYlRvcFJpZ2h0U3RhdHVzICAgICA6IFVzZSB0b3AgcmlnaHQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21MZWZ0U3RhdHVzICAgOiBVc2UgYm90dG9tIGxlZnQgcmVnaW9uIGFzIGZvY3VzIHJlZ2lvbiBvZiBpbnRlcmVzdAorICogIGJCb3R0b21SaWdodFN0YXR1cyAgOiBVc2UgYm90dG9tIHJpZ2h0IHJlZ2lvbiBhcyBmb2N1cyByZWdpb24gb2YgaW50ZXJlc3QKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9GT0NVU1NUQVRVU1RZUEUgZUZvY3VzU3RhdHVzOworICAgIE9NWF9CT09MIGJDZW50ZXJTdGF0dXM7CisgICAgT01YX0JPT0wgYkxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYlJpZ2h0U3RhdHVzOworICAgIE9NWF9CT09MIGJUb3BTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wTGVmdFN0YXR1czsKKyAgICBPTVhfQk9PTCBiVG9wUmlnaHRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbUxlZnRTdGF0dXM7CisgICAgT01YX0JPT0wgYkJvdHRvbVJpZ2h0U3RhdHVzOworfSBPTVhfUEFSQU1fRk9DVVNTVEFUVVNUWVBFOworCisvKiogQH0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9JbWFnZS5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9JbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2ZDQ2NjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0ltYWdlLmgKQEAgLTAsMCArMSwzMjggQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKi8KKworLyoqIAorICogQGZpbGUgT01YX0ltYWdlLmggLSBPcGVuTWF4IElMIHZlcnNpb24gMS4xLjIKKyAqIFRoZSBzdHJ1Y3R1cmVzIG5lZWRlZCBieSBJbWFnZSBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgYW5kIAorICogY29uZmlndXJhdGlvbiBkYXRhIHdpdGggdGhlIGNvbXBvbmVudHMuCisgKi8KKyNpZm5kZWYgT01YX0ltYWdlX2gKKyNkZWZpbmUgT01YX0ltYWdlX2gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisKKy8qKgorICogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZSAKKyAqIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZCAgCisgKiBmb3IgdGhpcyBoZWFkZXIgZmlsZSB0byBjb21waWxlIHN1Y2Nlc3NmdWxseSAKKyAqLworCisjaW5jbHVkZSA8T01YX0lWQ29tbW9uLmg+CisKKy8qKiBAZGVmZ3JvdXAgaW1hZ2luZyBPcGVuTUFYIElMIEltYWdpbmcgRG9tYWluCisgKiBAaW5ncm91cCBpdgorICogU3RydWN0dXJlcyBmb3IgT3Blbk1BWCBJTCBJbWFnaW5nIGRvbWFpbgorICogQHsKKyAqLworCisvKiogCisgKiBFbnVtZXJhdGlvbiB1c2VkIHRvIGRlZmluZSB0aGUgcG9zc2libGUgaW1hZ2UgY29tcHJlc3Npb24gY29kaW5nLiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9DT0RJTkdUWVBFIHsKKyAgICBPTVhfSU1BR0VfQ29kaW5nVW51c2VkLCAgICAgIC8qKjwgVmFsdWUgd2hlbiBmb3JtYXQgaXMgTi9BICovCisgICAgT01YX0lNQUdFX0NvZGluZ0F1dG9EZXRlY3QsICAvKio8IEF1dG8gZGV0ZWN0aW9uIG9mIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdKUEVHLCAgICAgICAgLyoqPCBKUEVHL0pGSUYgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ0pQRUcySywgICAgICAvKio8IEpQRUcgMjAwMCBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nRVhJRiwgICAgICAgIC8qKjwgRVhJRiBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nVElGRiwgICAgICAgIC8qKjwgVElGRiBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nR0lGLCAgICAgICAgIC8qKjwgR3JhcGhpY3MgaW1hZ2UgZm9ybWF0ICovCisgICAgT01YX0lNQUdFX0NvZGluZ1BORywgICAgICAgICAvKio8IFBORyBpbWFnZSBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nTFpXLCAgICAgICAgIC8qKjwgTFpXIGltYWdlIGZvcm1hdCAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdCTVAsICAgICAgICAgLyoqPCBXaW5kb3dzIEJpdG1hcCBmb3JtYXQgKi8KKyAgICBPTVhfSU1BR0VfQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9Db2RpbmdNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRV9DT0RJTkdUWVBFOworCisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYW4gaW1hZ2UgcGF0aC4gVGhlIG51bWJlciBvZiBpbWFnZSBwYXRocyAKKyAqIGZvciBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBpbWFnZSBjb21wb25lbnQuICAKKyAqIAorICogIElucHV0IChha2EgU291cmNlKSA6IFplcm8gSW5wdXRzLCBvbmUgT3V0cHV0LAorICogIFNwbGl0dGVyICAgICAgICAgICA6IE9uZSBJbnB1dCwgMiBvciBtb3JlIE91dHB1dHMsCisgKiAgUHJvY2Vzc2luZyBFbGVtZW50IDogT25lIElucHV0LCBvbmUgb3V0cHV0LAorICogIE1peGVyICAgICAgICAgICAgICA6IDIgb3IgbW9yZSBpbnB1dHMsIG9uZSBvdXRwdXQsCisgKiAgT3V0cHV0IChha2EgU2luaykgIDogT25lIElucHV0LCB6ZXJvIG91dHB1dHMuCisgKiAKKyAqIFRoZSBQb3J0RGVmaW5pdGlvbiBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBkZWZpbmUgYWxsIG9mIHRoZSBwYXJhbWV0ZXJzIAorICogbmVjZXNzYXJ5IGZvciB0aGUgY29tcGxpYW50IGNvbXBvbmVudCB0byBzZXR1cCBhbiBpbnB1dCBvciBhbiBvdXRwdXQgIAorICogaW1hZ2UgcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCAgCisgKiBiZSB0cmFuc21pdHRlZCB0byB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBDdXN0b21Db21tYW5kIGZ1bmN0aW9uLiAgIAorICogQ29tcGxpYW50IGNvbXBvbmVudHMgd2lsbCBwcmVwb3B1bGF0ZSB0aGlzIHN0cnVjdHVyZSB3aXRoIG9wdGltYWwgIAorICogdmFsdWVzIGR1cmluZyB0aGUgT01YX0dldFBhcmFtZXRlcigpIGNvbW1hbmQuCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgY01JTUVUeXBlICAgICAgICAgICAgIDogTUlNRSB0eXBlIG9mIGRhdGEgZm9yIHRoZSBwb3J0CisgKiAgcE5hdGl2ZVJlbmRlciAgICAgICAgIDogUGxhdGZvcm0gc3BlY2lmaWMgcmVmZXJlbmNlIGZvciBhIGRpc3BsYXkgaWYgYSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jLCBvdGhlcndpc2UgdGhpcyBmaWVsZCBpcyAwCisgKiAgbkZyYW1lV2lkdGggICAgICAgICAgIDogV2lkdGggb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBwb3J0IGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHVuY29tcHJlc3NlZCBmb3JtYXQgaXMgdXNlZC4gIFVzZSAwIGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgbkZyYW1lSGVpZ2h0ICAgICAgICAgIDogSGVpZ2h0IG9mIGZyYW1lIHRvIGJlIHVzZWQgb24gcG9ydCBpZiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duLCBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIChpLmUuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldCBmcm9tCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBpbWFnZSBpcyBib3R0b20gdXAKKyAqICBuU2xpY2VIZWlnaHQgICAgICAgICAgOiBIZWlnaHQgdXNlZCB3aGVuIGVuY29kaW5nIGluIHNsaWNlcworICogIGJGbGFnRXJyb3JDb25jZWFsbWVudCA6IFR1cm5zIG9uIGVycm9yIGNvbmNlYWxtZW50IGlmIGl0IGlzIHN1cHBvcnRlZCBieSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgT01YIGNvbXBvbmVudAorICogIGVDb21wcmVzc2lvbkZvcm1hdCAgICA6IENvbXByZXNzaW9uIGZvcm1hdCB1c2VkIGluIHRoaXMgaW5zdGFuY2Ugb2YgIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb21wb25lbnQuIFdoZW4gT01YX0lNQUdFX0NvZGluZ1VudXNlZCBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQsIGVDb2xvckZvcm1hdCBpcyB2YWxpZAorICogIGVDb2xvckZvcm1hdCAgICAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAorICogIHBOYXRpdmVXaW5kb3cgICAgICAgICA6IFBsYXRmb3JtIHNwZWNpZmljIHJlZmVyZW5jZSBmb3IgYSB3aW5kb3cgb2JqZWN0IGlmIGEgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBzaW5rICwgb3RoZXJ3aXNlIHRoaXMgZmllbGQgaXMgMHgwLiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BPUlRERUZJTklUSU9OVFlQRSB7CisgICAgT01YX1NUUklORyBjTUlNRVR5cGU7CisgICAgT01YX05BVElWRV9ERVZJQ0VUWVBFIHBOYXRpdmVSZW5kZXI7CisgICAgT01YX1UzMiBuRnJhbWVXaWR0aDsgCisgICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7CisgICAgT01YX1MzMiBuU3RyaWRlOyAgICAgCisgICAgT01YX1UzMiBuU2xpY2VIZWlnaHQ7CisgICAgT01YX0JPT0wgYkZsYWdFcnJvckNvbmNlYWxtZW50OworICAgIE9NWF9JTUFHRV9DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsKKyAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBlQ29sb3JGb3JtYXQ7CisgICAgT01YX05BVElWRV9XSU5ET1dUWVBFIHBOYXRpdmVXaW5kb3c7Cit9IE9NWF9JTUFHRV9QT1JUREVGSU5JVElPTlRZUEU7CisKKworLyoqICAKKyAqIFBvcnQgZm9ybWF0IHBhcmFtZXRlci4gIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgdG8gZW51bWVyYXRlIHRoZSB2YXJpb3VzIAorICogZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICA6IEluZGljYXRlcyB3aGljaCBwb3J0IHRvIHNldAorICogIG5JbmRleCAgICAgICAgICAgICA6IEluZGljYXRlcyB0aGUgZW51bWVyYXRpb24gaW5kZXggZm9yIHRoZSBmb3JtYXQgZnJvbSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAweDAgdG8gTi0xCisgKiAgZUNvbXByZXNzaW9uRm9ybWF0IDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9JTUFHRV9Db2RpbmdVbnVzZWQgaXMgc3BlY2lmaWVkLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBlQ29sb3JGb3JtYXQgaXMgdmFsaWQKKyAqICBlQ29sb3JGb3JtYXQgICAgICAgOiBEZWNvbXByZXNzZWQgZm9ybWF0IHVzZWQgYnkgdGhpcyBjb21wb25lbnQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuSW5kZXg7CisgICAgT01YX0lNQUdFX0NPRElOR1RZUEUgZUNvbXByZXNzaW9uRm9ybWF0OworICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGVDb2xvckZvcm1hdDsKK30gT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFOworCisKKy8qKiAKKyAqIEZsYXNoIGNvbnRyb2wgdHlwZSAKKyAqCisgKiBFTlVNUworICogIFRvcmNoIDogRmxhc2ggZm9yY2VkIGNvbnN0YW50bHkgb24KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFIHsKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sT24gPSAwLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xPZmYsCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbEF1dG8sCisgICAgT01YX0lNQUdFX0ZsYXNoQ29udHJvbFJlZEV5ZVJlZHVjdGlvbiwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sRmlsbGluLAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xUb3JjaCwKKyAgICBPTVhfSU1BR0VfRmxhc2hDb250cm9sS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9JTUFHRV9GbGFzaENvbnRyb2xNYXggPSAweDdGRkZGRkZGCit9IE9NWF9JTUFHRV9GTEFTSENPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIEZsYXNoIGNvbnRyb2wgY29uZmlndXJhdGlvbiAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRmxhc2hDb250cm9sIDogRmxhc2ggY29udHJvbCB0eXBlCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9QQVJBTV9GTEFTSENPTlRST0xUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0lNQUdFX0ZMQVNIQ09OVFJPTFRZUEUgZUZsYXNoQ29udHJvbDsKK30gT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEU7CisKKworLyoqIAorICogRm9jdXMgY29udHJvbCB0eXBlIAorICovCit0eXBlZGVmIGVudW0gT01YX0lNQUdFX0ZPQ1VTQ09OVFJPTFRZUEUgeworICAgIE9NWF9JTUFHRV9Gb2N1c0NvbnRyb2xPbiA9IDAsCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbE9mZiwKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0bywKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sQXV0b0xvY2ssCisgICAgT01YX0lNQUdFX0ZvY3VzQ29udHJvbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfSU1BR0VfRm9jdXNDb250cm9sTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfRk9DVVNDT05UUk9MVFlQRTsKKworIAorLyoqIAorICogRm9jdXMgY29udHJvbCBjb25maWd1cmF0aW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb2N1c0NvbnRyb2wgICA6IEZvY3VzIGNvbnRyb2wKKyAqICBuRm9jdXNTdGVwcyAgICAgOiBGb2N1cyBjYW4gdGFrZSBvbiB2YWx1ZXMgZnJvbSAwIG1tIHRvIGluZmluaXR5LiAKKyAqICAgICAgICAgICAgICAgICAgICBJbnRlcmVzdCBpcyBvbmx5IGluIG51bWJlciBvZiBzdGVwcyBvdmVyIHRoaXMgcmFuZ2UuCisgKiAgbkZvY3VzU3RlcEluZGV4IDogQ3VycmVudCBmb2N1cyBzdGVwIGluZGV4CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9JTUFHRV9DT05GSUdfRk9DVVNDT05UUk9MVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9GT0NVU0NPTlRST0xUWVBFIGVGb2N1c0NvbnRyb2w7CisgICAgT01YX1UzMiBuRm9jdXNTdGVwczsKKyAgICBPTVhfVTMyIG5Gb2N1c1N0ZXBJbmRleDsKK30gT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFOworCisKKy8qKiAKKyAqIFEgRmFjdG9yIGZvciBKUEVHIGNvbXByZXNzaW9uLCB3aGljaCBjb250cm9scyB0aGUgdHJhZGVvZmYgYmV0d2VlbiBpbWFnZQorICogcXVhbGl0eSBhbmQgc2l6ZS4gIFEgRmFjdG9yIHByb3ZpZGVzIGEgbW9yZSBzaW1wbGUgbWVhbnMgb2YgY29udHJvbGxpbmcKKyAqIEpQRUcgY29tcHJlc3Npb24gcXVhbGl0eSwgd2l0aG91dCBkaXJlY3RseSBwcm9ncmFtbWluZyBRdWFudGl6YXRpb24KKyAqIHRhYmxlcyBmb3IgY2hyb21hIGFuZCBsdW1hIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgICAgICAgICAKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gCisgKiAgblFGYWN0b3IgICA6IEpQRUcgUSBmYWN0b3IgdmFsdWUgaW4gdGhlIHJhbmdlIG9mIDEtMTAwLiBBIGZhY3RvciBvZiAxIAorICogICAgICAgICAgICAgICBwcm9kdWNlcyB0aGUgc21hbGxlc3QsIHdvcnN0IHF1YWxpdHkgaW1hZ2VzLCBhbmQgYSBmYWN0b3IgCisgKiAgICAgICAgICAgICAgIG9mIDEwMCBwcm9kdWNlcyB0aGUgbGFyZ2VzdCwgYmVzdCBxdWFsaXR5IGltYWdlcy4gIEEgCisgKiAgICAgICAgICAgICAgIHR5cGljYWwgZGVmYXVsdCBpcyA3NSBmb3Igc21hbGwgZ29vZCBxdWFsaXR5IGltYWdlcyAgICAgICAgICAgICAgIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAorICAgIE9NWF9VMzIgblFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorfSBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEU7CisKKy8qKiAKKyAqIFF1YW50aXphdGlvbiB0YWJsZSB0eXBlIAorICovCisKK3R5cGVkZWYgZW51bSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFIHsKKyAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVMdW1hID0gMCwKKyAgICBPTVhfSU1BR0VfUXVhbnRpemF0aW9uVGFibGVDaHJvbWEsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ2IsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlQ2hyb21hQ3IsCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9JTUFHRV9RdWFudGl6YXRpb25UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0lNQUdFX1F1YW50aXphdGlvblRhYmxlTWF4ID0gMHg3RkZGRkZGRgorfSBPTVhfSU1BR0VfUVVBTlRJWkFUSU9OVEFCTEVUWVBFOworCisvKiogCisgKiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIERDVCBjb21wcmVzc2lvbiBmb3IKKyAqIFlVViBkYXRhLCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzcGVjaWZ5aW5nIFEgZmFjdG9yLCBwcm92aWRpbmcgZXhhY3QgCisgKiBjb250cm9sIG9mIGNvbXByZXNzaW9uIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlUXVhbnRpemF0aW9uVGFibGUgICAgICA6IFF1YW50aXphdGlvbiB0YWJsZSB0eXBlCisgKiAgblF1YW50aXphdGlvbk1hdHJpeFs2NF0gOiBKUEVHIHF1YW50aXphdGlvbiB0YWJsZSBvZiBjb2VmZmljaWVudHMgc3RvcmVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gaW5jcmVhc2luZyBjb2x1bW5zIHRoZW4gYnkgcm93cyBvZiBkYXRhIChpLmUuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93IDEsIC4uLiByb3cgOCkuIFF1YW50aXphdGlvbiB2YWx1ZXMgYXJlIGluIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmdlIDAtMjU1IGFuZCBzdG9yZWQgaW4gbGluZWFyIG9yZGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgY29tcG9uZW50IHdpbGwgemlnLXphZyB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6YXRpb24gdGFibGUgZGF0YSBpZiByZXF1aXJlZCBpbnRlcm5hbGx5KSAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9JTUFHRV9RVUFOVElaQVRJT05UQUJMRVRZUEUgZVF1YW50aXphdGlvblRhYmxlOworICAgIE9NWF9VOCBuUXVhbnRpemF0aW9uTWF0cml4WzY0XTsKK30gT01YX0lNQUdFX1BBUkFNX1FVQU5USVpBVElPTlRBQkxFVFlQRTsKKworCisvKiogCisgKiBIdWZmbWFuIHRhYmxlIHR5cGUsIHRoZSBzYW1lIEh1ZmZtYW4gdGFibGUgaXMgYXBwbGllZCBmb3IgY2hyb21hIGFuZCAKKyAqIGx1bWEgY29tcG9uZW50IAorICovCit0eXBlZGVmIGVudW0gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgeworICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQyA9IDAsCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVBQ0x1bWEsCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZUFDQ2hyb21hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVEQ0x1bWEsCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZURDQ2hyb21hLAorICAgIE9NWF9JTUFHRV9IdWZmbWFuVGFibGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX0lNQUdFX0h1ZmZtYW5UYWJsZU1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEU7CisKKy8qKiAKKyAqIEpQRUcgSHVmZm1hbiB0YWJsZSAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgICAgICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlSHVmZm1hblRhYmxlICAgICAgICAgICAgICAgICAgICA6IEh1ZmZtYW4gdGFibGUgdHlwZQorICogIG5OdW1iZXJPZkh1ZmZtYW5Db2RlT2ZMZW5ndGhbMTZdIDogMC0xNiwgbnVtYmVyIG9mIEh1ZmZtYW4gY29kZXMgb2YgZWFjaCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIGxlbmd0aAorICogIG5IdWZmbWFuVGFibGVbMjU2XSAgICAgICAgICAgICAgIDogMC0yNTUsIHRoZSBzaXplIHVzZWQgZm9yIEFDIGFuZCBEQyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh1ZmZtYW5UYWJsZSBhcmUgMTYgYW5kIDE2MiAKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX0lNQUdFX1BBUkFNX0hVRkZNQU5UVEFCTEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0lNQUdFX0hVRkZNQU5UQUJMRVRZUEUgZUh1ZmZtYW5UYWJsZTsKKyAgICBPTVhfVTggbk51bWJlck9mSHVmZm1hbkNvZGVPZkxlbmd0aFsxNl07CisgICAgT01YX1U4IG5IdWZmbWFuVGFibGVbMjU2XTsKK31PTVhfSU1BR0VfUEFSQU1fSFVGRk1BTlRUQUJMRVRZUEU7CisKKy8qKiBAfSAqLworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9JbmRleC5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9JbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDRlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX0luZGV4LmgKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIEBmaWxlIE9NWF9JbmRleC5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIE9NWF9JbmRleCBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgZGVmaW5pdGlvbnMgZm9yIGJvdGggYXBwbGljYXRpb25zCisgKiAgYW5kIGNvbXBvbmVudHMgLgorICovCisKKworI2lmbmRlZiBPTVhfSW5kZXhfaAorI2RlZmluZSBPTVhfSW5kZXhfaAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyogRWFjaCBPTVggaGVhZGVyIG11c3QgaW5jbHVkZSBhbGwgcmVxdWlyZWQgaGVhZGVyIGZpbGVzIHRvIGFsbG93IHRoZQorICogIGhlYWRlciB0byBjb21waWxlIHdpdGhvdXQgZXJyb3JzLiAgVGhlIGluY2x1ZGVzIGJlbG93IGFyZSByZXF1aXJlZAorICogIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisjaW5jbHVkZSA8T01YX1R5cGVzLmg+CisKKworLyoqIFRoZSBPTVhfSU5ERVhUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGEgc3RydWN0dXJlIHdoZW4gZWl0aGVyCisgKiAgZ2V0dGluZyBvciBzZXR0aW5nIHBhcmFtZXRlcnMgYW5kL29yIGNvbmZpZ3VyYXRpb24gZGF0YS4gIEVhY2ggZW50cnkgaW4gCisgKiAgdGhpcyBlbnVtZXJhdGlvbiBtYXBzIHRvIGFuIE9NWCBzcGVjaWZpZWQgc3RydWN0dXJlLiAgV2hlbiB0aGUgCisgKiAgT01YX0dldFBhcmFtZXRlciwgT01YX1NldFBhcmFtZXRlciwgT01YX0dldENvbmZpZyBvciBPTVhfU2V0Q29uZmlnIG1ldGhvZHMKKyAqICBhcmUgdXNlZCwgdGhlIHNlY29uZCBwYXJhbWV0ZXIgd2lsbCBhbHdheXMgYmUgYW4gZW50cnkgZnJvbSB0aGlzIGVudW1lcmF0aW9uCisgKiAgYW5kIHRoZSB0aGlyZCBlbnRyeSB3aWxsIGJlIHRoZSBzdHJ1Y3R1cmUgc2hvd24gaW4gdGhlIGNvbW1lbnRzIGZvciB0aGUgZW50cnkuCisgKiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBpbml0aWFsaXppbmcgYSBjcm9wcGluZyBmdW5jdGlvbiwgdGhlIAorICogIE9NWF9TZXRDb25maWcgY29tbWFuZCB3b3VsZCBoYXZlIE9NWF9JbmRleENvbmZpZ0NvbW1vbklucHV0Q3JvcCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlciAKKyAqICBhbmQgd291bGQgc2VuZCBhIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgT01YX1JFQ1RUWVBFIHN0cnVjdHVyZSBhcyB0aGUgCisgKiAgdGhpcmQgcGFyYW1ldGVyLgorICogIAorICogIFRoZSBlbnVtZXJhdGlvbiBlbnRyaWVzIG5hbWVkIHdpdGggdGhlIE9NWF9Db25maWcgcHJlZml4IGFyZSBzZW50IHVzaW5nCisgKiAgdGhlIE9NWF9TZXRDb25maWcgY29tbWFuZCBhbmQgdGhlIGVudW1lcmF0aW9uIGVudHJpZXMgbmFtZWQgd2l0aCB0aGUKKyAqICBPTVhfUEFSQU1fIHByZWZpeCBhcmUgc2VudCB1c2luZyB0aGUgT01YX1NldFBhcmFtZXRlciBjb21tYW5kLgorICovCit0eXBlZGVmIGVudW0gT01YX0lOREVYVFlQRSB7CisKKyAgICBPTVhfSW5kZXhDb21wb25lbnRTdGFydFVudXNlZCA9IDB4MDEwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1Qcmlvcml0eU1nbXQsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUFJJT1JJVFlNR01UVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Jbml0LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BPUlRfUEFSQU1fVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtSW1hZ2VJbml0LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BPUlRfUEFSQU1fVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Jbml0LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BPUlRfUEFSQU1fVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtT3RoZXJJbml0LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BPUlRfUEFSQU1fVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtTnVtQXZhaWxhYmxlU3RyZWFtcywgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX1UzMlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUFjdGl2ZVN0cmVhbSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9VMzJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1TdXNwZW5zaW9uUG9saWN5LCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fU1VTUEVOU0lPTlBPTElDWVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUNvbXBvbmVudFN1c3BlbmRlZCwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TVVNQRU5TSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NhcHR1cmluZywgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CT09MRUFOVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhDb25maWdDYXB0dXJlTW9kZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ0FQVFVSRU1PREVUWVBFICovIAorICAgIE9NWF9JbmRleEF1dG9QYXVzZUFmdGVyQ2FwdHVyZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19CT09MRUFOVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhQYXJhbUNvbnRlbnRVUkksICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT05URU5UVVJJVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ3VzdG9tQ29udGVudFBpcGUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0NPTlRFTlRQSVBFVFlQRSAqLyAKKyAgICBPTVhfSW5kZXhQYXJhbURpc2FibGVSZXNvdXJjZUNvbmNlYWxtZW50LCAvKio8IHJlZmVyZW5jZTogT01YX1JFU09VUkNFQ09OQ0VBTE1FTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnTWV0YWRhdGFJdGVtQ291bnQsICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01FVEFEQVRBSVRFTUNPVU5UVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbnRhaW5lck5vZGVDb3VudCwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT05UQUlORVJOT0RFQ09VTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnTWV0YWRhdGFJdGVtLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01FVEFEQVRBSVRFTVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb3VudGVyTm9kZUlELCAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVEFJTkVSTk9ERUlEVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtTWV0YWRhdGFGaWx0ZXJUeXBlLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtTWV0YWRhdGFLZXlGaWx0ZXIsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX01FVEFEQVRBRklMVEVSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ByaW9yaXR5TWdtdCwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BSSU9SSVRZTUdNVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVN0YW5kYXJkQ29tcG9uZW50Um9sZSwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9DT01QT05FTlRST0xFVFlQRSAqLworCisgICAgT01YX0luZGV4UG9ydFN0YXJ0VW51c2VkID0gMHgwMjAwMDAwMCwKKyAgICBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uLCAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUNvbXBCdWZmZXJTdXBwbGllciwgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9CVUZGRVJTVVBQTElFUlRZUEUgKi8gCisgICAgT01YX0luZGV4UmVzZXJ2ZWRTdGFydFVudXNlZCA9IDB4MDMwMDAwMDAsCisKKyAgICAvKiBBdWRpbyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLworICAgIE9NWF9JbmRleEF1ZGlvU3RhcnRVbnVzZWQgPSAweDA0MDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Qb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BjbSwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUENNTU9ERVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQWFjLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BQUNQUk9GSUxFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9SYSwgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1JBVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9NcDMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX01QM1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvQWRwY20sICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9BRFBDTVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyMywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HNzIzVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9HNzI5LCAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0c3MjlUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0FtciwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fQU1SVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9XbWEsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1dNQVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvU2JjLCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9TQkNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb01pZGksICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fTUlESVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0ZSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HU01GUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvTWlkaUxvYWRVc2VyU291bmQsICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9NSURJTE9BRFVTRVJTT1VORFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvRzcyNiwgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HNzI2VFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9Hc21fRUZSLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX0dTTUVGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvR3NtX0hSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9HU01IUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0ZSLCAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENGUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvUGRjX0VGUiwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9QRENFRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1BkY19IUiwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUERDSFJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1RkbWFfRlIsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVERNQUZSVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9UZG1hX0VGUiwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1RETUFFRlJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1FjZWxwOCwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fUUNFTFA4VFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQXVkaW9RY2VscDEzLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX1BBUkFNX1FDRUxQMTNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb0V2cmMsICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fRVZSQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUF1ZGlvU212LCAgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19QQVJBTV9TTVZUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1BdWRpb1ZvcmJpcywgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fUEFSQU1fVk9SQklTVFlQRSAqLworCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpSW1tZWRpYXRlRXZlbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElJTU1FRElBVEVFVkVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb01pZGlDb250cm9sLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESUNPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpU291bmRCYW5rUHJvZ3JhbSwgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfTUlESVNPVU5EQkFOS1BST0dSQU1UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpU3RhdHVzLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElTVEFUVVNUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpTWV0YUV2ZW50LCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9NaWRpTWV0YUV2ZW50RGF0YSwgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX01JRElNRVRBRVZFTlREQVRBVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvVm9sdW1lLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19WT0xVTUVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9CYWxhbmNlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0JBTEFOQ0VUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9DaGFubmVsTXV0ZSwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxNVVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTXV0ZSwgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19NVVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTG91ZG5lc3MsICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19MT1VETkVTU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0VjaG9DYW5jZWxhdGlvbiwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfRUNIT0NBTkNFTEFUSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvTm9pc2VSZWR1Y3Rpb24sICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19OT0lTRVJFRFVDVElPTlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0Jhc3MsICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQkFTU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb1RyZWJsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfVFJFQkxFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvU3RlcmVvV2lkZW5pbmcsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19TVEVSRU9XSURFTklOR1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdBdWRpb0Nob3J1cywgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9BVURJT19DT05GSUdfQ0hPUlVTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0F1ZGlvRXF1YWxpemVyLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0FVRElPX0NPTkZJR19FUVVBTElaRVJUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9SZXZlcmJlcmF0aW9uLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX1JFVkVSQkVSQVRJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQXVkaW9DaGFubmVsVm9sdW1lLCAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQVVESU9fQ09ORklHX0NIQU5ORUxWT0xVTUVUWVBFICovCisKKyAgICAvKiBJbWFnZSBzcGVjaWZpYyBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9ucyAqLworICAgIE9NWF9JbmRleEltYWdlU3RhcnRVbnVzZWQgPSAweDA1MDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtSW1hZ2VQb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1GbGFzaENvbnRyb2wsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fRkxBU0hDT05UUk9MVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0ZvY3VzQ29udHJvbCwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX0NPTkZJR19GT0NVU0NPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1RRmFjdG9yLCAgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfSU1BR0VfUEFSQU1fUUZBQ1RPUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVF1YW50aXphdGlvblRhYmxlLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9RVUFOVElaQVRJT05UQUJMRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUh1ZmZtYW5UYWJsZSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9JTUFHRV9QQVJBTV9IVUZGTUFOVFRBQkxFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0ZsYXNoQ29udHJvbCwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0lNQUdFX1BBUkFNX0ZMQVNIQ09OVFJPTFRZUEUgKi8KKworICAgIC8qIFZpZGVvIHNwZWNpZmljIHBhcmFtZXRlcnMgYW5kIGNvbmZpZ3VyYXRpb25zICovCisgICAgT01YX0luZGV4VmlkZW9TdGFydFVudXNlZCA9IDB4MDYwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1BvcnRGb3JtYXQsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUE9SVEZPUk1BVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvUXVhbnRpemF0aW9uLCAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb0Zhc3RVcGRhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fVklERU9GQVNUVVBEQVRFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9CaXRyYXRlLCAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb01vdGlvblZlY3RvciwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0lOVFJBUkVGUkVTSFRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvRXJyb3JDb3JyZWN0aW9uLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1ZCU01DLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fVkJTTUNUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb01wZWcyLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fTVBFRzJUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb01wZWc0LCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1dtdiwgICAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fV01WVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9SdiwgICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX1JWVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9BdmMsICAgICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX1BBUkFNX0FWQ1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbVZpZGVvSDI2MywgICAgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9IMjYzVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCwgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19QQVJBTV9QUk9GSUxFTEVWRUxUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1Byb2ZpbGVMZXZlbEN1cnJlbnQsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fUFJPRklMRUxFVkVMVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvQml0cmF0ZSwgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvRnJhbWVyYXRlLCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2gsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhTUJSZWZyZXNoLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfTUFDUk9CTE9DS0VSUk9STUFQVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTUJFcnJvclJlcG9ydGluZywgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQkVSUk9SUkVQT1JUSU5HVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtVmlkZW9NYWNyb2Jsb2Nrc1BlckZyYW1lLCAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ1ZpZGVvTWFjcm9CbG9ja0Vycm9yTWFwLCAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFICovCisgICAgT01YX0luZGV4UGFyYW1WaWRlb1NsaWNlRk1PLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU8gKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb0FWQ0ludHJhUGVyaW9kLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgKi8KKyAgICBPTVhfSW5kZXhDb25maWdWaWRlb05hbFNpemUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9WSURFT19DT05GSUdfTkFMU0laRSAqLworCisgICAgLyogSW1hZ2UgJiBWaWRlbyBjb21tb24gQ29uZmlndXJhdGlvbnMgKi8KKyAgICBPTVhfSW5kZXhDb21tb25TdGFydFVudXNlZCA9IDB4MDcwMDAwMDAsCisgICAgT01YX0luZGV4UGFyYW1Db21tb25EZWJsb2NraW5nLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfUEFSQU1fREVCTE9DS0lOR1RZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUNvbW1vblNlbnNvck1vZGUsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9QQVJBTV9TRU5TT1JNT0RFVFlQRSAqLworICAgIE9NWF9JbmRleFBhcmFtQ29tbW9uSW50ZXJsZWF2ZSwgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0lOVEVSTEVBVkVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JGb3JtYXRDb252ZXJzaW9uLCAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19DT0xPUkNPTlZFUlNJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uU2NhbGUsICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkltYWdlRmlsdGVyLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19JTUFHRUZJTFRFUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvckVuaGFuY2VtZW50LCAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JFTkhBTkNFTUVOVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db2xvcktleSwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09MT1JLRVlUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQ29sb3JCbGVuZCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0NPTE9SQkxFTkRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRnJhbWVTdGFiaWxpc2F0aW9uLC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZSQU1FU1RBQlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Sb3RhdGUsICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUk9UQVRJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uTWlycm9yLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX01JUlJPUlRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25PdXRwdXRQb3NpdGlvbiwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUE9JTlRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uSW5wdXRDcm9wLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JFQ1RUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uT3V0cHV0Q3JvcCwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1JFQ1RUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRGlnaXRhbFpvb20sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NDQUxFRkFDVE9SVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk9wdGljYWxab29tLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19TQ0FMRUZBQ1RPUlRZUEUqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbldoaXRlQmFsYW5jZSwgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19XSElURUJBTENPTlRST0xUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRXhwb3N1cmUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0VYUE9TVVJFQ09OVFJPTFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25Db250cmFzdCwgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfQ09OVFJBU1RUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQnJpZ2h0bmVzcywgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JSSUdIVE5FU1NUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uQmFja2xpZ2h0LCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0JBQ0tMSUdIVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25HYW1tYSwgICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfR0FNTUFUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uU2F0dXJhdGlvbiwgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX1NBVFVSQVRJT05UWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uTGlnaHRuZXNzLCAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0xJR0hUTkVTU1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25FeGNsdXNpb25SZWN0LCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfUkVDVFRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdDb21tb25EaXRoZXJpbmcsICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9DT05GSUdfRElUSEVSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblBsYW5lQmxlbmQsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19QTEFORUJMRU5EVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkV4cG9zdXJlVmFsdWUsICAgICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19FWFBPU1VSRVZBTFVFVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbk91dHB1dFNpemUsICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX0ZSQU1FU0laRVRZUEUgKi8KKyAgICBPTVhfSW5kZXhQYXJhbUNvbW1vbkV4dHJhUXVhbnREYXRhLCAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9PVEhFUl9FWFRSQURBVEFUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnQ29tbW9uRm9jdXNSZWdpb24sICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfQ09ORklHX0ZPQ1VTUkVHSU9OVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vbkZvY3VzU3RhdHVzLCAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX1BBUkFNX0ZPQ1VTU1RBVFVTVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ0NvbW1vblRyYW5zaXRpb25FZmZlY3QsICAvKio8IHJlZmVyZW5jZTogT01YX0NPTkZJR19UUkFOU0lUSU9ORUZGRUNUVFlQRSAqLworCisgICAgLyogUmVzZXJ2ZWQgQ29uZmlndXJhdGlvbiByYW5nZSAqLworICAgIE9NWF9JbmRleE90aGVyU3RhcnRVbnVzZWQgPSAweDA4MDAwMDAwLAorICAgIE9NWF9JbmRleFBhcmFtT3RoZXJQb3J0Rm9ybWF0LCAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnT3RoZXJQb3dlciwgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRSAqLworICAgIE9NWF9JbmRleENvbmZpZ090aGVyU3RhdHMsICAgICAgICAgICAgICAvKio8IHJlZmVyZW5jZTogT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgKi8KKworCisgICAgLyogUmVzZXJ2ZWQgVGltZSByYW5nZSAqLworICAgIE9NWF9JbmRleFRpbWVTdGFydFVudXNlZCA9IDB4MDkwMDAwMDAsCisgICAgT01YX0luZGV4Q29uZmlnVGltZVNjYWxlLCAgICAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUNsb2NrU3RhdGUsICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfQ0xPQ0tTVEFURVRZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQWN0aXZlUmVmQ2xvY2ssICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudE1lZGlhVGltZSwgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFIChyZWFkIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRXYWxsVGltZSwgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAocmVhZCBvbmx5KSAqLworICAgIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50QXVkaW9SZWZlcmVuY2UsIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlLCAvKio8IHJlZmVyZW5jZTogT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgKHdyaXRlIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZU1lZGlhVGltZVJlcXVlc3QsICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgKHdyaXRlIG9ubHkpICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZUNsaWVudFN0YXJ0VGltZSwgICAgIC8qKjxyZWZlcmVuY2U6ICBPTVhfVElNRV9DT05GSUdfVElNRVNUQU1QVFlQRSAod3JpdGUgb25seSkgKi8KKyAgICBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb24sICAgICAgICAgICAgLyoqPCByZWZlcmVuY2U6IE9NWF9USU1FX0NPTkZJR19USU1FU1RBTVBUWVBFICovCisgICAgT01YX0luZGV4Q29uZmlnVGltZVNlZWtNb2RlLCAgICAgICAgICAgIC8qKjwgcmVmZXJlbmNlOiBPTVhfVElNRV9DT05GSUdfU0VFS01PREVUWVBFICovCisKKworICAgIE9NWF9JbmRleEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICAvKiBWZW5kb3Igc3BlY2lmaWMgYXJlYSAqLworICAgIE9NWF9JbmRleFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwKKyAgICAvKiBWZW5kb3Igc3BlY2lmaWMgc3RydWN0dXJlcyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlIG9mIDB4N0YwMDAwMDAgCisgICAgICAgdG8gMHg3RkZGRkZGRS4gIFRoaXMgcmFuZ2UgaXMgbm90IGJyb2tlbiBvdXQgYnkgdmVuZG9yLCBzbworICAgICAgIHByaXZhdGUgaW5kZXhlcyBhcmUgbm90IGd1YXJhbnRlZWQgdW5pcXVlIGFuZCB0aGVyZWZvcmUgc2hvdWxkCisgICAgICAgb25seSBiZSBzZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBjb21wb25lbnQuICovCisKKyAgICBPTVhfSW5kZXhNYXggPSAweDdGRkZGRkZGCisKK30gT01YX0lOREVYVFlQRTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9PdGhlci5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9PdGhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZjdmMzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX090aGVyLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIEBmaWxlIE9NWF9PdGhlci5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIHN0cnVjdHVyZXMgbmVlZGVkIGJ5IE90aGVyIGNvbXBvbmVudHMgdG8gZXhjaGFuZ2UKKyAqICBwYXJhbWV0ZXJzIGFuZCBjb25maWd1cmF0aW9uIGRhdGEgd2l0aCB0aGUgY29tcG9uZW50cy4KKyAqLworCisjaWZuZGVmIE9NWF9PdGhlcl9oCisjZGVmaW5lIE9NWF9PdGhlcl9oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworCisvKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiAgaGVhZGVyIHRvIGNvbXBpbGUgd2l0aG91dCBlcnJvcnMuICBUaGUgaW5jbHVkZXMgYmVsb3cgYXJlIHJlcXVpcmVkCisgKiAgZm9yIHRoaXMgaGVhZGVyIGZpbGUgdG8gY29tcGlsZSBzdWNjZXNzZnVsbHkgCisgKi8KKworI2luY2x1ZGUgPE9NWF9Db3JlLmg+CisKKworLyoqIAorICogRW51bWVyYXRpb24gb2YgcG9zc2libGUgZGF0YSB0eXBlcyB3aGljaCBtYXRjaCB0byBtdWx0aXBsZSBkb21haW5zIG9yIG5vCisgKiBkb21haW4gYXQgYWxsLiAgRm9yIHR5cGVzIHdoaWNoIGFyZSB2ZW5kb3Igc3BlY2lmaWMsIGEgdmFsdWUgYWJvdmUKKyAqIE9NWF9PVEhFUl9WRU5ET1JUU1RBUlQgc2hvdWxkIGJlIHVzZWQuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfT1RIRVJfRk9STUFUVFlQRSB7CisgICAgT01YX09USEVSX0Zvcm1hdFRpbWUgPSAwLCAvKio8IFRyYW5zbWlzc2lvbiBvZiB2YXJpb3VzIHRpbWVzdGFtcHMsIGVsYXBzZWQgdGltZSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUgZGVsdGFzLCBldGMgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0UG93ZXIsICAgIC8qKjwgUGVyaGFwcyB1c2VkIGZvciBlbmFibGluZy9kaXNhYmxpbmcgcG93ZXIgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZW1lbnQsIHNldHRpbmcgY2xvY2tzPyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRTdGF0cywgICAgLyoqPCBDb3VsZCBiZSB0aGluZ3Mgc3VjaCBhcyBmcmFtZSByYXRlLCBmcmFtZXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BwZWQsIGV0YyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRCaW5hcnksICAgLyoqPCBBcmJpdHJhcnkgYmluYXJ5IGRhdGEgKi8KKyAgICBPTVhfT1RIRVJfRm9ybWF0VmVuZG9yUmVzZXJ2ZWQgPSAxMDAwLCAvKio8IFN0YXJ0aW5nIHZhbHVlIGZvciB2ZW5kb3Igc3BlY2lmaWMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzICovCisKKyAgICBPTVhfT1RIRVJfRm9ybWF0S2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9PVEhFUl9Gb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9PVEhFUl9Gb3JtYXRNYXggPSAweDdGRkZGRkZGCit9IE9NWF9PVEhFUl9GT1JNQVRUWVBFOworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBzZWVrIG1vZGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfU0VFS01PREVUWVBFIHsKKyAgICBPTVhfVElNRV9TZWVrTW9kZUZhc3QgPSAwLCAvKio8IFByZWZlciBzZWVraW5nIHRvIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gb3ZlciAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoZSBhY3R1YWwgc2VlayBwb3NpdGlvbiBpZiBpdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHJlc3VsdHMgaW4gYSBmYXN0ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUFjY3VyYXRlLCAvKio8IFByZWZlciBzZWVraW5nIHRvIHRoZSBhY3R1YWwgc2VlayAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwb3NpdGlvbiBvdmVyIGFuIGFwcHJveGltYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdGVkIHNlZWsgcG9zaXRpb24gZXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGlmIGl0IHJlc3VsdHMgaW4gYSBzbG93ZXIgc2Vlay4gKi8KKyAgICBPTVhfVElNRV9TZWVrTW9kZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVElNRV9TZWVrTW9kZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1RJTUVfU2Vla01vZGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1NFRUtNT0RFVFlQRTsKKworLyogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc2Vla21vZGUgb2YgdGhlIGNvbXBvbmVudCAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfU0VFS01PREVUWVBFIGVUeXBlOyAgICAvKio8IFRoZSBzZWVrIG1vZGUgKi8KK30gT01YX1RJTUVfQ09ORklHX1NFRUtNT0RFVFlQRTsKKworLyoqIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0aW1lIHN0YW1wIHVzZWQgd2l0aCB0aGUgZm9sbG93aW5nIGNvbmZpZ3MgCisgKiBvbiB0aGUgQ2xvY2sgQ29tcG9uZW50IChDQyk6CisgKiAKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50V2FsbFRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgd2FsbCAgCisgKiAgICAgdGltZQorICogT01YX0luZGV4Q29uZmlnVGltZUN1cnJlbnRNZWRpYVRpbWU6IHF1ZXJ5IG9mIHRoZSBDQ5JzIGN1cnJlbnQgbWVkaWEKKyAqICAgICB0aW1lCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlIGFuZCAgCisgKiBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudFZpZGVvUmVmZXJlbmNlOiBhdWRpby92aWRlbyByZWZlcmVuY2UgCisgKiAgICAgY2xvY2sgc2VuZGluZyBTQyBpdHMgcmVmZXJlbmNlIHRpbWUKKyAqIE9NWF9JbmRleENvbmZpZ1RpbWVDbGllbnRTdGFydFRpbWU6IGEgQ2xvY2sgQ29tcG9uZW50IGNsaWVudCBzZW5kcyAKKyAqICAgICB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZyBvbiBpdHMgCisgKiAgICAgY2xpZW50IHBvcnQgd2hlbiBpdCByZWNlaXZlcyBhIGJ1ZmZlciB3aXRoCisgKiAgICAgT01YX0JVRkZFUkZMQUdfU1RBUlRUSU1FIHNldC4gSXQgbXVzdCB1c2UgdGhlIHRpbWVzdGFtcAorICogICAgIHNwZWNpZmllZCBieSB0aGF0IGJ1ZmZlciBmb3IgblN0YXJ0VGltZXN0YW1wLiAKKyAqCisgKiBJdJJzIGFsc28gdXNlZCB3aXRoIHRoZSBmb2xsb3dpbmcgY29uZmlnIG9uIGNvbXBvbmVudHMgaW4gZ2VuZXJhbDoKKyAqCisgKiBPTVhfSW5kZXhDb25maWdUaW1lUG9zaXRpb246IElMIGNsaWVudCBxdWVyeWluZyBjb21wb25lbnQgcG9zaXRpb24gCisgKiAoR2V0Q29uZmlnKSBvciBjb21tYW5kaW5nIGEgY29tcG9uZW50IHRvIHNlZWsgdG8gdGhlIGdpdmVuIGxvY2F0aW9uCisgKiAoU2V0Q29uZmlnKQorICovCQordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgIC8qKjwgcG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8gKi8KKyAgICBPTVhfVElDS1MgblRpbWVzdGFtcDsgIAkgICAgIC8qKjwgdGltZXN0YW1wIC4qLyAKK30gT01YX1RJTUVfQ09ORklHX1RJTUVTVEFNUFRZUEU7ICAKKworLyoqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHJlZmVyZW5jZSBjbG9ja3MgdG8gdGhlIG1lZGlhIHRpbWUuICovCit0eXBlZGVmIGVudW0gT01YX1RJTUVfVVBEQVRFVFlQRSB7CisgICAgICBPTVhfVElNRV9VcGRhdGVSZXF1ZXN0RnVsZmlsbG1lbnQsICAgIC8qKjwgVXBkYXRlIGlzIHRoZSBmdWxmaWxsbWVudCBvZiBhIG1lZGlhIHRpbWUgcmVxdWVzdC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZVNjYWxlQ2hhbmdlZCwJICAgICAgICAvKio8IFVwZGF0ZSB3YXMgZ2VuZXJhdGVkIGJlY2F1c2UgdGhlIHNjYWxlIGNoYWduZWQuICovCisgICAgICBPTVhfVElNRV9VcGRhdGVDbG9ja1N0YXRlQ2hhbmdlZCwgICAgIC8qKjwgVXBkYXRlIHdhcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgY2xvY2sgc3RhdGUgY2hhbmdlZC4gKi8KKyAgICAgIE9NWF9USU1FX1VwZGF0ZUtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICAgIE9NWF9USU1FX1VwZGF0ZVZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgICBPTVhfVElNRV9VcGRhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1VQREFURVRZUEU7CisKKy8qKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSByZWZlcmVuY2UgY2xvY2tzIHRvIHRoZSBtZWRpYSB0aW1lLiAqLwordHlwZWRlZiBlbnVtIE9NWF9USU1FX1JFRkNMT0NLVFlQRSB7CisgICAgICBPTVhfVElNRV9SZWZDbG9ja05vbmUsICAgIC8qKjwgVXNlIG5vIHJlZmVyZW5jZXMuICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja0F1ZGlvLAkvKio8IFVzZSByZWZlcmVuY2VzIHNlbnQgdGhyb3VnaCBPTVhfSW5kZXhDb25maWdUaW1lQ3VycmVudEF1ZGlvUmVmZXJlbmNlICovCisgICAgICBPTVhfVElNRV9SZWZDbG9ja1ZpZGVvLCAgIC8qKjwgVXNlIHJlZmVyZW5jZXMgc2VudCB0aHJvdWdoIE9NWF9JbmRleENvbmZpZ1RpbWVDdXJyZW50VmlkZW9SZWZlcmVuY2UgKi8KKyAgICAgIE9NWF9USU1FX1JlZkNsb2NrS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgICAgT01YX1RJTUVfUmVmQ2xvY2tWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgICAgT01YX1RJTUVfUmVmQ2xvY2tNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX1JFRkNMT0NLVFlQRTsKKworLyoqIEVudW1lcmF0aW9uIG9mIGNsb2NrIHN0YXRlcy4gKi8KK3R5cGVkZWYgZW51bSBPTVhfVElNRV9DTE9DS1NUQVRFIHsKKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVSdW5uaW5nLCAgICAgICAgICAgICAvKio8IENsb2NrIHJ1bm5pbmcuICovCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlV2FpdGluZ0ZvclN0YXJ0VGltZSwgLyoqPCBDbG9jayB3YWl0aW5nIHVudGlsIHRoZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHByZXNjcmliZWQgY2xpZW50cyBlbWl0IHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBzdGFydCB0aW1lLiAqLworICAgICAgT01YX1RJTUVfQ2xvY2tTdGF0ZVN0b3BwZWQsICAgICAgICAgICAgIC8qKjwgQ2xvY2sgc3RvcHBlZC4gKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgICBPTVhfVElNRV9DbG9ja1N0YXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICAgIE9NWF9USU1FX0Nsb2NrU3RhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9USU1FX0NMT0NLU1RBVEU7CisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEgbWVkaWEgdGltZSByZXF1ZXN0IHRvIHRoZSBjbG9jayBjb21wb25lbnQuCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBzZW5kcyB0aGlzIHN0cnVjdHVyZSB0byB0aGUgQ2xvY2sgQ29tcG9uZW50IHZpYSBhIFNldENvbmZpZworICogIG9uIGl0cyBjbGllbnQgcG9ydCB0byBzcGVjaWZ5IGEgbWVkaWEgdGltZXN0YW1wIHRoZSBDbG9jayBDb21wb25lbnQKKyAqICBzaG91bGQgZW1pdC4gIFRoZSBDbG9jayBDb21wb25lbnQgc2hvdWxkIGZ1bGZpbGwgdGhlIHJlcXVlc3QgYnkgc2VuZGluZyBhCisgKiAgT01YX1RJTUVfTUVESUFUSU1FVFlQRSB3aGVuIGl0cyBtZWRpYSBjbG9jayBtYXRjaGVzIHRoZSByZXF1ZXN0ZWQgCisgKiAgdGltZXN0YW1wLgorICoKKyAqICBUaGUgY2xpZW50IG1heSByZXF1aXJlIGEgbWVkaWEgdGltZSByZXF1ZXN0IGJlIGZ1bGZpbGxlZCBzbGlnaHRseQorICogIGVhcmxpZXIgdGhhbiB0aGUgbWVkaWEgdGltZSBzcGVjaWZpZWQuIEluIHRoaXMgY2FzZSB0aGUgY2xpZW50IHNwZWNpZmllcyAKKyAqICBhbiBvZmZzZXQgd2hpY2ggaXMgZXF1YWwgdG8gdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB3YWxsIHRpbWUgY29ycmVzcG9uZGluZyAKKyAqICB0byB0aGUgcmVxdWVzdGVkIG1lZGlhIHRpbWUgYW5kIHRoZSB3YWxsIHRpbWUgd2hlbiBpdCB3aWxsIGJlIAorICogIGZ1bGZpbGxlZC4gCisgKgorICogIEEgY2xpZW50IGNvbXBvbmVudCBtYXkgdXNlcyB0aGVzZSByZXF1ZXN0cyBhbmQgdGhlIE9NWF9USU1FX01FRElBVElNRVRZUEUgdG8KKyAqICB0aW1lIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGltZXN0YW1wcy4gSWYgYSBjbGllbnQgbXVzdCBwZXJmb3JtIGFuIG9wZXJhdGlvbiBPIGF0CisgKiAgYSB0aW1lIFQgKGUuZy4gZGVsaXZlciBhIHZpZGVvIGZyYW1lIGF0IGl0cyBjb3JyZXNwb25kaW5nIHRpbWVzdGFtcCksIGl0IG1ha2VzIGEgCisgKiAgbWVkaWEgdGltZSByZXF1ZXN0IGF0IFQgKHBlcmhhcHMgc3BlY2lmeWluZyBhbiBvZmZzZXQgdG8gZW5zdXJlIHRoZSByZXF1ZXN0IGZ1bGZpbGxtZW50CisgKiAgaXMgYSBsaXR0bGUgZWFybHkpLiBXaGVuIHRoZSBjbG9jayBjb21wb25lbnQgcGFzc2VzIHRoZSByZXN1bHRpbmcgT01YX1RJTUVfTUVESUFUSU1FVFlQRQorICogIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBjbGllbnQgY29tcG9uZW50LCB0aGUgY2xpZW50IG1heSBwZXJmb3JtIG9wZXJhdGlvbiBPIChwZXJoYXBzIGhhdmluZworICogIHRvIHdhaXQgYSBzbGlnaHQgYW1vdW50IG1vcmUgdGltZSBpdHNlbGYgYXMgc3BlY2lmaWVkIGJ5IHRoZSByZXR1cm4gdmFsdWVzKS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCBPTVhfVElNRV9DT05GSUdfTUVESUFUSU1FUkVRVUVTVFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAvKio8IHNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcyAqLworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgLyoqPCBwb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAqLworICAgIE9NWF9QVFIgcENsaWVudFByaXZhdGU7ICAgICAvKio8IENsaWVudCBwcml2YXRlIGRhdGEgdG8gZGlzYWJpZ3VhdGUgdGhpcyBtZWRpYSB0aW1lIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGZyb20gb3RoZXJzIChlLmcuIHRoZSBudW1iZXIgb2YgdGhlIGZyYW1lIHRvIGRlbGl2ZXIpLiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBEdXBsaWNhdGVkIGluIHRoZSBtZWRpYSB0aW1lIHN0cnVjdHVyZSB0aGF0IGZ1bGZpbGxzIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHRoaXMgcmVxdWVzdC4gQSB2YWx1ZSBvZiB6ZXJvIGlzIHJlc2VydmVkIGZvciB0aW1lIHNjYWxlIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHVwZGF0ZXMuICovCisgICAgT01YX1RJQ0tTIG5NZWRpYVRpbWVzdGFtcDsgIC8qKjwgTWVkaWEgdGltZXN0YW1wIHJlcXVlc3RlZC4qLyAKKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBBbW91bnQgb2Ygd2FsbCBjbG9jayB0aW1lIGJ5IHdoaWNoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHNob3VsZCBiZSBmdWxmaWxsZWQgZWFybHkgKi8KK30gT01YX1RJTUVfQ09ORklHX01FRElBVElNRVJFUVVFU1RUWVBFOworCisvKio8IFN0cnVjdHVyZSBzZW50IGZyb20gdGhlIGNsb2NrIGNvbXBvbmVudCBjbGllbnQgZWl0aGVyIHdoZW4gZnVsZmlsbGluZyAKKyAqICAgYSBtZWRpYSB0aW1lIHJlcXVlc3Qgb3Igd2hlbiB0aGUgdGltZSBzY2FsZSBoYXMgY2hhbmdlZC4gCisgKgorICogICBJbiB0aGUgZm9ybWVyIGNhc2UgdGhlIENsb2NrIENvbXBvbmVudCBmaWxscyB0aGlzIHN0cnVjdHVyZSBhbmQgdGltZXMgaXRzIGVtaXNzaW9uIAorICogICB0byBhIGNsaWVudCBjb21wb25lbnQgKHZpYSB0aGUgY2xpZW50IHBvcnQpIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtZWRpYSAKKyAqICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgdGhlIGNsaWVudC4gVGhlIENsb2NrIENvbXBvbmVudCBzaG91bGQgdGltZSB0aGUgZW1pc3Npb24gdG8gb2NjdXIKKyAqICAgd2hlbiB0aGUgcmVxdWVzdGVkIHRpbWVzdGFtcCBtYXRjaGVzIHRoZSBDbG9jayBDb21wb25lbnQncyBtZWRpYSB0aW1lIGJ1dCBhbHNvIHRoZSAKKyAqICAgcHJlc2NyaWJlZCBvZmZzZXQgZWFybHkuIAorICoKKyAqICAgVXBvbiBzY2FsZSBjaGFuZ2VzIHRoZSBjbG9jayBjb21wb25lbnQgY2xlYXJzIHRoZSBuQ2xpZW50UHJpdmF0ZSBkYXRhLCBzZW5kcyB0aGUgY3VycmVudAorICogICBtZWRpYSB0aW1lIGFuZCBzZXRzIHRoZSBuU2NhbGUgdG8gdGhlIG5ldyBzY2FsZSB2aWEgdGhlIGNsaWVudCBwb3J0LiBJdCBlbWl0cyBhIAorICogICBPTVhfVElNRV9NRURJQVRJTUVUWVBFIHRvIGFsbCBjbGllbnRzIGluZGVwZW5kZW50IG9mIGFueSByZXF1ZXN0cy4gVGhpcyBhbGxvd3MgY2xpZW50cyB0byAKKyAqICAgYWx0ZXIgcHJvY2Vzc2luZyB0byBhY2NvbW9kYXRlIHNjYWxpbmcuIEZvciBpbnN0YW5jZSBhIHZpZGVvIGNvbXBvbmVudCBtaWdodCBza2lwIGludGVyLWZyYW1lcyAKKyAqICAgaW4gdGhlIGNhc2Ugb2YgZXh0cmVtZSBmYXN0Zm9yd2FyZC4gTGlrZXdpc2UgYW4gYXVkaW8gY29tcG9uZW50IG1pZ2h0IGFkZCBvciByZW1vdmUgc2FtcGxlcyAKKyAqICAgZnJvbSBhbiBhdWRpbyBmcmFtZSB0byBzY2FsZSBhdWRpbyBkYXRhLiAKKyAqCisgKiAgIEl0IGlzIGV4cGVjdGVkIHRoYXQgc29tZSBjbG9jayBjb21wb25lbnRzIG1heSBub3QgYmUgYWJsZSB0byBmdWxmaWxsIHJlcXVlc3RzCisgKiAgIGF0IGV4YWN0bHkgdGhlIHByZXNjcmliZWQgdGltZS4gVGhpcyBpcyBhY2NlcHRhYmxlIHNvIGxvbmcgYXMgdGhlIHJlcXVlc3QgaXMgCisgKiAgIGZ1bGZpbGxlZCBhdCBsZWFzdCBhcyBlYXJseSBhcyBkZXNjcmliZWQgYW5kIG5vdCBsYXRlci4gVGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXMgCisgKiAgIGZpZWxkcyB0aGUgY2xpZW50IG1heSB1c2UgdG8gd2FpdCBmb3IgdGhlIHJlbWFpbmluZyB0aW1lLgorICoKKyAqICAgVGhlIGNsaWVudCBtYXkgdXNlIGVpdGhlciB0aGUgbk9mZnNldCBvciBuV2FsbFRpbWVBdE1lZGlhIGZpZWxkcyB0byBkZXRlcm1pbmUgdGhlIAorICogICB3YWxsIHRpbWUgdW50aWwgdGhlIG5NZWRpYVRpbWVzdGFtcCBhY3R1YWxseSBvY2N1cnMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKKyAqICAgY2xpZW50IGNhbiBnZXQgYSBtb3JlIGFjY3VyYXRlIHZhbHVlIGZvciBvZmZzZXQgYnkgZ2V0dGluZyB0aGUgY3VycmVudCB3YWxsCisgKiAgIGZyb20gdGhlIGNsb2MgY29tcG9uZW50IGFuZCBzdWJ0cmFjdGluZyBpdCBmcm9tIG5XYWxsVGltZUF0TWVkaWEuIAorICovCisKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX01FRElBVElNRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgbkNsaWVudFByaXZhdGU7ICAgICAgICAgLyoqPCBDbGllbnQgcHJpdmF0ZSBkYXRhIHRvIGRpc2FiaWd1YXRlIHRoaXMgbWVkaWEgdGltZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgZnJvbSBvdGhlcnMuIENvcGllZCBmcm9tIHRoZSBtZWRpYSB0aW1lIHJlcXVlc3QuIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBBIHZhbHVlIG9mIHplcm8gaXMgcmVzZXJ2ZWQgZm9yIHRpbWUgc2NhbGUgdXBkYXRlcy4gKi8KKyAgICBPTVhfVElNRV9VUERBVEVUWVBFIGVVcGRhdGVUeXBlOyAvKio8IFJlYXNvbiBmb3IgdGhlIHVwZGF0ZSAqLworICAgIE9NWF9USUNLUyBuTWVkaWFUaW1lc3RhbXA7ICAgICAgLyoqPCBNZWRpYSB0aW1lIHJlcXVlc3RlZC4gSWYgbm8gbWVkaWEgdGltZSB3YXMgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHJlcXVlc3RlZCB0aGVuIHRoaXMgaXMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZS4gKi8gCisgICAgT01YX1RJQ0tTIG5PZmZzZXQ7ICAgICAgICAgICAgICAvKio8IEFtb3VudCBvZiB3YWxsIGNsb2NrIHRpbWUgYnkgd2hpY2ggdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICByZXF1ZXN0IHdhcyBhY3R1YWxseSBmdWxmaWxsZWQgZWFybHkgKi8KKworICAgIE9NWF9USUNLUyBuV2FsbFRpbWVBdE1lZGlhVGltZTsgLyoqPCBXYWxsIHRpbWUgY29ycmVzcG9uZGluZyB0byBuTWVkaWFUaW1lU3RhbXAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIEEgY2xpZW50IG1heSBjb21wYXJlIHRoaXMgdmFsdWUgdG8gY3VycmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBtZWRpYSB0aW1lIG9idGFpbmVkIGZyb20gdGhlIENsb2NrIENvbXBvbmVudCB0byBkZXRlcm1pbmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICAgdGhlIHdhbGwgdGltZSB1bnRpbCB0aGUgbWVkaWEgdGltZXN0YW1wIGlzIHJlYWxseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICBjdXJyZW50LiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBDdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgaW4gUTE2IGZvcm1hdC4gKi8KKyAgICBPTVhfVElNRV9DTE9DS1NUQVRFIGVTdGF0ZTsgICAgIC8qIFNlZWtpbmcgQ2hhbmdlLiBBZGRlZCA3LzEyLiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKio8IFN0YXRlIG9mIHRoZSBtZWRpYSB0aW1lLiAqLworfSBPTVhfVElNRV9NRURJQVRJTUVUWVBFOyAgCisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUgc2NhbGUgZmFjdG9yLiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sgCisgKiAgY29tcG9uZW50LCBvdGhlciBjb21wb25lbnRzIHNlZSBzY2FsZSBjaGFuZ2VzIHZpYSBPTVhfVElNRV9NRURJQVRJTUVUWVBFIGJ1ZmZlcnMgc2VudCB2aWEKKyAqICB0aGUgY2xvY2sgY29tcG9uZW50IGNsaWVudCBwb3J0cy4gVXBvbiByZWNpZXZpbmcgdGhpcyBjb25maWcgdGhlIGNsb2NrIGNvbXBvbmVudCBjaGFuZ2VzIAorICogIHRoZSByYXRlIGJ5IHdoaWNoIHRoZSBtZWRpYSB0aW1lIGluY3JlYXNlcyBvciBkZWNyZWFzZXMgZWZmZWN0aXZlbHkgaW1wbGVtZW50aW5nIHRyaWNrIG1vZGVzLiAKKyAqLyAKK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19TQ0FMRVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9TMzIgeFNjYWxlOyAgICAgICAgICAgICAgICAgLyoqPCBUaGlzIGlzIGEgdmFsdWUgaW4gUTE2IGZvcm1hdCB3aGljaCBpcyB1c2VkIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2NhbGluZyB0aGUgbWVkaWEgdGltZSAqLworfSBPTVhfVElNRV9DT05GSUdfU0NBTEVUWVBFOworIAorLyoqIEJpdHMgdXNlZCB0byBpZGVudGlmeSBhIGNsb2NrIHBvcnQuIFVzZWQgaW4gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFknMgbldhaXRNYXNrIGZpZWxkICovCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQwIDB4MDAwMDAwMDEKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDEgMHgwMDAwMDAwMgorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUMiAweDAwMDAwMDA0CisjZGVmaW5lIE9NWF9DTE9DS1BPUlQzIDB4MDAwMDAwMDgKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDQgMHgwMDAwMDAxMAorI2RlZmluZSBPTVhfQ0xPQ0tQT1JUNSAweDAwMDAwMDIwCisjZGVmaW5lIE9NWF9DTE9DS1BPUlQ2IDB4MDAwMDAwNDAKKyNkZWZpbmUgT01YX0NMT0NLUE9SVDcgMHgwMDAwMDA4MAorCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBtb2RlIG9mIHRoZSBtZWRpYSBjbG9jay4gCisgKiAgSUwgQ2xpZW50IHVzZXMgdGhpcyBjb25maWcgdG8gY2hhbmdlIG9yIHF1ZXJ5IHRoZSBtb2RlIG9mIHRoZSAKKyAqICBtZWRpYSBjbG9jayBvZiB0aGUgY2xvY2sgY29tcG9uZW50LiBBcHBsaWNhYmxlIG9ubHkgdG8gY2xvY2sKKyAqICBjb21wb25lbnQuIAorICogIAorICogIE9uIGEgU2V0Q29uZmlnIGlmIGVTdGF0ZSBpcyBPTVhfVElNRV9DbG9ja1N0YXRlUnVubmluZyBtZWRpYSB0aW1lCisgKiAgc3RhcnRzIGltbWVkaWF0ZWx5IGF0IHRoZSBwcmVzY3JpYmVkIHN0YXJ0IHRpbWUuIElmCisgKiAgT01YX1RJTUVfQ2xvY2tTdGF0ZVdhaXRpbmdGb3JTdGFydFRpbWUgdGhlIENsb2NrIENvbXBvbmVudCBpZ25vcmVzCisgKiAgdGhlIGdpdmVuIG5TdGFydFRpbWUgYW5kIHdhaXRzIGZvciBhbGwgY2xpZW50cyBzcGVjaWZpZWQgaW4gdGhlIAorICogIG5XYWl0TWFzayB0byBzZW5kIHN0YXJ0dGltZXMgKHZpYSAKKyAqICBPTVhfSW5kZXhDb25maWdUaW1lQ2xpZW50U3RhcnRUaW1lKS4gVGhlIENsb2NrIENvbXBvbmVudCB0aGVuIHN0YXJ0cyAKKyAqICB0aGUgbWVkaWEgY2xvY2sgdXNpbmcgdGhlIGVhcmxpZXN0IHN0YXJ0IHRpbWUgc3VwcGxpZWQuICovICAgIAordHlwZWRlZiBzdHJ1Y3QgT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgLyoqPCBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIGluZm9ybWF0aW9uICovCisgICAgT01YX1RJTUVfQ0xPQ0tTVEFURSBlU3RhdGU7IC8qKjwgU3RhdGUgb2YgdGhlIG1lZGlhIHRpbWUuICovCisgICAgT01YX1RJQ0tTIG5TdGFydFRpbWU7ICAgICAgIC8qKjwgU3RhcnQgdGltZSBvZiB0aGUgbWVkaWEgdGltZS4gKi8KKyAgICBPTVhfVElDS1Mgbk9mZnNldDsgICAgICAgICAgLyoqPCBUaW1lIHRvIG9mZnNldCB0aGUgbWVkaWEgdGltZSBieSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKGUuZy4gcHJlcm9sbCkuIE1lZGlhIHRpbWUgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZXBvcnRlZCB0byBiZSBuT2Zmc2V0IHRpY2tzIGVhcmxpZXIuICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgT01YX1UzMiBuV2FpdE1hc2s7ICAgICAgICAgIC8qKjwgTWFzayBvZiBPTVhfQ0xPQ0tQT1JUIHZhbHVlcy4gKi8KK30gT01YX1RJTUVfQ09ORklHX0NMT0NLU1RBVEVUWVBFOworCisvKiogU3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgcmVmZXJlbmNlIGNsb2NrIGN1cnJlbnRseSBiZWluZyB1c2VkIHRvCisgKiAgY29tcHV0ZSBtZWRpYSB0aW1lLiBJTCBjbGllbnQgdXNlcyB0aGlzIGNvbmZpZyB0byBjaGFuZ2Ugb3IgcXVlcnkgdGhlIAorICogIGNsb2NrIGNvbXBvbmVudCdzIGFjdGl2ZSByZWZlcmVuY2UgY2xvY2sgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9USU1FX0NPTkZJR19BQ1RJVkVSRUZDTE9DS1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247ICAgICAgIC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9USU1FX1JFRkNMT0NLVFlQRSBlQ2xvY2s7ICAgLyoqPCBSZWZlcmVuY2UgY2xvY2sgdXNlZCB0byBjb21wdXRlIG1lZGlhIHRpbWUgKi8gICAgICAgICAgICAgICAgICAgICAgICAKK30gT01YX1RJTUVfQ09ORklHX0FDVElWRVJFRkNMT0NLVFlQRTsKKworLyoqIERlc2NyaXB0b3IgZm9yIHNldHRpbmcgc3BlY2lmaWNzIG9mIHBvd2VyIHR5cGUuCisgKiAgTm90ZTogdGhpcyBzdHJ1Y3R1cmUgaXMgbGlzdGVkIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9DT05GSUdfUE9XRVJUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIC8qKjwgc2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzICovCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAvKio8IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gKi8KKyAgICBPTVhfQk9PTCBiRW5hYmxlUE07ICAgICAgIC8qKjwgRmxhZyB0byBlbmFibGUgUG93ZXIgTWFuYWdlbWVudCAqLworfSBPTVhfT1RIRVJfQ09ORklHX1BPV0VSVFlQRTsKKworCisvKiogRGVzY3JpcHRvciBmb3Igc2V0dGluZyBzcGVjaWZpY3Mgb2Ygc3RhdHMgdHlwZS4KKyAqICBOb3RlOiB0aGlzIHN0cnVjdHVyZSBpcyBsaXN0ZWQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX09USEVSX0NPTkZJR19TVEFUU1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIC8qIHdoYXQgZ29lcyBoZXJlICovCit9IE9NWF9PVEhFUl9DT05GSUdfU1RBVFNUWVBFOworCisKKy8qKgorICogVGhlIFBvcnREZWZpbml0aW9uIHN0cnVjdHVyZSBpcyB1c2VkIHRvIGRlZmluZSBhbGwgb2YgdGhlIHBhcmFtZXRlcnMgCisgKiBuZWNlc3NhcnkgZm9yIHRoZSBjb21wbGlhbnQgY29tcG9uZW50IHRvIHNldHVwIGFuIGlucHV0IG9yIGFuIG91dHB1dCBvdGhlciAKKyAqIHBhdGguCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7ICAvKio8IFR5cGUgb2YgZGF0YSBleHBlY3RlZCBmb3IgdGhpcyBjaGFubmVsICovCit9IE9NWF9PVEhFUl9QT1JUREVGSU5JVElPTlRZUEU7CisKKy8qKiAgUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUKKyAgKiAgdGhlIHZhcmlvdXMgZGF0YSBpbnB1dC9vdXRwdXQgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGUgcG9ydC4KKyAgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9PVEhFUl9QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgLyoqPCBzaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMgKi8KKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247IC8qKjwgT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAqLworICAgIE9NWF9VMzIgblBvcnRJbmRleDsgLyoqPCBJbmRpY2F0ZXMgd2hpY2ggcG9ydCB0byBzZXQgKi8KKyAgICBPTVhfVTMyIG5JbmRleDsgLyoqPCBJbmRpY2F0ZXMgdGhlIGVudW1lcmF0aW9uIGluZGV4IGZvciB0aGUgZm9ybWF0IGZyb20gMHgwIHRvIE4tMSAqLworICAgIE9NWF9PVEhFUl9GT1JNQVRUWVBFIGVGb3JtYXQ7IC8qKjwgVHlwZSBvZiBkYXRhIGV4cGVjdGVkIGZvciB0aGlzIGNoYW5uZWwgKi8KK30gT01YX09USEVSX1BBUkFNX1BPUlRGT1JNQVRUWVBFOyAKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmCisvKiBGaWxlIEVPRiAqLwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9UeXBlcy5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vbXhfaW5jbHVkZS9raHJvbm9zL09NWF9UeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxYmU5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX1R5cGVzLmgKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKKyAqIAorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCisgKiBhIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKKyAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKKyAqIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwKKyAqIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0bworICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0CisgKiB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKKyAqIAorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKKyAqCisgKi8KKworLyoqIE9NWF9UeXBlcy5oIC0gT3Blbk1heCBJTCB2ZXJzaW9uIDEuMS4yCisgKiAgVGhlIE9NWF9UeXBlcyBoZWFkZXIgZmlsZSBjb250YWlucyB0aGUgcHJpbWl0aXZlIHR5cGUgZGVmaW5pdGlvbnMgdXNlZCBieSAKKyAqICB0aGUgY29yZSwgdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50LiAgVGhpcyBmaWxlIG1heSBuZWVkIHRvIGJlCisgKiAgbW9kaWZpZWQgdG8gYmUgdXNlZCBvbiBzeXN0ZW1zIHRoYXQgZG8gbm90IGhhdmUgImNoYXIiIHNldCB0byA4IGJpdHMsIAorICogICJzaG9ydCIgc2V0IHRvIDE2IGJpdHMgYW5kICJsb25nIiBzZXQgdG8gMzIgYml0cy4KKyAqLworCisjaWZuZGVmIE9NWF9UeXBlc19oCisjZGVmaW5lIE9NWF9UeXBlc19oCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqIFRoZSBPTVhfQVBJIGFuZCBPTVhfQVBJRU5UUlkgYXJlIHBsYXRmb3JtIHNwZWNpZmljIGRlZmluaXRpb25zIHVzZWQKKyAqICB0byBkZWNsYXJlIE9NWCBmdW5jdGlvbiBwcm90b3R5cGVzLiAgVGhleSBhcmUgbW9kaWZpZWQgdG8gbWVldCB0aGUKKyAqICByZXF1aXJlbWVudHMgZm9yIGEgcGFydGljdWxhciBwbGF0Zm9ybSAqLworI2lmZGVmIF9fU1lNQklBTjMyX18gICAKKyMgICBpZmRlZiBfX09NWF9FWFBPUlRTCisjICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsZXhwb3J0KQorIyAgIGVsc2UKKyMgICAgICAgaWZkZWYgX1dJTjMyCisjICAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgCisjICAgICAgIGVsc2UKKyMgICAgICAgICAgIGRlZmluZSBPTVhfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorIyAgICAgICBlbmRpZgorIyAgIGVuZGlmCisjZWxzZQorIyAgIGlmZGVmIF9XSU4zMgorIyAgICAgIGlmZGVmIF9fT01YX0VYUE9SVFMKKyMgICAgICAgICAgZGVmaW5lIE9NWF9BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisjICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBfX2RlY2xzcGVjKGRsbGltcG9ydCkKKyMgICAgICBlbmRpZgorIyAgIGVsc2UKKyMgICAgICBpZmRlZiBfX09NWF9FWFBPUlRTCisjICAgICAgICAgIGRlZmluZSBPTVhfQVBJCisjICAgICAgZWxzZQorIyAgICAgICAgICBkZWZpbmUgT01YX0FQSSBleHRlcm4KKyMgICAgICBlbmRpZgorIyAgIGVuZGlmCisjZW5kaWYKKworI2lmbmRlZiBPTVhfQVBJRU5UUlkKKyNkZWZpbmUgT01YX0FQSUVOVFJZIAorI2VuZGlmIAorCisvKiogT01YX0lOIGlzIHVzZWQgdG8gaWRlbnRpZnkgaW5wdXRzIHRvIGFuIE9NWCBmdW5jdGlvbi4gIFRoaXMgZGVzaWduYXRpb24gCisgICAgd2lsbCBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgcG9pbnRzIHRvIGEgcGFyYW1ldGVyIAorICAgIHRoYXQgaXMgdXNlZCBhcyBhbiBvdXRwdXQuICovCisjaWZuZGVmIE9NWF9JTgorI2RlZmluZSBPTVhfSU4KKyNlbmRpZgorCisvKiogT01YX09VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IG91dHB1dHMgZnJvbSBhbiBPTVggZnVuY3Rpb24uICBUaGlzIAorICAgIGRlc2lnbmF0aW9uIHdpbGwgYWxzbyBiZSB1c2VkIGluIHRoZSBjYXNlIG9mIGEgcG9pbnRlciB0aGF0IHBvaW50cyAKKyAgICB0byBhIHBhcmFtZXRlciB0aGF0IGlzIHVzZWQgYXMgYW4gaW5wdXQuICovCisjaWZuZGVmIE9NWF9PVVQKKyNkZWZpbmUgT01YX09VVAorI2VuZGlmCisKKworLyoqIE9NWF9JTk9VVCBpcyB1c2VkIHRvIGlkZW50aWZ5IHBhcmFtZXRlcnMgdGhhdCBtYXkgYmUgZWl0aGVyIGlucHV0cyBvcgorICAgIG91dHB1dHMgZnJvbSBhbiBPTVggZnVuY3Rpb24gYXQgdGhlIHNhbWUgdGltZS4gIFRoaXMgZGVzaWduYXRpb24gd2lsbCAKKyAgICBhbHNvIGJlIHVzZWQgaW4gdGhlIGNhc2Ugb2YgYSBwb2ludGVyIHRoYXQgIHBvaW50cyB0byBhIHBhcmFtZXRlciB0aGF0IAorICAgIGlzIHVzZWQgYm90aCBhcyBhbiBpbnB1dCBhbmQgYW4gb3V0cHV0LiAqLworI2lmbmRlZiBPTVhfSU5PVVQKKyNkZWZpbmUgT01YX0lOT1VUCisjZW5kaWYKKworLyoqIE9NWF9BTEwgaXMgdXNlZCB0byBhcyBhIHdpbGRjYXJkIHRvIHNlbGVjdCBhbGwgZW50aXRpZXMgb2YgdGhlIHNhbWUgdHlwZQorICogIHdoZW4gc3BlY2lmeWluZyB0aGUgaW5kZXgsIG9yIHJlZmVycmluZyB0byBhIG9iamVjdCBieSBhbiBpbmRleC4gIChpLmUuCisgKiAgdXNlIE9NWF9BTEwgdG8gaW5kaWNhdGUgYWxsIE4gY2hhbm5lbHMpLiBXaGVuIHVzZWQgYXMgYSBwb3J0IGluZGV4CisgKiAgZm9yIGEgY29uZmlnIG9yIHBhcmFtZXRlciB0aGlzIE9NWF9BTEwgZGVub3RlcyB0aGF0IHRoZSBjb25maWcgb3IKKyAqICBwYXJhbWV0ZXIgYXBwbGllcyB0byB0aGUgZW50aXJlIGNvbXBvbmVudCBub3QganVzdCBvbmUgcG9ydC4gKi8KKyNkZWZpbmUgT01YX0FMTCAweEZGRkZGRkZGCisKKy8qKiBJbiB0aGUgZm9sbG93aW5nIHdlIGRlZmluZSBncm91cHMgdGhhdCBoZWxwIGJ1aWxkaW5nIGRveHlnZW4gZG9jdW1lbnRhdGlvbiAqLworCisvKiogQGRlZmdyb3VwIGNvcmUgT3Blbk1BWCBJTCBjb3JlCisgKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29yZQorICovCisgCisgLyoqIEBkZWZncm91cCBjb21wIE9wZW5NQVggSUwgY29tcG9uZW50CisgKiBGdW5jdGlvbnMgYW5kIHN0cnVjdHVyZSByZWxhdGVkIHRvIHRoZSBPTVggSUwgY29tcG9uZW50CisgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgcnBtIFJlc291cmNlIGFuZCBQb2xpY3kgTWFuYWdlbWVudCAKKyAqIFN0cnVjdHVyZXMgZm9yIHJlc291cmNlIGFuZCBwb2xpY3kgbWFuYWdlbWVudCBvZiBjb21wb25lbnRzCisgKi8KKworLyoqIEBkZWZncm91cCBidWYgQnVmZmVyIE1hbmFnZW1lbnQKKyAqIEJ1ZmZlciBoYW5kbGluZyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKKyAqLworICAKKy8qKiBAZGVmZ3JvdXAgdHVuIFR1bm5lbGluZworICogQGluZ3JvdXAgY29yZSBjb21wCisgKiBTdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgdG8gbWFuYWdlIHR1bm5lbHMgYW1vbmcgY29tcG9uZW50IHBvcnRzCisgKi8KKyAKKy8qKiBAZGVmZ3JvdXAgY3AgQ29udGVudCBQaXBlcworICogIEBpbmdyb3VwIGNvcmUKKyAqLworIAorIC8qKiBAZGVmZ3JvdXAgbWV0YWRhdGEgTWV0YWRhdGEgaGFuZGxpbmcKKyAgKiAKKyAgKi8gCisKKy8qKiBPTVhfVTggaXMgYW4gOCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciBPTVhfVTg7CisKKy8qKiBPTVhfUzggaXMgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCit0eXBlZGVmIHNpZ25lZCBjaGFyIE9NWF9TODsKKworLyoqIE9NWF9VMTYgaXMgYSAxNiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IE9NWF9VMTY7CisKKy8qKiBPTVhfUzE2IGlzIGEgMTYgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIHNob3J0IE9NWF9TMTY7CisKKy8qKiBPTVhfVTMyIGlzIGEgMzIgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIE9NWF9VMzI7CisKKy8qKiBPTVhfUzMyIGlzIGEgMzIgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDMyIGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIGxvbmcgT01YX1MzMjsKKworCisvKiBVc2VycyB3aXRoIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBhY2NlcHQgdGhlICJsb25nIGxvbmciIGRlc2lnbmF0aW9uIHNob3VsZAorICAgZGVmaW5lIHRoZSBPTVhfU0tJUDY0QklUIG1hY3JvLiAgSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhpcyBtYXkgY2F1c2UgCisgICBzb21lIGNvbXBvbmVudHMgdG8gZmFpbCB0byBjb21waWxlIGlmIHRoZSBjb21wb25lbnQgd2FzIHdyaXR0ZW4gdG8gcmVxdWlyZQorICAgNjQgYml0IGludGVncmFsIHR5cGVzLiAgSG93ZXZlciwgdGhlc2UgY29tcG9uZW50cyB3b3VsZCBOT1QgY29tcGlsZSBhbnl3YXkKKyAgIHNpbmNlIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB3YXkgdGhlIGNvbXBvbmVudCB3YXMgd3JpdHRlbi4KKyovCisjaWZuZGVmIE9NWF9TS0lQNjRCSVQKKyNpZmRlZiBfX1NZTUJJQU4zMl9fCisvKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7CisKKy8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBPTVhfUzY0OworCisjZWxpZiBkZWZpbmVkKFdJTjMyKQorCisvKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8gICAKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCAgT01YX1U2NDsKKworLyoqIE9NWF9TNjQgaXMgYSA2NCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwordHlwZWRlZiBzaWduZWQgICBfX2ludDY0ICBPTVhfUzY0OworCisjZWxzZSAvKiBXSU4zMiAqLworCisvKiogT01YX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIE9NWF9VNjQ7CisKKy8qKiBPTVhfUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KK3R5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyBPTVhfUzY0OworCisjZW5kaWYgLyogV0lOMzIgKi8KKyNlbmRpZgorCisKKy8qKiBUaGUgT01YX0JPT0wgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHRydWUgb3IgYSBmYWxzZSAKKyAgICB2YWx1ZSB3aGVuIHBhc3NpbmcgcGFyYW1ldGVycyB0byBhbmQgZnJvbSB0aGUgT01YIGNvcmUgYW5kIGNvbXBvbmVudHMuICBUaGUKKyAgICBPTVhfQk9PTCBpcyBhIDMyIGJpdCBxdWFudGl0eSBhbmQgaXMgYWxpZ25lZCBvbiBhIDMyIGJpdCB3b3JkIGJvdW5kYXJ5LgorICovCit0eXBlZGVmIGVudW0gT01YX0JPT0wgeworICAgIE9NWF9GQUxTRSA9IDAsCisgICAgT01YX1RSVUUgPSAhT01YX0ZBTFNFLAorICAgIE9NWF9CT09MX01BWCA9IDB4N0ZGRkZGRkYKK30gT01YX0JPT0w7IAorIAorLyoqIFRoZSBPTVhfUFRSIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzIHBvaW50ZXJzIGJldHdlZW4gdGhlIE9NWAorICAgIGFwcGxpY2F0aW9ucyBhbmQgdGhlIE9NWCBDb3JlIGFuZCBjb21wb25lbnRzLiAgVGhpcyBpcyBhIDMyIGJpdCBwb2ludGVyIGFuZAorICAgIGlzIGFsaWduZWQgb24gYSAzMiBiaXQgYm91bmRhcnkuCisgKi8KK3R5cGVkZWYgdm9pZCogT01YX1BUUjsKKworLyoqIFRoZSBPTVhfU1RSSU5HIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCB0byBwYXNzICJDIiB0eXBlIHN0cmluZ3MgYmV0d2VlbgorICAgIHRoZSBhcHBsaWNhdGlvbiBhbmQgdGhlIGNvcmUgYW5kIGNvbXBvbmVudC4gIFRoZSBPTVhfU1RSSU5HIHR5cGUgaXMgYSAzMiAKKyAgICBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZCBhbGlnbmVkIGFuZCAKKyAgICB0aGUgc3RyaW5nIGlzIGJ5dGUgYWxpZ25lZC4gIAorICovCit0eXBlZGVmIGNoYXIqIE9NWF9TVFJJTkc7CisKKy8qKiBUaGUgT01YX0JZVEUgdHlwZSBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIHBhc3MgYXJyYXlzIG9mIGJ5dGVzIHN1Y2ggYXMKKyAgICBidWZmZXJzIGJldHdlZW4gdGhlIGFwcGxpY2F0aW9uIGFuZCB0aGUgY29tcG9uZW50IGFuZCBjb3JlLiAgVGhlIE9NWF9CWVRFIAorICAgIHR5cGUgaXMgYSAzMiBiaXQgcG9pbnRlciB0byBhIHplcm8gdGVybWluYXRlZCBzdHJpbmcuICBUaGUgIHBvaW50ZXIgaXMgd29yZAorICAgIGFsaWduZWQgYW5kIHRoZSBzdHJpbmcgaXMgYnl0ZSBhbGlnbmVkLgorICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIqIE9NWF9CWVRFOworCisvKiogT01YX1VVSURUWVBFIGlzIGEgdmVyeSBsb25nIHVuaXF1ZSBpZGVudGlmaWVyIHRvIHVuaXF1ZWx5IGlkZW50aWZ5CisgICAgYXQgcnVudGltZS4gIFRoaXMgaWRlbnRpZmllciBzaG91bGQgYmUgZ2VuZXJhdGVkIGJ5IGEgY29tcG9uZW50IGluIGEgd2F5CisgICAgdGhhdCBndWFyYW50ZWVzIHRoYXQgZXZlcnkgaW5zdGFuY2Ugb2YgdGhlIGlkZW50aWZpZXIgcnVubmluZyBvbiB0aGUgc3lzdGVtCisgICAgaXMgdW5pcXVlLiAqLwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIE9NWF9VVUlEVFlQRVsxMjhdOworCisvKiogVGhlIE9NWF9ESVJUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgYSBwb3J0IGlzIGFuIGlucHV0IG9yCisgICAgYW4gb3V0cHV0IHBvcnQuICBUaGlzIGVudW1lcmF0aW9uIGlzIGNvbW1vbiBhY3Jvc3MgYWxsIGNvbXBvbmVudCB0eXBlcy4gICAgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRElSVFlQRQoreworICAgIE9NWF9EaXJJbnB1dCwgICAgICAgICAgICAgIC8qKjwgUG9ydCBpcyBhbiBpbnB1dCBwb3J0ICovCisgICAgT01YX0Rpck91dHB1dCwgICAgICAgICAgICAgLyoqPCBQb3J0IGlzIGFuIG91dHB1dCBwb3J0ICovCisgICAgT01YX0Rpck1heCA9IDB4N0ZGRkZGRkYKK30gT01YX0RJUlRZUEU7CisKKy8qKiBUaGUgT01YX0VORElBTlRZUEUgZW51bWVyYXRpb24gaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgYml0IG9yZGVyaW5nIAorICAgIGZvciBudW1lcmljYWwgZGF0YSAoaS5lLiBiaWcgZW5kaWFuLCBvciBsaXR0bGUgZW5kaWFuKS4gICAgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfRU5ESUFOVFlQRQoreworICAgIE9NWF9FbmRpYW5CaWcsIC8qKjwgYmlnIGVuZGlhbiAqLworICAgIE9NWF9FbmRpYW5MaXR0bGUsIC8qKjwgbGl0dGxlIGVuZGlhbiAqLworICAgIE9NWF9FbmRpYW5NYXggPSAweDdGRkZGRkZGCit9IE9NWF9FTkRJQU5UWVBFOworCisKKy8qKiBUaGUgT01YX05VTUVSSUNBTERBVEFUWVBFIGVudW1lcmF0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgaWYgZGF0YSAKKyAgICBpcyBzaWduZWQgb3IgdW5zaWduZWQKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9OVU1FUklDQUxEQVRBVFlQRQoreworICAgIE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkLCAvKio8IHNpZ25lZCBkYXRhICovCisgICAgT01YX051bWVyaWNhbERhdGFVbnNpZ25lZCwgLyoqPCB1bnNpZ25lZCBkYXRhICovCisgICAgT01YX051bWVyY2lhbERhdGFNYXggPSAweDdGRkZGRkZGCit9IE9NWF9OVU1FUklDQUxEQVRBVFlQRTsKKworCisvKiogVW5zaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQlUzMiB7CisgICAgT01YX1UzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCisgICAgT01YX1UzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCisgICAgT01YX1UzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCit9IE9NWF9CVTMyOworCisKKy8qKiBTaWduZWQgYm91bmRlZCB2YWx1ZSB0eXBlICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQlMzMiB7CisgICAgT01YX1MzMiBuVmFsdWU7IC8qKjwgYWN0dWFsIHZhbHVlICovCisgICAgT01YX1MzMiBuTWluOyAgIC8qKjwgbWluaW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlID49IG5NaW4pICovCisgICAgT01YX1MzMiBuTWF4OyAgIC8qKjwgbWF4aW11bSBmb3IgdmFsdWUgKGkuZS4gblZhbHVlIDw9IG5NYXgpICovCit9IE9NWF9CUzMyOworCisKKy8qKiBTdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHNvbWUgdGltZSBvciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMuIFRoaXMgc3RydWN0dXJlCisgICogIG11c3QgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQgNjQgYml0IHZhbHVlLiBUaGUgcXVhbnRpdHkgaXMgc2lnbmVkIHRvIGFjY29tbW9kYXRlIAorICAqICBuZWdhdGl2ZSBkZWx0YXMgYW5kIHByZXJvbGwgc2NlbmFyaW9zLiBUaGUgcXVhbnRpdHkgaXMgcmVwcmVzZW50ZWQgaW4gbWljcm9zZWNvbmRzIAorICAqICB0byBhY2NvbW9kYXRlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lc3RhbXBzIChlLmcuIERWRCBwcmVzZW50YXRpb24gdGltZXN0YW1wcyBiYXNlZAorICAqICBvbiBhIDkwa0h6IGNsb2NrKSBhbmQgdG8gYWxsb3cgbW9yZSBhY2N1cmF0ZSBhbmQgc3luY2hyb25pemVkIGRlbGl2ZXJ5IChlLmcuIAorICAqICBpbmRpdmlkdWFsIGF1ZGlvIHNhbXBsZXMgZGVsaXZlcmVkIGF0IDE5MiBrSHopLiBUaGUgcXVhbnRpdHkgaXMgNjQgYml0IHRvIAorICAqICBhY2NvbW1vZGF0ZSBhIGxhcmdlIGR5bmFtaWMgcmFuZ2UgKHNpZ25lZCAzMiBiaXQgdmFsdWVzIHdvdWxkIGFsbG93IG9ubHkgZm9yIHBsdXMKKyAgKiAgb3IgbWludXMgMzUgbWludXRlcykuCisgICoKKyAgKiAgSW1wbGVtZW50YXRpb25zIHdpdGggbGltaXRlZCBwcmVjaXNpb24gbWF5IGNvbnZlcnQgdGhlIHNpZ25lZCA2NCBiaXQgdmFsdWUgdG8gCisgICogIGEgc2lnbmVkIDMyIGJpdCB2YWx1ZSBpbnRlcm5hbGx5IGJ1dCByaXNrIGxvc3Mgb2YgcHJlY2lzaW9uLiAgCisgICovCisjaWZuZGVmIE9NWF9TS0lQNjRCSVQKK3R5cGVkZWYgT01YX1M2NCBPTVhfVElDS1M7CisjZWxzZQordHlwZWRlZiBzdHJ1Y3QgT01YX1RJQ0tTCit7CisgICAgT01YX1UzMiBuTG93UGFydDsgICAgLyoqIGxvdyBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KKyAgICBPTVhfVTMyIG5IaWdoUGFydDsgICAvKiogaGlnaCBiaXRzIG9mIHRoZSBzaWduZWQgNjQgYml0IHRpY2sgdmFsdWUgKi8KK30gT01YX1RJQ0tTOworI2VuZGlmCisjZGVmaW5lIE9NWF9USUNLU19QRVJfU0VDT05EIDEwMDAwMDAKKworLyoqIERlZmluZSB0aGUgcHVibGljIGludGVyZmFjZSBmb3IgdGhlIE9NWCBIYW5kbGUuICBUaGUgY29yZSB3aWxsIG5vdCB1c2UKKyAgICB0aGlzIHZhbHVlIGludGVybmFsbHksIGJ1dCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgdXNlIHRoaXMgdmFsdWUuCisgKi8KK3R5cGVkZWYgdm9pZCogT01YX0hBTkRMRVRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9NQVJLVFlQRQoreworICAgIE9NWF9IQU5ETEVUWVBFIGhNYXJrVGFyZ2V0Q29tcG9uZW50OyAgIC8qKjwgVGhlIGNvbXBvbmVudCB0aGF0IHdpbGwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBhIG1hcmsgZXZlbnQgdXBvbiAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmcgdGhlIG1hcmsuICovCisgICAgT01YX1BUUiBwTWFya0RhdGE7ICAgLyoqPCBBcHBsaWNhdGlvbiBzcGVjaWZpYyBkYXRhIGFzc29jaWF0ZWQgd2l0aCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBtYXJrIHNlbnQgb24gYSBtYXJrIGV2ZW50IHRvIGRpc2FtYmlndWF0ZSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgbWFyayBmcm9tIG90aGVycy4gKi8KK30gT01YX01BUktUWVBFOworCisKKy8qKiBPTVhfTkFUSVZFX0RFVklDRVRZUEUgaXMgdXNlZCB0byBtYXAgYSBPTVggdmlkZW8gcG9ydCB0byB0aGUKKyAqICBwbGF0Zm9ybSAmIG9wZXJhdGluZyBzcGVjaWZpYyBvYmplY3QgdXNlZCB0byByZWZlcmVuY2UgdGhlIGRpc3BsYXkgCisgKiAgb3IgY2FuIGJlIHVzZWQgYnkgYSBhdWRpbyBwb3J0IGZvciBuYXRpdmUgYXVkaW8gcmVuZGVyaW5nICovCit0eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfREVWSUNFVFlQRTsKKworLyoqIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBpcyB1c2VkIHRvIG1hcCBhIE9NWCB2aWRlbyBwb3J0IHRvIHRoZQorICogIHBsYXRmb3JtICYgb3BlcmF0aW5nIHNwZWNpZmljIG9iamVjdCB1c2VkIHRvIHJlZmVyZW5jZSB0aGUgd2luZG93ICovCit0eXBlZGVmIHZvaWQqIE9NWF9OQVRJVkVfV0lORE9XVFlQRTsKKworLyoqIFRoZSBPTVhfVkVSU0lPTlRZUEUgdW5pb24gaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSB2ZXJzaW9uIGZvcgorICAgIGEgc3RydWN0dXJlIG9yIGNvbXBvbmVudC4gIEZvciBhIGNvbXBvbmVudCwgdGhlIHZlcnNpb24gaXMgZW50aXJlbHkKKyAgICBzcGVjaWZpZWQgYnkgdGhlIGNvbXBvbmVudCB2ZW5kb3IuICBDb21wb25lbnRzIGRvaW5nIHRoZSBzYW1lIGZ1bmN0aW9uCisgICAgZnJvbSBkaWZmZXJlbnQgdmVuZG9ycyBtYXkgb3IgbWF5IG5vdCBoYXZlIHRoZSBzYW1lIHZlcnNpb24uICBGb3IgCisgICAgc3RydWN0dXJlcywgdGhlIHZlcnNpb24gc2hhbGwgYmUgc2V0IGJ5IHRoZSBlbnRpdHkgdGhhdCBhbGxvY2F0ZXMgdGhlCisgICAgc3RydWN0dXJlLiAgRm9yIHN0cnVjdHVyZXMgc3BlY2lmaWVkIGluIHRoZSBPTVggMS4xIHNwZWNpZmljYXRpb24sIHRoZQorICAgIHZhbHVlIG9mIHRoZSB2ZXJzaW9uIHNoYWxsIGJlIHNldCB0byAxLjEuMC4wIGluIGFsbCBjYXNlcy4gIEFjY2VzcyB0byB0aGUKKyAgICBPTVhfVkVSU0lPTlRZUEUgY2FuIGJlIGJ5IGEgc2luZ2xlIDMyIGJpdCBhY2Nlc3MgKGUuZy4gYnkgblZlcnNpb24pIG9yCisgICAgYnkgYWNjZXNzaW5nIG9uZSBvZiB0aGUgc3RydWN0dXJlIGVsZW1lbnRzIHRvLCBmb3IgZXhhbXBsZSwgY2hlY2sgb25seQorICAgIHRoZSBNYWpvciByZXZpc2lvbi4KKyAqLwordHlwZWRlZiB1bmlvbiBPTVhfVkVSU0lPTlRZUEUKK3sKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICAgIE9NWF9VOCBuVmVyc2lvbk1ham9yOyAgIC8qKjwgTWFqb3IgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCisgICAgICAgIE9NWF9VOCBuVmVyc2lvbk1pbm9yOyAgIC8qKjwgTWlub3IgdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCisgICAgICAgIE9NWF9VOCBuUmV2aXNpb247ICAgICAgIC8qKjwgUmV2aXNpb24gdmVyc2lvbiBhY2Nlc3NvciBlbGVtZW50ICovCisgICAgICAgIE9NWF9VOCBuU3RlcDsgICAgICAgICAgIC8qKjwgU3RlcCB2ZXJzaW9uIGFjY2Vzc29yIGVsZW1lbnQgKi8KKyAgICB9IHM7CisgICAgT01YX1UzMiBuVmVyc2lvbjsgICAgICAgICAgIC8qKjwgMzIgYml0IHZhbHVlIHRvIG1ha2UgYWNjZXNzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBlYXNpbHkgZG9uZSBpbiBhIHNpbmdsZSB3b3JkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIGNvcHkvY29tcGFyZSBvcGVyYXRpb24gKi8KK30gT01YX1ZFUlNJT05UWVBFOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX1ZpZGVvLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL2tocm9ub3MvT01YX1ZpZGVvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ViMjczYwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUva2hyb25vcy9PTVhfVmlkZW8uaApAQCAtMCwwICsxLDEwNjAgQEAKKy8qKgorICogQ29weXJpZ2h0IChjKSAyMDA4IFRoZSBLaHJvbm9zIEdyb3VwIEluYy4gCisgKiAKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZworICogYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCisgKiAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nCisgKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCisgKiBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KKyAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdAorICogdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOiAKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkCisgKiBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4gCisgKiAKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuCisgKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWQorICogQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwKKyAqIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFCisgKiBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCisgKgorICovCisKKy8qKiAKKyAqICBAZmlsZSBPTVhfVmlkZW8uaCAtIE9wZW5NYXggSUwgdmVyc2lvbiAxLjEuMgorICogIFRoZSBzdHJ1Y3R1cmVzIGlzIG5lZWRlZCBieSBWaWRlbyBjb21wb25lbnRzIHRvIGV4Y2hhbmdlIHBhcmFtZXRlcnMgCisgKiAgYW5kIGNvbmZpZ3VyYXRpb24gZGF0YSB3aXRoIE9NWCBjb21wb25lbnRzLgorICovCisjaWZuZGVmIE9NWF9WaWRlb19oCisjZGVmaW5lIE9NWF9WaWRlb19oCisKKy8qKiBAZGVmZ3JvdXAgdmlkZW8gT3Blbk1BWCBJTCBWaWRlbyBEb21haW4KKyAqIEBpbmdyb3VwIGl2CisgKiBTdHJ1Y3R1cmVzIGZvciBPcGVuTUFYIElMIFZpZGVvIGRvbWFpbgorICogQHsKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKworLyoqCisgKiBFYWNoIE9NWCBoZWFkZXIgbXVzdCBpbmNsdWRlIGFsbCByZXF1aXJlZCBoZWFkZXIgZmlsZXMgdG8gYWxsb3cgdGhlCisgKiBoZWFkZXIgdG8gY29tcGlsZSB3aXRob3V0IGVycm9ycy4gIFRoZSBpbmNsdWRlcyBiZWxvdyBhcmUgcmVxdWlyZWQKKyAqIGZvciB0aGlzIGhlYWRlciBmaWxlIHRvIGNvbXBpbGUgc3VjY2Vzc2Z1bGx5IAorICovCisKKyNpbmNsdWRlIDxPTVhfSVZDb21tb24uaD4KKworCisvKioKKyAqIEVudW1lcmF0aW9uIHVzZWQgdG8gZGVmaW5lIHRoZSBwb3NzaWJsZSB2aWRlbyBjb21wcmVzc2lvbiBjb2RpbmdzLiAgCisgKiBOT1RFOiAgVGhpcyBlc3NlbnRpYWxseSByZWZlcnMgdG8gZmlsZSBleHRlbnNpb25zLiBJZiB0aGUgY29kaW5nIGlzIAorICogICAgICAgIGJlaW5nIHVzZWQgdG8gc3BlY2lmeSB0aGUgRU5DT0RFIHR5cGUsIHRoZW4gYWRkaXRpb25hbCB3b3JrIAorICogICAgICAgIG11c3QgYmUgZG9uZSB0byBjb25maWd1cmUgdGhlIGV4YWN0IGZsYXZvciBvZiB0aGUgY29tcHJlc3Npb24gCisgKiAgICAgICAgdG8gYmUgdXNlZC4gIEZvciBkZWNvZGUgY2FzZXMgd2hlcmUgdGhlIHVzZXIgYXBwbGljYXRpb24gY2FuIAorICogICAgICAgIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gTVBFRy00IGFuZCBILjI2NCBiaXQgc3RyZWFtcywgaXQgaXMgCisgKiAgICAgICAgdXAgdG8gdGhlIGNvZGVjIHRvIGhhbmRsZSB0aGlzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0NPRElOR1RZUEUgeworICAgIE9NWF9WSURFT19Db2RpbmdVbnVzZWQsICAgICAvKio8IFZhbHVlIHdoZW4gY29kaW5nIGlzIE4vQSAqLworICAgIE9NWF9WSURFT19Db2RpbmdBdXRvRGV0ZWN0LCAvKio8IEF1dG9kZXRlY3Rpb24gb2YgY29kaW5nIHR5cGUgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzIsICAgICAgLyoqPCBBS0E6IEguMjYyICovCisgICAgT01YX1ZJREVPX0NvZGluZ0gyNjMsICAgICAgIC8qKjwgSC4yNjMgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nTVBFRzQsICAgICAgLyoqPCBNUEVHLTQgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nV01WLCAgICAgICAgLyoqPCBhbGwgdmVyc2lvbnMgb2YgV2luZG93cyBNZWRpYSBWaWRlbyAqLworICAgIE9NWF9WSURFT19Db2RpbmdSViwgICAgICAgICAvKio8IGFsbCB2ZXJzaW9ucyBvZiBSZWFsIFZpZGVvICovCisgICAgT01YX1ZJREVPX0NvZGluZ0FWQywgICAgICAgIC8qKjwgSC4yNjQvQVZDICovCisgICAgT01YX1ZJREVPX0NvZGluZ01KUEVHLCAgICAgIC8qKjwgTW90aW9uIEpQRUcgKi8KKyAgICBPTVhfVklERU9fQ29kaW5nS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19Db2RpbmdWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19Db2RpbmdNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19DT0RJTkdUWVBFOworCisKKy8qKgorICogRGF0YSBzdHJ1Y3R1cmUgdXNlZCB0byBkZWZpbmUgYSB2aWRlbyBwYXRoLiAgVGhlIG51bWJlciBvZiBWaWRlbyBwYXRocyBmb3IgCisgKiBpbnB1dCBhbmQgb3V0cHV0IHdpbGwgdmFyeSBieSB0eXBlIG9mIHRoZSBWaWRlbyBjb21wb25lbnQuICAKKyAqIAorICogICAgSW5wdXQgKGFrYSBTb3VyY2UpIDogemVybyBJbnB1dHMsIG9uZSBPdXRwdXQsCisgKiAgICBTcGxpdHRlciAgICAgICAgICAgOiBvbmUgSW5wdXQsIDIgb3IgbW9yZSBPdXRwdXRzLAorICogICAgUHJvY2Vzc2luZyBFbGVtZW50IDogb25lIElucHV0LCBvbmUgb3V0cHV0LAorICogICAgTWl4ZXIgICAgICAgICAgICAgIDogMiBvciBtb3JlIGlucHV0cywgb25lIG91dHB1dCwKKyAqICAgIE91dHB1dCAoYWthIFNpbmspICA6IG9uZSBJbnB1dCwgemVybyBvdXRwdXRzLgorICogCisgKiBUaGUgUG9ydERlZmluaXRpb24gc3RydWN0dXJlIGlzIHVzZWQgdG8gZGVmaW5lIGFsbCBvZiB0aGUgcGFyYW1ldGVycyAKKyAqIG5lY2Vzc2FyeSBmb3IgdGhlIGNvbXBsaWFudCBjb21wb25lbnQgdG8gc2V0dXAgYW4gaW5wdXQgb3IgYW4gb3V0cHV0IHZpZGVvIAorICogcGF0aC4gIElmIGFkZGl0aW9uYWwgdmVuZG9yIHNwZWNpZmljIGRhdGEgaXMgcmVxdWlyZWQsIGl0IHNob3VsZCBiZSAKKyAqIHRyYW5zbWl0dGVkIHRvIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIEN1c3RvbUNvbW1hbmQgZnVuY3Rpb24uICBDb21wbGlhbnQgCisgKiBjb21wb25lbnRzIHdpbGwgcHJlcG9wdWxhdGUgdGhpcyBzdHJ1Y3R1cmUgd2l0aCBvcHRpbWFsIHZhbHVlcyBkdXJpbmcgdGhlIAorICogR2V0RGVmYXVsdEluaXRQYXJhbXMgY29tbWFuZC4KKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBjTUlNRVR5cGUgICAgICAgICAgICAgOiBNSU1FIHR5cGUgb2YgZGF0YSBmb3IgdGhlIHBvcnQKKyAqICBwTmF0aXZlUmVuZGVyICAgICAgICAgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgZGlzcGxheSBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmMsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDAKKyAqICBuRnJhbWVXaWR0aCAgICAgICAgICAgOiBXaWR0aCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiAgVXNlIDAgZm9yIHVua25vd24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uJ3QgY2FyZSBvciB2YXJpYWJsZQorICogIG5GcmFtZUhlaWdodCAgICAgICAgICA6IEhlaWdodCBvZiBmcmFtZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jb21wcmVzc2VkIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgblN0cmlkZSAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIGJ5dGVzIHBlciBzcGFuIG9mIGFuIGltYWdlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGdldAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gc3BhbiBOIHRvIHNwYW4gTisxLCB3aGVyZSBuZWdhdGl2ZSBzdHJpZGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgdGhlIGltYWdlIGlzIGJvdHRvbSB1cAorICogIG5TbGljZUhlaWdodCAgICAgICAgICA6IEhlaWdodCB1c2VkIHdoZW4gZW5jb2RpbmcgaW4gc2xpY2VzCisgKiAgbkJpdHJhdGUgICAgICAgICAgICAgIDogQml0IHJhdGUgb2YgZnJhbWUgdG8gYmUgdXNlZCBvbiBjaGFubmVsIGlmIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWQgZm9ybWF0IGlzIHVzZWQuIFVzZSAwIGZvciB1bmtub3duLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkb24ndCBjYXJlIG9yIHZhcmlhYmxlCisgKiAgeEZyYW1lcmF0ZSAgICAgICAgICAgIDogRnJhbWUgcmF0ZSB0byBiZSB1c2VkIG9uIGNoYW5uZWwgaWYgdW5jb21wcmVzc2VkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCBpcyB1c2VkLiBVc2UgMCBmb3IgdW5rbm93biwgZG9uJ3QgY2FyZSBvciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZS4gIFVuaXRzIGFyZSBRMTYgZnJhbWVzIHBlciBzZWNvbmQuCisgKiAgYkZsYWdFcnJvckNvbmNlYWxtZW50IDogVHVybnMgb24gZXJyb3IgY29uY2VhbG1lbnQgaWYgaXQgaXMgc3VwcG9ydGVkIGJ5IAorICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBPTVggY29tcG9uZW50CisgKiAgZUNvbXByZXNzaW9uRm9ybWF0ICAgIDogQ29tcHJlc3Npb24gZm9ybWF0IHVzZWQgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LiBXaGVuIE9NWF9WSURFT19Db2RpbmdVbnVzZWQgaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkLCBlQ29sb3JGb3JtYXQgaXMgdXNlZAorICogIGVDb2xvckZvcm1hdCA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAorICogIHBOYXRpdmVXaW5kb3cgOiBQbGF0Zm9ybSBzcGVjaWZpYyByZWZlcmVuY2UgZm9yIGEgd2luZG93IG9iamVjdCBpZiBhIAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgc2luayAsIG90aGVyd2lzZSB0aGlzIGZpZWxkIGlzIDB4MC4gCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QT1JUREVGSU5JVElPTlRZUEUgeworICAgIE9NWF9TVFJJTkcgY01JTUVUeXBlOworICAgIE9NWF9OQVRJVkVfREVWSUNFVFlQRSBwTmF0aXZlUmVuZGVyOworICAgIE9NWF9VMzIgbkZyYW1lV2lkdGg7CisgICAgT01YX1UzMiBuRnJhbWVIZWlnaHQ7CisgICAgT01YX1MzMiBuU3RyaWRlOworICAgIE9NWF9VMzIgblNsaWNlSGVpZ2h0OworICAgIE9NWF9VMzIgbkJpdHJhdGU7CisgICAgT01YX1UzMiB4RnJhbWVyYXRlOworICAgIE9NWF9CT09MIGJGbGFnRXJyb3JDb25jZWFsbWVudDsKKyAgICBPTVhfVklERU9fQ09ESU5HVFlQRSBlQ29tcHJlc3Npb25Gb3JtYXQ7CisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9OQVRJVkVfV0lORE9XVFlQRSBwTmF0aXZlV2luZG93OworfSBPTVhfVklERU9fUE9SVERFRklOSVRJT05UWVBFOworCisvKiogIAorICogUG9ydCBmb3JtYXQgcGFyYW1ldGVyLiAgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBlbnVtZXJhdGUgdGhlIHZhcmlvdXMgCisgKiBkYXRhIGlucHV0L291dHB1dCBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoZSBwb3J0LgorICogCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICAgIDogSW5kaWNhdGVzIHdoaWNoIHBvcnQgdG8gc2V0CisgKiAgbkluZGV4ICAgICAgICAgICAgIDogSW5kaWNhdGVzIHRoZSBlbnVtZXJhdGlvbiBpbmRleCBmb3IgdGhlIGZvcm1hdCBmcm9tIAorICogICAgICAgICAgICAgICAgICAgICAgIDB4MCB0byBOLTEKKyAqICBlQ29tcHJlc3Npb25Gb3JtYXQgOiBDb21wcmVzc2lvbiBmb3JtYXQgdXNlZCBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuIFdoZW4gT01YX1ZJREVPX0NvZGluZ1VudXNlZCBpcyBzcGVjaWZpZWQsIAorICogICAgICAgICAgICAgICAgICAgICAgIGVDb2xvckZvcm1hdCBpcyB1c2VkIAorICogIGVDb2xvckZvcm1hdCAgICAgICA6IERlY29tcHJlc3NlZCBmb3JtYXQgdXNlZCBieSB0aGlzIGNvbXBvbmVudAorICogIHhGcmFtZVJhdGUgICAgICAgICA6IEluZGljYXRlcyB0aGUgdmlkZW8gZnJhbWUgcmF0ZSBpbiBRMTYgZm9ybWF0CisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9QT1JURk9STUFUVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbkluZGV4OworICAgIE9NWF9WSURFT19DT0RJTkdUWVBFIGVDb21wcmVzc2lvbkZvcm1hdDsgCisgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZUNvbG9yRm9ybWF0OworICAgIE9NWF9VMzIgeEZyYW1lcmF0ZTsKK30gT01YX1ZJREVPX1BBUkFNX1BPUlRGT1JNQVRUWVBFOworCisKKy8qKgorICogVGhpcyBpcyBhIHN0cnVjdHVyZSBmb3IgY29uZmlndXJpbmcgdmlkZW8gY29tcHJlc3Npb24gcXVhbnRpemF0aW9uIAorICogcGFyYW1ldGVyIHZhbHVlcy4gIENvZGVjcyBtYXkgc3VwcG9ydCBkaWZmZXJlbnQgUVAgdmFsdWVzIGZvciBkaWZmZXJlbnQKKyAqIGZyYW1lIHR5cGVzLgorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblFwSSAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgaW5kZXggZnJhbWVzCisgKiAgblFwUCAgICAgICA6IFFQIHZhbHVlIHRvIHVzZSBmb3IgUCBmcmFtZXMKKyAqICBuUXBCICAgICAgIDogUVAgdmFsdWVzIHRvIHVzZSBmb3IgYmlkaXJlY3Rpb25hbCBmcmFtZXMgCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUXBJOworICAgIE9NWF9VMzIgblFwUDsKKyAgICBPTVhfVTMyIG5RcEI7Cit9IE9NWF9WSURFT19QQVJBTV9RVUFOVElaQVRJT05UWVBFOworCisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgY29uZmlndXJhdGlvbiBvZiB2aWRlbyBmYXN0IHVwZGF0ZSBwYXJhbWV0ZXJzLiAKKyAqICAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGJFbmFibGVWRlUgOiBFbmFibGUvRGlzYWJsZSB2aWRlbyBmYXN0IHVwZGF0ZQorICogIG5GaXJzdEdPQiAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiB0aGUgZmlyc3QgbWFjcm9ibG9jayByb3cKKyAqICBuRmlyc3RNQiAgIDogc3BlY2lmaWVzIHRoZSBmaXJzdCBNQiByZWxhdGl2ZSB0byB0aGUgc3BlY2lmaWVkIGZpcnN0IEdPQgorICogIG5OdW1NQnMgICAgOiBTcGVjaWZpZXMgdGhlIG51bWJlciBvZiBNQnMgdG8gYmUgcmVmcmVzaGVkIGZyb20gbkZpcnN0R09CIAorICogICAgICAgICAgICAgICBhbmQgbkZpcnN0TUIKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZJREVPRkFTVFVQREFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7ICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAorICAgIE9NWF9CT09MIGJFbmFibGVWRlU7ICAgICAgCisgICAgT01YX1UzMiBuRmlyc3RHT0I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbkZpcnN0TUI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9VMzIgbk51bU1CczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCit9IE9NWF9WSURFT19QQVJBTV9WSURFT0ZBU1RVUERBVEVUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIGJpdHJhdGUgY29udHJvbCB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19DT05UUk9MUkFURVRZUEUgeworICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZURpc2FibGUsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGUsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlQ29uc3RhbnQsCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmFyaWFibGVTa2lwRnJhbWVzLAorICAgIE9NWF9WaWRlb19Db250cm9sUmF0ZUNvbnN0YW50U2tpcEZyYW1lcywKKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZpZGVvX0NvbnRyb2xSYXRlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVmlkZW9fQ29udHJvbFJhdGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19DT05UUk9MUkFURVRZUEU7CisKKworLyoqIAorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBiaXRyYXRlIG1vZGUgb2YgYSBjb2RlYy4gCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICA6IE9NWCBzcGVjIHZlcnNpb24gaW5mbworICogIG5Qb3J0SW5kZXggICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0IGFwcGxpZXMgdG8KKyAqICBlQ29udHJvbFJhdGUgICA6IENvbnRyb2wgcmF0ZSB0eXBlIGVudW0KKyAqICBuVGFyZ2V0Qml0cmF0ZSA6IFRhcmdldCBiaXRyYXRlIHRvIGVuY29kZSB3aXRoCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9CSVRSQVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0NPTlRST0xSQVRFVFlQRSBlQ29udHJvbFJhdGU7IAorICAgIE9NWF9VMzIgblRhcmdldEJpdHJhdGU7ICAgICAgICAgICAgICAgICAKK30gT01YX1ZJREVPX1BBUkFNX0JJVFJBVEVUWVBFOworCisKKy8qKiAKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIG1vdGlvbiB2ZWN0b3IgKE1WKSB0eXBlcyAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFIHsKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yUGl4ZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckhhbGZQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvclF1YXJ0ZXJQZWwsCisgICAgT01YX1ZpZGVvX01vdGlvblZlY3RvckVpZ2h0aFBlbCwKKyAgICBPTVhfVmlkZW9fTW90aW9uVmVjdG9yS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WaWRlb19Nb3Rpb25WZWN0b3JNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19NT1RJT05WRUNUT1JUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyB0aGUgbnVtYmVyIG9mIG1vdGlvbiB2ZWN0b3JzIHVzZWQgYXMgd2VsbAorICogYXMgdGhlaXIgYWNjdXJhY3kuCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3QgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgIDogT01YIHNwZWMgdmVyc2lvbiBpbmZvCisgKiAgblBvcnRJbmRleCAgICAgICA6IHBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgZUFjY3VyYWN5ICAgICAgICA6IEVudW1lcmF0ZWQgTVYgYWNjdXJhY3kKKyAqICBiVW5yZXN0cmljdGVkTVZzIDogQWxsb3cgdW5yZXN0cmljdGVkIE1WcworICogIGJGb3VyTVYgICAgICAgICAgOiBBbGxvdyB1c2Ugb2YgNCBNVnMKKyAqICBzWFNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIGhvcml6b250YWwgZGlyZWN0aW9uIGZvciBNVnMKKyAqICBzWVNlYXJjaFJhbmdlICAgIDogU2VhcmNoIHJhbmdlIGluIHZlcnRpY2FsIGRpcmVjdGlvbiBmb3IgTVZzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9NT1RJT05WRUNUT1JUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX01PVElPTlZFQ1RPUlRZUEUgZUFjY3VyYWN5OworICAgIE9NWF9CT09MIGJVbnJlc3RyaWN0ZWRNVnM7CisgICAgT01YX0JPT0wgYkZvdXJNVjsKKyAgICBPTVhfUzMyIHNYU2VhcmNoUmFuZ2U7CisgICAgT01YX1MzMiBzWVNlYXJjaFJhbmdlOworfSBPTVhfVklERU9fUEFSQU1fTU9USU9OVkVDVE9SVFlQRTsKKworCisvKiogCisgKiBFbnVtZXJhdGlvbiBvZiBwb3NzaWJsZSBtZXRob2RzIHRvIHVzZSBmb3IgSW50cmEgUmVmcmVzaCAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFIHsKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQ3ljbGljLAorICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hBZGFwdGl2ZSwKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoQm90aCwKKyAgICBPTVhfVklERU9fSW50cmFSZWZyZXNoS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19JbnRyYVJlZnJlc2hNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19JTlRSQVJFRlJFU0hUWVBFOworCisKKy8qKgorICogU3RydWN0dXJlIGZvciBjb25maWd1cmluZyBpbnRyYSByZWZyZXNoIG1vZGUgCisgKiAKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4ICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVSZWZyZXNoTW9kZSA6IEN5Y2xpYywgQWRhcHRpdmUsIG9yIEJvdGgKKyAqICBuQWlyTUJzICAgICAgOiBOdW1iZXIgb2YgaW50cmEgbWFjcm9ibG9ja3MgdG8gcmVmcmVzaCBpbiBhIGZyYW1lIHdoZW4gCisgKiAgICAgICAgICAgICAgICAgQUlSIGlzIGVuYWJsZWQKKyAqICBuQWlyUmVmICAgICAgOiBOdW1iZXIgb2YgdGltZXMgYSBtb3Rpb24gbWFya2VkIG1hY3JvYmxvY2sgaGFzIHRvIGJlICAKKyAqICAgICAgICAgICAgICAgICBpbnRyYSBjb2RlZAorICogIG5DaXJNQnMgICAgICA6IE51bWJlciBvZiBjb25zZWN1dGl2ZSBtYWNyb2Jsb2NrcyB0byBiZSBjb2RlZCBhcyAiaW50cmEiICAKKyAqICAgICAgICAgICAgICAgICB3aGVuIENJUiBpcyBlbmFibGVkCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9JTlRSQVJFRlJFU0hUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX0lOVFJBUkVGUkVTSFRZUEUgZVJlZnJlc2hNb2RlOworICAgIE9NWF9VMzIgbkFpck1CczsKKyAgICBPTVhfVTMyIG5BaXJSZWY7CisgICAgT01YX1UzMiBuQ2lyTUJzOworfSBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRTsKKworCisvKioKKyAqIFN0cnVjdHVyZSBmb3IgZW5hYmxpbmcgdmFyaW91cyBlcnJvciBjb3JyZWN0aW9uIG1ldGhvZHMgZm9yIHZpZGVvIAorICogY29tcHJlc3Npb24uCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgICAgICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0byAKKyAqICBiRW5hYmxlSEVDICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGhlYWRlciBleHRlbnNpb24gY29kZXMgKEhFQykKKyAqICBiRW5hYmxlUmVzeW5jICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJlc3luY2hyb25pemF0aW9uIG1hcmtlcnMKKyAqICBuUmVzeW5jaE1hcmtlclNwYWNpbmcgICA6IFJlc3luY2ggbWFya2VycyBpbnRlcnZhbCAoaW4gYml0cykgdG8gYmUgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWVkIGluIHRoZSBzdHJlYW0gCisgKiAgYkVuYWJsZURhdGFQYXJ0aXRpb25pbmcgOiBFbmFibGUvZGlzYWJsZSBkYXRhIHBhcnRpdGlvbmluZyAKKyAqICBiRW5hYmxlUlZMQyAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kaW5nCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9FUlJPUkNPUlJFQ1RJT05UWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX0JPT0wgYkVuYWJsZUhFQzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUmVzeW5jOworICAgIE9NWF9VMzIgIG5SZXN5bmNoTWFya2VyU3BhY2luZzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlRGF0YVBhcnRpdGlvbmluZzsKKyAgICBPTVhfQk9PTCBiRW5hYmxlUlZMQzsKK30gT01YX1ZJREVPX1BBUkFNX0VSUk9SQ09SUkVDVElPTlRZUEU7CisKKworLyoqIAorICogQ29uZmlndXJhdGlvbiBvZiB2YXJpYWJsZSBibG9jay1zaXplIG1vdGlvbiBjb21wZW5zYXRpb24gKFZCU01DKSAKKyAqIAorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGIxNngxNiAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDE2eDE2CisgKiAgYjE2eDggICAgICA6IEVuYWJsZSBpbnRlciBibG9jayBzZWFyY2ggMTZ4OAorICogIGI4eDE2ICAgICAgOiBFbmFibGUgaW50ZXIgYmxvY2sgc2VhcmNoIDh4MTYKKyAqICBiOHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDgKKyAqICBiOHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA4eDQKKyAqICBiNHg4ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDgKKyAqICBiNHg0ICAgICAgIDogRW5hYmxlIGludGVyIGJsb2NrIHNlYXJjaCA0eDQKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1ZCU01DVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgIAorICAgIE9NWF9CT09MIGIxNngxNjsgCisgICAgT01YX0JPT0wgYjE2eDg7IAorICAgIE9NWF9CT09MIGI4eDE2OworICAgIE9NWF9CT09MIGI4eDg7CisgICAgT01YX0JPT0wgYjh4NDsKKyAgICBPTVhfQk9PTCBiNHg4OworICAgIE9NWF9CT09MIGI0eDQ7Cit9IE9NWF9WSURFT19QQVJBTV9WQlNNQ1RZUEU7CisKKworLyoqIAorICogSC4yNjMgcHJvZmlsZSB0eXBlcywgZWFjaCBwcm9maWxlIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIAorICogcGVyZm9ybWFuY2UgYm91bmRzIGFuZCBkaWZmZXJlbnQgYW5uZXhlcy4KKyAqCisgKiBFTlVNUzoKKyAqICBCYXNlbGluZSAgICAgICAgICAgOiBCYXNlbGluZSBQcm9maWxlOiBILjI2MyAoVjEpLCBubyBvcHRpb25hbCBtb2RlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAqICBIMzIwIENvZGluZyAgICAgICAgOiBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBCYWNrd2FyZCBDb21wYXRpYmlsaXR5IAorICogICAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGU6IEguMjYzKyAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEwuNAorICogICAgICAgICAgICAgICAgICAgICAgIGFuZCBUCisgKiAgQmFja3dhcmRDb21wYXRpYmxlIDogQmFja3dhcmQgQ29tcGF0aWJpbGl0eSBQcm9maWxlOiBILjI2MyAoVjEpLCAKKyAqICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlcyBhbm5leCBGICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSVNXVjIgICAgICAgICAgICAgIDogSW50ZXJhY3RpdmUgU3RyZWFtaW5nIFdpcmVsZXNzIFByb2ZpbGU6IEguMjYzKyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAoVjIpLCBpbmNsdWRlcyBhbm5leGVzIEksIEosIEsgYW5kIFQgICAgICAgICAgICAgICAgIAorICogIElTV1YzICAgICAgICAgICAgICA6IEludGVyYWN0aXZlIFN0cmVhbWluZyBXaXJlbGVzcyBQcm9maWxlOiBILjI2MysrICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAoVjMpLCBpbmNsdWRlcyBwcm9maWxlIDMgYW5kIGFubmV4ZXMgViBhbmQgVy42LjMuOCAgIAorICogIEhpZ2hDb21wcmVzc2lvbiAgICA6IENvbnZlcnNhdGlvbmFsIEhpZ2ggQ29tcHJlc3Npb24gUHJvZmlsZTogSC4yNjMrKyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgKFYzKSwgaW5jbHVkZXMgcHJvZmlsZXMgMSAmIDIgYW5kIGFubmV4ZXMgRCBhbmQgVSAgIAorICogIEludGVybmV0ICAgICAgICAgICA6IENvbnZlcnNhdGlvbmFsIEludGVybmV0IFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAorICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggSyAgICAgICAgICAgICAgICAgICAgICAgCisgKiAgSW50ZXJsYWNlICAgICAgICAgIDogQ29udmVyc2F0aW9uYWwgSW50ZXJsYWNlIFByb2ZpbGU6IEguMjYzKysgKFYzKSwgIAorICogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzIHByb2ZpbGUgNSBhbmQgYW5uZXggVy42LjMuMTEgICAgICAgICAgICAgICAKKyAqICBIaWdoTGF0ZW5jeSAgICAgICAgOiBIaWdoIExhdGVuY3kgUHJvZmlsZTogSC4yNjMrKyAoVjMpLCBpbmNsdWRlcyAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA2IGFuZCBhbm5leGVzIE8uMSBhbmQgUC41ICAgICAgICAgICAgICAgICAgICAgICAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhc2VsaW5lICAgICAgICAgICAgPSAweDAxLCAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSDMyMENvZGluZyAgICAgICAgICA9IDB4MDIsICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZSAgPSAweDA0LCAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjIgICAgICAgICAgICAgICA9IDB4MDgsICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSVNXVjMgICAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uICAgICA9IDB4MjAsICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcm5ldCAgICAgICAgICAgID0gMHg0MCwgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVJbnRlcmxhY2UgICAgICAgICAgID0gMHg4MCwgICAgICAgICAgIAorICAgIE9NWF9WSURFT19IMjYzUHJvZmlsZUhpZ2hMYXRlbmN5ICAgICAgICAgPSAweDEwMCwgICAgICAgICAKKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0gyNjNQcm9maWxlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fSDI2M1Byb2ZpbGVNYXggICAgICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEU7CisKKworLyoqIAorICogSC4yNjMgbGV2ZWwgdHlwZXMsIGVhY2ggbGV2ZWwgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgZnJhbWUgc2l6ZXMsIAorICogYml0IHJhdGVzLCBkZWNvZGVyIGZyYW1lIHJhdGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19IMjYzTGV2ZWwxMCAgPSAweDAxLCAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDIwICA9IDB4MDIsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDMwICA9IDB4MDQsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQwICA9IDB4MDgsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDQ1ICA9IDB4MTAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDUwICA9IDB4MjAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDYwICA9IDB4NDAsICAgICAgCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbDcwICA9IDB4ODAsIAorICAgIE9NWF9WSURFT19IMjYzTGV2ZWxLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbFZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX0gyNjNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fSDI2M0xFVkVMVFlQRTsKKworCisvKiogCisgKiBTcGVjaWZpZXMgdGhlIHBpY3R1cmUgdHlwZS4gVGhlc2UgdmFsdWVzIHNob3VsZCBiZSBPUidkIHRvIHNpZ25hbCBhbGwgCisgKiBwaWN0dXJlcyB0eXBlcyB3aGljaCBhcmUgYWxsb3dlZC4KKyAqCisgKiBFTlVNUzoKKyAqICBHZW5lcmljIFBpY3R1cmUgVHlwZXM6ICAgICAgICAgIEksIFAgYW5kIEIKKyAqICBILjI2MyBTcGVjaWZpYyBQaWN0dXJlIFR5cGVzOiAgIFNJIGFuZCBTUAorICogIEguMjY0IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICAgRUkgYW5kIEVQCisgKiAgTVBFRy00IFNwZWNpZmljIFBpY3R1cmUgVHlwZXM6ICBTCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fUElDVFVSRVRZUEUgeworICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUkgICA9IDB4MDEsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUCAgID0gMHgwMiwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVCICAgPSAweDA0LAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZVNJICA9IDB4MDgsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlU1AgID0gMHgxMCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVFSSAgPSAweDExLAorICAgIE9NWF9WSURFT19QaWN0dXJlVHlwZUVQICA9IDB4MTIsCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlUyAgID0gMHgxNCwKKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX1BpY3R1cmVUeXBlVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fUGljdHVyZVR5cGVNYXggPSAweDdGRkZGRkZGCit9IE9NWF9WSURFT19QSUNUVVJFVFlQRTsKKworCisvKiogCisgKiBILjI2MyBQYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbiAKKyAqICBuUG9ydEluZGV4ICAgICAgICAgICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBQIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5CRnJhbWVzICAgICAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGVQcm9maWxlICAgICAgICAgICAgICAgICA6IEguMjYzIHByb2ZpbGUocykgdG8gdXNlCisgKiAgZUxldmVsICAgICAgICAgICAgICAgICAgIDogSC4yNjMgbGV2ZWwocykgdG8gdXNlCisgKiAgYlBMVVNQVFlQRUFsbG93ZWQgICAgICAgIDogSW5kaWNhdGluZyB0aGF0IGl0IGlzIGFsbG93ZWQgdG8gdXNlIFBMVVNQVFlQRSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3BlY2lmaWVkIGluIHRoZSAxOTk4IHZlcnNpb24gb2YgSC4yNjMpIHRvIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlIGN1c3RvbSBwaWN0dXJlIHNpemVzIG9yIGNsb2NrIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZXF1ZW5jaWVzIAorICogIG5BbGxvd2VkUGljdHVyZVR5cGVzICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRzdHJlYW0KKyAqICBiRm9yY2VSb3VuZGluZ1R5cGVUb1plcm8gOiB2YWx1ZSBvZiB0aGUgUlRZUEUgYml0IChiaXQgNiBvZiBNUFBUWVBFKSBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgY29uc3RyYWluZWQuIEl0IGlzIHJlY29tbWVuZGVkIHRvIGNoYW5nZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhlIFJUWVBFIGJpdCBmb3IgZWFjaCByZWZlcmVuY2UgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZSBpbiBlcnJvci1mcmVlIGNvbW11bmljYXRpb24KKyAqICBuUGljdHVyZUhlYWRlclJlcGV0aXRpb24gOiBTcGVjaWZpZXMgdGhlIGZyZXF1ZW5jeSBvZiBwaWN0dXJlIGhlYWRlciAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBldGl0aW9uCisgKiAgbkdPQkhlYWRlckludGVydmFsICAgICAgIDogU3BlY2lmaWVzIHRoZSBpbnRlcnZhbCBvZiBub24tZW1wdHkgR09CICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIGluIHVuaXRzIG9mIEdPQnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0gyNjNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuUEZyYW1lczsKKyAgICBPTVhfVTMyIG5CRnJhbWVzOworICAgIE9NWF9WSURFT19IMjYzUFJPRklMRVRZUEUgZVByb2ZpbGU7CisJT01YX1ZJREVPX0gyNjNMRVZFTFRZUEUgZUxldmVsOworICAgIE9NWF9CT09MIGJQTFVTUFRZUEVBbGxvd2VkOworICAgIE9NWF9VMzIgbkFsbG93ZWRQaWN0dXJlVHlwZXM7CisgICAgT01YX0JPT0wgYkZvcmNlUm91bmRpbmdUeXBlVG9aZXJvOworICAgIE9NWF9VMzIgblBpY3R1cmVIZWFkZXJSZXBldGl0aW9uOworICAgIE9NWF9VMzIgbkdPQkhlYWRlckludGVydmFsOworfSBPTVhfVklERU9fUEFSQU1fSDI2M1RZUEU7CisKKworLyoqIAorICogTVBFRy0yIHByb2ZpbGUgdHlwZXMsIGVhY2ggcHJvZmlsZSBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyAKKyAqIHBlcmZvcm1hbmNlIGJvdW5kcyBhbmQgZGlmZmVyZW50IGFubmV4ZXMuCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSB7CisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNpbXBsZSA9IDAsICAvKio8IFNpbXBsZSBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZU1haW4sICAgICAgICAvKio8IE1haW4gUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGU0MjIsICAgICAgICAgLyoqPCA0OjI6MiBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNOUiwgICAgICAgICAvKio8IFNOUiBQcm9maWxlICovCisgICAgT01YX1ZJREVPX01QRUcyUHJvZmlsZVNwYXRpYWwsICAgICAvKio8IFNwYXRpYWwgUHJvZmlsZSAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVIaWdoLCAgICAgICAgLyoqPCBIaWdoIFByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fTVBFRzJQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19NUEVHMlByb2ZpbGVNYXggPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX01QRUcyUFJPRklMRVRZUEU7CisKKworLyoqIAorICogTVBFRy0yIGxldmVsIHR5cGVzLCBlYWNoIGxldmVsIGluZGljYXRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIGZyYW1lIAorICogc2l6ZXMsIGJpdCByYXRlcywgZGVjb2RlciBmcmFtZSByYXRlcy4gIE5vIG5lZWQgCisgKi8KK3R5cGVkZWYgZW51bSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgeworICAgIE9NWF9WSURFT19NUEVHMkxldmVsTEwgPSAwLCAgLyoqPCBMb3cgTGV2ZWwgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxNTCwgICAgICAvKio8IE1haW4gTGV2ZWwgKi8gCisgICAgT01YX1ZJREVPX01QRUcyTGV2ZWxIMTQsICAgICAvKio8IEhpZ2ggMTQ0MCAqLyAKKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbEhMLCAgICAgIC8qKjwgSGlnaCBMZXZlbCAqLyAgIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHMkxldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzJMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzJMRVZFTFRZUEU7CisKKworLyoqIAorICogTVBFRy0yIHBhcmFtcyAKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuUEZyYW1lcyAgIDogTnVtYmVyIG9mIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgbkJGcmFtZXMgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIGVQcm9maWxlICAgOiBNUEVHLTIgcHJvZmlsZShzKSB0byB1c2UKKyAqICBlTGV2ZWwgICAgIDogTVBFRy0yIGxldmVscyhzKSB0byB1c2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX01QRUcyVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgCisgICAgT01YX1UzMiBuUEZyYW1lczsgICAgICAgIAorICAgIE9NWF9VMzIgbkJGcmFtZXM7ICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzJQUk9GSUxFVFlQRSBlUHJvZmlsZTsKKwlPTVhfVklERU9fTVBFRzJMRVZFTFRZUEUgZUxldmVsOyAgIAorfSBPTVhfVklERU9fUEFSQU1fTVBFRzJUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICogCisgKiBFTlVNUzoKKyAqICAtIFNpbXBsZSBQcm9maWxlLCBMZXZlbHMgMS0zCisgKiAgLSBTaW1wbGUgU2NhbGFibGUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQ29yZSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBNYWluIFByb2ZpbGUsIExldmVscyAyLTQKKyAqICAtIE4tYml0IFByb2ZpbGUsIExldmVsIDIKKyAqICAtIFNjYWxhYmxlIFRleHR1cmUgUHJvZmlsZSwgTGV2ZWwgMQorICogIC0gU2ltcGxlIEZhY2UgQW5pbWF0aW9uIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIFNpbXBsZSBGYWNlIGFuZCBCb2R5IEFuaW1hdGlvbiAoRkJBKSBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBCYXNpYyBBbmltYXRlZCBUZXh0dXJlIFByb2ZpbGUsIExldmVscyAxLTIKKyAqICAtIEh5YnJpZCBQcm9maWxlLCBMZXZlbHMgMS0yCisgKiAgLSBBZHZhbmNlZCBSZWFsIFRpbWUgU2ltcGxlIFByb2ZpbGVzLCBMZXZlbHMgMS00CisgKiAgLSBDb3JlIFNjYWxhYmxlIFByb2ZpbGUsIExldmVscyAxLTMKKyAqICAtIEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5IFByb2ZpbGUsIExldmVscyAxLTQKKyAqICAtIEFkdmFuY2VkIENvcmUgUHJvZmlsZSwgTGV2ZWxzIDEtMgorICogIC0gQWR2YW5jZWQgU2NhbGFibGUgVGV4dHVyZSwgTGV2ZWxzIDItMworICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0UFJPRklMRVRZUEUgeworICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgID0gMHgwMSwgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSAgID0gMHgwMiwgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgPSAweDA0LCAgICAgICAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZU1haW4gICAgICAgICAgICAgPSAweDA4LCAgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlTmJpdCAgICAgICAgICAgICA9IDB4MTAsICAgICAgICAgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlICA9IDB4MjAsICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZhY2UgICAgICAgPSAweDQwLCAgICAgICAgCisgICAgT01YX1ZJREVPX01QRUc0UHJvZmlsZVNpbXBsZUZCQSAgICAgICAgPSAweDgwLCAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVCYXNpY0FuaW1hdGVkICAgID0gMHgxMDAsICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlSHlicmlkICAgICAgICAgICA9IDB4MjAwLCAgICAgICAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lID0gMHg0MDAsICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlICAgICA9IDB4ODAwLCAgICAgIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZyAgID0gMHgxMDAwLCAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlICAgICA9IDB4MjAwMCwgICAgICAKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTY2FsYWJsZSA9IDB4NDAwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgICA9IDB4ODAwMCwKKyAgICBPTVhfVklERU9fTVBFRzRQcm9maWxlS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19NUEVHNFByb2ZpbGVNYXggICAgICAgICAgICAgID0gMHg3RkZGRkZGRiAgCit9IE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIE1QRUctNCBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSAKKyAqIHNpemVzLCBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX01QRUc0TEVWRUxUWVBFIHsKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDAgID0gMHgwMSwgICAvKio8IExldmVsIDAgKi8gICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDBiID0gMHgwMiwgICAvKio8IExldmVsIDBiICovICAgCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWwxICA9IDB4MDQsICAgLyoqPCBMZXZlbCAxICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsMiAgPSAweDA4LCAgIC8qKjwgTGV2ZWwgMiAqLyAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDMgID0gMHgxMCwgICAvKio8IExldmVsIDMgKi8gCisgICAgT01YX1ZJREVPX01QRUc0TGV2ZWw0ICA9IDB4MjAsICAgLyoqPCBMZXZlbCA0ICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDRhID0gMHg0MCwgICAvKio8IExldmVsIDRhICovICAKKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbDUgID0gMHg4MCwgICAvKio8IExldmVsIDUgKi8gIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19NUEVHNExldmVsVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fTVBFRzRMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fTVBFRzRMRVZFTFRZUEU7CisKKworLyoqIAorICogTVBFRy00IGNvbmZpZ3VyYXRpb24uICBUaGlzIHN0cnVjdHVyZSBoYW5kbGVzIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworICogd2hpY2ggYXJlIHNwZWNpZmljIHRvIE1QRUc0IGFsZ29yaXRobXMKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggICAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuU2xpY2VIZWFkZXJTcGFjaW5nICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciAoSDI2MysgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICBBbm5leCBLKS4gUHV0IHplcm8gaWYgbm90IHVzZWQKKyAqICBiU1ZIICAgICAgICAgICAgICAgICA6IEVuYWJsZSBTaG9ydCBWaWRlbyBIZWFkZXIgbW9kZQorICogIGJHb3YgICAgICAgICAgICAgICAgIDogRmxhZyB0byBlbmFibGUgR09WCisgKiAgblBGcmFtZXMgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUgKGFsc28gY2FsbGVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgR09WIHBlcmlvZCkKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICA6IE51bWJlciBvZiBCIGZyYW1lcyBiZXR3ZWVuIGVhY2ggSSBmcmFtZQorICogIG5JRENWTENUaHJlc2hvbGQgICAgIDogVmFsdWUgb2YgaW50cmEgREMgVkxDIHRocmVzaG9sZAorICogIGJBQ1ByZWQgICAgICAgICAgICAgIDogRmxhZyB0byB1c2UgYWMgcHJlZGljdGlvbgorICogIG5NYXhQYWNrZXRTaXplICAgICAgIDogTWF4aW11bSBzaXplIG9mIHBhY2tldCBpbiBieXRlcy4KKyAqICBuVGltZUluY1JlcyAgICAgICAgICA6IFVzZWQgdG8gcGFzcyBWT1AgdGltZSBpbmNyZW1lbnQgcmVzb2x1dGlvbiBmb3IgTVBFRzQuIAorICogICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGluIE1QRUc0IHN0YW5kYXJkLgorICogIGVQcm9maWxlICAgICAgICAgICAgIDogTVBFRy00IHByb2ZpbGUocykgdG8gdXNlLgorICogIGVMZXZlbCAgICAgICAgICAgICAgIDogTVBFRy00IGxldmVsKHMpIHRvIHVzZS4KKyAqICBuQWxsb3dlZFBpY3R1cmVUeXBlcyA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSBiaXRzdHJlYW0KKyAqICBuSGVhZGVyRXh0ZW5zaW9uICAgICA6IFNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHZpZGVvIHBhY2tldAorICogICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycyB3aXRoaW4gYSBWT1AKKyAqICBiUmV2ZXJzaWJsZVZMQyAgICAgICA6IFNwZWNpZmllcyB3aGV0aGVyIHJldmVyc2libGUgdmFyaWFibGUgbGVuZ3RoIGNvZGluZyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGluIHVzZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fTVBFRzRUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuU2xpY2VIZWFkZXJTcGFjaW5nOworICAgIE9NWF9CT09MIGJTVkg7CisgICAgT01YX0JPT0wgYkdvdjsKKyAgICBPTVhfVTMyIG5QRnJhbWVzOworICAgIE9NWF9VMzIgbkJGcmFtZXM7CisgICAgT01YX1UzMiBuSURDVkxDVGhyZXNob2xkOworICAgIE9NWF9CT09MIGJBQ1ByZWQ7CisgICAgT01YX1UzMiBuTWF4UGFja2V0U2l6ZTsKKyAgICBPTVhfVTMyIG5UaW1lSW5jUmVzOworICAgIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGVQcm9maWxlOworICAgIE9NWF9WSURFT19NUEVHNExFVkVMVFlQRSBlTGV2ZWw7CisgICAgT01YX1UzMiBuQWxsb3dlZFBpY3R1cmVUeXBlczsKKyAgICBPTVhfVTMyIG5IZWFkZXJFeHRlbnNpb247CisgICAgT01YX0JPT0wgYlJldmVyc2libGVWTEM7Cit9IE9NWF9WSURFT19QQVJBTV9NUEVHNFRZUEU7CisKKworLyoqIAorICogV01WIFZlcnNpb25zIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX1dNVkZPUk1BVFRZUEUgeworICAgIE9NWF9WSURFT19XTVZGb3JtYXRVbnVzZWQgPSAweDAxLCAgIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDcgICAgICA9IDB4MDIsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA3ICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDggICAgICA9IDB4MDQsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA4ICovCisgICAgT01YX1ZJREVPX1dNVkZvcm1hdDkgICAgICA9IDB4MDgsICAgLyoqPCBXaW5kb3dzIE1lZGlhIFZpZGVvIGZvcm1hdCA5ICovCisgICAgT01YX1ZJREVPX1dNRkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fV01GRm9ybWF0VmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fV01WRm9ybWF0TWF4ICAgID0gMHg3RkZGRkZGRgorfSBPTVhfVklERU9fV01WRk9STUFUVFlQRTsKKworCisvKiogCisgKiBXTVYgUGFyYW1zIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgOiBTaXplIG9mIHRoZSBzdHJ1Y3R1cmUgaW4gYnl0ZXMKKyAqICBuVmVyc2lvbiAgIDogT01YIHNwZWNpZmljYXRpb24gdmVyc2lvbiBpbmZvcm1hdGlvbgorICogIG5Qb3J0SW5kZXggOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIGVGb3JtYXQgICAgOiBWZXJzaW9uIG9mIFdNViBzdHJlYW0gLyBkYXRhCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9WSURFT19XTVZGT1JNQVRUWVBFIGVGb3JtYXQ7Cit9IE9NWF9WSURFT19QQVJBTV9XTVZUWVBFOworCisKKy8qKiAKKyAqIFJlYWwgVmlkZW8gVmVyc2lvbiAKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19SVkZPUk1BVFRZUEUgeworICAgIE9NWF9WSURFT19SVkZvcm1hdFVudXNlZCA9IDAsIC8qKjwgRm9ybWF0IHVudXNlZCBvciB1bmtub3duICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0OCwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA4ICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0OSwgICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIGZvcm1hdCA5ICovCisgICAgT01YX1ZJREVPX1JWRm9ybWF0RzIsICAgICAgICAgLyoqPCBSZWFsIFZpZGVvIEZvcm1hdCBHMiAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fUlZGb3JtYXRWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19SVkZvcm1hdE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX1JWRk9STUFUVFlQRTsKKworCisvKiogCisgKiBSZWFsIFZpZGVvIFBhcmFtcyAKKyAqCisgKiBTVFVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24gCisgKiAgblBvcnRJbmRleCAgICAgICAgIDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBlRm9ybWF0ICAgICAgICAgICAgOiBWZXJzaW9uIG9mIFJWIHN0cmVhbSAvIGRhdGEKKyAqICBuQml0c1BlclBpeGVsICAgICAgOiBCaXRzIHBlciBwaXhlbCBjb2RlZCBpbiB0aGUgZnJhbWUKKyAqICBuUGFkZGVkV2lkdGggICAgICAgOiBQYWRkZWQgd2lkdGggaW4gcGl4ZWwgb2YgYSB2aWRlbyBmcmFtZQorICogIG5QYWRkZWRIZWlnaHQgICAgICA6IFBhZGRlZCBIZWlnaHQgaW4gcGl4ZWxzIG9mIGEgdmlkZW8gZnJhbWUKKyAqICBuRnJhbWVSYXRlICAgICAgICAgOiBSYXRlIG9mIHZpZGVvIGluIGZyYW1lcyBwZXIgc2Vjb25kCisgKiAgbkJpdHN0cmVhbUZsYWdzICAgIDogRmxhZ3Mgd2hpY2ggaW50ZXJuYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJpdHN0cmVhbQorICogIG5CaXRzdHJlYW1WZXJzaW9uICA6IEJpdHN0cmVhbSB2ZXJzaW9uCisgKiAgbk1heEVuY29kZUZyYW1lU2l6ZTogTWF4IGVuY29kZWQgZnJhbWUgc2l6ZQorICogIGJFbmFibGVQb3N0RmlsdGVyICA6IFR1cm4gb24vb2ZmIHBvc3QgZmlsdGVyCisgKiAgYkVuYWJsZVRlbXBvcmFsSW50ZXJwb2xhdGlvbiA6IFR1cm4gb24vb2ZmIHRlbXBvcmFsIGludGVycG9sYXRpb24KKyAqICBiRW5hYmxlTGF0ZW5jeU1vZGUgOiBXaGVuIGVuYWJsZWQsIHRoZSBkZWNvZGVyIGRvZXMgbm90IGRpc3BsYXkgYSBkZWNvZGVkIAorICogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lIHVudGlsIGl0IGhhcyBkZXRlY3RlZCB0aGF0IG5vIGVuaGFuY2VtZW50IGxheWVyIAorICogIAkJCQkJIGZyYW1lcyBvciBkZXBlbmRlbnQgQiBmcmFtZXMgd2lsbCBiZSBjb21pbmcuIFRoaXMgCisgKiAgCQkJCQkgZGV0ZWN0aW9uIHVzdWFsbHkgb2NjdXJzIHdoZW4gYSBzdWJzZXF1ZW50IG5vbi1CIAorICogIAkJCQkJIGZyYW1lIGlzIGVuY291bnRlcmVkIAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fUEFSQU1fUlZUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1ZJREVPX1JWRk9STUFUVFlQRSBlRm9ybWF0OworICAgIE9NWF9VMTYgbkJpdHNQZXJQaXhlbDsKKyAgICBPTVhfVTE2IG5QYWRkZWRXaWR0aDsKKyAgICBPTVhfVTE2IG5QYWRkZWRIZWlnaHQ7CisgICAgT01YX1UzMiBuRnJhbWVSYXRlOworICAgIE9NWF9VMzIgbkJpdHN0cmVhbUZsYWdzOworICAgIE9NWF9VMzIgbkJpdHN0cmVhbVZlcnNpb247CisgICAgT01YX1UzMiBuTWF4RW5jb2RlRnJhbWVTaXplOworICAgIE9NWF9CT09MIGJFbmFibGVQb3N0RmlsdGVyOworICAgIE9NWF9CT09MIGJFbmFibGVUZW1wb3JhbEludGVycG9sYXRpb247CisgICAgT01YX0JPT0wgYkVuYWJsZUxhdGVuY3lNb2RlOworfSBPTVhfVklERU9fUEFSQU1fUlZUWVBFOworCisKKy8qKiAKKyAqIEFWQyBwcm9maWxlIHR5cGVzLCBlYWNoIHByb2ZpbGUgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIHZhcmlvdXMgCisgKiBwZXJmb3JtYW5jZSBib3VuZHMgYW5kIGRpZmZlcmVudCBhbm5leGVzLgorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIHsKKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lID0gMHgwMSwgICAvKio8IEJhc2VsaW5lIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZU1haW4gICAgID0gMHgwMiwgICAvKio8IE1haW4gcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlRXh0ZW5kZWQgPSAweDA0LCAgIC8qKjwgRXh0ZW5kZWQgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCAgICAgPSAweDA4LCAgIC8qKjwgSGlnaCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoMTAgICA9IDB4MTAsICAgLyoqPCBIaWdoIDEwIHByb2ZpbGUgKi8KKyAgICBPTVhfVklERU9fQVZDUHJvZmlsZUhpZ2g0MjIgID0gMHgyMCwgICAvKio8IEhpZ2ggNDoyOjIgcHJvZmlsZSAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlSGlnaDQ0NCAgPSAweDQwLCAgIC8qKjwgSGlnaCA0OjQ6NCBwcm9maWxlICovCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVLaHJvbm9zRXh0ZW5zaW9ucyA9IDB4NkYwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBLaHJvbm9zIFN0YW5kYXJkIEV4dGVuc2lvbnMgKi8gCisgICAgT01YX1ZJREVPX0FWQ1Byb2ZpbGVWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19BVkNQcm9maWxlTWF4ICAgICAgPSAweDdGRkZGRkZGICAKK30gT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFOworCisKKy8qKiAKKyAqIEFWQyBsZXZlbCB0eXBlcywgZWFjaCBsZXZlbCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgdmFyaW91cyBmcmFtZSBzaXplcywgCisgKiBiaXQgcmF0ZXMsIGRlY29kZXIgZnJhbWUgcmF0ZXMuICBObyBuZWVkIAorICovCit0eXBlZGVmIGVudW0gT01YX1ZJREVPX0FWQ0xFVkVMVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ0xldmVsMSAgID0gMHgwMSwgICAgIC8qKjwgTGV2ZWwgMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDFiICA9IDB4MDIsICAgICAvKio8IExldmVsIDFiICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTEgID0gMHgwNCwgICAgIC8qKjwgTGV2ZWwgMS4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTIgID0gMHgwOCwgICAgIC8qKjwgTGV2ZWwgMS4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMTMgID0gMHgxMCwgICAgIC8qKjwgTGV2ZWwgMS4zICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsMiAgID0gMHgyMCwgICAgIC8qKjwgTGV2ZWwgMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIxICA9IDB4NDAsICAgICAvKio8IExldmVsIDIuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDIyICA9IDB4ODAsICAgICAvKio8IExldmVsIDIuMiAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDMgICA9IDB4MTAwLCAgICAvKio8IExldmVsIDMgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzMSAgPSAweDIwMCwgICAgLyoqPCBMZXZlbCAzLjEgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWwzMiAgPSAweDQwMCwgICAgLyoqPCBMZXZlbCAzLjIgKi8KKyAgICBPTVhfVklERU9fQVZDTGV2ZWw0ICAgPSAweDgwMCwgICAgLyoqPCBMZXZlbCA0ICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNDEgID0gMHgxMDAwLCAgIC8qKjwgTGV2ZWwgNC4xICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNDIgID0gMHgyMDAwLCAgIC8qKjwgTGV2ZWwgNC4yICovCisgICAgT01YX1ZJREVPX0FWQ0xldmVsNSAgID0gMHg0MDAwLCAgIC8qKjwgTGV2ZWwgNSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbDUxICA9IDB4ODAwMCwgICAvKio8IExldmVsIDUuMSAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbEtocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fQVZDTGV2ZWxWZW5kb3JTdGFydFVudXNlZCA9IDB4N0YwMDAwMDAsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIE9NWF9WSURFT19BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYgIAorfSBPTVhfVklERU9fQVZDTEVWRUxUWVBFOworCisKKy8qKiAKKyAqIEFWQyBsb29wIGZpbHRlciBtb2RlcyAKKyAqCisgKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckVuYWJsZSAgICAgICAgICAgICAgIDogRW5hYmxlCisgKiBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGUgICAgICAgICAgICAgIDogRGlzYWJsZQorICogT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJEaXNhYmxlU2xpY2VCb3VuZGFyeSA6IERpc2FibGVkIG9uIHNsaWNlIGJvdW4KKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNMT09QRklMVEVSVFlQRSB7CisgICAgT01YX1ZJREVPX0FWQ0xvb3BGaWx0ZXJFbmFibGUgPSAwLAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyRGlzYWJsZSwKKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlckRpc2FibGVTbGljZUJvdW5kYXJ5LAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyS2hyb25vc0V4dGVuc2lvbnMgPSAweDZGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgS2hyb25vcyBTdGFuZGFyZCBFeHRlbnNpb25zICovIAorICAgIE9NWF9WSURFT19BVkNMb29wRmlsdGVyVmVuZG9yU3RhcnRVbnVzZWQgPSAweDdGMDAwMDAwLCAvKio8IFJlc2VydmVkIHJlZ2lvbiBmb3IgaW50cm9kdWNpbmcgVmVuZG9yIEV4dGVuc2lvbnMgKi8KKyAgICBPTVhfVklERU9fQVZDTG9vcEZpbHRlck1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX0FWQ0xPT1BGSUxURVJUWVBFOworCisKKy8qKiAKKyAqIEFWQyBwYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCAgICAgICAgICAgICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgblNsaWNlSGVhZGVyU3BhY2luZyAgICAgICA6IE51bWJlciBvZiBtYWNyb2Jsb2NrcyBiZXR3ZWVuIHNsaWNlIGhlYWRlciwgcHV0ICAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVybyBpZiBub3QgdXNlZAorICogIG5QRnJhbWVzICAgICAgICAgICAgICAgICAgOiBOdW1iZXIgb2YgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICBuQkZyYW1lcyAgICAgICAgICAgICAgICAgIDogTnVtYmVyIG9mIEIgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgYlVzZUhhZGFtYXJkICAgICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIEhhZGFtYXJkIHRyYW5zZm9ybQorICogIG5SZWZGcmFtZXMgICAgICAgICAgICAgICAgOiBNYXggbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgdG8gdXNlIGZvciBpbnRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3Rpb24gc2VhcmNoICgxLTE2KQorICogIG5SZWZJZHhUcmFpbGluZyAgICAgICAgICAgOiBQaWMgcGFyYW0gc2V0IHJlZiBmcmFtZSBpbmRleCAoaW5kZXggaW50byByZWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgYnVmZmVyIG9mIHRyYWlsaW5nIGZyYW1lcyBsaXN0KSwgQiBmcmFtZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0CisgKiAgblJlZklkeEZvcndhcmQgICAgICAgICAgICA6IFBpYyBwYXJhbSBzZXQgcmVmIGZyYW1lIGluZGV4IChpbmRleCBpbnRvIHJlZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSBidWZmZXIgb2YgZm9yd2FyZCBmcmFtZXMgbGlzdCksIEIgZnJhbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydAorICogIGJFbmFibGVVRVAgICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSB1bmVxdWFsIGVycm9yIHByb3RlY3Rpb24uIFRoaXMgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgdmFsaWQgb2YgZGF0YSBwYXJ0aXRpb25pbmcgaXMgZW5hYmxlZC4KKyAqICBiRW5hYmxlRk1PICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgZmxleGlibGUgbWFjcm9ibG9jayBvcmRlcmluZworICogIGJFbmFibGVBU08gICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBhcmJpdHJhcnkgc2xpY2Ugb3JkZXJpbmcKKyAqICBiRW5hYmxlUlMgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc2VuZGluZyBvZiByZWR1bmRhbnQgc2xpY2VzCisgKiAgZVByb2ZpbGUgICAgICAgICAgICAgICAgICA6IEFWQyBwcm9maWxlKHMpIHRvIHVzZQorICogIGVMZXZlbCAgICAgICAgICAgICAgICAgICAgOiBBVkMgbGV2ZWwocykgdG8gdXNlCisgKiAgbkFsbG93ZWRQaWN0dXJlVHlwZXMgICAgICA6IFNwZWNpZmllcyB0aGUgcGljdHVyZSB0eXBlcyBhbGxvd2VkIGluIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0c3RyZWFtCisgKiAgYkZyYW1lTUJzT25seSAgICAgICAgICAgICA6IHNwZWNpZmllcyB0aGF0IGV2ZXJ5IGNvZGVkIHBpY3R1cmUgb2YgdGhlIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlZCB2aWRlbyBzZXF1ZW5jZSBpcyBhIGNvZGVkIGZyYW1lIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nIG9ubHkgZnJhbWUgbWFjcm9ibG9ja3MKKyAqICBiTUJBRkYgICAgICAgICAgICAgICAgICAgIDogRW5hYmxlL2Rpc2FibGUgc3dpdGNoaW5nIGJldHdlZW4gZnJhbWUgYW5kIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCBtYWNyb2Jsb2NrcyB3aXRoaW4gYSBwaWN0dXJlCisgKiAgYkVudHJvcHlDb2RpbmdDQUJBQyAgICAgICA6IEVudHJvcHkgZGVjb2RpbmcgbWV0aG9kIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4IGVsZW1lbnRzIGZvciB3aGljaCB0d28gZGVzY3JpcHRvcnMgYXBwZWFyIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3ludGF4IHRhYmxlcworICogIGJXZWlnaHRlZFBQcmVkaWN0aW9uICAgICAgOiBFbmFibGUvZGlzYWJsZSB3ZWlnaHRlZCBwcmVkaWN0aW9uIHNoYWxsIG5vdCAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgYXBwbGllZCB0byBQIGFuZCBTUCBzbGljZXMKKyAqICBuV2VpZ2h0ZWRCaXByZWRpY2l0b25Nb2RlIDogRGVmYXVsdCB3ZWlnaHRlZCBwcmVkaWN0aW9uIGlzIGFwcGxpZWQgdG8gQiAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2VzIAorICogIGJjb25zdElwcmVkICAgICAgICAgICAgICAgOiBFbmFibGUvZGlzYWJsZSBpbnRyYSBwcmVkaWN0aW9uCisgKiAgYkRpcmVjdDh4OEluZmVyZW5jZSAgICAgICA6IFNwZWNpZmllcyB0aGUgbWV0aG9kIHVzZWQgaW4gdGhlIGRlcml2YXRpb24gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgZm9yIGx1bWEgbW90aW9uIHZlY3RvcnMgZm9yIEJfU2tpcCwgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJfRGlyZWN0XzE2eDE2IGFuZCBCX0RpcmVjdF84eDggYXMgc3BlY2lmaWVkIAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzdWJjbGF1c2UgOC40LjEuMiBvZiB0aGUgQVZDIHNwZWMgCisgKiAgYkRpcmVjdFNwYXRpYWxUZW1wb3JhbCAgICA6IEZsYWcgaW5kaWNhdGluZyBzcGF0aWFsIG9yIHRlbXBvcmFsIGRpcmVjdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHVzZWQgaW4gQiBzbGljZSBjb2RpbmcgKHJlbGF0ZWQgdG8gCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJEaXJlY3Q4eDhJbmZlcmVuY2UpIC4gU3BhdGlhbCBkaXJlY3QgbW9kZSBpcyAKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBjb21tb24gYW5kIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KKyAqICBuQ2FiYWNJbml0SWR4ICAgICAgICAgICAgIDogSW5kZXggdXNlZCB0byBpbml0IENBQkFDIGNvbnRleHRzCisgKiAgZUxvb3BGaWx0ZXJNb2RlICAgICAgICAgICA6IEVuYWJsZS9kaXNhYmxlIGxvb3AgZmlsdGVyCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19QQVJBTV9BVkNUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOyAgICAgICAgICAgICAgICAgCisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAorICAgIE9NWF9VMzIgblBvcnRJbmRleDsgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5TbGljZUhlYWRlclNwYWNpbmc7ICAKKyAgICBPTVhfVTMyIG5QRnJhbWVzOyAgICAgCisgICAgT01YX1UzMiBuQkZyYW1lczsgICAgIAorICAgIE9NWF9CT09MIGJVc2VIYWRhbWFyZDsKKyAgICBPTVhfVTMyIG5SZWZGcmFtZXM7ICAKKwlPTVhfVTMyIG5SZWZJZHgxMEFjdGl2ZU1pbnVzMTsKKwlPTVhfVTMyIG5SZWZJZHgxMUFjdGl2ZU1pbnVzMTsKKyAgICBPTVhfQk9PTCBiRW5hYmxlVUVQOyAgCisgICAgT01YX0JPT0wgYkVuYWJsZUZNTzsgIAorICAgIE9NWF9CT09MIGJFbmFibGVBU087ICAKKyAgICBPTVhfQk9PTCBiRW5hYmxlUlM7ICAgCisgICAgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFIGVQcm9maWxlOworCU9NWF9WSURFT19BVkNMRVZFTFRZUEUgZUxldmVsOyAKKyAgICBPTVhfVTMyIG5BbGxvd2VkUGljdHVyZVR5cGVzOyAgCisJT01YX0JPT0wgYkZyYW1lTUJzT25seTsgICAgICAgIAkJCQkJCQkJCQorICAgIE9NWF9CT09MIGJNQkFGRjsgICAgICAgICAgICAgICAKKyAgICBPTVhfQk9PTCBiRW50cm9weUNvZGluZ0NBQkFDOyAgCisgICAgT01YX0JPT0wgYldlaWdodGVkUFByZWRpY3Rpb247IAorICAgIE9NWF9VMzIgbldlaWdodGVkQmlwcmVkaWNpdG9uTW9kZTsgCisgICAgT01YX0JPT0wgYmNvbnN0SXByZWQgOworICAgIE9NWF9CT09MIGJEaXJlY3Q4eDhJbmZlcmVuY2U7ICAKKwlPTVhfQk9PTCBiRGlyZWN0U3BhdGlhbFRlbXBvcmFsOworCU9NWF9VMzIgbkNhYmFjSW5pdElkYzsKKwlPTVhfVklERU9fQVZDTE9PUEZJTFRFUlRZUEUgZUxvb3BGaWx0ZXJNb2RlOworfSBPTVhfVklERU9fUEFSQU1fQVZDVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEUgeworICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgIAorICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOyAgICAgIAorICAgT01YX1UzMiBuUG9ydEluZGV4OyAgICAgICAgICAgIAorICAgT01YX1UzMiBlUHJvZmlsZTsgICAgICAvKio8IHR5cGUgaXMgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFLCBPTVhfVklERU9fSDI2M1BST0ZJTEVUWVBFLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIE9NWF9WSURFT19NUEVHNFBST0ZJTEVUWVBFIGRlcGVuZGluZyBvbiBjb250ZXh0ICovCisgICBPTVhfVTMyIGVMZXZlbDsgICAgICAgIC8qKjwgdHlwZSBpcyBPTVhfVklERU9fQVZDTEVWRUxUWVBFLCBPTVhfVklERU9fSDI2M0xFVkVMVFlQRSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBPTVhfVklERU9fTVBFRzRQUk9GSUxFVFlQRSBkZXBlbmRpbmcgb24gY29udGV4dCAqLworICAgT01YX1UzMiBuUHJvZmlsZUluZGV4OyAvKio8IFVzZWQgdG8gcXVlcnkgZm9yIGluZGl2aWR1YWwgcHJvZmlsZSBzdXBwb3J0IGluZm9ybWF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGlzIHZhbGlkIG9ubHkgZm9yIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9Qcm9maWxlTGV2ZWxRdWVyeVN1cHBvcnRlZCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYWxsIG90aGVyIGluZGljZXMgdGhpcyBwYXJhbWV0ZXIgaXMgdG8gYmUgaWdub3JlZC4gKi8KK30gT01YX1ZJREVPX1BBUkFNX1BST0ZJTEVMRVZFTFRZUEU7CisKKy8qKiAKKyAqIFN0cnVjdHVyZSBmb3IgZHluYW1pY2FsbHkgY29uZmlndXJpbmcgYml0cmF0ZSBtb2RlIG9mIGEgY29kZWMuIAorICoKKyAqIFNUUlVDVCBNRU1CRVJTOgorICogIG5TaXplICAgICAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0IGluIGJ5dGVzCisgKiAgblZlcnNpb24gICAgICAgOiBPTVggc3BlYyB2ZXJzaW9uIGluZm8KKyAqICBuUG9ydEluZGV4ICAgICA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdCBhcHBsaWVzIHRvCisgKiAgbkVuY29kZUJpdHJhdGUgOiBUYXJnZXQgYXZlcmFnZSBiaXRyYXRlIHRvIGJlIGdlbmVyYXRlZCBpbiBicHMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX0NPTkZJR19CSVRSQVRFVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsgICAgICAgICAgICAgICAKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7ICAgICAgICAgICAgICAgICAgICAgCisgICAgT01YX1UzMiBuRW5jb2RlQml0cmF0ZTsgICAgICAgICAgICAgICAgIAorfSBPTVhfVklERU9fQ09ORklHX0JJVFJBVEVUWVBFOworCisvKiogCisgKiBEZWZpbmVzIEVuY29kZXIgRnJhbWUgUmF0ZSBzZXR0aW5nCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICAgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgICAgICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uIAorICogIG5Qb3J0SW5kZXggICAgICAgOiBQb3J0IHRoYXQgdGhpcyBzdHJ1Y3R1cmUgYXBwbGllcyB0bworICogIHhFbmNvZGVGcmFtZXJhdGUgOiBFbmNvZGluZyBmcmFtZXJhdGUgcmVwcmVzZW50ZWQgaW4gUTE2IGZvcm1hdAorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0ZSQU1FUkFURVRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfVTMyIHhFbmNvZGVGcmFtZXJhdGU7IC8qIFExNiBmb3JtYXQgKi8KK30gT01YX0NPTkZJR19GUkFNRVJBVEVUWVBFOworCit0eXBlZGVmIHN0cnVjdCBPTVhfQ09ORklHX0lOVFJBUkVGUkVTSFZPUFRZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBJbnRyYVJlZnJlc2hWT1A7Cit9IE9NWF9DT05GSUdfSU5UUkFSRUZSRVNIVk9QVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX0NPTkZJR19NQUNST0JMT0NLRVJST1JNQVBUWVBFIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuRXJyTWFwU2l6ZTsgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIEVycm9yIE1hcCBpbiBieXRlcyAqLworICAgIE9NWF9VOCAgRXJyTWFwWzFdOyAgICAgICAgICAgICAvKiBFcnJvciBtYXAgaGludCAqLworfSBPTVhfQ09ORklHX01BQ1JPQkxPQ0tFUlJPUk1BUFRZUEU7CisKK3R5cGVkZWYgc3RydWN0IE9NWF9DT05GSUdfTUJFUlJPUlJFUE9SVElOR1RZUEUgeworICAgIE9NWF9VMzIgblNpemU7CisgICAgT01YX1ZFUlNJT05UWVBFIG5WZXJzaW9uOworICAgIE9NWF9VMzIgblBvcnRJbmRleDsKKyAgICBPTVhfQk9PTCBiRW5hYmxlZDsKK30gT01YX0NPTkZJR19NQkVSUk9SUkVQT1JUSU5HVFlQRTsKKwordHlwZWRlZiBzdHJ1Y3QgT01YX1BBUkFNX01BQ1JPQkxPQ0tTVFlQRSB7CisgICAgT01YX1UzMiBuU2l6ZTsKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VMzIgbk1hY3JvYmxvY2tzOworfSBPTVhfUEFSQU1fTUFDUk9CTE9DS1NUWVBFOworCisvKiogCisgKiBBVkMgU2xpY2UgTW9kZSBtb2RlcyAKKyAqCisgKiBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgICA6IE5vcm1hbCBmcmFtZSBlbmNvZGluZywgb25lIHNsaWNlIHBlciBmcmFtZQorICogT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNNQlNsaWNlICAgOiBOQUwgbW9kZSwgbnVtYmVyIG9mIE1CcyBwZXIgZnJhbWUKKyAqIE9NWF9WSURFT19TTElDRU1PREVfQVZDQnl0ZVNsaWNlIDogTkFMIG1vZGUsIG51bWJlciBvZiBieXRlcyBwZXIgZnJhbWUKKyAqLwordHlwZWRlZiBlbnVtIE9NWF9WSURFT19BVkNTTElDRU1PREVUWVBFIHsKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0RlZmF1bHQgPSAwLAorICAgIE9NWF9WSURFT19TTElDRU1PREVfQVZDTUJTbGljZSwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0J5dGVTbGljZSwKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ0tocm9ub3NFeHRlbnNpb25zID0gMHg2RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIEtocm9ub3MgU3RhbmRhcmQgRXh0ZW5zaW9ucyAqLyAKKyAgICBPTVhfVklERU9fU0xJQ0VNT0RFX0FWQ1ZlbmRvclN0YXJ0VW51c2VkID0gMHg3RjAwMDAwMCwgLyoqPCBSZXNlcnZlZCByZWdpb24gZm9yIGludHJvZHVjaW5nIFZlbmRvciBFeHRlbnNpb25zICovCisgICAgT01YX1ZJREVPX1NMSUNFTU9ERV9BVkNMZXZlbE1heCA9IDB4N0ZGRkZGRkYKK30gT01YX1ZJREVPX0FWQ1NMSUNFTU9ERVRZUEU7CisKKy8qKiAKKyAqIEFWQyBGTU8gU2xpY2UgTW9kZSBQYXJhbXMgCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbk51bVNsaWNlR3JvdXBzIDogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2Ygc2xpY2UgZ3JvdXBzCisgKiAgblNsaWNlR3JvdXBNYXBUeXBlIDogU3BlY2lmaWVzIHRoZSB0eXBlIG9mIHNsaWNlIGdyb3VwcworICogIGVTbGljZU1vZGUgOiBTcGVjaWZpZXMgdGhlIHR5cGUgb2Ygc2xpY2UKKyAqLwordHlwZWRlZiBzdHJ1Y3QgT01YX1ZJREVPX1BBUkFNX0FWQ1NMSUNFRk1PIHsKKyAgICBPTVhfVTMyIG5TaXplOyAKKyAgICBPTVhfVkVSU0lPTlRZUEUgblZlcnNpb247CisgICAgT01YX1UzMiBuUG9ydEluZGV4OworICAgIE9NWF9VOCBuTnVtU2xpY2VHcm91cHM7CisgICAgT01YX1U4IG5TbGljZUdyb3VwTWFwVHlwZTsKKyAgICBPTVhfVklERU9fQVZDU0xJQ0VNT0RFVFlQRSBlU2xpY2VNb2RlOworfSBPTVhfVklERU9fUEFSQU1fQVZDU0xJQ0VGTU87CisKKy8qKiAKKyAqIEFWQyBJRFIgUGVyaW9kIENvbmZpZ3MKKyAqCisgKiBTVFJVQ1QgTUVNQkVSUzoKKyAqICBuU2l6ZSAgICAgIDogU2l6ZSBvZiB0aGUgc3RydWN0dXJlIGluIGJ5dGVzCisgKiAgblZlcnNpb24gICA6IE9NWCBzcGVjaWZpY2F0aW9uIHZlcnNpb24gaW5mb3JtYXRpb24KKyAqICBuUG9ydEluZGV4IDogUG9ydCB0aGF0IHRoaXMgc3RydWN0dXJlIGFwcGxpZXMgdG8KKyAqICBuSURSUGVyaW9kIDogU3BlY2lmaWVzIHBlcmlvZGljaXR5IG9mIElEUiBmcmFtZXMKKyAqICBuUEZyYW1lcyA6IFNwZWNpZmllcyBpbnRlcm5hbCBvZiBjb2RpbmcgSW50cmEgZnJhbWVzCisgKi8KK3R5cGVkZWYgc3RydWN0IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0QgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuSURSUGVyaW9kOworICAgIE9NWF9VMzIgblBGcmFtZXM7Cit9IE9NWF9WSURFT19DT05GSUdfQVZDSU5UUkFQRVJJT0Q7CisKKy8qKiAKKyAqIEFWQyBOQUwgU2l6ZSBDb25maWdzCisgKgorICogU1RSVUNUIE1FTUJFUlM6CisgKiAgblNpemUgICAgICA6IFNpemUgb2YgdGhlIHN0cnVjdHVyZSBpbiBieXRlcworICogIG5WZXJzaW9uICAgOiBPTVggc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIGluZm9ybWF0aW9uCisgKiAgblBvcnRJbmRleCA6IFBvcnQgdGhhdCB0aGlzIHN0cnVjdHVyZSBhcHBsaWVzIHRvCisgKiAgbk5hbHVCeXRlcyA6IFNwZWNpZmllcyB0aGUgTkFMIHVuaXQgc2l6ZQorICovCit0eXBlZGVmIHN0cnVjdCBPTVhfVklERU9fQ09ORklHX05BTFNJWkUgeworICAgIE9NWF9VMzIgblNpemU7IAorICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7CisgICAgT01YX1UzMiBuTmFsdUJ5dGVzOworfSBPTVhfVklERU9fQ09ORklHX05BTFNJWkU7CisKKy8qKiBAfSAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLworCisjZW5kaWYKKy8qIEZpbGUgRU9GICovCisKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUvc2VjL1NFQ19PTVhfRGVmLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL3NlYy9TRUNfT01YX0RlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwYjYxNDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL3NlYy9TRUNfT01YX0RlZi5oCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgU0VDX09NWF9EZWYuaAorICogQGJyaWVmICAgIFNFQ19PTVggc3BlY2lmaWMgZGVmaW5lCisgKiBAYXV0aG9yICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9ERUYKKyNkZWZpbmUgU0VDX09NWF9ERUYKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorI2luY2x1ZGUgIk9NWF9JVkNvbW1vbi5oIgorCisjZGVmaW5lIFZFUlNJT05NQUpPUl9OVU1CRVIgICAgICAgICAgICAgICAgMQorI2RlZmluZSBWRVJTSU9OTUlOT1JfTlVNQkVSICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVWSVNJT05fTlVNQkVSICAgICAgICAgICAgICAgICAgICAwCisjZGVmaW5lIFNURVBfTlVNQkVSICAgICAgICAgICAgICAgICAgICAgICAgMAorCisKKyNkZWZpbmUgTUFYX09NWF9DT01QT05FTlRfTlVNICAgICAgICAgICAgICAyMAorI2RlZmluZSBNQVhfT01YX0NPTVBPTkVOVF9ST0xFX05VTSAgICAgICAgIDEwCisjZGVmaW5lIE1BWF9PTVhfQ09NUE9ORU5UX05BTUVfU0laRSAgICAgICAgT01YX01BWF9TVFJJTkdOQU1FX1NJWkUKKyNkZWZpbmUgTUFYX09NWF9DT01QT05FTlRfUk9MRV9TSVpFICAgICAgICBPTVhfTUFYX1NUUklOR05BTUVfU0laRQorI2RlZmluZSBNQVhfT01YX0NPTVBPTkVOVF9MSUJOQU1FX1NJWkUgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFICogMgorI2RlZmluZSBNQVhfT01YX01JTUVUWVBFX1NJWkUgICAgICAgICAgICAgIE9NWF9NQVhfU1RSSU5HTkFNRV9TSVpFCisKKyNkZWZpbmUgTUFYX1RJTUVTVEFNUCAgICAgICAgMTcKKyNkZWZpbmUgTUFYX0ZMQUdTICAgICAgICAgICAgMTcKKworI2RlZmluZSBVU0VfQU5EUk9JRF9FWFRFTlNJT04KKworCit0eXBlZGVmIGVudW0gX1NFQ19DT0RFQ19UWVBFCit7CisgICAgU1dfQ09ERUMsCisgICAgSFdfVklERU9fQ09ERUMsCisgICAgSFdfQVVESU9fQ09ERUMKK30gU0VDX0NPREVDX1RZUEU7CisKK3R5cGVkZWYgc3RydWN0IF9TRUNfT01YX1BSSU9SSVRZTUdNVFRZUEUKK3sKKyAgICBPTVhfVTMyIG5Hcm91cFByaW9yaXR5OyAvKiB0aGUgdmFsdWUgMCByZXByZXNlbnRzIHRoZSBoaWdoZXN0IHByaW9yaXR5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZm9yIGEgZ3JvdXAgb2YgY29tcG9uZW50cyAgICAgICAgICAgICAgICAgICAqLworICAgIE9NWF9VMzIgbkdyb3VwSUQ7Cit9IFNFQ19PTVhfUFJJT1JJVFlNR01UVFlQRTsKKwordHlwZWRlZiBlbnVtIF9TRUNfT01YX0lOREVYVFlQRQoreworI2RlZmluZSBTRUNfSU5ERVhfUEFSQU1fRU5BQkxFX1RIVU1CTkFJTCAiT01YLlNFQy5pbmRleC5UaHVtYm5haWxNb2RlIgorICAgIE9NWF9JbmRleFZlbmRvclRodW1ibmFpbE1vZGUgICAgICAgID0gMHg3RjAwMDAwMSwKKworICAgIC8qIGZvciBBbmRyb2lkIE5hdGl2ZSBXaW5kb3cgKi8KKyNkZWZpbmUgU0VDX0lOREVYX1BBUkFNX0VOQUJMRV9BTkIgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5lbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVycyIKKyAgICBPTVhfSW5kZXhQYXJhbUVuYWJsZUFuZHJvaWRCdWZmZXJzICAgID0gMHg3RjAwMDAxMSwKKyNkZWZpbmUgU0VDX0lOREVYX1BBUkFNX0dFVF9BTkIgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5nZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2UiCisgICAgT01YX0luZGV4UGFyYW1HZXRBbmRyb2lkTmF0aXZlQnVmZmVyICA9IDB4N0YwMDAwMTIsCisjZGVmaW5lIFNFQ19JTkRFWF9QQVJBTV9VU0VfQU5CICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXgudXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciIKKyAgICBPTVhfSW5kZXhQYXJhbVVzZUFuZHJvaWROYXRpdmVCdWZmZXIgID0gMHg3RjAwMDAxMywKKyAgICAvKiBmb3IgQW5kcm9pZCBTdG9yZSBNZXRhZGF0YSBJbmJ1ZmZlciAqLworI2RlZmluZSBTRUNfSU5ERVhfUEFSQU1fU1RPUkVfTUVUQURBVEFfQlVGRkVSICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguc3RvcmVNZXRhRGF0YUluQnVmZmVycyIKKyAgICBPTVhfSW5kZXhQYXJhbVN0b3JlTWV0YURhdGFCdWZmZXIgICAgID0gMHg3RjAwMDAxNCwKKworICAgIC8qIGZvciBBbmRyb2lkIFBWIE9wZW5Db3JlKi8KKyAgICBPTVhfQ09NUE9ORU5UX0NBUEFCSUxJVFlfVFlQRV9JTkRFWCA9IDB4RkY3QTM0NworfSBTRUNfT01YX0lOREVYVFlQRTsKKwordHlwZWRlZiBlbnVtIF9TRUNfT01YX0VSUk9SVFlQRQoreworICAgIE9NWF9FcnJvck5vRU9GID0gMHg5MDAwMDAwMSwKKyAgICBPTVhfRXJyb3JJbnB1dERhdGFEZWNvZGVZZXQsCisgICAgT01YX0Vycm9ySW5wdXREYXRhRW5jb2RlWWV0LAorICAgIE9NWF9FcnJvck1GQ0luaXQKK30gU0VDX09NWF9FUlJPUlRZUEU7CisKK3R5cGVkZWYgZW51bSBfU0VDX09NWF9DT01NQU5EVFlQRQoreworICAgIFNFQ19PTVhfQ29tbWFuZENvbXBvbmVudERlSW5pdCA9IDB4N0YwMDAwMDEsCisgICAgU0VDX09NWF9Db21tYW5kRW1wdHlCdWZmZXIsCisgICAgU0VDX09NWF9Db21tYW5kRmlsbEJ1ZmZlcgorfSBTRUNfT01YX0NPTU1BTkRUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfVFJBTlNfU1RBVEVUWVBFIHsKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVJbnZhbGlkLAorICAgIFNFQ19PTVhfVHJhbnNTdGF0ZUxvYWRlZFRvSWRsZSwKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVJZGxlVG9FeGVjdXRpbmcsCisgICAgU0VDX09NWF9UcmFuc1N0YXRlRXhlY3V0aW5nVG9JZGxlLAorICAgIFNFQ19PTVhfVHJhbnNTdGF0ZUlkbGVUb0xvYWRlZCwKKyAgICBTRUNfT01YX1RyYW5zU3RhdGVNYXggPSAwWDdGRkZGRkZGCit9IFNFQ19PTVhfVFJBTlNfU1RBVEVUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfQ09MT1JfRk9STUFUVFlQRSB7CisgICAgT01YX1NFQ19DT0xPUl9Gb3JtYXROVjEyVFBoeXNpY2FsQWRkcmVzcyA9IDB4N0YwMDAwMDEsIC8qKjwgUmVzZXJ2ZWQgcmVnaW9uIGZvciBpbnRyb2R1Y2luZyBWZW5kb3IgRXh0ZW5zaW9ucyAqLworICAgIC8qIGZvciBBbmRyb2lkIE5hdGl2ZSBXaW5kb3cgKi8KKyAgICBPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXIgPSAweDEwMCwKKyAgICAvKiBmb3IgQW5kcm9pZCBzdXJmYWNlIHRleHR1cmUgZW5jb2RlICovCisgICAgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUgPSAweDdGMDAwNzg5Cit9U0VDX09NWF9DT0xPUl9GT1JNQVRUWVBFOworCit0eXBlZGVmIGVudW0gX1NFQ19PTVhfU1VQUE9SVEZPUk1BVF9UWVBFCit7CisgICAgc3VwcG9ydEZvcm1hdF8wID0gMHgwMCwKKyAgICBzdXBwb3J0Rm9ybWF0XzEsCisgICAgc3VwcG9ydEZvcm1hdF8yLAorICAgIHN1cHBvcnRGb3JtYXRfMworfSBTRUNfT01YX1NVUFBPUlRGT1JNQVRfVFlQRTsKKworCisvKiBmb3IgQW5kcm9pZCAqLwordHlwZWRlZiBzdHJ1Y3QgX09NWENvbXBvbmVudENhcGFiaWxpdHlGbGFnc1R5cGUKK3sKKyAgICAvKiBPTVggQ09NUE9ORU5UIENBUEFCSUxJVFkgUkVMQVRFRCBNRU1CRVJTICovCisgICAgT01YX0JPT0wgaUlzT01YQ29tcG9uZW50TXVsdGlUaHJlYWRlZDsKKyAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNFeHRlcm5hbE91dHB1dEJ1ZmZlckFsbG9jOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c0V4dGVybmFsSW5wdXRCdWZmZXJBbGxvYzsKKyAgICBPTVhfQk9PTCBpT01YQ29tcG9uZW50U3VwcG9ydHNNb3ZhYmxlSW5wdXRCdWZmZXJzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRTdXBwb3J0c1BhcnRpYWxGcmFtZXM7CisgICAgT01YX0JPT0wgaU9NWENvbXBvbmVudFVzZXNOQUxTdGFydENvZGVzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRDYW5IYW5kbGVJbmNvbXBsZXRlRnJhbWVzOworICAgIE9NWF9CT09MIGlPTVhDb21wb25lbnRVc2VzRnVsbEFWQ0ZyYW1lczsKK30gT01YQ29tcG9uZW50Q2FwYWJpbGl0eUZsYWdzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PTVhfVklERU9fUFJPRklMRUxFVkVMCit7CisgICAgT01YX1MzMiAgcHJvZmlsZTsKKyAgICBPTVhfUzMyICBsZXZlbDsKK30gU0VDX09NWF9WSURFT19QUk9GSUxFTEVWRUw7CisKKworI2lmbmRlZiBfX09NWF9FWFBPUlRTCisjZGVmaW5lIF9fT01YX0VYUE9SVFMKKyNkZWZpbmUgU0VDX0VYUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNkZWZpbmUgU0VDX0lNUE9SVF9SRUYgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb214X2luY2x1ZGUvc2VjL1NFQ19PTVhfTWFjcm9zLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL3NlYy9TRUNfT01YX01hY3Jvcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZWJjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29teF9pbmNsdWRlL3NlYy9TRUNfT01YX01hY3Jvcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICBTRUNfT01YX01hY3Jvcy5oCisgKiBAYnJpZWYgICAgTWFjcm9zCisgKiBAYXV0aG9yICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09NWF9NQUNST1MKKyNkZWZpbmUgU0VDX09NWF9NQUNST1MKKworI2luY2x1ZGUgIlNFQ19PTVhfRGVmLmgiCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisKKworLyoKKyAqIE1BQ1JPUworICovCisjZGVmaW5lIEFMSUdOX1RPXzMyQih4KSAgICgoKCh4KSArICgxIDw8ICA1KSAtIDEpID4+ICA1KSA8PCAgNSkKKyNkZWZpbmUgQUxJR05fVE9fMTI4Qih4KSAgKCgoKHgpICsgKDEgPDwgIDcpIC0gMSkgPj4gIDcpIDw8ICA3KQorI2RlZmluZSBBTElHTl9UT184S0IoeCkgICAoKCgoeCkgKyAoMSA8PCAxMykgLSAxKSA+PiAxMykgPDwgMTMpCisKKyNkZWZpbmUgSU5JVF9TRVRfU0laRV9WRVJTSU9OKF9zdHJ1Y3RfLCBfc3RydWN0VHlwZV8pICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNFQ19PU0FMX01lbXNldCgoX3N0cnVjdF8pLCAwLCBzaXplb2YoX3N0cnVjdFR5cGVfKSk7ICAgICAgIFwKKyAgICAgICAgKF9zdHJ1Y3RfKS0+blNpemUgPSBzaXplb2YoX3N0cnVjdFR5cGVfKTsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoX3N0cnVjdF8pLT5uVmVyc2lvbi5zLm5WZXJzaW9uTWFqb3IgPSBWRVJTSU9OTUFKT1JfTlVNQkVSOyBcCisgICAgICAgIChfc3RydWN0XyktPm5WZXJzaW9uLnMublZlcnNpb25NaW5vciA9IFZFUlNJT05NSU5PUl9OVU1CRVI7IFwKKyAgICAgICAgKF9zdHJ1Y3RfKS0+blZlcnNpb24ucy5uUmV2aXNpb24gPSBSRVZJU0lPTl9OVU1CRVI7ICAgICAgICAgXAorICAgICAgICAoX3N0cnVjdF8pLT5uVmVyc2lvbi5zLm5TdGVwID0gU1RFUF9OVU1CRVI7ICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCkKKworLyoKKyAqIFBvcnQgU3BlY2lmaWMKKyAqLworI2RlZmluZSBTRUNfVFVOTkVMX0VTVEFCTElTSEVEIDB4MDAwMQorI2RlZmluZSBTRUNfVFVOTkVMX0lTX1NVUFBMSUVSIDB4MDAwMgorCisjZGVmaW5lIENIRUNLX1BPUlRfQkVJTkdfRkxVU0hFRChwb3J0KSAgICAgICAgICAgICAgICAgKHBvcnQtPmJJc1BvcnRGbHVzaGVkID09IE9NWF9UUlVFKQorI2RlZmluZSBDSEVDS19QT1JUX0JFSU5HX0RJU0FCTEVEKHBvcnQpICAgICAgICAgICAgICAgIChwb3J0LT5iSXNQb3J0RGlzYWJsZWQgPT0gT01YX1RSVUUpCisjZGVmaW5lIENIRUNLX1BPUlRfRU5BQkxFRChwb3J0KSAgICAgICAgICAgICAgICAgICAgICAgKHBvcnQtPnBvcnREZWZpbml0aW9uLmJFbmFibGVkID09IE9NWF9UUlVFKQorI2RlZmluZSBDSEVDS19QT1JUX1BPUFVMQVRFRChwb3J0KSAgICAgICAgICAgICAgICAgICAgIChwb3J0LT5wb3J0RGVmaW5pdGlvbi5iUG9wdWxhdGVkID09IE9NWF9UUlVFKQorI2RlZmluZSBDSEVDS19QT1JUX1RVTk5FTEVEKHBvcnQpICAgICAgICAgICAgICAgICAgICAgIChwb3J0LT50dW5uZWxGbGFncyAmIFNFQ19UVU5ORUxfRVNUQUJMSVNIRUQpCisjZGVmaW5lIENIRUNLX1BPUlRfQlVGRkVSX1NVUFBMSUVSKHBvcnQpICAgICAgICAgICAgICAgKHBvcnQtPnR1bm5lbEZsYWdzICYgU0VDX1RVTk5FTF9JU19TVVBQTElFUikKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvQW5kcm9pZC5tayBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjAxNDkKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvQW5kcm9pZC5tawpAQCAtMCwwICsxLDM4IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKKworTE9DQUxfU1JDX0ZJTEVTIDo9IFwKKwlTRUNfT1NBTF9FdmVudC5jIFwKKwlTRUNfT1NBTF9RdWV1ZS5jIFwKKwlTRUNfT1NBTF9FVEMuYyBcCisJU0VDX09TQUxfTXV0ZXguYyBcCisJU0VDX09TQUxfVGhyZWFkLmMgXAorCVNFQ19PU0FMX01lbW9yeS5jIFwKKwlTRUNfT1NBTF9TZW1hcGhvcmUuYyBcCisJU0VDX09TQUxfTGlicmFyeS5jIFwKKwlTRUNfT1NBTF9Mb2cuYyBcCisJU0VDX09TQUxfQnVmZmVyLmNwcAorCisKK0xPQ0FMX01PRFVMRSA6PSBsaWJzZWNvc2FsCisKK0xPQ0FMX0NGTEFHUyA6PQorCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9CisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliY3V0aWxzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlidXRpbHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ1aSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmhhcmR3YXJlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGliYW5kcm9pZF9ydW50aW1lCisKK0xPQ0FMX0NfSU5DTFVERVMgOj0gJChTRUNfT01YX0lOQykva2hyb25vcyBcCisJJChTRUNfT01YX0lOQykvc2VjIFwKKwkkKFNFQ19PTVhfVE9QKS9zZWNfb3NhbCBcCisJJChTRUNfT01YX0NPTVBPTkVOVCkvY29tbW9uIFwKKwkkKFNFQ19PTVhfVE9QKS8uLi8uLi9pbmNsdWRlIFwKKwkkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZQorCitpbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfQnVmZmVyLmNwcCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9CdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOGY3MDIKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfQnVmZmVyLmNwcApAQCAtMCwwICsxLDQ1NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9CdWZmZXIuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqICAgICAgICAgICAgICBKaW5zdW5nIFlhbmcgKGpzZ29vZC55YW5nQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMC4yCisgKiBAaGlzdG9yeQorICogICAyMDExLjUuMTUgOiBDcmVhdGUKKyAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSAiU0VDX09NWF9EZWYuaCIKKyNpbmNsdWRlICJTRUNfT01YX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1NlbWFwaG9yZS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0J1ZmZlci5oIgorI2luY2x1ZGUgIlNFQ19PTVhfQmFzZWNvbXBvbmVudC5oIgorCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyTWFwcGVyLmg+CisjaW5jbHVkZSA8dWkvUmVjdC5oPgorI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KKyNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlICJoYWxfcHVibGljLmgiCisKKyNkZWZpbmUgSEFMX1BJWEVMX0ZPUk1BVF9DMTEwX05WMTIgICAgICAgICAgMHgxMDAKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKworc3RydWN0IEFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zIHsKKyAgICBPTVhfVTMyIG5TaXplOworICAgIE9NWF9WRVJTSU9OVFlQRSBuVmVyc2lvbjsKKyAgICBPTVhfVTMyIG5Qb3J0SW5kZXg7Cit9OworCisjaWZkZWYgVVNFX0FORFJPSURfRVhURU5TSU9OCitPTVhfRVJST1JUWVBFIGNoZWNrVmVyc2lvbkFOQihPTVhfUFRSIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX1ZFUlNJT05UWVBFKiB2ZXJzaW9uID0gTlVMTDsKKworCisgICAgQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgKnBBTkJQOworICAgIHBBTkJQID0gKEFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworCisgICAgdmVyc2lvbiA9IChPTVhfVkVSU0lPTlRZUEUqKSgoY2hhciopcEFOQlAgKyBzaXplb2YoT01YX1UzMikpOworICAgIGlmICgqKChPTVhfVTMyKilwQU5CUCkgPD0gc2l6ZW9mKEFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zKSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHZlcnNpb24tPnMublZlcnNpb25NYWpvciAhPSBWRVJTSU9OTUFKT1JfTlVNQkVSIHx8CisgICAgICAgIHZlcnNpb24tPnMublZlcnNpb25NaW5vciAhPSBWRVJTSU9OTUlOT1JfTlVNQkVSKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclZlcnNpb25NaXNtYXRjaDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX1UzMiBjaGVja1BvcnRJbmRleEFOQihPTVhfUFRSIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSkKK3sKKyAgICBBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyAqcEFOQlA7CisgICAgcEFOQlAgPSAoQW5kcm9pZE5hdGl2ZUJ1ZmZlcnNQYXJhbXMgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICByZXR1cm4gcEFOQlAtPm5Qb3J0SW5kZXg7Cit9CisKK09NWF9VMzIgZ2V0TWV0YWRhdGFCdWZmZXJUeXBlKGNvbnN0IHVpbnQ4X3QgKnB0cikKK3sKKyAgICBPTVhfVTMyIHR5cGUgPSAqKE9NWF9VMzIgKikgcHRyOworICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZ2V0TWV0YWRhdGFCdWZmZXJUeXBlOiAlbGQiLCB0eXBlKTsKKyAgICByZXR1cm4gdHlwZTsKK30KKworT01YX1UzMiBnZXRWQUREUmZyb21BTkIoT01YX1BUUiBwVW5yZWFkYWJsZUJ1ZmZlciwgT01YX1UzMiBXaWR0aCwgT01YX1UzMiBIZWlnaHQsIHZvaWQgKnBWaXJBZGRyc1tdKQoreworICAgIE9NWF9VMzIgcmV0ID0gMDsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmOworICAgIHZvaWQgKnJlYWRhYmxlQnVmZmVyOworICAgIEdyYXBoaWNCdWZmZXJNYXBwZXIgJm1hcHBlciA9IEdyYXBoaWNCdWZmZXJNYXBwZXI6OmdldCgpOworICAgIFJlY3QgYm91bmRzKFdpZHRoLCBIZWlnaHQpOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgYnVmID0gKGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICopcFVucmVhZGFibGVCdWZmZXI7CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJwVW5yZWFkYWJsZUJ1ZmZlcjoweCV4LCBidWY6MHgleCwgYnVmLT5oYW5kbGU6MHgleCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBVbnJlYWRhYmxlQnVmZmVyLCBidWYsIGJ1Zi0+aGFuZGxlKTsKKworICAgIHJldCA9IG1hcHBlci5sb2NrKGJ1Zi0+aGFuZGxlLCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCBib3VuZHMsIHBWaXJBZGRycyk7CisgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX0VSUk9SLCAibWFwcGVyLmxvY2sgRXJyb3IsIEVycm9yIGNvZGU6JWQiLCByZXQpOworICAgIH0KKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX1UzMiBwdXRWQUREUnRvQU5CKE9NWF9QVFIgcFVucmVhZGFibGVCdWZmZXIpCit7CisgICAgYW5kcm9pZF9uYXRpdmVfYnVmZmVyX3QgKmJ1ZjsKKyAgICB2b2lkICpyZWFkYWJsZUJ1ZmZlcjsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBHcmFwaGljQnVmZmVyTWFwcGVyICZtYXBwZXIgPSBHcmFwaGljQnVmZmVyTWFwcGVyOjpnZXQoKTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGJ1ZiA9IChhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqKXBVbnJlYWRhYmxlQnVmZmVyOworCisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiBtYXBwZXIudW5sb2NrKGJ1Zi0+aGFuZGxlKTsKK30KKworT01YX0VSUk9SVFlQRSBlbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBFbmFibGVBbmRyb2lkTmF0aXZlQnVmZmVyc1BhcmFtcyAqcGVhbmJwOworCisgICAgRnVuY3Rpb25JbigpOworCisgICAgaWYgKGhDb21wb25lbnQgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcE9NWENvbXBvbmVudCA9IChPTVhfQ09NUE9ORU5UVFlQRSAqKWhDb21wb25lbnQ7CisgICAgaWYgKHBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBTRUNDb21wb25lbnQgPSAoU0VDX09NWF9CQVNFQ09NUE9ORU5UICopcE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGU7CisgICAgcGVhbmJwID0gKEVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXJzUGFyYW1zICopQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlOworICAgIHBTRUNQb3J0ID0gJnBTRUNDb21wb25lbnQtPnBTRUNQb3J0W3BlYW5icC0+blBvcnRJbmRleF07CisKKyAgICBpZiAocGVhbmJwLT5lbmFibGUgPT0gT01YX0ZBTFNFKSB7CisgICAgICAgIFNFQ19PU0FMX0xvZyhTRUNfTE9HX1RSQUNFLCAiZGlzYWJsZSBBbmRyb2lkTmF0aXZlQnVmZmVyIik7CisgICAgICAgIHBTRUNQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImVuYWJsZSBBbmRyb2lkTmF0aXZlQnVmZmVyIik7CisgICAgICAgIHBTRUNQb3J0LT5iVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlciA9IE9NWF9UUlVFOworICAgICAgICBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24uZm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IChPTVhfQ09MT1JfRk9STUFUVFlQRSlPTVhfU0VDX0NPTE9SX0Zvcm1hdEFOQllVVjQyMFNlbWlQbGFuYXI7CisgICAgfQorCisgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBnZXRBbmRyb2lkTmF0aXZlQnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgKnBnYW5icDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIHBnYW5icCA9IChHZXRBbmRyb2lkTmF0aXZlQnVmZmVyVXNhZ2VQYXJhbXMgKilDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmU7CisKKyAgICBwZ2FuYnAtPm5Vc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU47CisKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFVzZUJ1ZmZlckFOQigKKyAgICBPTVhfSU4gT01YX0hBTkRMRVRZUEUgICAgICAgICAgICBoQ29tcG9uZW50LAorICAgIE9NWF9JTk9VVCBPTVhfQlVGRkVSSEVBREVSVFlQRSAqKnBwQnVmZmVySGRyLAorICAgIE9NWF9JTiBPTVhfVTMyICAgICAgICAgICAgICAgICAgIG5Qb3J0SW5kZXgsCisgICAgT01YX0lOIE9NWF9QVFIgICAgICAgICAgICAgICAgICAgcEFwcFByaXZhdGUsCisgICAgT01YX0lOIE9NWF9VMzIgICAgICAgICAgICAgICAgICAgblNpemVCeXRlcywKKyAgICBPTVhfSU4gT01YX1U4ICAgICAgICAgICAgICAgICAgICpwQnVmZmVyKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgICp0ZW1wX2J1ZmZlckhlYWRlciA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICBpID0gMDsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworCisgICAgcFNFQ1BvcnQgPSAmcFNFQ0NvbXBvbmVudC0+cFNFQ1BvcnRbblBvcnRJbmRleF07CisgICAgaWYgKG5Qb3J0SW5kZXggPj0gcFNFQ0NvbXBvbmVudC0+cG9ydFBhcmFtLm5Qb3J0cykgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHBTRUNQb3J0LT5wb3J0U3RhdGUgIT0gT01YX1N0YXRlSWRsZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JJbmNvcnJlY3RTdGF0ZU9wZXJhdGlvbjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChDSEVDS19QT1JUX1RVTk5FTEVEKHBTRUNQb3J0KSAmJiBDSEVDS19QT1JUX0JVRkZFUl9TVVBQTElFUihwU0VDUG9ydCkpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUG9ydEluZGV4OworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgdGVtcF9idWZmZXJIZWFkZXIgPSAoT01YX0JVRkZFUkhFQURFUlRZUEUgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisgICAgaWYgKHRlbXBfYnVmZmVySGVhZGVyID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIFNFQ19PU0FMX01lbXNldCh0ZW1wX2J1ZmZlckhlYWRlciwgMCwgc2l6ZW9mKE9NWF9CVUZGRVJIRUFERVJUWVBFKSk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLm5CdWZmZXJDb3VudEFjdHVhbDsgaSsrKSB7CisgICAgICAgIGlmIChwU0VDUG9ydC0+YnVmZmVyU3RhdGVBbGxvY2F0ZVtpXSA9PSBCVUZGRVJfU1RBVEVfRlJFRSkgeworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlckhlYWRlcltpXSA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcFNFQ1BvcnQtPmJ1ZmZlclN0YXRlQWxsb2NhdGVbaV0gPSAoQlVGRkVSX1NUQVRFX0FTU0lHTkVEIHwgSEVBREVSX1NUQVRFX0FMTE9DQVRFRCk7CisgICAgICAgICAgICBJTklUX1NFVF9TSVpFX1ZFUlNJT04odGVtcF9idWZmZXJIZWFkZXIsIE9NWF9CVUZGRVJIRUFERVJUWVBFKTsKKyAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5wQnVmZmVyICAgICAgICA9IHBCdWZmZXI7CisgICAgICAgICAgICB0ZW1wX2J1ZmZlckhlYWRlci0+bkFsbG9jTGVuICAgICAgPSBuU2l6ZUJ5dGVzOworICAgICAgICAgICAgdGVtcF9idWZmZXJIZWFkZXItPnBBcHBQcml2YXRlICAgID0gcEFwcFByaXZhdGU7CisgICAgICAgICAgICBpZiAoblBvcnRJbmRleCA9PSBJTlBVVF9QT1JUX0lOREVYKQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uSW5wdXRQb3J0SW5kZXggPSBJTlBVVF9QT1JUX0lOREVYOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHRlbXBfYnVmZmVySGVhZGVyLT5uT3V0cHV0UG9ydEluZGV4ID0gT1VUUFVUX1BPUlRfSU5ERVg7CisKKyAgICAgICAgICAgIHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSsrOworICAgICAgICAgICAgaWYgKHBTRUNQb3J0LT5hc3NpZ25lZEJ1ZmZlck51bSA9PSBwU0VDUG9ydC0+cG9ydERlZmluaXRpb24ubkJ1ZmZlckNvdW50QWN0dWFsKSB7CisgICAgICAgICAgICAgICAgcFNFQ1BvcnQtPnBvcnREZWZpbml0aW9uLmJQb3B1bGF0ZWQgPSBPTVhfVFJVRTsKKyAgICAgICAgICAgICAgICAvKiBTRUNfT1NBTF9NdXRleExvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KHBTRUNQb3J0LT5sb2FkZWRSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgLyogU0VDX09TQUxfTXV0ZXhVbmxvY2socFNFQ0NvbXBvbmVudC0+Y29tcE11dGV4KTsgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwcEJ1ZmZlckhkciA9IHRlbXBfYnVmZmVySGVhZGVyOworICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX0ZyZWUodGVtcF9idWZmZXJIZWFkZXIpOworICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSB1c2VBbmRyb2lkTmF0aXZlQnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisgICAgT01YX1UzMiAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSAwOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgICBVc2VBbmRyb2lkTmF0aXZlQnVmZmVyUGFyYW1zICpwdWFuYnA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBwdWFuYnAgPSAoVXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlclBhcmFtcyAqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKworICAgIE9NWF9QVFIgYnVmZmVyID0gKHZvaWQgKilwdWFuYnAtPm5hdGl2ZUJ1ZmZlci5nZXQoKTsKKyAgICBhbmRyb2lkX25hdGl2ZV9idWZmZXJfdCAqYnVmID0gKGFuZHJvaWRfbmF0aXZlX2J1ZmZlcl90ICopYnVmZmVyOworICAgIGJ1ZldpZHRoID0gKChidWYtPndpZHRoICsgMTUpIC8gMTYpICogMTY7CisgICAgYnVmSGVpZ2h0ID0gKChidWYtPmhlaWdodCArIDE1KSAvIDE2KSAqIDE2OworICAgIGZyYW1lU2l6ZSA9IChidWZXaWR0aCAqIGJ1ZkhlaWdodCAqIDMpIC8gMjsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImJ1ZmZlcjoweCV4LCBidWY6MHgleCwgYnVmLT5oYW5kbGU6MHgleCIsIGJ1ZmZlciwgYnVmLCBidWYtPmhhbmRsZSk7CisKKyAgICByZXQgPSBVc2VCdWZmZXJBTkIoaENvbXBvbmVudCwgcHVhbmJwLT5idWZmZXJIZWFkZXIsIHB1YW5icC0+blBvcnRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVhbmJwLT5wQXBwUHJpdmF0ZSwgZnJhbWVTaXplLCAoT01YX1U4ICopYnVmZmVyKTsKKworRVhJVDoKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBlbmFibGVTdG9yZU1ldGFEYXRhSW5CdWZmZXJzKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKQoreworICAgIE9NWF9FUlJPUlRZUEUgICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBPTVhfQ09NUE9ORU5UVFlQRSAgICAgKnBPTVhDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqcFNFQ0NvbXBvbmVudCA9IE5VTEw7CisgICAgU0VDX09NWF9CQVNFUE9SVCAgICAgICpwU0VDUG9ydCA9IE5VTEw7CisKKyAgICBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzUGFyYW1zICpwU3RvcmVNZXRhRGF0YTsKKworICAgIEZ1bmN0aW9uSW4oKTsKKworICAgIGlmIChoQ29tcG9uZW50ID09IE5VTEwpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorICAgIHBPTVhDb21wb25lbnQgPSAoT01YX0NPTVBPTkVOVFRZUEUgKiloQ29tcG9uZW50OworICAgIGlmIChwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZSA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwU0VDQ29tcG9uZW50ID0gKFNFQ19PTVhfQkFTRUNPTVBPTkVOVCAqKXBPTVhDb21wb25lbnQtPnBDb21wb25lbnRQcml2YXRlOworICAgIHBTdG9yZU1ldGFEYXRhID0gKFN0b3JlTWV0YURhdGFJbkJ1ZmZlcnNQYXJhbXMqKUNvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZTsKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtwU3RvcmVNZXRhRGF0YS0+blBvcnRJbmRleF07CisKKyAgICBpZiAocFN0b3JlTWV0YURhdGEtPmJTdG9yZU1ldGFEYXRhID09IE9NWF9GQUxTRSkgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImRpc2FibGUgU3RvcmVNZXRhRGF0YUluQnVmZmVycyIpOworICAgICAgICBwU0VDUG9ydC0+YlN0b3JlTWV0YURhdGFJbkJ1ZmZlciA9IE9NWF9GQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImVuYWJsZSBTdG9yZU1ldGFEYXRhSW5CdWZmZXJzIik7CisgICAgICAgIHBTRUNQb3J0LT5iU3RvcmVNZXRhRGF0YUluQnVmZmVyID0gT01YX1RSVUU7CisgICAgfQorCitFWElUOgorICAgIEZ1bmN0aW9uT3V0KCk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfQk9PTCBpc01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UoT01YX0JZVEUgcElucHV0RGF0YUJ1ZmZlcikKK3sKKyAgICBPTVhfVTMyIHR5cGUgPSBnZXRNZXRhZGF0YUJ1ZmZlclR5cGUocElucHV0RGF0YUJ1ZmZlcik7CisKKyAgICBpZiAodHlwZSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkKKyAgICAgICAgcmV0dXJuIE9NWF9UUlVFOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIE9NWF9GQUxTRTsKK30KKworT01YX0VSUk9SVFlQRSBwcmVwcm9jZXNzTWV0YURhdGFJbkJ1ZmZlcnMoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX0JZVEUgcElucHV0RGF0YUJ1ZmZlciwgQlVGRkVSX0FERFJFU1NfSU5GTyAqcElucHV0SW5mbykKK3sKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgT01YX0NPTVBPTkVOVFRZUEUgICAgICpwT01YQ29tcG9uZW50ID0gTlVMTDsKKyAgICBTRUNfT01YX0JBU0VDT01QT05FTlQgKnBTRUNDb21wb25lbnQgPSBOVUxMOworICAgIFNFQ19PTVhfQkFTRVBPUlQgICAgICAqcFNFQ1BvcnQgPSBOVUxMOworICAgIE9NWF9VMzIgICAgICAgICAgICAgICAgdHlwZSA9IDA7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoaENvbXBvbmVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKyAgICBwT01YQ29tcG9uZW50ID0gKE9NWF9DT01QT05FTlRUWVBFICopaENvbXBvbmVudDsKKyAgICBpZiAocE9NWENvbXBvbmVudC0+cENvbXBvbmVudFByaXZhdGUgPT0gTlVMTCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgcFNFQ0NvbXBvbmVudCA9IChTRUNfT01YX0JBU0VDT01QT05FTlQgKilwT01YQ29tcG9uZW50LT5wQ29tcG9uZW50UHJpdmF0ZTsKKyAgICBwU0VDUG9ydCA9ICZwU0VDQ29tcG9uZW50LT5wU0VDUG9ydFtJTlBVVF9QT1JUX0lOREVYXTsKKworICAgIHR5cGUgPSBnZXRNZXRhZGF0YUJ1ZmZlclR5cGUocElucHV0RGF0YUJ1ZmZlcik7CisgICAgaWYgKHR5cGUgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUNhbWVyYVNvdXJjZSkgeworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBJbnB1dEluZm8tPllQaHlBZGRyLCBwSW5wdXREYXRhQnVmZmVyICsgNCwgc2l6ZW9mKHZvaWQgKikpOworICAgICAgICBTRUNfT1NBTF9NZW1jcHkoJnBJbnB1dEluZm8tPkNQaHlBZGRyLCBwSW5wdXREYXRhQnVmZmVyICsgNCArIHNpemVvZih2b2lkICopLCBzaXplb2Yodm9pZCAqKSk7CisgICAgfSBlbHNlIGlmICh0eXBlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKXsKKyAgICAgICAgSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190ICptb2R1bGUgPSAoSU1HX2dyYWxsb2NfbW9kdWxlX3B1YmxpY190ICopcFNFQ1BvcnQtPnBJTUdHcmFsbG9jTW9kdWxlOworICAgICAgICBPTVhfUFRSIHBVbnJlYWRhYmxlQnVmZmVyID0gTlVMTDsKKyAgICAgICAgT01YX1BUUiBwUmVhZGFibGVCdWZmZXIgPSBOVUxMOworICAgICAgICBPTVhfUFRSIHBWaXJBZGRyc1szXTsKKyAgICAgICAgaW50IGVyciA9IDA7CisKKyAgICAgICAgcFZpckFkZHJzWzBdID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVZpckFkZHI7CisgICAgICAgIHBWaXJBZGRyc1sxXSA9IHBTRUNDb21wb25lbnQtPnByb2Nlc3NEYXRhW0lOUFVUX1BPUlRfSU5ERVhdLnNwZWNpZmljQnVmZmVySGVhZGVyLkNWaXJBZGRyOworICAgICAgICBwVmlyQWRkcnNbMl0gPSBOVUxMOworCisgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgeworICAgICAgICAgICAgZXJyID0gaHdfZ2V0X21vZHVsZShHUkFMTE9DX0hBUkRXQVJFX01PRFVMRV9JRCwgKGNvbnN0IGh3X21vZHVsZV90ICoqKSZtb2R1bGUpOworICAgICAgICAgICAgaWYoZXJyKSB7CisgICAgICAgICAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfRVJST1IsICJod19nZXRfbW9kdWxlIGZhaWxlZCAoZXJyPSVkKVxuIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcFNFQ1BvcnQtPnBJTUdHcmFsbG9jTW9kdWxlID0gKE9NWF9QVFIpbW9kdWxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvKiAgICAgSU1HIENTQyBSR0IgdG8gTlYxMiAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooKGJ1ZmZlcl9oYW5kbGVfdCAqKSAocElucHV0RGF0YUJ1ZmZlciArIDQpKTsKKyAgICAgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJidWZmZXIgaGFuZGxlICVwKVxuIiwgYnVmKTsKKyAgICAgICAgZXJyID0gbW9kdWxlLT5CbGl0KG1vZHVsZSwgYnVmLCBwVmlyQWRkcnMsIEhBTF9QSVhFTF9GT1JNQVRfQzExMF9OVjEyKTsKKyAgICAgICAgaWYoZXJyKSB7CisgICAgICAgICAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19FUlJPUiwgIm1vZHVsZS0+QmxpdCgpIGZhaWxlZCAoZXJyPSVkKVxuIiwgZXJyKTsKKyAgICAgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgfQorCisgICAgICAgIHBJbnB1dEluZm8tPllQaHlBZGRyID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuWVBoeUFkZHI7CisgICAgICAgIHBJbnB1dEluZm8tPkNQaHlBZGRyID0gcFNFQ0NvbXBvbmVudC0+cHJvY2Vzc0RhdGFbSU5QVVRfUE9SVF9JTkRFWF0uc3BlY2lmaWNCdWZmZXJIZWFkZXIuQ1BoeUFkZHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yTm90SW1wbGVtZW50ZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBpc1R2T3V0RW5hYmxlZCgpIHsKKyAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgcHJvcGVydHlfZ2V0KCJpbml0LnN2Yy50dm91dGhhY2siLCB2YWx1ZSwgIiIpOworICAgIHJldHVybiAoc3RyY21wKHZhbHVlLCAicnVubmluZyIpID09IDApOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9CdWZmZXIuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9CdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDk2YmZlCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0J1ZmZlci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfQnVmZmVyLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiAgICAgICAgICAgICAgSmluc3VuZyBZYW5nIChqc2dvb2QueWFuZ0BzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAuMgorICogQGhpc3RvcnkKKyAqICAgMjAxMS41LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9CVUZGRVIKKyNkZWZpbmUgU0VDX09TQUxfQlVGRkVSCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgIk9NWF9UeXBlcy5oIgorCit0eXBlZGVmIHN0cnVjdCB7CisgICAgdm9pZCAqWVBoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBZCisgICAgdm9pZCAqQ1BoeUFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOL09VVF0gcGh5c2ljYWwgYWRkcmVzcyBvZiBDYkNyCisgICAgdm9pZCAqWVZpckFkZHI7ICAgICAgICAgICAgICAgICAgICAgLy8gW0lOL09VVF0gdmlydHVhbCBhZGRyZXNzIG9mIFkKKyAgICB2b2lkICpDVmlyQWRkcjsgICAgICAgICAgICAgICAgICAgICAvLyBbSU4vT1VUXSB2aXJ0dWFsIGFkZHJlc3Mgb2YgQ2JDcgorICAgIGludCBZU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFtJTi9PVVRdIGlucHV0IHNpemUgb2YgWSBkYXRhCisgICAgaW50IENTaXplOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gW0lOL09VVF0gaW5wdXQgc2l6ZSBvZiBDYkNyIGRhdGEKK30gQlVGRkVSX0FERFJFU1NfSU5GTzsKKworCitPTVhfRVJST1JUWVBFIGNoZWNrVmVyc2lvbkFOQihPTVhfUFRSIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CitPTVhfVTMyIGNoZWNrUG9ydEluZGV4QU5CKE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKK09NWF9VMzIgZ2V0TWV0YWRhdGFCdWZmZXJUeXBlKGNvbnN0IHVpbnQ4X3QgKnB0cik7CitPTVhfRVJST1JUWVBFIGVuYWJsZUFuZHJvaWROYXRpdmVCdWZmZXIoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1BUUiBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0VSUk9SVFlQRSBnZXRBbmRyb2lkTmF0aXZlQnVmZmVyKE9NWF9IQU5ETEVUWVBFIGhDb21wb25lbnQsIE9NWF9QVFIgQ29tcG9uZW50UGFyYW1ldGVyU3RydWN0dXJlKTsKK09NWF9FUlJPUlRZUEUgdXNlQW5kcm9pZE5hdGl2ZUJ1ZmZlcihPTVhfSEFORExFVFlQRSBoQ29tcG9uZW50LCBPTVhfUFRSIENvbXBvbmVudFBhcmFtZXRlclN0cnVjdHVyZSk7CitPTVhfVTMyIGdldFZBRERSZnJvbUFOQihPTVhfUFRSIHBVbnJlYWRhYmxlQnVmZmVyLCBPTVhfVTMyIFdpZHRoLCBPTVhfVTMyIEhlaWdodCwgdm9pZCAqdmFkZHJlc3NbXSk7CitPTVhfVTMyIHB1dFZBRERSdG9BTkIoT01YX1BUUiBwVW5yZWFkYWJsZUJ1ZmZlcik7CitPTVhfRVJST1JUWVBFIGVuYWJsZVN0b3JlTWV0YURhdGFJbkJ1ZmZlcnMoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX1BUUiBDb21wb25lbnRQYXJhbWV0ZXJTdHJ1Y3R1cmUpOworT01YX0JPT0wgaXNNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKE9NWF9CWVRFIHBJbnB1dERhdGFCdWZmZXIpOworT01YX0VSUk9SVFlQRSBwcmVwcm9jZXNzTWV0YURhdGFJbkJ1ZmZlcnMoT01YX0hBTkRMRVRZUEUgaENvbXBvbmVudCwgT01YX0JZVEUgcElucHV0RGF0YUJ1ZmZlciwgQlVGRkVSX0FERFJFU1NfSU5GTyAqcElucHV0SW5mbyk7CisKK2ludCBpc1R2T3V0RW5hYmxlZCgpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0VUQy5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0VUQy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjgzNTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRVRDLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfRVRDLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX0VUQy5oIgorCisKKyNpZm5kZWYgSEFWRV9HRVRMSU5FCitzc2l6ZV90IGdldGxpbmUoY2hhciAqKnBwTGluZSwgc2l6ZV90ICpwTGVuLCBGSUxFICpwU3RyZWFtKQoreworICAgIGNoYXIgKnBDdXJyZW50UG9pbnRlciA9IE5VTEw7CisgICAgc2l6ZV90IGNvbnN0IGNodW5rID0gNTEyOworCisgICAgc2l6ZV90IGRlZmF1bHRCdWZmZXJTaXplID0gY2h1bmsgKyAxOworICAgIHNpemVfdCByZXRTaXplID0gMDsKKworICAgIGlmICgqcHBMaW5lID09IE5VTEwpIHsKKyAgICAgICAgKnBwTGluZSA9IChjaGFyICopbWFsbG9jKGRlZmF1bHRCdWZmZXJTaXplKTsKKyAgICAgICAgaWYgKCpwcExpbmUgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0U2l6ZSA9IC0xOworICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgICpwTGVuID0gZGVmYXVsdEJ1ZmZlclNpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoKnBMZW4gPCBkZWZhdWx0QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgKnBwTGluZSA9IChjaGFyICopcmVhbGxvYygqcHBMaW5lLCBkZWZhdWx0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoKnBwTGluZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0U2l6ZSA9IC0xOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpwTGVuID0gZGVmYXVsdEJ1ZmZlclNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBzaXplX3QgcmVhZEJ5dGUgPSAwOworCisgICAgICAgIHBDdXJyZW50UG9pbnRlciA9ICpwcExpbmUgKyByZWFkQnl0ZTsKKworICAgICAgICBpID0gZnJlYWQocEN1cnJlbnRQb2ludGVyLCAxLCBjaHVuaywgcFN0cmVhbSk7CisgICAgICAgIGlmIChpIDwgY2h1bmsgJiYgZmVycm9yKHBTdHJlYW0pKSB7CisgICAgICAgICAgICByZXRTaXplID0gLTE7CisgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGogPCBpKSB7CisgICAgICAgICAgICArK2o7CisgICAgICAgICAgICBpZiAoKnBDdXJyZW50UG9pbnRlcisrID09IChjaGFyKSdcbicpIHsKKyAgICAgICAgICAgICAgICAqcEN1cnJlbnRQb2ludGVyID0gJ1wwJzsKKyAgICAgICAgICAgICAgICBpZiAoaiAhPSBpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmc2VlayhwU3RyZWFtLCBqIC0gaSwgU0VFS19DVVIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXRTaXplID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZmVvZihwU3RyZWFtKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZXJyKHBTdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWFkQnl0ZSArPSBqOworICAgICAgICAgICAgICAgIHJldFNpemUgPSByZWFkQnl0ZTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZWFkQnl0ZSArPSBqOworICAgICAgICBpZiAoZmVvZihwU3RyZWFtKSkgeworICAgICAgICAgICAgaWYgKHJlYWRCeXRlKSB7CisgICAgICAgICAgICAgICAgcmV0U2l6ZSA9IHJlYWRCeXRlOworICAgICAgICAgICAgICAgIGdvdG8gRVhJVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaSkgeworICAgICAgICAgICAgICAgIHJldFNpemUgPSAtMTsKKyAgICAgICAgICAgICAgICBnb3RvIEVYSVQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpID0gKChyZWFkQnl0ZSArIChjaHVuayAqIDIpKSAvIGNodW5rKSAqIGNodW5rOworICAgICAgICBpZiAoaSAhPSAqcExlbikgeworICAgICAgICAgICAgKnBwTGluZSA9IChjaGFyICopcmVhbGxvYygqcHBMaW5lLCBpKTsKKyAgICAgICAgICAgIGlmICgqcHBMaW5lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXRTaXplID0gLTE7CisgICAgICAgICAgICAgICAgZ290byBFWElUOworICAgICAgICB9CisgICAgICAgICAgICAqcExlbiA9IGk7CisgICAgICAgIH0KKyAgICB9CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldFNpemU7Cit9CisjZW5kaWYgLyogSEFWRV9HRVRMSU5FICovCisKK09NWF9QVFIgU0VDX09TQUxfU3RyY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMpCit7CisgICAgcmV0dXJuIHN0cmNweShkZXN0LCBzcmMpOworfQorCitPTVhfUFRSIFNFQ19PU0FMX1N0cm5jcHkoT01YX1BUUiBkZXN0LCBPTVhfUFRSIHNyYywgc2l6ZV90IG51bSkKK3sKKyAgICByZXR1cm4gc3RybmNweShkZXN0LCBzcmMsIG51bSk7Cit9CisKK09NWF9TMzIgU0VDX09TQUxfU3RyY21wKE9NWF9QVFIgc3RyMSwgT01YX1BUUiBzdHIyKQoreworICAgIHJldHVybiBzdHJjbXAoc3RyMSwgc3RyMik7Cit9CisKK09NWF9QVFIgU0VDX09TQUxfU3RyY2F0KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMpCit7CisgICAgcmV0dXJuIHN0cmNhdChkZXN0LCBzcmMpOworfQorCitzaXplX3QgU0VDX09TQUxfU3RybGVuKGNvbnN0IGNoYXIgKnN0cikKK3sKKyAgICByZXR1cm4gc3RybGVuKHN0cik7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRVRDLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRVRDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2ZWRlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9FVEMuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0VUQy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9FVEMKKyNkZWZpbmUgU0VDX09TQUxfRVRDCisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9QVFIgU0VDX09TQUxfU3RyY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMpOworT01YX1BUUiBTRUNfT1NBTF9TdHJuY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIHNpemVfdCBudW0pOworT01YX1MzMiBTRUNfT1NBTF9TdHJjbXAoT01YX1BUUiBzdHIxLCBPTVhfUFRSIHN0cjIpOworT01YX1BUUiBTRUNfT1NBTF9TdHJjYXQoT01YX1BUUiBkZXN0LCBPTVhfUFRSIHNyYyk7CitzaXplX3QgU0VDX09TQUxfU3RybGVuKGNvbnN0IGNoYXIgKnN0cik7Citzc2l6ZV90IGdldGxpbmUoY2hhciAqKnBwTGluZSwgc2l6ZV90ICpsZW4sIEZJTEUgKnN0cmVhbSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0V2ZW50LmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRXZlbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWIzY2EyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0V2ZW50LmMKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9FdmVudC5jCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX011dGV4LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfRXZlbnQuaCIKKworI3VuZGVmICBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX09TQUxfRVZFTlQiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TaWduYWxDcmVhdGUoT01YX0hBTkRMRVRZUEUgKmV2ZW50SGFuZGxlKQoreworICAgIFNFQ19PU0FMX1RIUkVBREVWRU5UICpldmVudDsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBldmVudCA9IChTRUNfT1NBTF9USFJFQURFVkVOVCAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX09TQUxfVEhSRUFERVZFTlQpKTsKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIFNFQ19PU0FMX01lbXNldChldmVudCwgMCwgc2l6ZW9mKFNFQ19PU0FMX1RIUkVBREVWRU5UKSk7CisgICAgZXZlbnQtPnNpZ25hbCA9IE9NWF9GQUxTRTsKKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4Q3JlYXRlKCZldmVudC0+bXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBTRUNfT1NBTF9GcmVlKGV2ZW50KTsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwdGhyZWFkX2NvbmRfaW5pdCgmZXZlbnQtPmNvbmRpdGlvbiwgTlVMTCkpIHsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUoZXZlbnQtPm11dGV4KTsKKyAgICAgICAgU0VDX09TQUxfRnJlZShldmVudCk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgICpldmVudEhhbmRsZSA9IChPTVhfSEFORExFVFlQRSlldmVudDsKKyAgICByZXQgPSBPTVhfRXJyb3JOb25lOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIGV2ZW50SGFuZGxlKQoreworICAgIFNFQ19PU0FMX1RIUkVBREVWRU5UICpldmVudCA9IChTRUNfT1NBTF9USFJFQURFVkVOVCAqKWV2ZW50SGFuZGxlOworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIGlmICghZXZlbnQpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhMb2NrKGV2ZW50LT5tdXRleCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGlmIChwdGhyZWFkX2NvbmRfZGVzdHJveSgmZXZlbnQtPmNvbmRpdGlvbikpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhVbmxvY2soZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgcmV0ID0gU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUoZXZlbnQtPm11dGV4KTsKKyAgICBpZiAocmV0ICE9IE9NWF9FcnJvck5vbmUpIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZShldmVudCk7CisKK0VYSVQ6CisgICAgcmV0dXJuIHJldDsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TaWduYWxSZXNldChPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSkKK3sKKyAgICBTRUNfT1NBTF9USFJFQURFVkVOVCAqZXZlbnQgPSAoU0VDX09TQUxfVEhSRUFERVZFTlQgKilldmVudEhhbmRsZTsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4TG9jayhldmVudC0+bXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBldmVudC0+c2lnbmFsID0gT01YX0ZBTFNFOworCisgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2soZXZlbnQtPm11dGV4KTsKKworRVhJVDoKKyAgICByZXR1cm4gcmV0OworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFNldChPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSkKK3sKKyAgICBTRUNfT1NBTF9USFJFQURFVkVOVCAqZXZlbnQgPSAoU0VDX09TQUxfVEhSRUFERVZFTlQgKilldmVudEhhbmRsZTsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4TG9jayhldmVudC0+bXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBldmVudC0+c2lnbmFsID0gT01YX1RSVUU7CisgICAgcHRocmVhZF9jb25kX3NpZ25hbCgmZXZlbnQtPmNvbmRpdGlvbik7CisKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhldmVudC0+bXV0ZXgpOworCitFWElUOgorICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsV2FpdChPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSwgT01YX1UzMiBtcykKK3sKKyAgICBTRUNfT1NBTF9USFJFQURFVkVOVCAqZXZlbnQgPSAoU0VDX09TQUxfVEhSRUFERVZFTlQgKilldmVudEhhbmRsZTsKKyAgICBPTVhfRVJST1JUWVBFICAgICAgICAgcmV0ID0gT01YX0Vycm9yTm9uZTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgdGltZW91dDsKKyAgICBzdHJ1Y3QgdGltZXZhbCAgICAgICAgbm93OworICAgIGludCAgICAgICAgICAgICAgICAgICBmdW5jcmV0ID0gMDsKKyAgICBPTVhfVTMyICAgICAgICAgICAgICAgdHZfdXM7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoIWV2ZW50KSB7CisgICAgICAgIHJldCA9IE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKyAgICAgICAgZ290byBFWElUOworICAgIH0KKworICAgIGdldHRpbWVvZmRheSgmbm93LCBOVUxMKTsKKworICAgIHR2X3VzID0gbm93LnR2X3VzZWMgKyBtcyAqIDEwMDA7CisgICAgdGltZW91dC50dl9zZWMgPSBub3cudHZfc2VjICsgdHZfdXMgLyAxMDAwMDAwOworICAgIHRpbWVvdXQudHZfbnNlYyA9ICh0dl91cyAlIDEwMDAwMDApICogMTAwMDsKKworICAgIHJldCA9IFNFQ19PU0FMX011dGV4TG9jayhldmVudC0+bXV0ZXgpOworICAgIGlmIChyZXQgIT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICBpZiAobXMgPT0gMCkgeworICAgICAgICBpZiAoIWV2ZW50LT5zaWduYWwpCisgICAgICAgICAgICByZXQgPSBPTVhfRXJyb3JUaW1lb3V0OworICAgIH0gZWxzZSBpZiAobXMgPT0gREVGX01BWF9XQUlUX1RJTUUpIHsKKyAgICAgICAgd2hpbGUgKCFldmVudC0+c2lnbmFsKQorICAgICAgICAgICAgcHRocmVhZF9jb25kX3dhaXQoJmV2ZW50LT5jb25kaXRpb24sIChwdGhyZWFkX211dGV4X3QgKikoZXZlbnQtPm11dGV4KSk7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgd2hpbGUgKCFldmVudC0+c2lnbmFsKSB7CisgICAgICAgICAgICBmdW5jcmV0ID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCgmZXZlbnQtPmNvbmRpdGlvbiwgKHB0aHJlYWRfbXV0ZXhfdCAqKShldmVudC0+bXV0ZXgpLCAmdGltZW91dCk7CisgICAgICAgICAgICBpZiAoKCFldmVudC0+c2lnbmFsKSAmJiAoZnVuY3JldCA9PSBFVElNRURPVVQpKSB7CisgICAgICAgICAgICAgICAgcmV0ID0gT01YX0Vycm9yVGltZW91dDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKGV2ZW50LT5tdXRleCk7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRXZlbnQuaCBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9FdmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MGQyY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfRXZlbnQuaApAQCAtMCwwICsxLDYxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0V2ZW50LmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX0VWRU5UCisjZGVmaW5lIFNFQ19PU0FMX0VWRU5UCisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjZGVmaW5lIERFRl9NQVhfV0FJVF9USU1FIDB4RkZGRkZGRkYKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19PU0FMX1RIUkVBREVWRU5UCit7CisgICAgT01YX0JPT0wgICAgICAgc2lnbmFsOworICAgIE9NWF9IQU5ETEVUWVBFIG11dGV4OworICAgIHB0aHJlYWRfY29uZF90IGNvbmRpdGlvbjsKK30gU0VDX09TQUxfVEhSRUFERVZFTlQ7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsQ3JlYXRlKE9NWF9IQU5ETEVUWVBFICpldmVudEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFRlcm1pbmF0ZShPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NpZ25hbFJlc2V0KE9NWF9IQU5ETEVUWVBFIGV2ZW50SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsU2V0KE9NWF9IQU5ETEVUWVBFIGV2ZW50SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2lnbmFsV2FpdChPTVhfSEFORExFVFlQRSBldmVudEhhbmRsZSwgT01YX1UzMiBtcyk7CisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTGlicmFyeS5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xpYnJhcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmFjNzEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xpYnJhcnkuYwpAQCAtMCwwICsxLDU0IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0xpYnJhcnkuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZGxmY24uaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX0xpYnJhcnkuaCIKKworCit2b2lkICpTRUNfT1NBTF9kbG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFnKQoreworICAgIHJldHVybiBkbG9wZW4oZmlsZW5hbWUsIGZsYWcpOworfQorCit2b2lkICpTRUNfT1NBTF9kbHN5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKnN5bWJvbCkKK3sKKyAgICByZXR1cm4gZGxzeW0oaGFuZGxlLCBzeW1ib2wpOworfQorCitpbnQgU0VDX09TQUxfZGxjbG9zZSh2b2lkICpoYW5kbGUpCit7CisgICAgcmV0dXJuIGRsY2xvc2UoaGFuZGxlKTsKK30KKworY29uc3QgY2hhciAqU0VDX09TQUxfZGxlcnJvcih2b2lkKQoreworICAgIHJldHVybiBkbGVycm9yKCk7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTGlicmFyeS5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODdjZWNkCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xpYnJhcnkuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgU0VDX09TQUxfTGlicmFyeS5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX0xJQlJBUlkKKyNkZWZpbmUgU0VDX09TQUxfTElCUkFSWQorCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkICpTRUNfT1NBTF9kbG9wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFnKTsKK3ZvaWQgKlNFQ19PU0FMX2Rsc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqc3ltYm9sKTsKK2ludCAgIFNFQ19PU0FMX2RsY2xvc2Uodm9pZCAqaGFuZGxlKTsKK2NvbnN0IGNoYXIgKlNFQ19PU0FMX2RsZXJyb3Iodm9pZCk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xvZy5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX0xvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZTQ5NzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTG9nLmMKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9Mb2cuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgWXVuamkgS2ltICh5dW5qaS5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9Mb2cuaCIKKworCit2b2lkIF9TRUNfT1NBTF9Mb2coU0VDX0xPR19MRVZFTCBsb2dMZXZlbCwgY29uc3QgY2hhciAqdGFnLCBjb25zdCBjaGFyICptc2csIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3B0cjsKKworICAgIHZhX3N0YXJ0KGFyZ3B0ciwgbXNnKTsKKworICAgIHN3aXRjaCAobG9nTGV2ZWwpIHsKKyAgICBjYXNlIFNFQ19MT0dfVFJBQ0U6CisgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX0RFQlVHLCB0YWcsIG1zZywgYXJncHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTRUNfTE9HX1dBUk5JTkc6CisgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX1dBUk4sIHRhZywgbXNnLCBhcmdwdHIpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNFQ19MT0dfRVJST1I6CisgICAgICAgIF9fYW5kcm9pZF9sb2dfdnByaW50KEFORFJPSURfTE9HX0VSUk9SLCB0YWcsIG1zZywgYXJncHRyKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgX19hbmRyb2lkX2xvZ192cHJpbnQoQU5EUk9JRF9MT0dfVkVSQk9TRSwgdGFnLCBtc2csIGFyZ3B0cik7CisgICAgfQorCisgICAgdmFfZW5kKGFyZ3B0cik7Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTG9nLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY4YTZjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9Mb2cuaApAQCAtMCwwICsxLDc4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX0xvZy5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBZdW5qaSBLaW0gKHl1bmppLmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICogICAyMDEwLjguMjcgOiBBZGQgdHJhY2UgZnVuY3Rpb24KKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX0xPRworI2RlZmluZSBTRUNfT1NBTF9MT0cKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaWZuZGVmIFNFQ19MT0dfT0ZGCisjZGVmaW5lIFNFQ19MT0cKKyNlbmRpZgorCisjaWZuZGVmIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTE9HIgorI2VuZGlmCisKKyNpZmRlZiBTRUNfVFJBQ0VfT04KKyNkZWZpbmUgU0VDX1RSQUNFCisjZW5kaWYKKwordHlwZWRlZiBlbnVtIF9MT0dfTEVWRUwKK3sKKyAgICBTRUNfTE9HX1RSQUNFLAorICAgIFNFQ19MT0dfV0FSTklORywKKyAgICBTRUNfTE9HX0VSUk9SCit9IFNFQ19MT0dfTEVWRUw7CisKKyNpZmRlZiBTRUNfTE9HCisjZGVmaW5lIFNFQ19PU0FMX0xvZyhhLCAuLi4pICAgICgodm9pZClfU0VDX09TQUxfTG9nKGEsIFNFQ19MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisjZWxzZQorI2RlZmluZSBTRUNfT1NBTF9Mb2coYSwgLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGEgPT0gU0VDX0xPR19FUlJPUikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKCh2b2lkKV9TRUNfT1NBTF9Mb2coYSwgU0VDX0xPR19UQUcsIF9fVkFfQVJHU19fKSk7IFwKKyAgICB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNpZmRlZiBTRUNfVFJBQ0UKKyNkZWZpbmUgRnVuY3Rpb25JbigpIF9TRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgU0VDX0xPR19UQUcsICIlcyBJbiAsIExpbmU6ICVkIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXykKKyNkZWZpbmUgRnVuY3Rpb25PdXQoKSBfU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsIFNFQ19MT0dfVEFHLCAiJXMgT3V0ICwgTGluZTogJWQiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKQorI2Vsc2UKKyNkZWZpbmUgRnVuY3Rpb25JbigpICgodm9pZCAqKTApCisjZGVmaW5lIEZ1bmN0aW9uT3V0KCkgKCh2b2lkICopMCkKKyNlbmRpZgorCitleHRlcm4gdm9pZCBfU0VDX09TQUxfTG9nKFNFQ19MT0dfTEVWRUwgbG9nTGV2ZWwsIGNvbnN0IGNoYXIgKnRhZywgY29uc3QgY2hhciAqbXNnLCAuLi4pOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9NZW1vcnkuYyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9NZW1vcnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTc5ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX01lbW9yeS5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTWVtb3J5LmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIlNFQ19PU0FMX01lbW9yeS5oIgorCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworc3RhdGljIGludCBtZW1fY250ID0gMDsKKworT01YX1BUUiBTRUNfT1NBTF9NYWxsb2MoT01YX1UzMiBzaXplKQoreworICAgIG1lbV9jbnQrKzsKKyAgICBTRUNfT1NBTF9Mb2coU0VDX0xPR19UUkFDRSwgImFsbG9jIGNvdW50OiAlZCIsIG1lbV9jbnQpOworCisgICAgcmV0dXJuIChPTVhfUFRSKW1hbGxvYyhzaXplKTsKK30KKwordm9pZCBTRUNfT1NBTF9GcmVlKE9NWF9QVFIgYWRkcikKK3sKKyAgICBtZW1fY250LS07CisgICAgU0VDX09TQUxfTG9nKFNFQ19MT0dfVFJBQ0UsICJmcmVlIGNvdW50OiAlZCIsIG1lbV9jbnQpOworCisgICAgaWYgKGFkZHIpCisgICAgICAgIGZyZWUoYWRkcik7CisKKyAgICByZXR1cm47Cit9CisKK09NWF9QVFIgU0VDX09TQUxfTWVtc2V0KE9NWF9QVFIgZGVzdCwgT01YX1MzMiBjLCBPTVhfUzMyIG4pCit7CisgICAgcmV0dXJuIG1lbXNldChkZXN0LCBjLCBuKTsKK30KKworT01YX1BUUiBTRUNfT1NBTF9NZW1jcHkoT01YX1BUUiBkZXN0LCBPTVhfUFRSIHNyYywgT01YX1MzMiBuKQoreworICAgIHJldHVybiBtZW1jcHkoZGVzdCwgc3JjLCBuKTsKK30KKworT01YX1BUUiBTRUNfT1NBTF9NZW1tb3ZlKE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIE9NWF9TMzIgbikKK3sKKyAgICByZXR1cm4gbWVtbW92ZShkZXN0LCBzcmMsIG4pOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX01lbW9yeS5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX01lbW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMTI4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTWVtb3J5LmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9NZW1vcnkuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09TQUxfTUVNT1JZCisjZGVmaW5lIFNFQ19PU0FMX01FTU9SWQorCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCitPTVhfUFRSIFNFQ19PU0FMX01hbGxvYyhPTVhfVTMyIHNpemUpOwordm9pZCAgICBTRUNfT1NBTF9GcmVlKE9NWF9QVFIgYWRkcik7CitPTVhfUFRSIFNFQ19PU0FMX01lbXNldChPTVhfUFRSIGRlc3QsIE9NWF9TMzIgYywgT01YX1MzMiBuKTsKK09NWF9QVFIgU0VDX09TQUxfTWVtY3B5KE9NWF9QVFIgZGVzdCwgT01YX1BUUiBzcmMsIE9NWF9TMzIgbik7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTXV0ZXguYyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9NdXRleC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjgwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfTXV0ZXguYwpAQCAtMCwwICsxLDkxIEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX011dGV4LmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhDcmVhdGUoT01YX0hBTkRMRVRZUEUgKm11dGV4SGFuZGxlKQoreworICAgIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXg7CisKKyAgICBtdXRleCA9IChwdGhyZWFkX211dGV4X3QgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKHB0aHJlYWRfbXV0ZXhfdCkpOworICAgIGlmICghbXV0ZXgpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnN1ZmZpY2llbnRSZXNvdXJjZXM7CisKKyAgICBpZiAocHRocmVhZF9tdXRleF9pbml0KG11dGV4LCBOVUxMKSAhPSAwKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworCisgICAgKm11dGV4SGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKW11dGV4OworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX011dGV4VGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIG11dGV4SGFuZGxlKQoreworICAgIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggPSAocHRocmVhZF9tdXRleF90ICopbXV0ZXhIYW5kbGU7CisKKyAgICBpZiAobXV0ZXggPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGlmIChwdGhyZWFkX211dGV4X2Rlc3Ryb3kobXV0ZXgpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICBTRUNfT1NBTF9GcmVlKG11dGV4KTsKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9NdXRleExvY2soT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpCit7CisgICAgcHRocmVhZF9tdXRleF90ICptdXRleCA9IChwdGhyZWFkX211dGV4X3QgKiltdXRleEhhbmRsZTsKKyAgICBpbnQgcmVzdWx0OworCisgICAgaWYgKG11dGV4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICBpZiAocHRocmVhZF9tdXRleF9sb2NrKG11dGV4KSAhPSAwKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhVbmxvY2soT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpCit7CisgICAgcHRocmVhZF9tdXRleF90ICptdXRleCA9IChwdGhyZWFkX211dGV4X3QgKiltdXRleEhhbmRsZTsKKyAgICBpbnQgcmVzdWx0OworCisgICAgaWYgKG11dGV4ID09IE5VTEwpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICBpZiAocHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKK30KZGlmZiAtLWdpdCBhL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9NdXRleC5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkY2Q5ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9NdXRleC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfTXV0ZXguaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorKi8KKworI2lmbmRlZiBTRUNfT1NBTF9NVVRFWAorI2RlZmluZSBTRUNfT1NBTF9NVVRFWAorCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhDcmVhdGUoT01YX0hBTkRMRVRZUEUgKm11dGV4SGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfTXV0ZXhUZXJtaW5hdGUoT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9NdXRleExvY2soT01YX0hBTkRMRVRZUEUgbXV0ZXhIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9NdXRleFVubG9jayhPTVhfSEFORExFVFlQRSBtdXRleEhhbmRsZSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1F1ZXVlLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfUXVldWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTZjMDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1F1ZXVlLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfUXVldWUuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9NdXRleC5oIgorI2luY2x1ZGUgIlNFQ19PU0FMX1F1ZXVlLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9RdWV1ZUNyZWF0ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIGludCBpID0gMDsKKyAgICBTRUNfUUVsZW0gKm5ld3FlbGVtID0gTlVMTDsKKyAgICBTRUNfUUVsZW0gKmN1cnJlbnRxZWxlbSA9IE5VTEw7CisgICAgU0VDX1FVRVVFICpxdWV1ZSA9IChTRUNfUVVFVUUgKilxdWV1ZUhhbmRsZTsKKworICAgIE9NWF9FUlJPUlRZUEUgcmV0ID0gT01YX0Vycm9yTm9uZTsKKworICAgIGlmICghcXVldWUpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleENyZWF0ZSgmcXVldWUtPnFNdXRleCk7CisgICAgaWYgKHJldCAhPSBPTVhfRXJyb3JOb25lKQorICAgICAgICByZXR1cm4gcmV0OworCisgICAgcXVldWUtPmZpcnN0ID0gKFNFQ19RRWxlbSAqKVNFQ19PU0FMX01hbGxvYyhzaXplb2YoU0VDX1FFbGVtKSk7CisgICAgaWYgKHF1ZXVlLT5maXJzdCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCisgICAgU0VDX09TQUxfTWVtc2V0KHF1ZXVlLT5maXJzdCwgMCwgc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgIGN1cnJlbnRxZWxlbSA9IHF1ZXVlLT5sYXN0ID0gcXVldWUtPmZpcnN0OworICAgIHF1ZXVlLT5udW1FbGVtID0gMDsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoTUFYX1FVRVVFX0VMRU1FTlRTIC0gMik7IGkrKykgeworICAgICAgICBuZXdxZWxlbSA9IChTRUNfUUVsZW0gKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgICAgICBpZiAobmV3cWVsZW0gPT0gTlVMTCkgeworICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLT5maXJzdCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgY3VycmVudHFlbGVtID0gcXVldWUtPmZpcnN0LT5xTmV4dDsKKyAgICAgICAgICAgICAgICBTRUNfT1NBTF9GcmVlKChPTVhfUFRSKXF1ZXVlLT5maXJzdCk7CisgICAgICAgICAgICAgICAgcXVldWUtPmZpcnN0ID0gY3VycmVudHFlbGVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckluc3VmZmljaWVudFJlc291cmNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNFQ19PU0FMX01lbXNldChuZXdxZWxlbSwgMCwgc2l6ZW9mKFNFQ19RRWxlbSkpOworICAgICAgICAgICAgY3VycmVudHFlbGVtLT5xTmV4dCA9IG5ld3FlbGVtOworICAgICAgICAgICAgY3VycmVudHFlbGVtID0gbmV3cWVsZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjdXJyZW50cWVsZW0tPnFOZXh0ID0gcXVldWUtPmZpcnN0OworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfUXVldWVUZXJtaW5hdGUoU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSkKK3sKKyAgICBpbnQgaSA9IDA7CisgICAgU0VDX1FFbGVtICpjdXJyZW50cWVsZW0gPSBOVUxMOworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgT01YX0VSUk9SVFlQRSByZXQgPSBPTVhfRXJyb3JOb25lOworCisgICAgaWYgKCFxdWV1ZSkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGZvciAoIGkgPSAwOyBpIDwgKE1BWF9RVUVVRV9FTEVNRU5UUyAtIDIpOyBpKyspIHsKKyAgICAgICAgY3VycmVudHFlbGVtID0gcXVldWUtPmZpcnN0LT5xTmV4dDsKKyAgICAgICAgU0VDX09TQUxfRnJlZShxdWV1ZS0+Zmlyc3QpOworICAgICAgICBxdWV1ZS0+Zmlyc3QgPSBjdXJyZW50cWVsZW07CisgICAgfQorCisgICAgaWYocXVldWUtPmZpcnN0KSB7CisgICAgICAgIFNFQ19PU0FMX0ZyZWUocXVldWUtPmZpcnN0KTsKKyAgICAgICAgcXVldWUtPmZpcnN0ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXQgPSBTRUNfT1NBTF9NdXRleFRlcm1pbmF0ZShxdWV1ZS0+cU11dGV4KTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK2ludCBTRUNfT1NBTF9RdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCB2b2lkICpkYXRhKQoreworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgaWYgKHF1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiAtMTsKKworICAgIFNFQ19PU0FMX011dGV4TG9jayhxdWV1ZS0+cU11dGV4KTsKKworICAgIGlmICgocXVldWUtPmxhc3QtPmRhdGEgIT0gTlVMTCkgfHwgKHF1ZXVlLT5udW1FbGVtID49IE1BWF9RVUVVRV9FTEVNRU5UUykpIHsKKyAgICAgICAgU0VDX09TQUxfTXV0ZXhVbmxvY2socXVldWUtPnFNdXRleCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcXVldWUtPmxhc3QtPmRhdGEgPSBkYXRhOworICAgIHF1ZXVlLT5sYXN0ID0gcXVldWUtPmxhc3QtPnFOZXh0OworICAgIHF1ZXVlLT5udW1FbGVtKys7CisKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhxdWV1ZS0+cU11dGV4KTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCAqU0VDX09TQUxfRGVxdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIHZvaWQgKmRhdGEgPSBOVUxMOworICAgIFNFQ19RVUVVRSAqcXVldWUgPSAoU0VDX1FVRVVFICopcXVldWVIYW5kbGU7CisgICAgaWYgKHF1ZXVlID09IE5VTEwpCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgU0VDX09TQUxfTXV0ZXhMb2NrKHF1ZXVlLT5xTXV0ZXgpOworCisgICAgaWYgKChxdWV1ZS0+Zmlyc3QtPmRhdGEgPT0gTlVMTCkgfHwgKHF1ZXVlLT5udW1FbGVtIDw9IDApKSB7CisgICAgICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZGF0YSA9IHF1ZXVlLT5maXJzdC0+ZGF0YTsKKyAgICBxdWV1ZS0+Zmlyc3QtPmRhdGEgPSBOVUxMOworICAgIHF1ZXVlLT5maXJzdCA9IHF1ZXVlLT5maXJzdC0+cU5leHQ7CisgICAgcXVldWUtPm51bUVsZW0tLTsKKworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgIHJldHVybiBkYXRhOworfQorCitpbnQgU0VDX09TQUxfR2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKQoreworICAgIGludCBFbGVtTnVtID0gMDsKKyAgICBTRUNfUVVFVUUgKnF1ZXVlID0gKFNFQ19RVUVVRSAqKXF1ZXVlSGFuZGxlOworICAgIGlmIChxdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2socXVldWUtPnFNdXRleCk7CisgICAgRWxlbU51bSA9IHF1ZXVlLT5udW1FbGVtOworICAgIFNFQ19PU0FMX011dGV4VW5sb2NrKHF1ZXVlLT5xTXV0ZXgpOworICAgIHJldHVybiBFbGVtTnVtOworfQorCitpbnQgU0VDX09TQUxfU2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCBpbnQgRWxlbU51bSkKK3sKKyAgICBTRUNfUVVFVUUgKnF1ZXVlID0gKFNFQ19RVUVVRSAqKXF1ZXVlSGFuZGxlOworICAgIGlmIChxdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICBTRUNfT1NBTF9NdXRleExvY2socXVldWUtPnFNdXRleCk7CisgICAgcXVldWUtPm51bUVsZW0gPSBFbGVtTnVtOyAKKyAgICBTRUNfT1NBTF9NdXRleFVubG9jayhxdWV1ZS0+cU11dGV4KTsKKyAgICByZXR1cm4gRWxlbU51bTsKK30KKwpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1F1ZXVlLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfUXVldWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjA5MzhmCi0tLSAvZGV2L251bGwKKysrIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1F1ZXVlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgIFNFQ19PU0FMX1F1ZXVlLmgKKyAqIEBicmllZgorICogQGF1dGhvciAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaWZuZGVmIFNFQ19PU0FMX1FVRVVFCisjZGVmaW5lIFNFQ19PU0FMX1FVRVVFCisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKyNpbmNsdWRlICJPTVhfQ29yZS5oIgorCisKKyNkZWZpbmUgTUFYX1FVRVVFX0VMRU1FTlRTICAgIDEwCisKK3R5cGVkZWYgc3RydWN0IF9TRUNfUUVsZW0KK3sKKyAgICB2b2lkICAgICAgICAgICAgICAqZGF0YTsKKyAgICBzdHJ1Y3QgX1NFQ19RRWxlbSAqcU5leHQ7Cit9IFNFQ19RRWxlbTsKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19RVUVVRQoreworICAgIFNFQ19RRWxlbSAgICAgKmZpcnN0OworICAgIFNFQ19RRWxlbSAgICAgKmxhc3Q7CisgICAgaW50ICAgICAgICAgICAgbnVtRWxlbTsKKyAgICBPTVhfSEFORExFVFlQRSBxTXV0ZXg7Cit9IFNFQ19RVUVVRTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfUXVldWVDcmVhdGUoU0VDX1FVRVVFICpxdWV1ZUhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1F1ZXVlVGVybWluYXRlKFNFQ19RVUVVRSAqcXVldWVIYW5kbGUpOworaW50ICAgICAgICAgICBTRUNfT1NBTF9RdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCB2b2lkICpkYXRhKTsKK3ZvaWQgICAgICAgICAqU0VDX09TQUxfRGVxdWV1ZShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKTsKK2ludCAgICAgICAgICAgU0VDX09TQUxfR2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlKTsKK2ludCAgICAgICAgICAgU0VDX09TQUxfU2V0RWxlbU51bShTRUNfUVVFVUUgKnF1ZXVlSGFuZGxlLCBpbnQgRWxlbU51bSk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1NlbWFwaG9yZS5jIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1NlbWFwaG9yZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YmM5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfU2VtYXBob3JlLmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKgorICogQ29weXJpZ2h0IDIwMTAgU2Ftc3VuZyBFbGVjdHJvbmljcyBTLkxTSSBDby4gTFRECisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBAZmlsZSAgICAgICAgU0VDX09TQUxfU2VtYXBob3JlLmMKKyAqIEBicmllZgorICogQGF1dGhvciAgICAgIFNldW5nQmVvbSBLaW0gKHNiY3J1eC5raW1Ac2Ftc3VuZy5jb20pCisgKiBAdmVyc2lvbiAgICAgMS4wCisgKiBAaGlzdG9yeQorICogICAyMDEwLjcuMTUgOiBDcmVhdGUKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c2VtYXBob3JlLmg+CisKKyNpbmNsdWRlICJTRUNfT1NBTF9NZW1vcnkuaCIKKyNpbmNsdWRlICJTRUNfT1NBTF9TZW1hcGhvcmUuaCIKKworI3VuZGVmIFNFQ19MT0dfVEFHCisjZGVmaW5lIFNFQ19MT0dfVEFHICAgICJTRUNfTE9HX1NFTUEiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZW1hcGhvcmVDcmVhdGUoT01YX0hBTkRMRVRZUEUgKnNlbWFwaG9yZUhhbmRsZSkKK3sKKyAgICBzZW1fdCAqc2VtYTsKKworICAgIHNlbWEgPSAoc2VtX3QgKilTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKHNlbV90KSk7CisgICAgaWYgKCFzZW1hKQorICAgICAgICByZXR1cm4gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworCisgICAgaWYgKHNlbV9pbml0KHNlbWEsIDAsIDApICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICAqc2VtYXBob3JlSGFuZGxlID0gKE9NWF9IQU5ETEVUWVBFKXNlbWE7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSkKK3sKKyAgICBzZW1fdCAqc2VtYSA9IChzZW1fdCAqKXNlbWFwaG9yZUhhbmRsZTsKKworICAgIGlmIChzZW1hID09IE5VTEwpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICBpZiAoc2VtX2Rlc3Ryb3koc2VtYSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIFNFQ19PU0FMX0ZyZWUoc2VtYSk7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlV2FpdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV93YWl0KHNlbWEpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlUG9zdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV9wb3N0KHNlbWEpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICBGdW5jdGlvbk91dCgpOworCisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2V0X1NlbWFwaG9yZUNvdW50KE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSwgT01YX1MzMiB2YWwpCit7CisgICAgc2VtX3QgKnNlbWEgPSAoc2VtX3QgKilzZW1hcGhvcmVIYW5kbGU7CisKKyAgICBpZiAoc2VtYSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUGFyYW1ldGVyOworCisgICAgaWYgKHNlbV9pbml0KHNlbWEsIDAsIHZhbCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQorCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX0dldF9TZW1hcGhvcmVDb3VudChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUsIE9NWF9TMzIgKnZhbCkKK3sKKyAgICBzZW1fdCAqc2VtYSA9IChzZW1fdCAqKXNlbWFwaG9yZUhhbmRsZTsKKyAgICBPTVhfVTMyIHNlbWFWYWwgPSAwOworCisgICAgaWYgKHNlbWEgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBhcmFtZXRlcjsKKworICAgIGlmIChzZW1fZ2V0dmFsdWUoc2VtYSwgJnNlbWFWYWwpICE9IDApCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CisKKyAgICAqdmFsID0gc2VtYVZhbDsKKworICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworfQpkaWZmIC0tZ2l0IGEvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1NlbWFwaG9yZS5oIGIvZXh5bm9zMy9zNXBjMTEwL3NlY19tbS9zZWNfb214L3NlY19vc2FsL1NFQ19PU0FMX1NlbWFwaG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2QzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfU2VtYXBob3JlLmgKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9TZW1hcGhvcmUuaAorICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpZm5kZWYgU0VDX09TQUxfU0VNQVBIT1JFCisjZGVmaW5lIFNFQ19PU0FMX1NFTUFQSE9SRQorCisjaW5jbHVkZSAiT01YX1R5cGVzLmgiCisjaW5jbHVkZSAiT01YX0NvcmUuaCIKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlQ3JlYXRlKE9NWF9IQU5ETEVUWVBFICpzZW1hcGhvcmVIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZW1hcGhvcmVUZXJtaW5hdGUoT01YX0hBTkRMRVRZUEUgc2VtYXBob3JlSGFuZGxlKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfU2VtYXBob3JlV2FpdChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUpOworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9TZW1hcGhvcmVQb3N0KE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1NldF9TZW1hcGhvcmVDb3VudChPTVhfSEFORExFVFlQRSBzZW1hcGhvcmVIYW5kbGUsIE9NWF9TMzIgdmFsKTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfR2V0X1NlbWFwaG9yZUNvdW50KE9NWF9IQU5ETEVUWVBFIHNlbWFwaG9yZUhhbmRsZSwgT01YX1MzMiAqdmFsKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfVGhyZWFkLmMgYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfVGhyZWFkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I2OWQzMAotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9UaHJlYWQuYwpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqCisgKiBDb3B5cmlnaHQgMjAxMCBTYW1zdW5nIEVsZWN0cm9uaWNzIFMuTFNJIENvLiBMVEQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEBmaWxlICAgICAgICBTRUNfT1NBTF9UaHJlYWQuYworICogQGJyaWVmCisgKiBAYXV0aG9yICAgICAgU2V1bmdCZW9tIEtpbSAoc2JjcnV4LmtpbUBzYW1zdW5nLmNvbSkKKyAqIEB2ZXJzaW9uICAgICAxLjAKKyAqIEBoaXN0b3J5CisgKiAgIDIwMTAuNy4xNSA6IENyZWF0ZQorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAiU0VDX09TQUxfTWVtb3J5LmgiCisjaW5jbHVkZSAiU0VDX09TQUxfVGhyZWFkLmgiCisKKyN1bmRlZiBTRUNfTE9HX1RBRworI2RlZmluZSBTRUNfTE9HX1RBRyAgICAiU0VDX0xPR19USFJFQUQiCisjZGVmaW5lIFNFQ19MT0dfT0ZGCisjaW5jbHVkZSAiU0VDX09TQUxfTG9nLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgX1NFQ19USFJFQURfSEFORExFX1RZUEUKK3sKKyAgICBwdGhyZWFkX3QgICAgICAgICAgcHRocmVhZDsKKyAgICBwdGhyZWFkX2F0dHJfdCAgICAgYXR0cjsKKyAgICBzdHJ1Y3Qgc2NoZWRfcGFyYW0gc2NoZWRwYXJhbTsKKyAgICBpbnQgICAgICAgICAgICAgICAgc3RhY2tfc2l6ZTsKK30gU0VDX1RIUkVBRF9IQU5ETEVfVFlQRTsKKworCitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1RocmVhZENyZWF0ZShPTVhfSEFORExFVFlQRSAqdGhyZWFkSGFuZGxlLCBPTVhfUFRSIGZ1bmN0aW9uX25hbWUsIE9NWF9QVFIgYXJndW1lbnQpCit7CisgICAgRnVuY3Rpb25JbigpOworCisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IGRldGFjaF9yZXQgPSAwOworICAgIFNFQ19USFJFQURfSEFORExFX1RZUEUgKnRocmVhZDsKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisKKyAgICB0aHJlYWQgPSBTRUNfT1NBTF9NYWxsb2Moc2l6ZW9mKFNFQ19USFJFQURfSEFORExFX1RZUEUpKTsKKyAgICBTRUNfT1NBTF9NZW1zZXQodGhyZWFkLCAwLCBzaXplb2YoU0VDX1RIUkVBRF9IQU5ETEVfVFlQRSkpOworCisgICAgcHRocmVhZF9hdHRyX2luaXQoJnRocmVhZC0+YXR0cik7CisgICAgaWYgKHRocmVhZC0+c3RhY2tfc2l6ZSAhPSAwKQorICAgICAgICBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCZ0aHJlYWQtPmF0dHIsIHRocmVhZC0+c3RhY2tfc2l6ZSk7CisKKyAgICAvKiBzZXQgcHJpb3JpdHkgKi8KKyAgICBpZiAodGhyZWFkLT5zY2hlZHBhcmFtLnNjaGVkX3ByaW9yaXR5ICE9IDApCisgICAgICAgIHB0aHJlYWRfYXR0cl9zZXRzY2hlZHBhcmFtKCZ0aHJlYWQtPmF0dHIsICZ0aHJlYWQtPnNjaGVkcGFyYW0pOworCisgICAgZGV0YWNoX3JldCA9IHB0aHJlYWRfYXR0cl9zZXRkZXRhY2hzdGF0ZSgmdGhyZWFkLT5hdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisgICAgaWYgKGRldGFjaF9yZXQgIT0gMCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JVbmRlZmluZWQ7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisKKyAgICByZXN1bHQgPSBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLT5wdGhyZWFkLCAmdGhyZWFkLT5hdHRyLCBmdW5jdGlvbl9uYW1lLCAodm9pZCAqKWFyZ3VtZW50KTsKKyAgICAvKiBwdGhyZWFkX3NldHNjaGVkcGFyYW0odGhyZWFkLT5wdGhyZWFkLCBTQ0hFRF9SUiwgJnRocmVhZC0+c2NoZWRwYXJhbSk7ICovCisKKyAgICBzd2l0Y2ggKHJlc3VsdCkgeworICAgIGNhc2UgMDoKKyAgICAgICAgKnRocmVhZEhhbmRsZSA9IChPTVhfSEFORExFVFlQRSl0aHJlYWQ7CisgICAgICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRUFHQUlOOgorICAgICAgICAqdGhyZWFkSGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9ySW5zdWZmaWNpZW50UmVzb3VyY2VzOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICAqdGhyZWFkSGFuZGxlID0gTlVMTDsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBicmVhazsKKyAgICB9CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHRocmVhZEhhbmRsZSkKK3sKKyAgICBGdW5jdGlvbkluKCk7CisKKyAgICBPTVhfRVJST1JUWVBFIHJldCA9IE9NWF9FcnJvck5vbmU7CisgICAgU0VDX1RIUkVBRF9IQU5ETEVfVFlQRSAqdGhyZWFkID0gKFNFQ19USFJFQURfSEFORExFX1RZUEUgKil0aHJlYWRIYW5kbGU7CisKKyAgICBpZiAoIXRocmVhZCkgeworICAgICAgICByZXQgPSBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisgICAgICAgIGdvdG8gRVhJVDsKKyAgICB9CisgICAgaWYgKHB0aHJlYWRfam9pbih0aHJlYWQtPnB0aHJlYWQsIE5VTEwpICE9IDApIHsKKyAgICAgICAgcmV0ID0gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICBnb3RvIEVYSVQ7CisgICAgfQorCisgICAgU0VDX09TQUxfRnJlZSh0aHJlYWQpOworICAgIHJldCA9IE9NWF9FcnJvck5vbmU7CisKK0VYSVQ6CisgICAgRnVuY3Rpb25PdXQoKTsKKworICAgIHJldHVybiByZXQ7CisKK30KKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRDYW5jZWwoT01YX0hBTkRMRVRZUEUgdGhyZWFkSGFuZGxlKQoreworICAgIFNFQ19USFJFQURfSEFORExFX1RZUEUgKnRocmVhZCA9IChTRUNfVEhSRUFEX0hBTkRMRV9UWVBFICopdGhyZWFkSGFuZGxlOworCisgICAgaWYgKCF0aHJlYWQpCisgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CisKKyAgICAvKiB0aHJlYWRfY2FuY2VsKHRocmVhZC0+cHRocmVhZCk7ICovCisgICAgcHRocmVhZF9leGl0KHRocmVhZC0+cHRocmVhZCk7CisgICAgcHRocmVhZF9qb2luKHRocmVhZC0+cHRocmVhZCwgTlVMTCk7CisKKyAgICBTRUNfT1NBTF9GcmVlKHRocmVhZCk7CisgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7Cit9CisKK3ZvaWQgU0VDX09TQUxfVGhyZWFkRXhpdCh2b2lkICp2YWx1ZV9wdHIpCit7CisgICAgcHRocmVhZF9leGl0KHZhbHVlX3B0cik7CisgICAgcmV0dXJuOworfQorCit2b2lkIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoT01YX1UzMiBtcykKK3sKKyAgICB1c2xlZXAobXMgKiAxMDAwKTsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfVGhyZWFkLmggYi9leHlub3MzL3M1cGMxMTAvc2VjX21tL3NlY19vbXgvc2VjX29zYWwvU0VDX09TQUxfVGhyZWFkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkMjYwOQotLS0gL2Rldi9udWxsCisrKyBiL2V4eW5vczMvczVwYzExMC9zZWNfbW0vc2VjX29teC9zZWNfb3NhbC9TRUNfT1NBTF9UaHJlYWQuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICoKKyAqIENvcHlyaWdodCAyMDEwIFNhbXN1bmcgRWxlY3Ryb25pY3MgUy5MU0kgQ28uIExURAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogQGZpbGUgICAgICAgIFNFQ19PU0FMX1RocmVhZC5oCisgKiBAYnJpZWYKKyAqIEBhdXRob3IgICAgICBTZXVuZ0Jlb20gS2ltIChzYmNydXgua2ltQHNhbXN1bmcuY29tKQorICogQHZlcnNpb24gICAgIDEuMAorICogQGhpc3RvcnkKKyAqICAgMjAxMC43LjE1IDogQ3JlYXRlCisgKi8KKworI2lmbmRlZiBTRUNfT1NBTF9USFJFQUQKKyNkZWZpbmUgU0VDX09TQUxfVEhSRUFECisKKyNpbmNsdWRlICJPTVhfVHlwZXMuaCIKKyNpbmNsdWRlICJPTVhfQ29yZS5oIgorCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworT01YX0VSUk9SVFlQRSBTRUNfT1NBTF9UaHJlYWRDcmVhdGUoT01YX0hBTkRMRVRZUEUgKnRocmVhZEhhbmRsZSwgT01YX1BUUiBmdW5jdGlvbl9uYW1lLCBPTVhfUFRSIGFyZ3VtZW50KTsKK09NWF9FUlJPUlRZUEUgU0VDX09TQUxfVGhyZWFkVGVybWluYXRlKE9NWF9IQU5ETEVUWVBFIHRocmVhZEhhbmRsZSk7CitPTVhfRVJST1JUWVBFIFNFQ19PU0FMX1RocmVhZENhbmNlbChPTVhfSEFORExFVFlQRSB0aHJlYWRIYW5kbGUpOwordm9pZCAgICAgICAgICBTRUNfT1NBTF9UaHJlYWRFeGl0KHZvaWQgKnZhbHVlX3B0cik7Cit2b2lkICAgICAgICAgIFNFQ19PU0FMX1NsZWVwTWlsbGlzZWMoT01YX1UzMiBtcyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvczVwYzExMC5tayBiL3M1cGMxMTAubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmNWUwZQotLS0gL2Rldi9udWxsCisrKyBiL3M1cGMxMTAubWsKQEAgLTAsMCArMSwxOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZlcSAoJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pLHM1cGMxMTApCisKK2luY2x1ZGUgaGFyZHdhcmUvc2Ftc3VuZy9leHlub3MzL3M1cGMxMTAvQW5kcm9pZC5taworCitlbmRpZgo=